From b5d42fa6aed35be3f22f397fc60ccf943bf5a6b6 Mon Sep 17 00:00:00 2001 From: Kuitos Date: Tue, 17 Aug 2021 21:25:28 +0800 Subject: [PATCH] =?UTF-8?q?=E2=8F=AA=20revert=20document=20event=20hijacki?= =?UTF-8?q?ng=20(#1658)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sandbox/patchers/windowListener.ts | 53 ++++++-------------------- 1 file changed, 12 insertions(+), 41 deletions(-) diff --git a/src/sandbox/patchers/windowListener.ts b/src/sandbox/patchers/windowListener.ts index 58da3b4..677ddde 100644 --- a/src/sandbox/patchers/windowListener.ts +++ b/src/sandbox/patchers/windowListener.ts @@ -6,69 +6,40 @@ import { noop } from 'lodash'; -const rawWindowAddEventListener = window.addEventListener; -const rawWindowRemoveEventListener = window.removeEventListener; -const rawDocAddEventListener = document.addEventListener; -const rawDocRemoveEventListener = document.removeEventListener; +const rawAddEventListener = window.addEventListener; +const rawRemoveEventListener = window.removeEventListener; export default function patch(global: WindowProxy) { - const windowListenerMap = new Map(); - const docListenerMap = new Map(); + const listenerMap = new Map(); global.addEventListener = ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ) => { - const listeners = windowListenerMap.get(type) || []; - windowListenerMap.set(type, [...listeners, listener]); - return rawWindowAddEventListener.call(window, type, listener, options); + const listeners = listenerMap.get(type) || []; + listenerMap.set(type, [...listeners, listener]); + return rawAddEventListener.call(window, type, listener, options); }; + global.removeEventListener = ( type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions, ) => { - const storedTypeListeners = windowListenerMap.get(type); + const storedTypeListeners = listenerMap.get(type); if (storedTypeListeners && storedTypeListeners.length && storedTypeListeners.indexOf(listener) !== -1) { storedTypeListeners.splice(storedTypeListeners.indexOf(listener), 1); } - return rawWindowRemoveEventListener.call(window, type, listener, options); - }; - - document.addEventListener = ( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | AddEventListenerOptions, - ) => { - const listeners = docListenerMap.get(type) || []; - docListenerMap.set(type, [...listeners, listener]); - return rawDocAddEventListener.call(document, type, listener, options); - }; - document.removeEventListener = ( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | AddEventListenerOptions, - ) => { - const storedTypeListeners = docListenerMap.get(type); - if (storedTypeListeners && storedTypeListeners.length && storedTypeListeners.indexOf(listener) !== -1) { - storedTypeListeners.splice(storedTypeListeners.indexOf(listener), 1); - } - return rawDocRemoveEventListener.call(document, type, listener, options); + return rawRemoveEventListener.call(window, type, listener, options); }; return function free() { - windowListenerMap.forEach((listeners, type) => + listenerMap.forEach((listeners, type) => [...listeners].forEach((listener) => global.removeEventListener(type, listener)), ); - docListenerMap.forEach((listeners, type) => - [...listeners].forEach((listener) => document.removeEventListener(type, listener)), - ); - - global.addEventListener = rawWindowAddEventListener; - global.removeEventListener = rawWindowRemoveEventListener; - document.addEventListener = rawDocAddEventListener; - document.removeEventListener = rawDocRemoveEventListener; + global.addEventListener = rawAddEventListener; + global.removeEventListener = rawRemoveEventListener; return noop; };