revert document event hijacking (#1658)

This commit is contained in:
Kuitos 2021-08-17 21:25:28 +08:00 committed by GitHub
parent a34e9b14bb
commit b5d42fa6ae

View File

@ -6,69 +6,40 @@
import { noop } from 'lodash'; import { noop } from 'lodash';
const rawWindowAddEventListener = window.addEventListener; const rawAddEventListener = window.addEventListener;
const rawWindowRemoveEventListener = window.removeEventListener; const rawRemoveEventListener = window.removeEventListener;
const rawDocAddEventListener = document.addEventListener;
const rawDocRemoveEventListener = document.removeEventListener;
export default function patch(global: WindowProxy) { export default function patch(global: WindowProxy) {
const windowListenerMap = new Map<string, EventListenerOrEventListenerObject[]>(); const listenerMap = new Map<string, EventListenerOrEventListenerObject[]>();
const docListenerMap = new Map<string, EventListenerOrEventListenerObject[]>();
global.addEventListener = ( global.addEventListener = (
type: string, type: string,
listener: EventListenerOrEventListenerObject, listener: EventListenerOrEventListenerObject,
options?: boolean | AddEventListenerOptions, options?: boolean | AddEventListenerOptions,
) => { ) => {
const listeners = windowListenerMap.get(type) || []; const listeners = listenerMap.get(type) || [];
windowListenerMap.set(type, [...listeners, listener]); listenerMap.set(type, [...listeners, listener]);
return rawWindowAddEventListener.call(window, type, listener, options); return rawAddEventListener.call(window, type, listener, options);
}; };
global.removeEventListener = ( global.removeEventListener = (
type: string, type: string,
listener: EventListenerOrEventListenerObject, listener: EventListenerOrEventListenerObject,
options?: boolean | AddEventListenerOptions, options?: boolean | AddEventListenerOptions,
) => { ) => {
const storedTypeListeners = windowListenerMap.get(type); const storedTypeListeners = listenerMap.get(type);
if (storedTypeListeners && storedTypeListeners.length && storedTypeListeners.indexOf(listener) !== -1) { if (storedTypeListeners && storedTypeListeners.length && storedTypeListeners.indexOf(listener) !== -1) {
storedTypeListeners.splice(storedTypeListeners.indexOf(listener), 1); storedTypeListeners.splice(storedTypeListeners.indexOf(listener), 1);
} }
return rawWindowRemoveEventListener.call(window, type, listener, options); return rawRemoveEventListener.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 function free() { return function free() {
windowListenerMap.forEach((listeners, type) => listenerMap.forEach((listeners, type) =>
[...listeners].forEach((listener) => global.removeEventListener(type, listener)), [...listeners].forEach((listener) => global.removeEventListener(type, listener)),
); );
docListenerMap.forEach((listeners, type) => global.addEventListener = rawAddEventListener;
[...listeners].forEach((listener) => document.removeEventListener(type, listener)), global.removeEventListener = rawRemoveEventListener;
);
global.addEventListener = rawWindowAddEventListener;
global.removeEventListener = rawWindowRemoveEventListener;
document.addEventListener = rawDocAddEventListener;
document.removeEventListener = rawDocRemoveEventListener;
return noop; return noop;
}; };