diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index 030049a1ec5..a3180be6253 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -286,7 +286,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma return this.registerEditorProvider(ModelType.Custom, extensionData, viewType, options); } - public registerEditorProvider( + private registerEditorProvider( modelType: ModelType, extensionData: extHostProtocol.WebviewExtensionDescription, viewType: string, @@ -313,7 +313,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma const resource = webviewInput.resource; const modelRef = await this.getOrCreateCustomEditorModel(modelType, webviewInput, resource, viewType); - webviewInput.onDisposeWebview(() => { + webviewInput.webview.onDispose(() => { modelRef.dispose(); }); @@ -383,7 +383,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma input.onDispose(() => { disposables.dispose(); }); - input.onDisposeWebview(() => { + input.webview.onDispose(() => { this._proxy.$onDidDisposeWebviewPanel(handle).finally(() => { this._webviewInputs.delete(handle); }); diff --git a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts index 2b251b0a959..d7f77621d45 100644 --- a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts +++ b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts @@ -3,15 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Dimension } from 'vs/base/browser/dom'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { memoize } from 'vs/base/common/decorators'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { IWebviewService, Webview, WebviewContentOptions, WebviewOverlay, WebviewElement, WebviewOptions, WebviewExtensionDescription, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from 'vs/workbench/contrib/webview/browser/webview'; +import { IWebviewService, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE, Webview, WebviewContentOptions, WebviewElement, WebviewExtensionDescription, WebviewOptions, WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; -import { Dimension } from 'vs/base/browser/dom'; -import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; /** * Webview editor overlay that creates and destroys the underlying webview as needed. @@ -52,8 +52,15 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv this._contentOptions = initialContentOptions; this._findWidgetVisible = KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE.bindTo(_contextKeyService); + } - this._register(toDisposable(() => this.container.remove())); + private readonly _onDispose = this._register(new Emitter()); + public onDispose = this._onDispose.event; + + dispose() { + this.container.remove(); + this._onDispose.fire(); + super.dispose(); } @memoize diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index d9fa87f548a..6502720cd90 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -71,7 +71,6 @@ export interface WebviewExtensionDescription { } export interface Webview extends IDisposable { - html: string; contentOptions: WebviewContentOptions; extension: WebviewExtensionDescription | undefined; @@ -115,6 +114,8 @@ export interface WebviewOverlay extends Webview { readonly container: HTMLElement; options: WebviewOptions; + readonly onDispose: Event; + claim(owner: any): void; release(owner: any): void; diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts index 3689cebcca2..98ca51637c8 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Emitter } from 'vs/base/common/event'; import { Lazy } from 'vs/base/common/lazy'; import { URI } from 'vs/base/common/uri'; import { EditorInput, GroupIdentifier, IEditorInput, Verbosity } from 'vs/workbench/common/editor'; @@ -22,9 +21,6 @@ export class WebviewInput extends EditorInput { private readonly _webview: Lazy; private _didSomeoneTakeMyWebview = false; - private readonly _onDisposeWebview = this._register(new Emitter()); - readonly onDisposeWebview = this._onDisposeWebview.event; - get resource() { return URI.from({ scheme: WebviewPanelResourceScheme, @@ -48,7 +44,6 @@ export class WebviewInput extends EditorInput { if (!this.isDisposed()) { if (!this._didSomeoneTakeMyWebview) { this._webview?.rawValue?.dispose(); - this._onDisposeWebview.fire(); } } super.dispose();