From 9e04a67d12596c6d74059e3475307a61b56570bd Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 20 May 2021 17:38:03 -0700 Subject: [PATCH] Switch to use vscode-webview.net as default webview endpoint This moves us off of `vscode-webview-test` to instead use `vscode-webview.net` for loading webview resources. We now also pick this up from the product.json instead of hardcoding it --- product.json | 1 + src/vs/base/common/product.ts | 2 ++ src/vs/platform/product/common/product.ts | 1 + src/vs/workbench/api/common/shared/webview.ts | 10 ++++++---- .../electron-sandbox/iframeWebviewElement.ts | 4 ++-- .../environment/browser/environmentService.ts | 11 +++++------ .../test/browser/api/extHostWebview.test.ts | 13 +++++++------ 7 files changed, 24 insertions(+), 18 deletions(-) diff --git a/product.json b/product.json index a16e67696ef..3f00f8e1468 100644 --- a/product.json +++ b/product.json @@ -22,6 +22,7 @@ "licenseFileName": "LICENSE.txt", "reportIssueUrl": "https://github.com/microsoft/vscode/issues/new", "urlProtocol": "code-oss", + "webviewContentExternalBaseUrlTemplate": "https://{{uuid}}.vscode-webview.net/{{quality}}/{{commit}}/out/vs/workbench/contrib/webview/browser/pre/", "extensionAllowedProposedApi": [ "ms-vscode.vscode-js-profile-flame", "ms-vscode.vscode-js-profile-table", diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index 129b8dec4d9..fb1afd73cef 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -130,6 +130,8 @@ export interface IProductConfiguration { readonly 'configurationSync.store'?: ConfigurationSyncStore; readonly darwinUniversalAssetId?: string; + + readonly webviewContentExternalBaseUrlTemplate: string; } export type ImportantExtensionTip = { name: string; languages?: string[]; pattern?: string; isExtensionPack?: boolean }; diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 28e36704128..b6b67a0b5ac 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -63,6 +63,7 @@ else { reportIssueUrl: 'https://github.com/microsoft/vscode/issues/new', licenseName: 'MIT', licenseUrl: 'https://github.com/microsoft/vscode/blob/main/LICENSE.txt', + webviewContentExternalBaseUrlTemplate: 'https://{{uuid}}.vscode-webview.net/{{quality}}/{{commit}}/out/vs/workbench/contrib/webview/browser/pre/', extensionAllowedProposedApi: [ 'ms-vscode.vscode-js-profile-flame', 'ms-vscode.vscode-js-profile-table', diff --git a/src/vs/workbench/api/common/shared/webview.ts b/src/vs/workbench/api/common/shared/webview.ts index eeecb0ca1f1..de315478caa 100644 --- a/src/vs/workbench/api/common/shared/webview.ts +++ b/src/vs/workbench/api/common/shared/webview.ts @@ -15,16 +15,18 @@ export interface WebviewInitData { } /** - * Location where we load resources from + * Root from which resources in webviews are loaded. * - * There endpoints can be hardcoded because we never expect to actually hit them. Instead these requests + * This is hardcoded because we never expect to actually hit it. Instead these requests * should always go to a service worker. */ -export const webviewResourceOrigin = (id: string) => `https://${id}.vscode-webview-test.com`; +export const webviewResourceAuthority = 'vscode-webview.net'; + +export const webviewResourceOrigin = (id: string) => `https://${id}.${webviewResourceAuthority}`; export const webviewResourceRoot = (id: string) => `${webviewResourceOrigin(id)}/vscode-resource/{{resource}}`; -export const webviewGenericCspSource = 'https://*.vscode-webview-test.com'; +export const webviewGenericCspSource = `https://*.${webviewResourceAuthority}`; /** * Construct a uri that can load resources inside a webview diff --git a/src/vs/workbench/contrib/webview/electron-sandbox/iframeWebviewElement.ts b/src/vs/workbench/contrib/webview/electron-sandbox/iframeWebviewElement.ts index 6c66a01bc11..5284437a718 100644 --- a/src/vs/workbench/contrib/webview/electron-sandbox/iframeWebviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-sandbox/iframeWebviewElement.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Schemas } from 'vs/base/common/network'; import { IMenuService } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -69,7 +70,7 @@ export class ElectronIframeWebview extends IFrameWebview { } protected override get webviewContentEndpoint(): string { - const endpoint = this._environmentService.webviewExternalEndpoint!.replace('{{uuid}}', this.id); + const endpoint = `${Schemas.vscodeWebview}://${this.id}`; if (endpoint[endpoint.length - 1] === '/') { return endpoint.slice(0, endpoint.length - 1); } @@ -79,5 +80,4 @@ export class ElectronIframeWebview extends IFrameWebview { protected override async doPostMessage(channel: string, data?: any): Promise { this.element?.contentWindow!.postMessage({ channel, args: data }, '*'); } - } diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index a4046f66004..65ec7e95496 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -226,14 +226,13 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment get disableExtensions() { return this.payload?.get('disableExtensions') === 'true'; } - private get webviewEndpoint(): string { - // TODO@matt: get fallback from product service - return this.options.webviewEndpoint || 'https://{{uuid}}.vscode-webview-test.com/{{commit}}'; - } - @memoize get webviewExternalEndpoint(): string { - return (this.webviewEndpoint).replace('{{commit}}', this.productService.commit || '23a2409675bc1bde94f3532bc7c5826a6e99e4b6'); + const endpoint = this.options.webviewEndpoint || this.productService.webviewContentExternalBaseUrlTemplate; + console.log(endpoint); + return endpoint + .replace('{{commit}}', this.productService.commit || '97740a7d253650f9f186c211de5247e2577ce9f7') + .replace('{{quality}}', this.productService.quality || 'insider'); } @memoize diff --git a/src/vs/workbench/test/browser/api/extHostWebview.test.ts b/src/vs/workbench/test/browser/api/extHostWebview.test.ts index 4dd59f11662..12ebcc51e9a 100644 --- a/src/vs/workbench/test/browser/api/extHostWebview.test.ts +++ b/src/vs/workbench/test/browser/api/extHostWebview.test.ts @@ -15,6 +15,7 @@ import { NullApiDeprecationService } from 'vs/workbench/api/common/extHostApiDep import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ExtHostWebviews } from 'vs/workbench/api/common/extHostWebview'; import { ExtHostWebviewPanels } from 'vs/workbench/api/common/extHostWebviewPanels'; +import { webviewResourceAuthority } from 'vs/workbench/api/common/shared/webview'; import { EditorGroupColumn } from 'vs/workbench/common/editor'; import type * as vscode from 'vscode'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; @@ -80,31 +81,31 @@ suite('ExtHostWebview', () => { assert.strictEqual( stripEndpointUuid(webview.webview.asWebviewUri(URI.parse('file:///Users/codey/file.html')).toString()), - 'vscode-webview-test.com/vscode-resource/file//Users/codey/file.html', + `${webviewResourceAuthority}/vscode-resource/file//Users/codey/file.html`, 'Unix basic' ); assert.strictEqual( stripEndpointUuid(webview.webview.asWebviewUri(URI.parse('file:///Users/codey/file.html#frag')).toString()), - 'vscode-webview-test.com/vscode-resource/file//Users/codey/file.html#frag', + `${webviewResourceAuthority}/vscode-resource/file//Users/codey/file.html#frag`, 'Unix should preserve fragment' ); assert.strictEqual( stripEndpointUuid(webview.webview.asWebviewUri(URI.parse('file:///Users/codey/f%20ile.html')).toString()), - 'vscode-webview-test.com/vscode-resource/file//Users/codey/f%20ile.html', + `${webviewResourceAuthority}/vscode-resource/file//Users/codey/f%20ile.html`, 'Unix with encoding' ); assert.strictEqual( stripEndpointUuid(webview.webview.asWebviewUri(URI.parse('file://localhost/Users/codey/file.html')).toString()), - 'vscode-webview-test.com/vscode-resource/file/localhost/Users/codey/file.html', + `${webviewResourceAuthority}/vscode-resource/file/localhost/Users/codey/file.html`, 'Unix should preserve authority' ); assert.strictEqual( stripEndpointUuid(webview.webview.asWebviewUri(URI.parse('file:///c:/codey/file.txt')).toString()), - 'vscode-webview-test.com/vscode-resource/file//c%3A/codey/file.txt', + `${webviewResourceAuthority}/vscode-resource/file//c%3A/codey/file.txt`, 'Windows C drive' ); }); @@ -114,7 +115,7 @@ suite('ExtHostWebview', () => { assert.strictEqual( stripEndpointUuid(webview.webview.asWebviewUri(URI.parse('file:///Users/codey/file.html')).toString()), - 'vscode-webview-test.com/vscode-resource/vscode-remote/remote/Users/codey/file.html', + `${webviewResourceAuthority}/vscode-resource/vscode-remote/remote/Users/codey/file.html`, 'Unix basic' ); });