diff --git a/extensions/ql-vscode/src/abstract-webview.ts b/extensions/ql-vscode/src/abstract-webview.ts index 4206f3303e7..1a0f68a4fda 100644 --- a/extensions/ql-vscode/src/abstract-webview.ts +++ b/extensions/ql-vscode/src/abstract-webview.ts @@ -9,7 +9,7 @@ import { } from 'vscode'; import * as path from 'path'; -import { DisposableObject } from './pure/disposable-object'; +import { DisposableObject, DisposeHandler } from './pure/disposable-object'; import { tmpDir } from './helpers'; import { getHtmlForWebview, WebviewMessage, WebviewView } from './interface-utils'; @@ -126,4 +126,9 @@ export abstract class AbstractWebview { return this.getPanel().webview.postMessage(msg); } + + public dispose(disposeHandler?: DisposeHandler) { + this.panel?.dispose(); + super.dispose(disposeHandler); + } } diff --git a/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts b/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts index 2622f30be06..9f1d591bc2d 100644 --- a/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts +++ b/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts @@ -27,7 +27,6 @@ import { createTimestampFile, showAndLogErrorMessage } from '../helpers'; import { QueryStatus } from '../query-status'; import * as fs from 'fs-extra'; - export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager { private readonly _onVariantAnalysisAdded = this.push(new EventEmitter()); public readonly onVariantAnalysisAdded = this._onVariantAnalysisAdded.event; @@ -75,6 +74,9 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA this.variantAnalysisResultsManager.removeAnalysisResults(variantAnalysis); await this.removeStorageDirectory(variantAnalysis.id); this.variantAnalyses.delete(variantAnalysis.id); + + // This will automatically unregister the view + this.views.get(variantAnalysis.id)?.dispose(); } private async removeStorageDirectory(variantAnalysisId: number) { @@ -88,7 +90,7 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA } if (!this.views.has(variantAnalysisId)) { // The view will register itself with the manager, so we don't need to do anything here. - this.push(new VariantAnalysisView(this.ctx, variantAnalysisId, this)); + this.track(new VariantAnalysisView(this.ctx, variantAnalysisId, this)); } const variantAnalysisView = this.views.get(variantAnalysisId)!; @@ -106,6 +108,7 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA public unregisterView(view: VariantAnalysisView): void { this.views.delete(view.variantAnalysisId); + this.disposeAndStopTracking(view); } public getView(variantAnalysisId: number): VariantAnalysisView | undefined {