Skip to content

Commit 0a27c05

Browse files
committed
Dispose tracked objects when panel is disposed
This will change the `AbstractWebview` to dispose its tracked objects (using `this.push`) when the panel is disposed rather than when the view is disposed. This makes `this.push` actually useful in a view. Before, the objects would only get disposed when the extension itself was disposed.
1 parent 66fdabf commit 0a27c05

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

extensions/ql-vscode/src/common/vscode/abstract-webview.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { join } from "path";
1010

1111
import { App } from "../app";
12-
import { DisposableObject, DisposeHandler } from "../disposable-object";
12+
import { Disposable } from "../disposable-object";
1313
import { tmpDir } from "../../tmp-dir";
1414
import { getHtmlForWebview, WebviewMessage, WebviewKind } from "./webview-html";
1515

@@ -27,16 +27,16 @@ export type WebviewPanelConfig = {
2727
export abstract class AbstractWebview<
2828
ToMessage extends WebviewMessage,
2929
FromMessage extends WebviewMessage,
30-
> extends DisposableObject {
30+
> {
3131
protected panel: WebviewPanel | undefined;
3232
protected panelLoaded = false;
3333
protected panelLoadedCallBacks: Array<() => void> = [];
3434

3535
private panelResolves?: Array<(panel: WebviewPanel) => void>;
3636

37-
constructor(protected readonly app: App) {
38-
super();
39-
}
37+
private disposables: Disposable[] = [];
38+
39+
constructor(protected readonly app: App) {}
4040

4141
public async restoreView(panel: WebviewPanel): Promise<void> {
4242
this.panel = panel;
@@ -101,6 +101,7 @@ export abstract class AbstractWebview<
101101
this.panel = undefined;
102102
this.panelLoaded = false;
103103
this.onPanelDispose();
104+
this.disposeAll();
104105
}, null),
105106
);
106107

@@ -150,8 +151,27 @@ export abstract class AbstractWebview<
150151
return panel.webview.postMessage(msg);
151152
}
152153

153-
public dispose(disposeHandler?: DisposeHandler) {
154+
public dispose() {
154155
this.panel?.dispose();
155-
super.dispose(disposeHandler);
156+
this.disposeAll();
157+
}
158+
159+
private disposeAll() {
160+
while (this.disposables.length > 0) {
161+
const disposable = this.disposables.pop()!;
162+
disposable.dispose();
163+
}
164+
}
165+
166+
/**
167+
* Adds `obj` to a list of objects to dispose when the panel is disposed. Objects added by `push` are
168+
* disposed in reverse order of being added.
169+
* @param obj The object to take ownership of.
170+
*/
171+
protected push<T extends Disposable>(obj: T): T {
172+
if (obj !== undefined) {
173+
this.disposables.push(obj);
174+
}
175+
return obj;
156176
}
157177
}

0 commit comments

Comments
 (0)