diff --git a/src/vs/workbench/api/common/extHostWebview.ts b/src/vs/workbench/api/common/extHostWebview.ts index f3717e325c8..7d43a551a1c 100644 --- a/src/vs/workbench/api/common/extHostWebview.ts +++ b/src/vs/workbench/api/common/extHostWebview.ts @@ -41,8 +41,7 @@ export class ExtHostWebview implements vscode.Webview { public get cspSource(): string { return this._initData.webviewCspSource - .replace('{{uuid}}', this._handle) - .replace('{{commit}}', this._initData.commit || '211fa02efe8c041fd7baa8ec3dce199d5185aa44'); + .replace('{{uuid}}', this._handle); } public get html(): string { diff --git a/src/vs/workbench/api/common/shared/webview.ts b/src/vs/workbench/api/common/shared/webview.ts index dc78561bff0..b496a453a2f 100644 --- a/src/vs/workbench/api/common/shared/webview.ts +++ b/src/vs/workbench/api/common/shared/webview.ts @@ -7,7 +7,6 @@ import { URI } from 'vs/base/common/uri'; import * as vscode from 'vscode'; export interface WebviewInitData { - readonly commit?: string; readonly webviewResourceRoot: string; readonly webviewCspSource: string; } @@ -18,7 +17,6 @@ export function asWebviewUri( resource: vscode.Uri, ): vscode.Uri { const uri = initData.webviewResourceRoot - .replace('{{commit}}', initData.commit || '211fa02efe8c041fd7baa8ec3dce199d5185aa44') .replace('{{resource}}', resource.toString().replace(/^\S+?:/, '')) .replace('{{uuid}}', uuid); return URI.parse(uri); diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 45eda337065..db8dca5e362 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -6,11 +6,11 @@ import { addClass, addDisposableListener } from 'vs/base/browser/dom'; import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; +import { isWeb } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; -import { IProductService } from 'vs/platform/product/common/productService'; import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; import { Webview, WebviewContentOptions, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; @@ -19,7 +19,6 @@ import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/p import { loadLocalResource } from 'vs/workbench/contrib/webview/common/resourceLoader'; import { getWebviewThemeData } from 'vs/workbench/contrib/webview/common/themeing'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { isWeb } from 'vs/base/common/platform'; interface WebviewContent { readonly html: string; @@ -46,11 +45,10 @@ export class IFrameWebview extends Disposable implements Webview { @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @IFileService private readonly fileService: IFileService, @IConfigurationService private readonly _configurationService: IConfigurationService, - @IProductService private readonly _productService: IProductService ) { super(); - if (!this.useExternalEndpoint && (!environmentService.options || typeof environmentService.options.webviewEndpoint !== 'string')) { - throw new Error('To use iframe based webviews, you must configure `environmentService.webviewEndpoint`'); + if (!this.useExternalEndpoint && (!environmentService.options || typeof environmentService.webviewExternalEndpoint !== 'string')) { + throw new Error('To use iframe based webviews, you must configure `environmentService.webviewExternalEndpoint`'); } this._portMappingManager = this._register(new WebviewPortMappingManager( @@ -67,7 +65,7 @@ export class IFrameWebview extends Disposable implements Webview { this.element = document.createElement('iframe'); this.element.sandbox.add('allow-scripts', 'allow-same-origin'); - this.element.setAttribute('src', `${this.endpoint}/index.html?id=${this.id}`); + this.element.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.id}`); this.element.style.border = 'none'; this.element.style.width = '100%'; this.element.style.height = '100%'; @@ -145,24 +143,14 @@ export class IFrameWebview extends Disposable implements Webview { this._register(themeService.onThemeChange(this.style, this)); } - private get endpoint(): string { - const baseEndpoint = this.externalEndpoint || this.environmentService.options!.webviewEndpoint!; - const endpoint = baseEndpoint.replace('{{uuid}}', this.id); + private get externalEndpoint(): string { + const endpoint = this.environmentService.webviewExternalEndpoint!.replace('{{uuid}}', this.id); if (endpoint[endpoint.length - 1] === '/') { return endpoint.slice(0, endpoint.length - 1); } return endpoint; } - private get externalEndpoint(): string | undefined { - const useExternalEndpoint = this.useExternalEndpoint; - if (!useExternalEndpoint) { - return undefined; - } - const commit = this._productService.quality && this._productService.commit ? this._productService.commit : '211fa02efe8c041fd7baa8ec3dce199d5185aa44'; - return `https://{{uuid}}.vscode-webview-test.com/${commit}`; - } - private get useExternalEndpoint(): boolean { return isWeb || this._configurationService.getValue('webview.experimental.useExternalEndpoint'); } @@ -197,7 +185,7 @@ export class IFrameWebview extends Disposable implements Webview { private preprocessHtml(value: string): string { return value.replace(/(["'])vscode-resource:([^\s'"]+?)(["'])/gi, (_, startQuote, path, endQuote) => - `${startQuote}${this.endpoint}/vscode-resource${path}${endQuote}`); + `${startQuote}${this.externalEndpoint}/vscode-resource${path}${endQuote}`); } public update(html: string, options: WebviewContentOptions, retainContextWhenHidden: boolean) { @@ -217,7 +205,7 @@ export class IFrameWebview extends Disposable implements Webview { contents: this.content.html, options: this.content.options, state: this.content.state, - endpoint: this.endpoint, + endpoint: this.externalEndpoint, }); } diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 6895dee4694..4f923d0e94b 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -3,18 +3,19 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IWindowConfiguration, IPath, IPathsToWaitFor } from 'vs/platform/windows/common/windows'; -import { IExtensionHostDebugParams, IDebugParams, BACKUPS } from 'vs/platform/environment/common/environment'; -import { URI } from 'vs/base/common/uri'; -import { IProcessEnvironment } from 'vs/base/common/platform'; -import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { ExportData } from 'vs/base/common/performance'; -import { LogLevel } from 'vs/platform/log/common/log'; -import { joinPath } from 'vs/base/common/resources'; import { Schemas } from 'vs/base/common/network'; +import { ExportData } from 'vs/base/common/performance'; +import { IProcessEnvironment } from 'vs/base/common/platform'; +import { joinPath } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { generateUuid } from 'vs/base/common/uuid'; +import { BACKUPS, IDebugParams, IExtensionHostDebugParams } from 'vs/platform/environment/common/environment'; +import { LogLevel } from 'vs/platform/log/common/log'; +import product from 'vs/platform/product/browser/product'; +import { IPath, IPathsToWaitFor, IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; -import { generateUuid } from 'vs/base/common/uuid'; export class BrowserWindowConfiguration implements IWindowConfiguration { @@ -178,12 +179,18 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment galleryMachineIdResource?: URI; readonly logFile: URI; + get webviewExternalEndpoint(): string { + // TODO: get fallback from product.json + return this.options.webviewEndpoint || 'https://{{uuid}}.vscode-webview-test.com'; + } + get webviewResourceRoot(): string { - return this.options.webviewEndpoint ? `${this.options.webviewEndpoint}/vscode-resource{{resource}}` : 'vscode-resource:{{resource}}'; + return `${this.webviewExternalEndpoint}/{{commit}}/vscode-resource{{resource}}` + .replace('{{commit}}', product.commit || '211fa02efe8c041fd7baa8ec3dce199d5185aa44'); } get webviewCspSource(): string { - return this.options.webviewEndpoint ? this.options.webviewEndpoint : 'vscode-resource:'; + return this.options.webviewEndpoint || `https://*.vscode-webview-test.com`; } } diff --git a/src/vs/workbench/services/environment/common/environmentService.ts b/src/vs/workbench/services/environment/common/environmentService.ts index d0e6e0a5b18..b19a45caf00 100644 --- a/src/vs/workbench/services/environment/common/environmentService.ts +++ b/src/vs/workbench/services/environment/common/environmentService.ts @@ -24,6 +24,7 @@ export interface IWorkbenchEnvironmentService extends IEnvironmentService { readonly debugSearch: IDebugParams; + readonly webviewExternalEndpoint: string; readonly webviewResourceRoot: string; readonly webviewCspSource: string; diff --git a/src/vs/workbench/services/environment/node/environmentService.ts b/src/vs/workbench/services/environment/node/environmentService.ts index 24320328eb6..f3ea1f53621 100644 --- a/src/vs/workbench/services/environment/node/environmentService.ts +++ b/src/vs/workbench/services/environment/node/environmentService.ts @@ -12,11 +12,17 @@ import { Schemas } from 'vs/base/common/network'; import { toBackupWorkspaceResource } from 'vs/workbench/services/backup/common/backup'; import { join } from 'vs/base/common/path'; import { IDebugParams } from 'vs/platform/environment/common/environment'; +import product from 'vs/platform/product/node/product'; export class WorkbenchEnvironmentService extends EnvironmentService implements IWorkbenchEnvironmentService { _serviceBrand: undefined; + get webviewExternalEndpoint(): string { + const baseEndpoint = 'https://{{uuid}}.vscode-webview-test.com/{{commit}}'; + return baseEndpoint.replace('{{commit}}', product.commit || '211fa02efe8c041fd7baa8ec3dce199d5185aa44'); + } + readonly webviewResourceRoot = 'vscode-resource:{{resource}}'; readonly webviewCspSource = 'vscode-resource:';