Skip to content

Commit a051032

Browse files
committed
Revert "Try using AbortController for disposable dom listeners"
This reverts commit 508486f.
1 parent d5a5929 commit a051032

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

src/vs/base/browser/dom.ts

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,40 @@ export function isInDOM(node: Node | null): boolean {
2929
return node?.isConnected ?? false;
3030
}
3131

32-
export function addDisposableListener<K extends keyof GlobalEventHandlersEventMap>(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable;
33-
export function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable;
34-
export function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {
35-
let controller: AbortController | undefined = new AbortController();
32+
class DomListener implements IDisposable {
3633

37-
const opts: AddEventListenerOptions = typeof useCaptureOrOptions === 'boolean'
38-
? { capture: useCaptureOrOptions, signal: controller.signal }
39-
: { signal: controller.signal, ...(useCaptureOrOptions ?? {}) };
34+
private _handler: (e: any) => void;
35+
private _node: EventTarget;
36+
private readonly _type: string;
37+
private readonly _options: boolean | AddEventListenerOptions;
4038

41-
node.addEventListener(type, handler, opts);
42-
return toDisposable(() => {
43-
controller?.abort();
44-
controller = undefined;
45-
});
39+
constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {
40+
this._node = node;
41+
this._type = type;
42+
this._handler = handler;
43+
this._options = (options || false);
44+
this._node.addEventListener(this._type, this._handler, this._options);
45+
}
46+
47+
public dispose(): void {
48+
if (!this._handler) {
49+
// Already disposed
50+
return;
51+
}
52+
53+
this._node.removeEventListener(this._type, this._handler, this._options);
54+
55+
// Prevent leakers from holding on to the dom or handler func
56+
this._node = null!;
57+
this._handler = null!;
58+
}
59+
}
60+
61+
export function addDisposableListener<K extends keyof GlobalEventHandlersEventMap>(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;
62+
export function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;
63+
export function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;
64+
export function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {
65+
return new DomListener(node, type, handler, useCaptureOrOptions);
4666
}
4767

4868
export interface IAddStandardDisposableListenerSignature {

0 commit comments

Comments
 (0)