🐛window variable should in with lexical scope while speedy mode enabled (#2390)
This commit is contained in:
parent
52b1a3c441
commit
bac5e2ac69
|
|
@ -102,7 +102,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.10.5",
|
"@babel/runtime": "^7.10.5",
|
||||||
"import-html-entry": "^1.14.0",
|
"import-html-entry": "^1.14.1",
|
||||||
"lodash": "^4.17.11",
|
"lodash": "^4.17.11",
|
||||||
"single-spa": "^5.9.2"
|
"single-spa": "^5.9.2"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import type {
|
||||||
ObjectType,
|
ObjectType,
|
||||||
} from './interfaces';
|
} from './interfaces';
|
||||||
import { createSandboxContainer, css } from './sandbox';
|
import { createSandboxContainer, css } from './sandbox';
|
||||||
import { trustedGlobals } from './sandbox/common';
|
import { scopedGlobals } from './sandbox/common';
|
||||||
import {
|
import {
|
||||||
Deferred,
|
Deferred,
|
||||||
genAppInstanceIdByName,
|
genAppInstanceIdByName,
|
||||||
|
|
@ -345,7 +345,7 @@ export async function loadApp<T extends ObjectType>(
|
||||||
|
|
||||||
// get the lifecycle hooks from module exports
|
// get the lifecycle hooks from module exports
|
||||||
const scriptExports: any = await execScripts(global, sandbox && !useLooseSandbox, {
|
const scriptExports: any = await execScripts(global, sandbox && !useLooseSandbox, {
|
||||||
scopedGlobalVariables: speedySandbox ? trustedGlobals : [],
|
scopedGlobalVariables: speedySandbox ? scopedGlobals : [],
|
||||||
});
|
});
|
||||||
const { bootstrap, mount, unmount, update } = getLifecyclesFromExports(
|
const { bootstrap, mount, unmount, update } = getLifecyclesFromExports(
|
||||||
scriptExports,
|
scriptExports,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
import { isBoundedFunction, isCallable, isConstructable } from '../utils';
|
import { isBoundedFunction, isCallable, isConstructable } from '../utils';
|
||||||
import { globals } from './globals';
|
import { globals } from './globals';
|
||||||
import { without } from 'lodash';
|
|
||||||
|
|
||||||
type AppInstance = { name: string; window: WindowProxy };
|
type AppInstance = { name: string; window: WindowProxy };
|
||||||
let currentRunningApp: AppInstance | null = null;
|
let currentRunningApp: AppInstance | null = null;
|
||||||
|
|
@ -22,8 +21,8 @@ export function setCurrentRunningApp(appInstance: { name: string; window: Window
|
||||||
currentRunningApp = appInstance;
|
currentRunningApp = appInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
const spiedGlobals = ['window', 'self', 'globalThis', 'top', 'parent', 'hasOwnProperty', 'document', 'eval'];
|
export const overwrittenGlobals = ['window', 'self', 'globalThis'];
|
||||||
export const trustedGlobals = [...without(globals, ...spiedGlobals), 'requestAnimationFrame'];
|
export const scopedGlobals = Array.from(new Set([...globals, ...overwrittenGlobals, 'requestAnimationFrame']));
|
||||||
|
|
||||||
const functionBoundedValueMap = new WeakMap<CallableFunction, CallableFunction>();
|
const functionBoundedValueMap = new WeakMap<CallableFunction, CallableFunction>();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import { execScripts } from 'import-html-entry';
|
||||||
import { isFunction } from 'lodash';
|
import { isFunction } from 'lodash';
|
||||||
import { frameworkConfiguration } from '../../../apis';
|
import { frameworkConfiguration } from '../../../apis';
|
||||||
import { qiankunHeadTagName } from '../../../utils';
|
import { qiankunHeadTagName } from '../../../utils';
|
||||||
import { trustedGlobals } from '../../common';
|
import { scopedGlobals } from '../../common';
|
||||||
import * as css from '../css';
|
import * as css from '../css';
|
||||||
|
|
||||||
export const rawHeadAppendChild = HTMLHeadElement.prototype.appendChild;
|
export const rawHeadAppendChild = HTMLHeadElement.prototype.appendChild;
|
||||||
|
|
@ -280,7 +280,7 @@ function getOverwrittenAppendChildOrInsertBefore(opts: {
|
||||||
const { fetch } = frameworkConfiguration;
|
const { fetch } = frameworkConfiguration;
|
||||||
const referenceNode = mountDOM.contains(refChild) ? refChild : null;
|
const referenceNode = mountDOM.contains(refChild) ? refChild : null;
|
||||||
|
|
||||||
const scopedGlobalVariables = speedySandbox ? trustedGlobals : [];
|
const scopedGlobalVariables = speedySandbox ? scopedGlobals : [];
|
||||||
|
|
||||||
if (src) {
|
if (src) {
|
||||||
let isRedfinedCurrentScript = false;
|
let isRedfinedCurrentScript = false;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
/* eslint-disable no-param-reassign */
|
/* eslint-disable no-param-reassign */
|
||||||
|
import { without } from 'lodash';
|
||||||
/**
|
/**
|
||||||
* @author Kuitos
|
* @author Kuitos
|
||||||
* @since 2020-3-31
|
* @since 2020-3-31
|
||||||
|
|
@ -6,7 +7,8 @@
|
||||||
import type { SandBox } from '../interfaces';
|
import type { SandBox } from '../interfaces';
|
||||||
import { SandBoxType } from '../interfaces';
|
import { SandBoxType } from '../interfaces';
|
||||||
import { isPropertyFrozen, nativeGlobal, nextTask } from '../utils';
|
import { isPropertyFrozen, nativeGlobal, nextTask } from '../utils';
|
||||||
import { getCurrentRunningApp, getTargetValue, trustedGlobals, setCurrentRunningApp } from './common';
|
import { overwrittenGlobals, getCurrentRunningApp, getTargetValue, setCurrentRunningApp } from './common';
|
||||||
|
import { globals } from './globals';
|
||||||
|
|
||||||
type SymbolTarget = 'target' | 'globalContext';
|
type SymbolTarget = 'target' | 'globalContext';
|
||||||
|
|
||||||
|
|
@ -45,11 +47,18 @@ const globalVariableWhiteList: string[] = [
|
||||||
...variableWhiteListInDev,
|
...variableWhiteListInDev,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// these globals should be recorded in every accessing
|
||||||
|
const accessingSpiedGlobals = ['document', 'top', 'parent', 'hasOwnProperty', 'eval'];
|
||||||
/*
|
/*
|
||||||
variables who are impossible to be overwritten need to be escaped from proxy sandbox for performance reasons
|
variables who are impossible to be overwritten need to be escaped from proxy sandbox for performance reasons.
|
||||||
see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/unscopables
|
see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/unscopables
|
||||||
*/
|
*/
|
||||||
const unscopables = trustedGlobals.reduce((acc, key) => ({ ...acc, [key]: true }), { __proto__: null });
|
const unscopables = without(globals, ...accessingSpiedGlobals, ...overwrittenGlobals).reduce(
|
||||||
|
(acc, key) => ({ ...acc, [key]: true }),
|
||||||
|
{
|
||||||
|
__proto__: null,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
const useNativeWindowForBindingsProps = new Map<PropertyKey, boolean>([
|
const useNativeWindowForBindingsProps = new Map<PropertyKey, boolean>([
|
||||||
['fetch', true],
|
['fetch', true],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user