Skip to content

Commit 5ff3b28

Browse files
committed
Cleanup and add webview.experimental.useIframes setting
1 parent 43017b1 commit 5ff3b28

File tree

5 files changed

+39
-42
lines changed

5 files changed

+39
-42
lines changed

src/vs/workbench/contrib/webview/browser/pre/host.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// @ts-check
66
(function () {
77
const id = document.location.search.match(/\bid=([\w-]+)/)[1];
8-
const noServiceWorker = /noServiceWorker/.test(document.location.search);
8+
const onElectron = /platform=electron/.test(document.location.search);
99

1010
const hostMessaging = new class HostMessaging {
1111
constructor() {
@@ -37,7 +37,7 @@
3737
}();
3838

3939
const workerReady = new Promise(async (resolveWorkerReady) => {
40-
if (noServiceWorker) {
40+
if (onElectron) {
4141
return resolveWorkerReady();
4242
}
4343

@@ -100,11 +100,15 @@
100100
postMessage: hostMessaging.postMessage.bind(hostMessaging),
101101
onMessage: hostMessaging.onMessage.bind(hostMessaging),
102102
ready: workerReady,
103-
fakeLoad: !noServiceWorker,
104-
rewriteCSP: (csp, endpoint) => {
105-
const endpointUrl = new URL(endpoint);
106-
return csp.replace(/(vscode-webview-resource|vscode-resource):(?=(\s|;|$))/g, endpointUrl.origin);
107-
}
103+
fakeLoad: !onElectron,
104+
rewriteCSP: onElectron
105+
? (csp) => {
106+
return csp.replace(/vscode-resource:(?=(\s|;|$))/g, 'vscode-webview-resource:');
107+
}
108+
: (csp, endpoint) => {
109+
const endpointUrl = new URL(endpoint);
110+
return csp.replace(/(vscode-webview-resource|vscode-resource):(?=(\s|;|$))/g, endpointUrl.origin);
111+
}
108112
};
109113

110114
(/** @type {any} */ (window)).createWebviewManager(host);

src/vs/workbench/contrib/webview/electron-browser/iframeWebviewElement.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1616
import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing';
1717
import { WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview';
1818
import { IFrameWebview } from 'vs/workbench/contrib/webview/browser/webviewElement';
19-
import { WebviewResourceRequestManager } from 'vs/workbench/contrib/webview/electron-browser/webviewResourceRequestManager';
19+
import { rewriteVsCodeResourceUrls, WebviewResourceRequestManager } from 'vs/workbench/contrib/webview/electron-browser/resourceLoading';
2020
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
2121

2222
/**
@@ -50,7 +50,7 @@ export class ElectronIframeWebview extends IFrameWebview {
5050
}
5151

5252
protected initElement() {
53-
this.element!.src = `${Schemas.vscodeWebview}://${this.id}/index.html?id=${this.id}&bnoServiceWorker`;
53+
this.element!.src = `${Schemas.vscodeWebview}://${this.id}/index.html?id=${this.id}&platform=electron`;
5454
}
5555

5656
public set contentOptions(options: WebviewContentOptions) {
@@ -79,16 +79,6 @@ export class ElectronIframeWebview extends IFrameWebview {
7979
}
8080

8181
protected preprocessHtml(value: string): string {
82-
return value
83-
.replace(/(["'])vscode-resource:(\/\/([^\s\/'"]+?)(?=\/))?([^\s'"]+?)(["'])/gi, (match, startQuote, _1, scheme, path, endQuote) => {
84-
if (scheme) {
85-
return `${startQuote}${Schemas.vscodeWebviewResource}://${this.id}/${scheme}${path}${endQuote}`;
86-
}
87-
if (!path.startsWith('//')) {
88-
// Add an empty authority if we don't already have one
89-
path = '//' + path;
90-
}
91-
return `${startQuote}${Schemas.vscodeWebviewResource}://${this.id}/file${path}${endQuote}`;
92-
});
82+
return rewriteVsCodeResourceUrls(this.id, value);
9383
}
9484
}

src/vs/workbench/contrib/webview/electron-browser/webviewResourceRequestManager.ts renamed to src/vs/workbench/contrib/webview/electron-browser/resourceLoading.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,27 @@ import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remot
1414
import { IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService';
1515
import { WebviewContentOptions, WebviewExtensionDescription } from 'vs/workbench/contrib/webview/browser/webview';
1616
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
17+
import { Schemas } from 'vs/base/common/network';
18+
19+
/**
20+
* Try to rewrite `vscode-resource:` urls in html
21+
*/
22+
export function rewriteVsCodeResourceUrls(
23+
id: string,
24+
html: string,
25+
): string {
26+
return html
27+
.replace(/(["'])vscode-resource:(\/\/([^\s\/'"]+?)(?=\/))?([^\s'"]+?)(["'])/gi, (_match, startQuote, _1, scheme, path, endQuote) => {
28+
if (scheme) {
29+
return `${startQuote}${Schemas.vscodeWebviewResource}://${id}/${scheme}${path}${endQuote}`;
30+
}
31+
if (!path.startsWith('//')) {
32+
// Add an empty authority if we don't already have one
33+
path = '//' + path;
34+
}
35+
return `${startQuote}${Schemas.vscodeWebviewResource}://${id}/file${path}${endQuote}`;
36+
});
37+
}
1738

1839
/**
1940
* Manages the loading of resources inside of a webview.

src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/t
2626
import { Webview, WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview';
2727
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
2828
import { WebviewFindDelegate, WebviewFindWidget } from '../browser/webviewFindWidget';
29-
import { WebviewResourceRequestManager } from './webviewResourceRequestManager';
29+
import { WebviewResourceRequestManager, rewriteVsCodeResourceUrls } from './resourceLoading';
3030

3131
class WebviewKeyboardHandler {
3232

@@ -250,21 +250,7 @@ export class ElectronWebviewBasedWebview extends BaseWebview<WebviewTag> impleme
250250
public set html(value: string) {
251251
this._myLogService.debug(`Webview(${this.id}): will set html`);
252252

253-
super.html = this.preprocessHtml(value);
254-
}
255-
256-
private preprocessHtml(value: string): string {
257-
return value
258-
.replace(/(["'])vscode-resource:(\/\/([^\s\/'"]+?)(?=\/))?([^\s'"]+?)(["'])/gi, (match, startQuote, _1, scheme, path, endQuote) => {
259-
if (scheme) {
260-
return `${startQuote}${Schemas.vscodeWebviewResource}://${this.id}/${scheme}${path}${endQuote}`;
261-
}
262-
if (!path.startsWith('//')) {
263-
// Add an empty authority if we don't already have one
264-
path = '//' + path;
265-
}
266-
return `${startQuote}${Schemas.vscodeWebviewResource}://${this.id}/file${path}${endQuote}`;
267-
});
253+
super.html = rewriteVsCodeResourceUrls(this.id, value);
268254
}
269255

270256
public mountTo(parent: HTMLElement) {

src/vs/workbench/contrib/webview/electron-browser/webviewService.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,8 @@ export class ElectronWebviewService implements IWebviewService {
3232
contentOptions: WebviewContentOptions,
3333
extension: WebviewExtensionDescription | undefined,
3434
): WebviewElement {
35-
const useExternalEndpoint = this._configService.getValue<string>('webview.experimental.useExternalEndpoint');
36-
if (useExternalEndpoint) {
37-
return this._instantiationService.createInstance(ElectronIframeWebview, id, options, contentOptions, extension, this._webviewThemeDataProvider);
38-
} else {
39-
return this._instantiationService.createInstance(ElectronWebviewBasedWebview, id, options, contentOptions, extension, this._webviewThemeDataProvider);
40-
}
35+
const useIframes = this._configService.getValue<string>('webview.experimental.useIframes');
36+
return this._instantiationService.createInstance(useIframes ? ElectronIframeWebview : ElectronWebviewBasedWebview, id, options, contentOptions, extension, this._webviewThemeDataProvider);
4137
}
4238

4339
createWebviewOverlay(

0 commit comments

Comments
 (0)