diff --git a/src/vs/workbench/api/common/extHostWebview.ts b/src/vs/workbench/api/common/extHostWebview.ts index e5dc3c670d5..1411775a7a8 100644 --- a/src/vs/workbench/api/common/extHostWebview.ts +++ b/src/vs/workbench/api/common/extHostWebview.ts @@ -54,6 +54,8 @@ export class ExtHostWebview implements vscode.Webview { /* internal */ readonly _onDidDispose: Event = this.#onDidDisposeEmitter.event; public dispose() { + this.#isDisposed = true; + this.#onDidDisposeEmitter.fire(); this.#onDidDisposeEmitter.dispose(); @@ -99,8 +101,10 @@ export class ExtHostWebview implements vscode.Webview { this.#options = newOptions; } - public postMessage(message: any): Promise { - this.assertNotDisposed(); + public async postMessage(message: any): Promise { + if (this.#isDisposed) { + return false; + } return this.#proxy.$postMessage(this.#handle, message); } diff --git a/src/vs/workbench/api/common/extHostWebviewView.ts b/src/vs/workbench/api/common/extHostWebviewView.ts index 9cbff1880d5..a9f3db59641 100644 --- a/src/vs/workbench/api/common/extHostWebviewView.ts +++ b/src/vs/workbench/api/common/extHostWebviewView.ts @@ -51,6 +51,8 @@ class ExtHostWebviewView extends Disposable implements vscode.WebviewView { this.#isDisposed = true; this.#onDidDispose.fire(); + this.#webview.dispose(); + super.dispose(); } @@ -186,6 +188,8 @@ export class ExtHostWebviewViews implements extHostProtocol.ExtHostWebviewViewsS const webviewView = this.getWebviewView(webviewHandle); this._webviewViews.delete(webviewHandle); webviewView.dispose(); + + this._extHostWebview.deleteWebview(webviewHandle); } private getWebviewView(handle: string): ExtHostWebviewView { diff --git a/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts b/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts index 8e2849173f7..c4b7399bdff 100644 --- a/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts +++ b/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts @@ -89,6 +89,8 @@ export class WebviewViewPane extends ViewPane { dispose() { this._onDispose.fire(); + this._webview?.dispose(); + super.dispose(); }