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