From 447454f97ce6e697428a6d0e4efdf0cb2152306c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=B9=E5=8D=81=E5=85=AB=E7=94=BB=E7=94=9F?= <308929264@qq.com> Date: Wed, 9 Sep 2020 10:49:21 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20set=20the=20event=20target=20dur?= =?UTF-8?q?ing=20dynamic=20script=20onload/onerror=20events=20(#914)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: wangzongxu Co-authored-by: Kuitos --- src/sandbox/patchers/dynamicAppend.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/sandbox/patchers/dynamicAppend.ts b/src/sandbox/patchers/dynamicAppend.ts index 710d172..f93da56 100644 --- a/src/sandbox/patchers/dynamicAppend.ts +++ b/src/sandbox/patchers/dynamicAppend.ts @@ -61,6 +61,18 @@ function setCachedRules(element: HTMLStyleElement, cssRules: CSSRuleList) { Object.defineProperty(element, styledComponentSymbol, { value: cssRules, configurable: true, enumerable: false }); } +function patchCustomEvent(e: CustomEvent, elementGetter: () => HTMLScriptElement | null): CustomEvent { + Object.defineProperties(e, { + srcElement: { + get: elementGetter, + }, + target: { + get: elementGetter, + }, + }); + return e; +} + function getOverwrittenAppendChildOrInsertBefore(opts: { appName: string; proxy: WindowProxy; @@ -159,7 +171,7 @@ function getOverwrittenAppendChildOrInsertBefore(opts: { // 2. addEventListener way, which toast-loader used, see https://github.com/pyrsmk/toast/blob/master/src/Toast.ts#L64 const loadEvent = new CustomEvent('load'); if (isFunction(element.onload)) { - element.onload(loadEvent); + element.onload(patchCustomEvent(loadEvent, () => element)); } else { element.dispatchEvent(loadEvent); } @@ -169,7 +181,7 @@ function getOverwrittenAppendChildOrInsertBefore(opts: { error: () => { const errorEvent = new CustomEvent('error'); if (isFunction(element.onerror)) { - element.onerror(errorEvent); + element.onerror(patchCustomEvent(errorEvent, () => element)); } else { element.dispatchEvent(errorEvent); }