diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 308a8e73d36d985d19414edfcf0d323a8ea77f5d..70bfb4bee453204d6ae23df790a4fbd5e46df496 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1090,6 +1090,7 @@ declare module 'vscode' { export function registerWebviewEditorProvider( viewType: string, provider: WebviewEditorProvider, + options?: WebviewPanelOptions ): Disposable; } diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index 6e40d8382e1ec488ebf74e866a5944c4755ceadc..e9f033115d6692a3e3444f3fd9879e1077254175 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -258,7 +258,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews this._revivers.delete(viewType); } - public $registerEditorProvider(viewType: string, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): void { + public $registerEditorProvider(viewType: string, extensionId: ExtensionIdentifier, extensionLocation: UriComponents, options: modes.IWebviewPanelOptions): void { if (this._editorProviders.has(viewType)) { throw new Error(`Provider for ${viewType} already registered`); } @@ -274,6 +274,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews this._webviewInputs.add(handle, webviewInput); this.hookupWebviewEventDelegate(handle, webviewInput); + webviewInput.webview.options = options; webviewInput.webview.extension = extension; if (webviewInput instanceof CustomFileEditorInput) { diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 1bf33f6314d4cbafa00bc74d2103364462ac02d9..138a0d12284656e75231354fb6224af480cced3a 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -530,9 +530,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I registerWebviewPanelSerializer: (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviews.registerWebviewPanelSerializer(extension, viewType, serializer); }, - registerWebviewEditorProvider: (viewType: string, provider: vscode.WebviewEditorProvider) => { + registerWebviewEditorProvider: (viewType: string, provider: vscode.WebviewEditorProvider, options?: vscode.WebviewPanelOptions) => { checkProposedApiEnabled(extension); - return extHostWebviews.registerWebviewEditorProvider(extension, viewType, provider); + return extHostWebviews.registerWebviewEditorProvider(extension, viewType, provider, options); }, registerDecorationProvider(provider: vscode.DecorationProvider) { checkProposedApiEnabled(extension); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index b5ee0a9c9f20484ffddf5b2a485602bdce059f06..a99e32f6bf8a326ab3404e1197db7ec5f1292c22 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -556,7 +556,7 @@ export interface MainThreadWebviewsShape extends IDisposable { $registerSerializer(viewType: string): void; $unregisterSerializer(viewType: string): void; - $registerEditorProvider(viewType: string, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): void; + $registerEditorProvider(viewType: string, extensionId: ExtensionIdentifier, extensionLocation: UriComponents, options: modes.IWebviewPanelOptions): void; $unregisterEditorProvider(viewType: string): void; } diff --git a/src/vs/workbench/api/common/extHostWebview.ts b/src/vs/workbench/api/common/extHostWebview.ts index 42f77e01117d2e64fd80936a2b27c4b36c665546..92f087f74db12e319169cd1972b0c2bea756795a 100644 --- a/src/vs/workbench/api/common/extHostWebview.ts +++ b/src/vs/workbench/api/common/extHostWebview.ts @@ -318,13 +318,14 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { extension: IExtensionDescription, viewType: string, provider: vscode.WebviewEditorProvider, + options?: vscode.WebviewPanelOptions, ): vscode.Disposable { if (this._editorProviders.has(viewType)) { throw new Error(`Editor provider for '${viewType}' already registered`); } this._editorProviders.set(viewType, { extension, provider, }); - this._proxy.$registerEditorProvider(viewType, extension.identifier, extension.extensionLocation); + this._proxy.$registerEditorProvider(viewType, extension.identifier, extension.extensionLocation, options || {}); return new Disposable(() => { this._editorProviders.delete(viewType); diff --git a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts index a977b3d510411b32a555700ab607888289910f68..299ecab6654e25043985e3119755149767eb6f03 100644 --- a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts +++ b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts @@ -26,17 +26,23 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewEd private _state: string | undefined = undefined; private _extension: WebviewExtensionDescription | undefined; + private _contentOptions: WebviewContentOptions; + private _options: WebviewOptions; + private _owner: any = undefined; public constructor( private readonly id: string, - public readonly options: WebviewOptions, - private _contentOptions: WebviewContentOptions, + initialOptions: WebviewOptions, + initialContentOptions: WebviewContentOptions, @IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService, @IWebviewService private readonly _webviewService: IWebviewService ) { super(); + this._options = initialOptions; + this._contentOptions = initialContentOptions; + this._register(toDisposable(() => this.container.remove())); } @@ -64,7 +70,7 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewEd } this._owner = undefined; this.container.style.visibility = 'hidden'; - if (!this.options.retainContextWhenHidden) { + if (!this._options.retainContextWhenHidden) { this._webview.clear(); this._webviewEvents.clear(); } @@ -85,12 +91,12 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewEd private show() { if (!this._webview.value) { - const webview = this._webviewService.createWebview(this.id, this.options, this._contentOptions); + const webview = this._webviewService.createWebview(this.id, this._options, this._contentOptions); this._webview.value = webview; webview.state = this._state; webview.html = this._html; webview.extension = this._extension; - if (this.options.tryRestoreScrollPosition) { + if (this._options.tryRestoreScrollPosition) { webview.initialScrollProgress = this._initialScrollProgress; } this._webview.value.mountTo(this.container); @@ -136,6 +142,9 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewEd this.withWebview(webview => webview.state = value); } + public get options(): WebviewOptions { return this._options; } + public set options(value: WebviewOptions) { this._options = value; } + public get contentOptions(): WebviewContentOptions { return this._contentOptions; } public set contentOptions(value: WebviewContentOptions) { this._contentOptions = value; diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index cca4ac9111eff84df0bca083e9013967462fdff3..a26adfb756dacf9cc02fa603af3faa06f5db4447 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -90,7 +90,7 @@ export interface WebviewElement extends Webview { export interface WebviewEditorOverlay extends Webview { readonly container: HTMLElement; - readonly options: WebviewOptions; + options: WebviewOptions; claim(owner: any): void; release(owner: any): void;