diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html
index 829ce5e4aea..097dd15b3c5 100644
--- a/src/vs/code/browser/workbench/workbench.html
+++ b/src/vs/code/browser/workbench/workbench.html
@@ -10,7 +10,7 @@
+ content="default-src 'none'; img-src 'self' https: data: blob: vscode-remote:; media-src 'none'; frame-src 'self' {{WEBVIEW_ENDPOINT}} https://*.vscode-webview-test.com; script-src 'self' https://az416426.vo.msecnd.net 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' ws: wss: https:; font-src 'self' blob: vscode-remote:;">
diff --git a/src/vs/code/electron-browser/workbench/workbench.html b/src/vs/code/electron-browser/workbench/workbench.html
index 7070141cca2..dfac360344a 100644
--- a/src/vs/code/electron-browser/workbench/workbench.html
+++ b/src/vs/code/electron-browser/workbench/workbench.html
@@ -3,7 +3,7 @@
-
+
diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts
index 22a9a4f7532..5e5df2a02cf 100644
--- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts
+++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts
@@ -45,7 +45,9 @@ export class IFrameWebview extends Disposable implements Webview {
@IConfigurationService private readonly _configurationService: IConfigurationService,
) {
super();
- if (typeof environmentService.webviewEndpoint !== 'string') {
+ const useExternalEndpoint = this._configurationService.getValue('webview.experimental.useExternalEndpoint');
+
+ if (typeof environmentService.webviewEndpoint !== 'string' && !useExternalEndpoint) {
throw new Error('To use iframe based webviews, you must configure `environmentService.webviewEndpoint`');
}
@@ -142,7 +144,9 @@ export class IFrameWebview extends Disposable implements Webview {
}
private get endpoint(): string {
- const endpoint = this.environmentService.webviewEndpoint!.replace('{{uuid}}', this.id);
+ const useExternalEndpoint = this._configurationService.getValue('webview.experimental.useExternalEndpoint');
+ const baseEndpoint = useExternalEndpoint ? 'https://{{uuid}}.vscode-webview-test.com/8fa811108f0f0524c473020ef57b6620f6c201e1' : this.environmentService.webviewEndpoint!;
+ const endpoint = baseEndpoint.replace('{{uuid}}', this.id);
if (endpoint[endpoint.length - 1] === '/') {
return endpoint.slice(0, endpoint.length - 1);
}
diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts
index 6533704e2ab..dcce256690f 100644
--- a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts
+++ b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts
@@ -3,8 +3,10 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
+import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { DynamicWebviewEditorOverlay } from 'vs/workbench/contrib/webview/browser/DynamicWebviewEditorOverlay';
+import { IFrameWebview } from 'vs/workbench/contrib/webview/browser/webviewElement';
import { IWebviewService, WebviewContentOptions, WebviewEditorOverlay, WebviewElement, WebviewOptions } from 'vs/workbench/contrib/webview/common/webview';
import { ElectronWebviewBasedWebview } from 'vs/workbench/contrib/webview/electron-browser/webviewElement';
@@ -13,14 +15,20 @@ export class ElectronWebviewService implements IWebviewService {
constructor(
@IInstantiationService private readonly _instantiationService: IInstantiationService,
+ @IConfigurationService private readonly _configService: IConfigurationService,
) { }
createWebview(
- _id: string,
+ id: string,
options: WebviewOptions,
contentOptions: WebviewContentOptions
): WebviewElement {
- return this._instantiationService.createInstance(ElectronWebviewBasedWebview, options, contentOptions);
+ const useExternalEndpoint = this._configService.getValue('webview.experimental.useExternalEndpoint');
+ if (useExternalEndpoint) {
+ return this._instantiationService.createInstance(IFrameWebview, id, options, contentOptions);
+ } else {
+ return this._instantiationService.createInstance(ElectronWebviewBasedWebview, options, contentOptions);
+ }
}
createWebviewEditorOverlay(