From 3666f94deb3317a3dcdc4cb9f91f7da565f58117 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 14 Aug 2024 20:48:27 +0200 Subject: [PATCH] esm - backport new HTML entry points and use if ESM (#225633) --- build/gulpfile.vscode.js | 3 +- build/gulpfile.vscode.web.js | 3 + .../browser/workbench/workbench-dev.esm.html | 67 +++++++ .../code/browser/workbench/workbench.esm.html | 48 +++++ .../processExplorer-dev.esm.html | 43 +++++ .../processExplorer/processExplorer.esm.html | 42 +++++ .../workbench/workbench-dev.esm.html | 76 ++++++++ .../workbench/workbench.esm.html | 72 ++++++++ src/vs/code/node/cli.ts | 5 +- .../issue/electron-main/issueMainService.ts | 3 +- .../issue/electron-main/processMainService.ts | 3 +- .../electron-main/protocolMainService.ts | 3 +- .../windows/electron-main/windowImpl.ts | 3 +- .../node/remoteExtensionHostAgentServer.ts | 4 +- src/vs/server/node/webClientServer.ts | 9 +- .../issueReporter-dev.esm.html | 47 +++++ .../electron-sandbox/issueReporter.esm.html | 45 +++++ .../browser/webWorkerExtensionHost.ts | 4 +- .../webWorkerExtensionHostIframe.esm.html | 164 ++++++++++++++++++ 19 files changed, 631 insertions(+), 13 deletions(-) create mode 100644 src/vs/code/browser/workbench/workbench-dev.esm.html create mode 100644 src/vs/code/browser/workbench/workbench.esm.html create mode 100644 src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.esm.html create mode 100644 src/vs/code/electron-sandbox/processExplorer/processExplorer.esm.html create mode 100644 src/vs/code/electron-sandbox/workbench/workbench-dev.esm.html create mode 100644 src/vs/code/electron-sandbox/workbench/workbench.esm.html create mode 100644 src/vs/workbench/contrib/issue/electron-sandbox/issueReporter-dev.esm.html create mode 100644 src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.esm.html create mode 100644 src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 1323931216a..609b0d60b0a 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -56,6 +56,7 @@ const vscodeResources = [ 'out-build/vs/**/*.{svg,png,html,jpg,mp3}', '!out-build/vs/code/browser/**/*.html', '!out-build/vs/code/**/*-dev.html', + '!out-build/vs/code/**/*-dev.esm.html', '!out-build/vs/editor/standalone/**/*.svg', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', 'out-build/vs/base/browser/ui/codicons/codicon/**', @@ -70,8 +71,8 @@ const vscodeResources = [ 'out-build/vs/workbench/contrib/terminal/browser/media/*.sh', 'out-build/vs/workbench/contrib/terminal/browser/media/*.zsh', 'out-build/vs/workbench/contrib/webview/browser/pre/*.js', - '!out-build/vs/workbench/contrib/issue/browser/*.html', '!out-build/vs/workbench/contrib/issue/**/*-dev.html', + '!out-build/vs/workbench/contrib/issue/**/*-dev.esm.html', 'out-build/vs/**/markdown.css', 'out-build/vs/workbench/contrib/tasks/**/*.json', '!**/test/**' diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index 0424b12fa45..190dac79372 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -47,6 +47,7 @@ const vscodeWebResourceIncludes = [ // Extension Worker 'out-build/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html', + 'out-build/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html', // Web node paths (needed for integration tests) 'out-build/vs/webPackagePaths.js', @@ -62,6 +63,8 @@ const vscodeWebResources = [ '!out-build/vs/**/{node,electron-sandbox,electron-main}/**', '!out-build/vs/editor/standalone/**', '!out-build/vs/workbench/**/*-tb.png', + '!out-build/vs/code/**/*-dev.html', + '!out-build/vs/code/**/*-dev.esm.html', '!**/test/**' ]; diff --git a/src/vs/code/browser/workbench/workbench-dev.esm.html b/src/vs/code/browser/workbench/workbench-dev.esm.html new file mode 100644 index 00000000000..140030d8abe --- /dev/null +++ b/src/vs/code/browser/workbench/workbench-dev.esm.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/vs/code/browser/workbench/workbench.esm.html b/src/vs/code/browser/workbench/workbench.esm.html new file mode 100644 index 00000000000..38c03e6a321 --- /dev/null +++ b/src/vs/code/browser/workbench/workbench.esm.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.esm.html b/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.esm.html new file mode 100644 index 00000000000..74d159c3ddd --- /dev/null +++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.esm.html @@ -0,0 +1,43 @@ + + + + + + + + + +
+ + + + + + + diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer.esm.html b/src/vs/code/electron-sandbox/processExplorer/processExplorer.esm.html new file mode 100644 index 00000000000..d2747202950 --- /dev/null +++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer.esm.html @@ -0,0 +1,42 @@ + + + + + + + + + + +
+ + + + + diff --git a/src/vs/code/electron-sandbox/workbench/workbench-dev.esm.html b/src/vs/code/electron-sandbox/workbench/workbench-dev.esm.html new file mode 100644 index 00000000000..2d8161be6a9 --- /dev/null +++ b/src/vs/code/electron-sandbox/workbench/workbench-dev.esm.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + diff --git a/src/vs/code/electron-sandbox/workbench/workbench.esm.html b/src/vs/code/electron-sandbox/workbench/workbench.esm.html new file mode 100644 index 00000000000..1e89448e605 --- /dev/null +++ b/src/vs/code/electron-sandbox/workbench/workbench.esm.html @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index 9acf37f930f..db947d6c029 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -398,7 +398,10 @@ export async function main(argv: string[]): Promise { return false; } if (target.type === 'page') { - return target.url.indexOf('workbench/workbench.html') > 0 || target.url.indexOf('workbench/workbench-dev.html') > 0; + return target.url.indexOf('workbench/workbench.html') > 0 || + target.url.indexOf('workbench/workbench-dev.html') > 0 || + target.url.indexOf('workbench/workbench.esm.html') > 0 || + target.url.indexOf('workbench/workbench-dev.esm.html') > 0; } else { return true; } diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 1aea4ead9b9..cb7255ef5bd 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -22,6 +22,7 @@ import { IIPCObjectUrl, IProtocolMainService } from 'vs/platform/protocol/electr import { zoomLevelToZoomFactor } from 'vs/platform/window/common/window'; import { ICodeWindow, IWindowState } from 'vs/platform/window/electron-main/window'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; +import { isESM } from 'vs/base/common/amd'; interface IBrowserWindowOptions { backgroundColor: string | undefined; @@ -89,7 +90,7 @@ export class IssueMainService implements IIssueMainService { }); this.issueReporterWindow.loadURL( - FileAccess.asBrowserUri(`vs/workbench/contrib/issue/electron-sandbox/issueReporter${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true) + FileAccess.asBrowserUri(`vs/workbench/contrib/issue/electron-sandbox/issueReporter${this.environmentMainService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).toString(true) ); this.issueReporterWindow.on('close', () => { diff --git a/src/vs/platform/issue/electron-main/processMainService.ts b/src/vs/platform/issue/electron-main/processMainService.ts index e6002ae0192..2fdbcf1369c 100644 --- a/src/vs/platform/issue/electron-main/processMainService.ts +++ b/src/vs/platform/issue/electron-main/processMainService.ts @@ -25,6 +25,7 @@ import { IStateService } from 'vs/platform/state/node/state'; import { UtilityProcess } from 'vs/platform/utilityProcess/electron-main/utilityProcess'; import { zoomLevelToZoomFactor } from 'vs/platform/window/common/window'; import { IWindowState } from 'vs/platform/window/electron-main/window'; +import { isESM } from 'vs/base/common/amd'; const processExplorerWindowState = 'issue.processExplorerWindowState'; @@ -161,7 +162,7 @@ export class ProcessMainService implements IProcessMainService { }); this.processExplorerWindow.loadURL( - FileAccess.asBrowserUri(`vs/code/electron-sandbox/processExplorer/processExplorer${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true) + FileAccess.asBrowserUri(`vs/code/electron-sandbox/processExplorer/processExplorer${this.environmentMainService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).toString(true) ); this.processExplorerWindow.on('close', () => { diff --git a/src/vs/platform/protocol/electron-main/protocolMainService.ts b/src/vs/platform/protocol/electron-main/protocolMainService.ts index 8b6fd7b5868..4dcb1bcaf7f 100644 --- a/src/vs/platform/protocol/electron-main/protocolMainService.ts +++ b/src/vs/platform/protocol/electron-main/protocolMainService.ts @@ -96,7 +96,8 @@ export class ProtocolMainService extends Disposable implements IProtocolMainServ let headers: Record | undefined; if (this.environmentService.crossOriginIsolated) { - if (basename(path) === 'workbench.html' || basename(path) === 'workbench-dev.html') { + const pathBasename = basename(path); + if (pathBasename === 'workbench.html' || pathBasename === 'workbench-dev.html' || pathBasename === 'workbench.esm.html' || pathBasename === 'workbench-dev.esm.html') { headers = COI.CoopAndCoep; } else { headers = COI.getHeadersFromQuery(request.url); diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts index 3e905e3ba66..5d3b1c579e8 100644 --- a/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/src/vs/platform/windows/electron-main/windowImpl.ts @@ -44,6 +44,7 @@ import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electr import { ILoggerMainService } from 'vs/platform/log/electron-main/loggerService'; import { firstOrDefault } from 'vs/base/common/arrays'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { isESM } from 'vs/base/common/amd'; export interface IWindowCreationOptions { readonly state: IWindowState; @@ -1036,7 +1037,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { this.readyState = ReadyState.NAVIGATING; // Load URL - this._win.loadURL(FileAccess.asBrowserUri(`vs/code/electron-sandbox/workbench/workbench${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true)); + this._win.loadURL(FileAccess.asBrowserUri(`vs/code/electron-sandbox/workbench/workbench${this.environmentMainService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).toString(true)); // Remember that we did load const wasLoaded = this.wasLoaded; diff --git a/src/vs/server/node/remoteExtensionHostAgentServer.ts b/src/vs/server/node/remoteExtensionHostAgentServer.ts index d9bb0122f64..c076b5c1150 100644 --- a/src/vs/server/node/remoteExtensionHostAgentServer.ts +++ b/src/vs/server/node/remoteExtensionHostAgentServer.ts @@ -9,7 +9,7 @@ import * as http from 'http'; import * as net from 'net'; import { performance } from 'perf_hooks'; import * as url from 'url'; -import { LoaderStats } from 'vs/base/common/amd'; +import { LoaderStats, isESM } from 'vs/base/common/amd'; import { VSBuffer } from 'vs/base/common/buffer'; import { CharCode } from 'vs/base/common/charCode'; import { isSigPipeError, onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors'; @@ -781,7 +781,7 @@ export async function createServer(address: string | net.AddressInfo | null, arg serverBasePath = `/${serverBasePath}`; } - const hasWebClient = fs.existsSync(FileAccess.asFileUri('vs/code/browser/workbench/workbench.html').fsPath); + const hasWebClient = fs.existsSync(FileAccess.asFileUri(`vs/code/browser/workbench/workbench.${isESM ? 'esm.' : ''}html`).fsPath); if (hasWebClient && address && typeof address !== 'string') { // ships the web ui! diff --git a/src/vs/server/node/webClientServer.ts b/src/vs/server/node/webClientServer.ts index 2abd1e1366c..c75c9858d0b 100644 --- a/src/vs/server/node/webClientServer.ts +++ b/src/vs/server/node/webClientServer.ts @@ -28,6 +28,7 @@ import { IProductConfiguration } from 'vs/base/common/product'; import { isString } from 'vs/base/common/types'; import { CharCode } from 'vs/base/common/charCode'; import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; +import { isESM } from 'vs/base/common/amd'; const textMimeType: { [ext: string]: string | undefined } = { '.html': 'text/html', @@ -297,7 +298,7 @@ export class WebClientServer { const resolveWorkspaceURI = (defaultLocation?: string) => defaultLocation && URI.file(path.resolve(defaultLocation)).with({ scheme: Schemas.vscodeRemote, authority: remoteAuthority }); - const filePath = FileAccess.asFileUri(this._environmentService.isBuilt ? 'vs/code/browser/workbench/workbench.html' : 'vs/code/browser/workbench/workbench-dev.html').fsPath; + const filePath = FileAccess.asFileUri(`vs/code/browser/workbench/workbench${this._environmentService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).fsPath; const authSessionInfo = !this._environmentService.isBuilt && this._environmentService.args['github-auth'] ? { id: generateUuid(), providerId: 'github', @@ -374,13 +375,15 @@ export class WebClientServer { return void res.end('Not found'); } - const webWorkerExtensionHostIframeScriptSHA = 'sha256-V28GQnL3aYxbwgpV3yW1oJ+VKKe/PBSzWntNyH8zVXA='; + const webWorkerExtensionHostIframeScriptSHA = isESM ? 'sha256-2Q+j4hfT09+1+imS46J2YlkCtHWQt0/BE79PXjJ0ZJ8=' : 'sha256-V28GQnL3aYxbwgpV3yW1oJ+VKKe/PBSzWntNyH8zVXA='; const cspDirectives = [ 'default-src \'self\';', 'img-src \'self\' https: data: blob:;', 'media-src \'self\';', - `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html + isESM ? + `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} blob: 'nonce-1nline-m4p' ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : `http://${remoteAuthority}`};` : // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html + `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html 'child-src \'self\';', `frame-src 'self' https://*.vscode-cdn.net data:;`, 'worker-src \'self\' data: blob:;', diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter-dev.esm.html b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter-dev.esm.html new file mode 100644 index 00000000000..5276ed507ba --- /dev/null +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter-dev.esm.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.esm.html b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.esm.html new file mode 100644 index 00000000000..2f87d2489ce --- /dev/null +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.esm.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts index ca86cea6dbc..95e972cd752 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts @@ -12,7 +12,7 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { canceled, onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; -import { COI, FileAccess } from 'vs/base/common/network'; +import { AppResourcePath, COI, FileAccess } from 'vs/base/common/network'; import * as platform from 'vs/base/common/platform'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; @@ -86,7 +86,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost const suffix = `?${suffixSearchParams.toString()}`; - const iframeModulePath = 'vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html'; + const iframeModulePath: AppResourcePath = `vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.${isESM ? 'esm.' : ''}html`; if (platform.isWeb) { const webEndpointUrlTemplate = this._productService.webEndpointUrlTemplate; const commit = this._productService.commit; diff --git a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html new file mode 100644 index 00000000000..bd4ea195337 --- /dev/null +++ b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html @@ -0,0 +1,164 @@ + + + + + + + + +