From d12aef58f4154c7547c2be67bc0c05dfc22bdd4f Mon Sep 17 00:00:00 2001 From: "zhouxiao.shaw" Date: Wed, 5 Jul 2023 12:14:52 +0800 Subject: [PATCH 1/6] fix: add sandbox owner document config --- packages/browser-vm/src/dynamicNode/index.ts | 3 ++- packages/browser-vm/src/types.ts | 1 + packages/core/src/config.ts | 1 + packages/core/src/interface.ts | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/browser-vm/src/dynamicNode/index.ts b/packages/browser-vm/src/dynamicNode/index.ts index 8569635ee..9ab8000ae 100644 --- a/packages/browser-vm/src/dynamicNode/index.ts +++ b/packages/browser-vm/src/dynamicNode/index.ts @@ -114,7 +114,8 @@ export function makeElInjector(sandboxConfig: SandboxOptions) { if (typeof window.Element === 'function') { // iframe can read html container this can't point to proxyDocument has Illegal invocation error - if (sandboxConfig.fixBaseUrl) safeWrapper(() => handleOwnerDocument()); + if (sandboxConfig.fixOwnerDocument) + safeWrapper(() => handleOwnerDocument()); const rewrite = ( methods: Array, builder: typeof injector | typeof injectorRemoveChild, diff --git a/packages/browser-vm/src/types.ts b/packages/browser-vm/src/types.ts index c8747d6a8..97ec5cb56 100644 --- a/packages/browser-vm/src/types.ts +++ b/packages/browser-vm/src/types.ts @@ -23,6 +23,7 @@ export interface SandboxOptions { baseUrl?: string; fixBaseUrl?: boolean; fixStaticResourceBaseUrl?: boolean; + fixOwnerDocument?: boolean; disableWith?: boolean; strictIsolation?: boolean; disableElementtiming?: boolean; diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index 90f45398c..231f95315 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -114,6 +114,7 @@ export const createDefaultOptions = () => { disableWith: false, strictIsolation: false, disableElementtiming: false, + fixOwnerDocument: false, }, // global hooks beforeLoad: () => {}, diff --git a/packages/core/src/interface.ts b/packages/core/src/interface.ts index b53aa251c..0a493e5d1 100644 --- a/packages/core/src/interface.ts +++ b/packages/core/src/interface.ts @@ -81,6 +81,7 @@ export namespace interfaces { disableWith?: boolean; strictIsolation?: boolean; disableElementtiming?: boolean; + fixOwnerDocument?: boolean; } export interface Config { From 8e7029413bfaff93bf1f47ca1b592c0a8a5f56fb Mon Sep 17 00:00:00 2001 From: "zhouxiao.shaw" Date: Wed, 5 Jul 2023 12:18:59 +0800 Subject: [PATCH 2/6] chore: add fixOwnerDocument config --- website/src/components/config/_sandbox.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/src/components/config/_sandbox.mdx b/website/src/components/config/_sandbox.mdx index 226167cdc..17f4ecab9 100644 --- a/website/src/components/config/_sandbox.mdx +++ b/website/src/components/config/_sandbox.mdx @@ -18,6 +18,8 @@ interface SandboxConfig { modules?: Array | Record; // disableElementtiming 1.14.4 版本提供,默认值为 false,将会给子应用元素注入 elementtiming 属性,可以通过此属性获取子应用元素的加载时间 disableElementtiming?: boolean; + // fixOwnerDocument 1.17.0 版本提供,默认值为 false,sandbox 在针对 Element 的 ownerDocument 会发生逃逸,fixOwnerDocument 设置为 true 会避免逃逸 + fixOwnerDocument?: boolean; } type Module = (sandbox: Sandbox) => OverridesData | void; From 60301af9c512dbb8b5414d931aadc50bd390baa9 Mon Sep 17 00:00:00 2001 From: "zhouxiao.shaw" Date: Wed, 5 Jul 2023 12:29:06 +0800 Subject: [PATCH 3/6] chore: add sandbox config --- packages/browser-vm/src/pluginify.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/browser-vm/src/pluginify.ts b/packages/browser-vm/src/pluginify.ts index e2a235702..e820f81fd 100644 --- a/packages/browser-vm/src/pluginify.ts +++ b/packages/browser-vm/src/pluginify.ts @@ -130,6 +130,7 @@ function createOptions(Garfish: interfaces.Garfish) { fixStaticResourceBaseUrl: Boolean( appInfo.sandbox?.fixStaticResourceBaseUrl, ), + fixOwnerDocument: Boolean(appInfo.sandbox?.fixOwnerDocument), disableWith: Boolean(appInfo.sandbox?.disableWith), disableElementtiming: Boolean(appInfo.sandbox?.disableElementtiming), strictIsolation: Boolean(appInfo.sandbox?.strictIsolation), From 73a735a319e268a15079d4a540b945624310d782 Mon Sep 17 00:00:00 2001 From: "zhouxiao.shaw" Date: Thu, 6 Jul 2023 11:02:08 +0800 Subject: [PATCH 4/6] chore: example add fixOwnerDocument config --- dev/app-main/src/config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/app-main/src/config.ts b/dev/app-main/src/config.ts index 49c151ba1..6cb9c46aa 100644 --- a/dev/app-main/src/config.ts +++ b/dev/app-main/src/config.ts @@ -45,6 +45,7 @@ let defaultConfig: RunInfo = { // 并且子应用的查询和添加行为仅会在 DOM 作用域内进行 strictIsolation: false, fixBaseUrl: true, + fixOwnerDocument: true, // 覆盖子应用的执行上下文,使用自定义的执行上下文,例如子应用 localStorage 使用当前主应用 localStorage // 仅在 snapshot: false 时有效 From a195afd492f79349629f2416fc161d7bc1abf604 Mon Sep 17 00:00:00 2001 From: "zhouxiao.shaw" Date: Thu, 6 Jul 2023 12:30:05 +0800 Subject: [PATCH 5/6] chore: fix baseurl --- cypress/e2e/2-the-vm-sandbox/dom.spec.js | 1 + dev/app-main/src/config.ts | 1 + dev/app-main/src/constant.ts | 3 --- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cypress/e2e/2-the-vm-sandbox/dom.spec.js b/cypress/e2e/2-the-vm-sandbox/dom.spec.js index 8f43e40f9..c8c493276 100644 --- a/cypress/e2e/2-the-vm-sandbox/dom.spec.js +++ b/cypress/e2e/2-the-vm-sandbox/dom.spec.js @@ -18,6 +18,7 @@ describe('whole process vm sandbox set variable', () => { disablePreloadApp: true, sandbox: { snapshot: false, + fixStaticResourceBaseUrl: true, }, protectVariable: ['dynamicScriptOnloadTag', 'dynamicScriptOnerrorTag'], }, diff --git a/dev/app-main/src/config.ts b/dev/app-main/src/config.ts index 6cb9c46aa..007ca09e4 100644 --- a/dev/app-main/src/config.ts +++ b/dev/app-main/src/config.ts @@ -45,6 +45,7 @@ let defaultConfig: RunInfo = { // 并且子应用的查询和添加行为仅会在 DOM 作用域内进行 strictIsolation: false, fixBaseUrl: true, + fixStaticResourceBaseUrl: true, fixOwnerDocument: true, // 覆盖子应用的执行上下文,使用自定义的执行上下文,例如子应用 localStorage 使用当前主应用 localStorage diff --git a/dev/app-main/src/constant.ts b/dev/app-main/src/constant.ts index 891b7fa0b..269956e54 100644 --- a/dev/app-main/src/constant.ts +++ b/dev/app-main/src/constant.ts @@ -15,9 +15,6 @@ export const localApps: AppInfo = [ // 每个应用的 name 需要保持唯一 name: 'react17', activeWhen: '/react17', - sandbox: { - fixStaticResourceBaseUrl: false, - }, // 子应用的入口地址,可以为 HTML 地址和 JS 地址 // 注意:entry 地址不可以与主应用+子应用激活地址相同,否则刷新时将会直接返回子应用内容 entry: getProxyHost('dev/react17'), From e8287378dd33cef6a47f5a0255971a5a0dbdca77 Mon Sep 17 00:00:00 2001 From: "zhouxiao.shaw" Date: Thu, 6 Jul 2023 16:05:47 +0800 Subject: [PATCH 6/6] fix: e2e error --- .../set-global-variable.spec.js | 5 ++-- dev/app-main/src/constant.ts | 3 +++ dev/app-react-16/src/sandbox.tsx | 23 +++++++++++++++---- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/cypress/e2e/2-the-vm-sandbox/set-global-variable.spec.js b/cypress/e2e/2-the-vm-sandbox/set-global-variable.spec.js index 231b55b03..51a27157f 100644 --- a/cypress/e2e/2-the-vm-sandbox/set-global-variable.spec.js +++ b/cypress/e2e/2-the-vm-sandbox/set-global-variable.spec.js @@ -21,6 +21,7 @@ describe('whole process vm sandbox set variable', () => { sandbox: { snapshot: false, fixBaseUrl: true, + fixOwnerDocument: true, }, }, }); @@ -70,12 +71,12 @@ describe('whole process vm sandbox set variable', () => { cy.contains('[data-test=title]', ProxyVariableTitle).then(() => { expect( win.document - .querySelector('[data-test=iframe-pre-fix]') + .querySelector('[data-test=iframe-pre-fix-16]') .getAttribute('src'), ).to.equal(`http:${getPublicPath('dev/react16')}iframe`); expect( win.document - .querySelector('[data-test=img-pre-fix]') + .querySelector('[data-test=img-pre-fix-16]') .getAttribute('src'), ).to.equal(`http:${getPublicPath('dev/react16')}img`); }); diff --git a/dev/app-main/src/constant.ts b/dev/app-main/src/constant.ts index 269956e54..891b7fa0b 100644 --- a/dev/app-main/src/constant.ts +++ b/dev/app-main/src/constant.ts @@ -15,6 +15,9 @@ export const localApps: AppInfo = [ // 每个应用的 name 需要保持唯一 name: 'react17', activeWhen: '/react17', + sandbox: { + fixStaticResourceBaseUrl: false, + }, // 子应用的入口地址,可以为 HTML 地址和 JS 地址 // 注意:entry 地址不可以与主应用+子应用激活地址相同,否则刷新时将会直接返回子应用内容 entry: getProxyHost('dev/react17'), diff --git a/dev/app-react-16/src/sandbox.tsx b/dev/app-react-16/src/sandbox.tsx index 7dad32d37..309b88274 100644 --- a/dev/app-react-16/src/sandbox.tsx +++ b/dev/app-react-16/src/sandbox.tsx @@ -84,12 +84,25 @@ export default function () { add script test onerror
-
document instanceof Document: {String(document instanceof Document)}
-
document.body.parentNode?.parentNode: {String(document === document.body.parentNode?.parentNode)}
+
+ document instanceof Document: {String(document instanceof Document)} +
+
+ document.body.parentNode?.parentNode:{' '} + {String(document === document.body.parentNode?.parentNode)} +
-
-