Skip to content

Commit ec8016f

Browse files
committed
Cache webview view title across reloads
Fixes #105867
1 parent cf38af8 commit ec8016f

File tree

4 files changed

+30
-9
lines changed

4 files changed

+30
-9
lines changed

src/vs/workbench/api/browser/mainThreadWebviewViews.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export class MainThreadWebviewsViews extends Disposable implements extHostProtoc
7878
});
7979

8080
try {
81-
await this._proxy.$resolveWebviewView(handle, viewType, state, cancellation);
81+
await this._proxy.$resolveWebviewView(handle, viewType, webviewView.title, state, cancellation);
8282
} catch (error) {
8383
onUnexpectedError(error);
8484
webviewView.webview.html = this.mainThreadWebviews.getWebviewResolvedFailedContent(viewType);

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ export interface ExtHostCustomEditorsShape {
686686
}
687687

688688
export interface ExtHostWebviewViewsShape {
689-
$resolveWebviewView(webviewHandle: WebviewHandle, viewType: string, state: any, cancellation: CancellationToken): Promise<void>;
689+
$resolveWebviewView(webviewHandle: WebviewHandle, viewType: string, title: string | undefined, state: any, cancellation: CancellationToken): Promise<void>;
690690

691691
$onDidChangeWebviewViewVisibility(webviewHandle: WebviewHandle, visible: boolean): void;
692692

src/vs/workbench/api/common/extHostWebviewView.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ class ExtHostWebviewView extends Disposable implements vscode.WebviewView {
2929
handle: extHostProtocol.WebviewHandle,
3030
proxy: extHostProtocol.MainThreadWebviewViewsShape,
3131
viewType: string,
32+
title: string | undefined,
3233
webview: ExtHostWebview,
3334
isVisible: boolean,
3435
) {
3536
super();
3637

3738
this.#viewType = viewType;
39+
this.#title = title;
3840
this.#handle = handle;
3941
this.#proxy = proxy;
4042
this.#webview = webview;
@@ -153,6 +155,7 @@ export class ExtHostWebviewViews implements extHostProtocol.ExtHostWebviewViewsS
153155
async $resolveWebviewView(
154156
webviewHandle: string,
155157
viewType: string,
158+
title: string | undefined,
156159
state: any,
157160
cancellation: CancellationToken,
158161
): Promise<void> {
@@ -164,7 +167,7 @@ export class ExtHostWebviewViews implements extHostProtocol.ExtHostWebviewViewsS
164167
const { provider, extension } = entry;
165168

166169
const webview = this._extHostWebview.createNewWebview(webviewHandle, { /* todo */ }, extension);
167-
const revivedView = new ExtHostWebviewView(webviewHandle, this._proxy, viewType, webview, true);
170+
const revivedView = new ExtHostWebviewView(webviewHandle, this._proxy, viewType, title, webview, true);
168171

169172
this._webviewViews.set(webviewHandle, revivedView);
170173

src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
2828

2929
declare const ResizeObserver: any;
3030

31-
const webviewStateKey = 'webviewState';
31+
const storageKeys = {
32+
webviewState: 'webviewState',
33+
title: 'title'
34+
} as const;
3235

3336
export class WebviewViewPane extends ViewPane {
3437

@@ -38,6 +41,9 @@ export class WebviewViewPane extends ViewPane {
3841
private _container?: HTMLElement;
3942
private _resizeObserver?: any;
4043

44+
private readonly defaultTitle: string;
45+
private setTitle: string | undefined;
46+
4147
private readonly memento: Memento;
4248
private readonly viewState: MementoObject;
4349

@@ -60,10 +66,16 @@ export class WebviewViewPane extends ViewPane {
6066
@IViewsService private readonly viewService: IViewsService,
6167
) {
6268
super({ ...options, titleMenuId: MenuId.ViewTitle }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
69+
this.defaultTitle = this.title;
6370

6471
this.memento = new Memento(`webviewView.${this.id}`, storageService);
6572
this.viewState = this.memento.getMemento(StorageScope.WORKSPACE);
6673

74+
const storedTitle = this.viewState[storageKeys.title];
75+
if (typeof storedTitle === 'string') {
76+
this.updateTitle(storedTitle);
77+
}
78+
6779
this._register(this.onDidChangeBodyVisibility(() => this.updateTreeVisibility()));
6880
this.updateTreeVisibility();
6981
}
@@ -108,8 +120,9 @@ export class WebviewViewPane extends ViewPane {
108120

109121
public saveState() {
110122
if (this._webview) {
111-
this.viewState[webviewStateKey] = this._webview.state;
123+
this.viewState[storageKeys.webviewState] = this._webview.state;
112124
}
125+
this.viewState[storageKeys.title] = this.setTitle;
113126

114127
this.memento.saveMemento();
115128
super.saveState();
@@ -142,15 +155,15 @@ export class WebviewViewPane extends ViewPane {
142155

143156
const webviewId = `webviewView-${this.id.replace(/[^a-z0-9]/gi, '-')}`.toLowerCase();
144157
const webview = this.webviewService.createWebviewOverlay(webviewId, {}, {}, undefined);
145-
webview.state = this.viewState['webviewState'];
158+
webview.state = this.viewState[storageKeys.webviewState];
146159
this._webview = webview;
147160

148161
this._register(toDisposable(() => {
149162
this._webview?.release(this);
150163
}));
151164

152165
this._register(webview.onDidUpdateState(() => {
153-
this.viewState[webviewStateKey] = webview.state;
166+
this.viewState[storageKeys.webviewState] = webview.state;
154167
}));
155168

156169
const source = this._register(new CancellationTokenSource());
@@ -164,8 +177,8 @@ export class WebviewViewPane extends ViewPane {
164177
onDidChangeVisibility: this.onDidChangeBodyVisibility,
165178
onDispose: this.onDispose,
166179

167-
get title() { return self.title; },
168-
set title(value: string) { self.updateTitle(value); },
180+
get title(): string | undefined { return self.setTitle; },
181+
set title(value: string | undefined) { self.updateTitle(value); },
169182

170183
get description(): string | undefined { return self.titleDescription; },
171184
set description(value: string | undefined) { self.updateTitleDescription(value); },
@@ -180,6 +193,11 @@ export class WebviewViewPane extends ViewPane {
180193
}
181194
}
182195

196+
protected updateTitle(value: string | undefined) {
197+
this.setTitle = value;
198+
super.updateTitle(typeof value === 'string' ? value : this.defaultTitle);
199+
}
200+
183201
private async withProgress(task: () => Promise<void>): Promise<void> {
184202
return this.progressService.withProgress({ location: this.id, delay: 500 }, task);
185203
}

0 commit comments

Comments
 (0)