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';
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<string, EventListenerOrEventListenerObject[]>();
const docListenerMap = new Map<string, EventListenerOrEventListenerObject[]>();
const listenerMap = new Map<string, EventListenerOrEventListenerObject[]>();
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;
};