From 5ec2e40b21a4cd5ce6a5ed4eb3f509dc280a0d53 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 25 Nov 2019 22:37:22 -0800 Subject: [PATCH] Fixing webview getting disposed after rename For #83961 --- .../workbench/api/browser/mainThreadWebview.ts | 16 +++++++++++----- .../customEditor/browser/customEditorInput.ts | 5 +++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index e9889040ffc..4dd8f594288 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { onUnexpectedError } from 'vs/base/common/errors'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { isWeb } from 'vs/base/common/platform'; import { startsWith } from 'vs/base/common/strings'; @@ -330,14 +330,20 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma } private hookupWebviewEventDelegate(handle: extHostProtocol.WebviewPanelHandle, input: WebviewInput) { - input.webview.onDidClickLink((uri: URI) => this.onDidClickLink(handle, uri)); - input.webview.onMessage((message: any) => this._proxy.$onMessage(handle, message)); - input.onDisposeWebview(() => { + const disposables = new DisposableStore(); + + disposables.add(input.webview.onDidClickLink((uri: URI) => this.onDidClickLink(handle, uri))); + disposables.add(input.webview.onMessage((message: any) => { this._proxy.$onMessage(handle, message); })); + disposables.add(input.onDisposeWebview(() => { this._proxy.$onDidDisposeWebviewPanel(handle).finally(() => { this._webviewInputs.delete(handle); }); + })); + disposables.add(input.webview.onMissingCsp((extension: ExtensionIdentifier) => this._proxy.$onMissingCsp(handle, extension.value))); + + input.onDispose(() => { + disposables.dispose(); }); - input.webview.onMissingCsp((extension: ExtensionIdentifier) => this._proxy.$onMissingCsp(handle, extension.value)); } private updateWebviewViewStates() { diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts index 673d8f3b96d..78cba9eadda 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts @@ -7,7 +7,9 @@ import { memoize } from 'vs/base/common/decorators'; import { Lazy } from 'vs/base/common/lazy'; import { basename } from 'vs/base/common/path'; import { isEqual } from 'vs/base/common/resources'; +import { assertIsDefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; +import { generateUuid } from 'vs/base/common/uuid'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IEditorModel, ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -18,7 +20,6 @@ import { ICustomEditorModel, ICustomEditorService } from 'vs/workbench/contrib/c import { WebviewEditorOverlay } from 'vs/workbench/contrib/webview/browser/webview'; import { IWebviewWorkbenchService, LazilyResolvedWebviewEditorInput } from 'vs/workbench/contrib/webview/browser/webviewWorkbenchService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { assertIsDefined } from 'vs/base/common/types'; export class CustomFileEditorInput extends LazilyResolvedWebviewEditorInput { @@ -163,7 +164,7 @@ export class CustomFileEditorInput extends LazilyResolvedWebviewEditorInput { return this.instantiationService.createInstance(CustomFileEditorInput, uri, this.viewType, - this.id, + generateUuid(), new Lazy(() => webview)); } } -- GitLab