⏪ revert document event hijacking (#1658)
This commit is contained in:
parent
a34e9b14bb
commit
b5d42fa6ae
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user