🐛 speedy mode sandbox should compatible with element-ui popper (#2415)
This commit is contained in:
parent
bcfc96cd62
commit
6732f8b4b0
|
|
@ -29,8 +29,12 @@ const proxyAttachContainerConfigMap: WeakMap<WindowProxy, ContainerConfig> =
|
||||||
nativeGlobal.__proxyAttachContainerConfigMap__;
|
nativeGlobal.__proxyAttachContainerConfigMap__;
|
||||||
|
|
||||||
const elementAttachContainerConfigMap = new WeakMap<HTMLElement, ContainerConfig>();
|
const elementAttachContainerConfigMap = new WeakMap<HTMLElement, ContainerConfig>();
|
||||||
|
|
||||||
const docCreatePatchedMap = new WeakMap<typeof document.createElement, typeof document.createElement>();
|
const docCreatePatchedMap = new WeakMap<typeof document.createElement, typeof document.createElement>();
|
||||||
|
const mutationObserverPatchedMap = new WeakMap<
|
||||||
|
typeof MutationObserver.prototype.observe,
|
||||||
|
typeof MutationObserver.prototype.observe
|
||||||
|
>();
|
||||||
|
const parentNodePatchedMap = new WeakMap<PropertyDescriptor, PropertyDescriptor>();
|
||||||
|
|
||||||
function patchDocument(cfg: { sandbox: SandBox; speedy: boolean }) {
|
function patchDocument(cfg: { sandbox: SandBox; speedy: boolean }) {
|
||||||
const { sandbox, speedy } = cfg;
|
const { sandbox, speedy } = cfg;
|
||||||
|
|
@ -74,17 +78,50 @@ function patchDocument(cfg: { sandbox: SandBox; speedy: boolean }) {
|
||||||
// patch MutationObserver.prototype.observe to avoid type error
|
// patch MutationObserver.prototype.observe to avoid type error
|
||||||
// https://github.com/umijs/qiankun/issues/2406
|
// https://github.com/umijs/qiankun/issues/2406
|
||||||
const nativeMutationObserverObserveFn = MutationObserver.prototype.observe;
|
const nativeMutationObserverObserveFn = MutationObserver.prototype.observe;
|
||||||
MutationObserver.prototype.observe = function observe(
|
if (!mutationObserverPatchedMap.has(nativeMutationObserverObserveFn)) {
|
||||||
this: MutationObserver,
|
const observe = function observe(this: MutationObserver, target: Node, options: MutationObserverInit) {
|
||||||
target: Node,
|
|
||||||
options: MutationObserverInit,
|
|
||||||
) {
|
|
||||||
const realTarget = target instanceof Document ? nativeDocument : target;
|
const realTarget = target instanceof Document ? nativeDocument : target;
|
||||||
return nativeMutationObserverObserveFn.call(this, realTarget, options);
|
return nativeMutationObserverObserveFn.call(this, realTarget, options);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MutationObserver.prototype.observe = observe;
|
||||||
|
mutationObserverPatchedMap.set(nativeMutationObserverObserveFn, observe);
|
||||||
|
}
|
||||||
|
|
||||||
|
// patch parentNode getter to avoid document === html.parentNode
|
||||||
|
// https://github.com/umijs/qiankun/issues/2408#issuecomment-1446229105
|
||||||
|
const parentNodeDescriptor = Object.getOwnPropertyDescriptor(Node.prototype, 'parentNode');
|
||||||
|
if (parentNodeDescriptor && !parentNodePatchedMap.has(parentNodeDescriptor)) {
|
||||||
|
const { get: parentNodeGetter, configurable } = parentNodeDescriptor;
|
||||||
|
if (parentNodeGetter && configurable) {
|
||||||
|
const patchedParentNodeDescriptor = {
|
||||||
|
...parentNodeDescriptor,
|
||||||
|
get(this: Node) {
|
||||||
|
const parentNode = parentNodeGetter.call(this);
|
||||||
|
if (parentNode instanceof Document) {
|
||||||
|
const proxy = getCurrentRunningApp()?.window;
|
||||||
|
if (proxy) {
|
||||||
|
return proxy.document;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return parentNode;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
Object.defineProperty(Node.prototype, 'parentNode', patchedParentNodeDescriptor);
|
||||||
|
|
||||||
|
parentNodePatchedMap.set(parentNodeDescriptor, patchedParentNodeDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
MutationObserver.prototype.observe = nativeMutationObserverObserveFn;
|
MutationObserver.prototype.observe = nativeMutationObserverObserveFn;
|
||||||
|
mutationObserverPatchedMap.delete(nativeMutationObserverObserveFn);
|
||||||
|
|
||||||
|
if (parentNodeDescriptor) {
|
||||||
|
Object.defineProperty(Node.prototype, 'parentNode', parentNodeDescriptor);
|
||||||
|
parentNodePatchedMap.delete(parentNodeDescriptor);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -150,7 +187,7 @@ export function patchStrictSandbox(
|
||||||
// all dynamic style sheets are stored in proxy container
|
// all dynamic style sheets are stored in proxy container
|
||||||
const { dynamicStyleSheetElements } = containerConfig;
|
const { dynamicStyleSheetElements } = containerConfig;
|
||||||
|
|
||||||
const unpatchDocumentCreate = patchDocument({ sandbox, speedy: speedySandbox });
|
const unpatchDocument = patchDocument({ sandbox, speedy: speedySandbox });
|
||||||
|
|
||||||
const unpatchDynamicAppendPrototypeFunctions = patchHTMLDynamicAppendPrototypeFunctions(
|
const unpatchDynamicAppendPrototypeFunctions = patchHTMLDynamicAppendPrototypeFunctions(
|
||||||
(element) => elementAttachContainerConfigMap.has(element),
|
(element) => elementAttachContainerConfigMap.has(element),
|
||||||
|
|
@ -167,7 +204,7 @@ export function patchStrictSandbox(
|
||||||
// release the overwritten prototype after all the micro apps unmounted
|
// release the overwritten prototype after all the micro apps unmounted
|
||||||
if (isAllAppsUnmounted()) {
|
if (isAllAppsUnmounted()) {
|
||||||
unpatchDynamicAppendPrototypeFunctions();
|
unpatchDynamicAppendPrototypeFunctions();
|
||||||
unpatchDocumentCreate();
|
unpatchDocument();
|
||||||
}
|
}
|
||||||
|
|
||||||
recordStyledComponentsCSSRules(dynamicStyleSheetElements);
|
recordStyledComponentsCSSRules(dynamicStyleSheetElements);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user