From 47ed486348d3ebcadfba89f63097c3d26923cb68 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 25 Sep 2020 11:03:40 +0200 Subject: [PATCH 01/12] explorer: improve aria-level computation of compact folders #107235 --- src/vs/base/browser/ui/tree/abstractTree.ts | 2 +- .../files/browser/views/explorerViewer.ts | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 9201e668832..db296ffd300 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -186,7 +186,7 @@ function asListOptions(modelProvider: () => ITreeModel options.accessibilityProvider!.getWidgetRole!() : () => 'tree', - getAriaLevel(node) { + getAriaLevel: options.accessibilityProvider && options.accessibilityProvider.getAriaLevel ? (node) => options.accessibilityProvider!.getAriaLevel!(node.element) : (node) => { return node.depth; }, getActiveDescendantId: options.accessibilityProvider.getActiveDescendantId && (node => { diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index e06fc13446c..e9f6e0d339d 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -255,7 +255,8 @@ export class FilesRenderer implements ICompressibleTreeRenderer(); this.configListener = this.configurationService.onDidChangeConfiguration(e => { @@ -491,6 +492,22 @@ export class FilesRenderer implements ICompressibleTreeRenderer Date: Fri, 25 Sep 2020 11:35:29 +0200 Subject: [PATCH 02/12] fixes #107235 --- .../workbench/contrib/files/browser/views/explorerViewer.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index e9f6e0d339d..bb47af156f8 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -163,10 +163,12 @@ export class CompressedNavigationController implements ICompressedNavigationCont private updateLabels(templateData: IFileTemplateData): void { this._labels = Array.from(templateData.container.querySelectorAll('.label-name')) as HTMLElement[]; - + let parents = ''; for (let i = 0; i < this.labels.length; i++) { - this.labels[i].setAttribute('aria-label', this.items[i].name); + const ariaLabel = parents.length ? `${this.items[i].name}, compact, ${parents}` : this.items[i].name; + this.labels[i].setAttribute('aria-label', ariaLabel); this.labels[i].setAttribute('aria-level', `${this.depth + i}`); + parents = parents.length ? `${this.items[i].name} ${parents}` : this.items[i].name; } this.updateCollapsed(this.collapsed); From dc9ef0d110a818a3d60c5275de1722452ad2c293 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 25 Sep 2020 11:45:55 +0200 Subject: [PATCH 03/12] Make sure the renderer received `$onWillActivateExtension` before proceeding to load extension code --- .../api/browser/mainThreadExtensionService.ts | 2 +- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- .../workbench/api/common/extHostExtensionService.ts | 11 +++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadExtensionService.ts b/src/vs/workbench/api/browser/mainThreadExtensionService.ts index e0b3986200d..5d0132e2989 100644 --- a/src/vs/workbench/api/browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/browser/mainThreadExtensionService.ts @@ -50,7 +50,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha $activateExtension(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise { return this._extensionService._activateById(extensionId, reason); } - $onWillActivateExtension(extensionId: ExtensionIdentifier): void { + async $onWillActivateExtension(extensionId: ExtensionIdentifier): Promise { this._extensionService._onWillActivateExtension(extensionId); } $onDidActivateExtension(extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 3106330c6b5..d8c45c2afbf 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -830,7 +830,7 @@ export interface MainThreadTaskShape extends IDisposable { export interface MainThreadExtensionServiceShape extends IDisposable { $activateExtension(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; - $onWillActivateExtension(extensionId: ExtensionIdentifier): void; + $onWillActivateExtension(extensionId: ExtensionIdentifier): Promise; $onDidActivateExtension(extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void; $onExtensionActivationError(extensionId: ExtensionIdentifier, error: ExtensionActivationError): Promise; $onExtensionRuntimeError(extensionId: ExtensionIdentifier, error: SerializedError): void; diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 33b062b329c..53d3612cc5d 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -303,8 +303,15 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme // --- impl - private _activateExtension(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): Promise { - this._mainThreadExtensionsProxy.$onWillActivateExtension(extensionDescription.identifier); + private async _activateExtension(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason): Promise { + if (!this._initData.remote.isRemote) { + // local extension host process + await this._mainThreadExtensionsProxy.$onWillActivateExtension(extensionDescription.identifier); + } else { + // remote extension host process + // do not wait for renderer confirmation + this._mainThreadExtensionsProxy.$onWillActivateExtension(extensionDescription.identifier); + } return this._doActivateExtension(extensionDescription, reason).then((activatedExtension) => { const activationTimes = activatedExtension.activationTimes; this._mainThreadExtensionsProxy.$onDidActivateExtension(extensionDescription.identifier, activationTimes.codeLoadingTime, activationTimes.activateCallTime, activationTimes.activateResolvedTime, reason); From 5d8c90cdb3215615ef606dbc6bfc5a6ad7d824e1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 25 Sep 2020 13:40:08 +0200 Subject: [PATCH 04/12] Fixes #107434: `hostExtensions` should never contain remote extensions --- .../services/extensions/common/remoteExtensionHost.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts index fea56076567..1d26bf01091 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts @@ -21,7 +21,7 @@ import { Schemas } from 'vs/base/common/network'; import { Disposable } from 'vs/base/common/lifecycle'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { PersistentProtocol } from 'vs/base/parts/ipc/common/ipc.net'; -import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { VSBuffer } from 'vs/base/common/buffer'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -205,8 +205,15 @@ export class RemoteExtensionHost extends Disposable implements IExtensionHost { const [telemetryInfo, remoteInitData] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]); // Collect all identifiers for extension ids which can be considered "resolved" + const remoteExtensions = new Set(); + remoteInitData.extensions.forEach((extension) => remoteExtensions.add(ExtensionIdentifier.toKey(extension.identifier.value))); + const resolvedExtensions = remoteInitData.allExtensions.filter(extension => !extension.main && !extension.browser).map(extension => extension.identifier); - const hostExtensions = remoteInitData.allExtensions.filter(extension => (extension.main || extension.browser) && extension.api === 'none').map(extension => extension.identifier); + const hostExtensions = ( + remoteInitData.allExtensions + .filter(extension => !remoteExtensions.has(ExtensionIdentifier.toKey(extension.identifier.value))) + .filter(extension => (extension.main || extension.browser) && extension.api === 'none').map(extension => extension.identifier) + ); const workspace = this._contextService.getWorkspace(); return { commit: this._productService.commit, From 7f035b4be73a7ce9ceafb2128c066b717eafaf87 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 25 Sep 2020 14:10:45 +0200 Subject: [PATCH 05/12] debt - introduce and adopt FileAccess deprecate amd.ts and require.toUrl methods --- src/bootstrap-amd.js | 2 +- src/bootstrap-window.js | 4 +- src/bootstrap.js | 22 ++++++++--- src/typings/require.d.ts | 3 ++ src/vs/base/browser/dom.ts | 8 ++-- src/vs/base/common/amd.ts | 6 +++ src/vs/base/common/network.ts | 37 +++++++++++++++++++ src/vs/base/node/paths.ts | 4 +- src/vs/base/node/processes.ts | 4 +- src/vs/base/node/ps.ts | 6 +-- src/vs/code/electron-main/auth.ts | 8 ++-- src/vs/code/electron-main/sharedProcess.ts | 10 +++-- src/vs/code/electron-main/window.ts | 10 +++-- .../common/extensionManagement.ts | 3 +- .../node/extensionsScanner.ts | 4 +- .../files/node/watcher/nsfw/watcherService.ts | 4 +- .../files/node/watcher/unix/watcherService.ts | 4 +- .../watcher/win32/csharpWatcherService.ts | 4 +- .../issue/electron-main/issueMainService.ts | 17 +++++---- src/vs/platform/product/common/product.ts | 10 ++--- .../parts/editor/editor.contribution.ts | 6 +-- .../browser/parts/editor/editorGroupView.ts | 5 +-- .../contrib/cli/node/cli.contribution.ts | 4 +- .../debug/browser/debug.contribution.ts | 20 +++++----- .../contrib/debug/node/debugHelperService.ts | 4 +- .../browser/extensionsWorkbenchService.ts | 5 ++- .../node/externalTerminalService.ts | 4 +- .../electron-browser/webviewElement.ts | 7 +++- .../welcome/page/browser/welcomePage.ts | 5 +-- .../browser/editor/editorWalkThrough.ts | 5 +-- .../browser/webWorkerExtensionHost.ts | 5 ++- .../cachedExtensionScanner.ts | 7 ++-- .../localProcessExtensionHost.ts | 4 +- .../integrity/node/integrityService.ts | 4 +- .../search/electron-browser/searchService.ts | 7 +--- .../textMate/browser/textMateService.ts | 4 +- .../electron-sandbox/textMateService.ts | 10 ++--- .../electron-sandbox/textMateWorker.ts | 4 +- test/unit/electron/renderer.js | 2 +- 39 files changed, 172 insertions(+), 110 deletions(-) diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index 8b0ec252d25..752e4ab63ed 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -14,7 +14,7 @@ const nlsConfig = bootstrap.setupNLS(); // Bootstrap: Loader loader.config({ - baseUrl: bootstrap.fileUriFromPath(__dirname, process.platform === 'win32'), + baseUrl: bootstrap.fileUriFromPath(__dirname, { isWindows: process.platform === 'win32' }), catchError: true, nodeRequire: require, nodeMain: __filename, diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index d3d05e5578f..dfc7bbd12e4 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -103,7 +103,7 @@ window['MonacoEnvironment'] = {}; const loaderConfig = { - baseUrl: `${bootstrapLib.fileUriFromPath(configuration.appRoot, safeProcess.platform === 'win32')}/out`, + baseUrl: `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32' })}/out`, 'vs/nls': nlsConfig }; @@ -241,7 +241,7 @@ } /** - * @return {{ fileUriFromPath: (path: string, isWindows: boolean) => string; }} + * @return {{ fileUriFromPath: (path: string, config: { isWindows?: boolean, scheme?: string, fallbackAuthority?: string }) => string; }} */ function bootstrap() { // @ts-ignore (defined in bootstrap.js) diff --git a/src/bootstrap.js b/src/bootstrap.js index 58c6103d9be..0cb6466aeaf 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -88,10 +88,13 @@ /** * @param {string} path - * @param {boolean} isWindows + * @param {{ isWindows?: boolean, scheme?: string, fallbackAuthority?: string }} config * @returns {string} */ - function fileUriFromPath(path, isWindows) { + function fileUriFromPath(path, config) { + + // Since we are building a URI, we normalize any backlsash + // to slashes and we ensure that the path begins with a '/'. let pathName = path.replace(/\\/g, '/'); if (pathName.length > 0 && pathName.charAt(0) !== '/') { pathName = `/${pathName}`; @@ -99,10 +102,17 @@ /** @type {string} */ let uri; - if (isWindows && pathName.startsWith('//')) { // specially handle Windows UNC paths - uri = encodeURI(`file:${pathName}`); - } else { - uri = encodeURI(`file://${pathName}`); + + // Windows: in order to support UNC paths (which start with '//') + // that have their own authority, we do not use the provided authority + // but rather preserve it. + if (config.isWindows && pathName.startsWith('//')) { + uri = encodeURI(`${config.scheme || 'file'}:${pathName}`); + } + + // Otherwise we optionally add the provided authority if specified + else { + uri = encodeURI(`${config.scheme || 'file'}://${config.fallbackAuthority || ''}${pathName}`); } return uri.replace(/#/g, '%23'); diff --git a/src/typings/require.d.ts b/src/typings/require.d.ts index cc4a4043ce1..dc6c6bd10fd 100644 --- a/src/typings/require.d.ts +++ b/src/typings/require.d.ts @@ -41,6 +41,9 @@ declare const define: { }; interface NodeRequire { + /** + * @deprecated use `FileAccess.asFileUri()` for node.js contexts or `FileAccess.asBrowserUri` for browser contexts. + */ toUrl(path: string): string; (dependencies: string[], callback: (...args: any[]) => any, errorback?: (err: any) => void): any; config(data: any): any; diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 8b381f96cc1..21d07830544 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -13,7 +13,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; -import { Schemas, RemoteAuthorities } from 'vs/base/common/network'; +import { Schemas, FileAccess, RemoteAuthorities } from 'vs/base/common/network'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; export function clearNode(node: HTMLElement): void { @@ -1223,10 +1223,12 @@ export function asDomUri(uri: URI): URI { if (!uri) { return uri; } - if (Schemas.vscodeRemote === uri.scheme) { + + if (uri.scheme === Schemas.vscodeRemote) { return RemoteAuthorities.rewrite(uri); } - return uri; + + return FileAccess.asBrowserUri(uri); } /** diff --git a/src/vs/base/common/amd.ts b/src/vs/base/common/amd.ts index ebea36794d0..d8ce68b55e2 100644 --- a/src/vs/base/common/amd.ts +++ b/src/vs/base/common/amd.ts @@ -5,10 +5,16 @@ import { URI } from 'vs/base/common/uri'; +/** + * @deprecated use `FileAccess.asFileUri(relativePath, requireFn).fsPath` + */ export function getPathFromAmdModule(requirefn: typeof require, relativePath: string): string { return getUriFromAmdModule(requirefn, relativePath).fsPath; } +/** + * @deprecated use `FileAccess.asFileUri()` for node.js contexts or `FileAccess.asBrowserUri` for browser contexts. + */ export function getUriFromAmdModule(requirefn: typeof require, relativePath: string): URI { return URI.parse(requirefn.toUrl(relativePath)); } diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts index 4b6aebc1646..d768875629f 100644 --- a/src/vs/base/common/network.ts +++ b/src/vs/base/common/network.ts @@ -129,3 +129,40 @@ class RemoteAuthoritiesImpl { } export const RemoteAuthorities = new RemoteAuthoritiesImpl(); + +class FileAccessImpl { + + /** + * Returns a URI to use in contexts where the browser is responsible + * for loading (e.g. fetch()) or when used within the DOM. + */ + asBrowserUri(uri: URI): URI; + asBrowserUri(moduleId: string, moduleIdToUrl: { toUrl(moduleId: string): string }): URI; + asBrowserUri(uriOrModule: URI | string, moduleIdToUrl?: { toUrl(moduleId: string): string }): URI { + const uri = this.toUri(uriOrModule, moduleIdToUrl); + + return uri; + } + + /** + * Returns the `file` URI to use in contexts where node.js + * is responsible for loading. + */ + asFileUri(uri: URI): URI; + asFileUri(moduleId: string, moduleIdToUrl: { toUrl(moduleId: string): string }): URI; + asFileUri(uriOrModule: URI | string, moduleIdToUrl?: { toUrl(moduleId: string): string }): URI { + const uri = this.toUri(uriOrModule, moduleIdToUrl); + + return uri; + } + + private toUri(uriOrModule: URI | string, moduleIdToUrl?: { toUrl(moduleId: string): string }): URI { + if (URI.isUri(uriOrModule)) { + return uriOrModule; + } + + return URI.parse(moduleIdToUrl!.toUrl(uriOrModule)); + } +} + +export const FileAccess = new FileAccessImpl(); diff --git a/src/vs/base/node/paths.ts b/src/vs/base/node/paths.ts index 66930cdaf4b..977eaf8806f 100644 --- a/src/vs/base/node/paths.ts +++ b/src/vs/base/node/paths.ts @@ -3,14 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; interface IPaths { getAppDataPath(platform: string): string; getDefaultUserDataPath(platform: string): string; } -const pathsPath = getPathFromAmdModule(require, 'paths'); +const pathsPath = FileAccess.asFileUri('paths', require).fsPath; const paths = require.__$__nodeRequire(pathsPath); export const getAppDataPath = paths.getAppDataPath; export const getDefaultUserDataPath = paths.getDefaultUserDataPath; diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index 6ccedd679ed..302fa75997e 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -15,7 +15,7 @@ import * as extpath from 'vs/base/common/extpath'; import * as Platform from 'vs/base/common/platform'; import { LineDecoder } from 'vs/base/node/decoder'; import { CommandOptions, ForkOptions, SuccessData, Source, TerminateResponse, TerminateResponseCode, Executable } from 'vs/base/common/processes'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; export { CommandOptions, ForkOptions, SuccessData, Source, TerminateResponse, TerminateResponseCode }; export type ValueCallback = (value: T | Promise) => void; @@ -67,7 +67,7 @@ function terminateProcess(process: cp.ChildProcess, cwd?: string): Promise { cp.execFile(cmd, [process.pid.toString()], { encoding: 'utf8', shell: true } as cp.ExecFileOptions, (err, stdout, stderr) => { if (err) { diff --git a/src/vs/base/node/ps.ts b/src/vs/base/node/ps.ts index 31223d4a5d8..dd5d53d67b4 100644 --- a/src/vs/base/node/ps.ts +++ b/src/vs/base/node/ps.ts @@ -5,7 +5,7 @@ import { exec } from 'child_process'; import { ProcessItem } from 'vs/base/common/processes'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; export function listProcesses(rootPid: number): Promise { @@ -180,7 +180,7 @@ export function listProcesses(rootPid: number): Promise { // The cpu usage value reported on Linux is the average over the process lifetime, // recalculate the usage over a one second interval // JSON.stringify is needed to escape spaces, https://github.com/nodejs/node/issues/6803 - let cmd = JSON.stringify(getPathFromAmdModule(require, 'vs/base/node/cpuUsage.sh')); + let cmd = JSON.stringify(FileAccess.asFileUri('vs/base/node/cpuUsage.sh', require).fsPath); cmd += ' ' + pids.join(' '); exec(cmd, {}, (err, stdout, stderr) => { @@ -208,7 +208,7 @@ export function listProcesses(rootPid: number): Promise { if (process.platform !== 'linux') { reject(err || new Error(stderr.toString())); } else { - const cmd = JSON.stringify(getPathFromAmdModule(require, 'vs/base/node/ps.sh')); + const cmd = JSON.stringify(FileAccess.asFileUri('vs/base/node/ps.sh', require).fsPath); exec(cmd, {}, (err, stdout, stderr) => { if (err || stderr) { reject(err || new Error(stderr.toString())); diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index f57aef11f3e..b4096018623 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -6,8 +6,8 @@ import { localize } from 'vs/nls'; import { Disposable } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; +import { FileAccess } from 'vs/base/common/network'; import { BrowserWindow, BrowserWindowConstructorOptions, app, AuthInfo, WebContents, Event as ElectronEvent } from 'electron'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; type LoginEvent = { event: ElectronEvent; @@ -59,7 +59,7 @@ export class ProxyAuthHandler extends Disposable { show: true, title: 'VS Code', webPreferences: { - preload: getPathFromAmdModule(require, 'vs/base/parts/sandbox/electron-browser/preload.js'), + preload: FileAccess.asFileUri('vs/base/parts/sandbox/electron-browser/preload.js', require).fsPath, sandbox: true, contextIsolation: true, enableWebSQL: false, @@ -76,7 +76,7 @@ export class ProxyAuthHandler extends Disposable { } const win = new BrowserWindow(opts); - const url = require.toUrl('vs/code/electron-sandbox/proxy/auth.html'); + const windowUrl = FileAccess.asBrowserUri('vs/code/electron-sandbox/proxy/auth.html', require); const proxyUrl = `${authInfo.host}:${authInfo.port}`; const title = localize('authRequire', "Proxy Authentication Required"); const message = localize('proxyauth', "The proxy {0} requires authentication.", proxyUrl); @@ -97,6 +97,6 @@ export class ProxyAuthHandler extends Disposable { win.close(); } }); - win.loadURL(url); + win.loadURL(windowUrl.toString(true)); } } diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index a40e860b384..c541a2c7e08 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -13,7 +13,7 @@ import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifec import { IThemeMainService } from 'vs/platform/theme/electron-main/themeMainService'; import { toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; export class SharedProcess implements ISharedProcess { @@ -41,7 +41,7 @@ export class SharedProcess implements ISharedProcess { show: false, backgroundColor: this.themeMainService.getBackgroundColor(), webPreferences: { - preload: getPathFromAmdModule(require, 'vs/base/parts/sandbox/electron-browser/preload.js'), + preload: FileAccess.asFileUri('vs/base/parts/sandbox/electron-browser/preload.js', require).fsPath, nodeIntegration: true, enableWebSQL: false, enableRemoteModule: false, @@ -60,8 +60,10 @@ export class SharedProcess implements ISharedProcess { windowId: this.window.id }; - const url = `${require.toUrl('vs/code/electron-browser/sharedProcess/sharedProcess.html')}?config=${encodeURIComponent(JSON.stringify(config))}`; - this.window.loadURL(url); + const windowUrl = FileAccess + .asBrowserUri('vs/code/electron-browser/sharedProcess/sharedProcess.html', require) + .with({ query: `config=${encodeURIComponent(JSON.stringify(config))}` }); + this.window.loadURL(windowUrl.toString(true)); // Prevent the window from dying const onClose = (e: ElectronEvent) => { diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 17dcfd5a97b..221bc958455 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -34,9 +34,8 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IStorageMainService } from 'vs/platform/storage/node/storageMainService'; import { IFileService } from 'vs/platform/files/common/files'; +import { FileAccess, Schemas } from 'vs/base/common/network'; import { ColorScheme } from 'vs/platform/theme/common/theme'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; -import { Schemas } from 'vs/base/common/network'; export interface IWindowCreationOptions { state: IWindowState; @@ -168,7 +167,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { show: !isFullscreenOrMaximized, title: product.nameLong, webPreferences: { - preload: getPathFromAmdModule(require, 'vs/base/parts/sandbox/electron-browser/preload.js'), + preload: FileAccess.asFileUri('vs/base/parts/sandbox/electron-browser/preload.js', require).fsPath, enableWebSQL: false, enableRemoteModule: false, spellcheck: false, @@ -837,7 +836,10 @@ export class CodeWindow extends Disposable implements ICodeWindow { workbench = 'vs/code/electron-browser/workbench/workbench.html'; } - return `${require.toUrl(workbench)}?config=${encodeURIComponent(JSON.stringify(config))}`; + return FileAccess + .asBrowserUri(workbench, require) + .with({ query: `config=${encodeURIComponent(JSON.stringify(config))}` }) + .toString(true); } serializeWindowState(): IWindowState { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index fa4e7350910..7e30f75eea8 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -10,6 +10,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { URI } from 'vs/base/common/uri'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionManifest, IExtension, ExtensionType } from 'vs/platform/extensions/common/extensions'; +import { FileAccess } from 'vs/base/common/network'; export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9-A-Z]*)\\.([a-z0-9A-Z][a-z0-9-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); @@ -260,7 +261,7 @@ export interface IExtensionTipsService { } -export const DefaultIconPath = require.toUrl('./media/defaultIcon.png'); +export const DefaultIconPath = FileAccess.asBrowserUri('./media/defaultIcon.png', require).toString(true); export const ExtensionsLabel = localize('extensions', "Extensions"); export const ExtensionsLocalizedLabel = { value: ExtensionsLabel, original: 'Extensions' }; export const ExtensionsChannelId = 'extensions'; diff --git a/src/vs/platform/extensionManagement/node/extensionsScanner.ts b/src/vs/platform/extensionManagement/node/extensionsScanner.ts index a2c840c049b..e7342348d46 100644 --- a/src/vs/platform/extensionManagement/node/extensionsScanner.ts +++ b/src/vs/platform/extensionManagement/node/extensionsScanner.ts @@ -14,7 +14,6 @@ import { areSameExtensions, ExtensionIdentifierWithVersion, groupByExtension, ge import { Limiter, Queue } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; import { localizeManifest } from 'vs/platform/extensionManagement/common/extensionNls'; import { localize } from 'vs/nls'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -23,6 +22,7 @@ import { extract, ExtractError } from 'vs/base/node/zip'; import { isWindows } from 'vs/base/common/platform'; import { flatten } from 'vs/base/common/arrays'; import { IStringDictionary } from 'vs/base/common/collections'; +import { FileAccess } from 'vs/base/common/network'; const ERROR_SCANNING_SYS_EXTENSIONS = 'scanningSystem'; const ERROR_SCANNING_USER_EXTENSIONS = 'scanningUser'; @@ -336,7 +336,7 @@ export class ExtensionsScanner extends Disposable { private _devSystemExtensionsPath: string | null = null; private get devSystemExtensionsPath(): string { if (!this._devSystemExtensionsPath) { - this._devSystemExtensionsPath = path.normalize(path.join(getPathFromAmdModule(require, ''), '..', '.build', 'builtInExtensions')); + this._devSystemExtensionsPath = path.normalize(path.join(FileAccess.asFileUri('', require).fsPath, '..', '.build', 'builtInExtensions')); } return this._devSystemExtensionsPath; } diff --git a/src/vs/platform/files/node/watcher/nsfw/watcherService.ts b/src/vs/platform/files/node/watcher/nsfw/watcherService.ts index 36cc3c56995..79fa3ba25f6 100644 --- a/src/vs/platform/files/node/watcher/nsfw/watcherService.ts +++ b/src/vs/platform/files/node/watcher/nsfw/watcherService.ts @@ -8,7 +8,7 @@ import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; import { IDiskFileChange, ILogMessage } from 'vs/platform/files/node/watcher/watcher'; import { Disposable } from 'vs/base/common/lifecycle'; import { IWatcherRequest, IWatcherService } from 'vs/platform/files/node/watcher/nsfw/watcher'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; export class FileWatcher extends Disposable { @@ -34,7 +34,7 @@ export class FileWatcher extends Disposable { private startWatching(): void { const client = this._register(new Client( - getPathFromAmdModule(require, 'bootstrap-fork'), + FileAccess.asFileUri('bootstrap-fork', require).fsPath, { serverName: 'File Watcher (nsfw)', args: ['--type=watcherService'], diff --git a/src/vs/platform/files/node/watcher/unix/watcherService.ts b/src/vs/platform/files/node/watcher/unix/watcherService.ts index 18da926b0ef..e561cc8e513 100644 --- a/src/vs/platform/files/node/watcher/unix/watcherService.ts +++ b/src/vs/platform/files/node/watcher/unix/watcherService.ts @@ -8,7 +8,7 @@ import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; import { IDiskFileChange, ILogMessage } from 'vs/platform/files/node/watcher/watcher'; import { Disposable } from 'vs/base/common/lifecycle'; import { IWatcherRequest, IWatcherOptions, IWatcherService } from 'vs/platform/files/node/watcher/unix/watcher'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; export class FileWatcher extends Disposable { @@ -35,7 +35,7 @@ export class FileWatcher extends Disposable { private startWatching(): void { const client = this._register(new Client( - getPathFromAmdModule(require, 'bootstrap-fork'), + FileAccess.asFileUri('bootstrap-fork', require).fsPath, { serverName: 'File Watcher (chokidar)', args: ['--type=watcherService'], diff --git a/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts b/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts index 9eda54b3c90..4a13ec02886 100644 --- a/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts +++ b/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts @@ -8,7 +8,7 @@ import { FileChangeType } from 'vs/platform/files/common/files'; import * as decoder from 'vs/base/node/decoder'; import * as glob from 'vs/base/common/glob'; import { IDiskFileChange, ILogMessage } from 'vs/platform/files/node/watcher/watcher'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; export class OutOfProcessWin32FolderWatcher { @@ -50,7 +50,7 @@ export class OutOfProcessWin32FolderWatcher { args.push('-verbose'); } - this.handle = cp.spawn(getPathFromAmdModule(require, 'vs/platform/files/node/watcher/win32/CodeHelper.exe'), args); + this.handle = cp.spawn(FileAccess.asFileUri('vs/platform/files/node/watcher/win32/CodeHelper.exe', require).fsPath, args); const stdoutLineDecoder = new decoder.LineDecoder(); diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index ee27d4c8e38..bc2b9bc4deb 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -18,9 +18,9 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IWindowState } from 'vs/platform/windows/electron-main/windows'; import { listProcesses } from 'vs/base/node/ps'; import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogs'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { zoomLevelToZoomFactor } from 'vs/platform/windows/common/windows'; +import { FileAccess } from 'vs/base/common/network'; const DEFAULT_BACKGROUND_COLOR = '#1E1E1E'; @@ -195,7 +195,7 @@ export class IssueMainService implements ICommonIssueService { title: localize('issueReporter', "Issue Reporter"), backgroundColor: data.styles.backgroundColor || DEFAULT_BACKGROUND_COLOR, webPreferences: { - preload: getPathFromAmdModule(require, 'vs/base/parts/sandbox/electron-browser/preload.js'), + preload: FileAccess.asFileUri('vs/base/parts/sandbox/electron-browser/preload.js', require).fsPath, enableWebSQL: false, enableRemoteModule: false, spellcheck: false, @@ -261,7 +261,7 @@ export class IssueMainService implements ICommonIssueService { backgroundColor: data.styles.backgroundColor, title: localize('processExplorer', "Process Explorer"), webPreferences: { - preload: getPathFromAmdModule(require, 'vs/base/parts/sandbox/electron-browser/preload.js'), + preload: FileAccess.asFileUri('vs/base/parts/sandbox/electron-browser/preload.js', require).fsPath, enableWebSQL: false, enableRemoteModule: false, spellcheck: false, @@ -294,7 +294,7 @@ export class IssueMainService implements ICommonIssueService { }; this._processExplorerWindow.loadURL( - toLauchUrl('vs/code/electron-sandbox/processExplorer/processExplorer.html', windowConfiguration)); + toWindowUrl('vs/code/electron-sandbox/processExplorer/processExplorer.html', windowConfiguration)); this._processExplorerWindow.on('close', () => this._processExplorerWindow = null); @@ -435,11 +435,11 @@ export class IssueMainService implements ICommonIssueService { } }; - return toLauchUrl('vs/code/electron-sandbox/issue/issueReporter.html', windowConfiguration); + return toWindowUrl('vs/code/electron-sandbox/issue/issueReporter.html', windowConfiguration); } } -function toLauchUrl(pathToHtml: string, windowConfiguration: T): string { +function toWindowUrl(modulePathToHtml: string, windowConfiguration: T): string { const environment = parseArgs(process.argv, OPTIONS); const config = Object.assign(environment, windowConfiguration); for (const keyValue of Object.keys(config)) { @@ -449,5 +449,8 @@ function toLauchUrl(pathToHtml: string, windowConfiguration: T): string { } } - return `${require.toUrl(pathToHtml)}?config=${encodeURIComponent(JSON.stringify(config))}`; + return FileAccess + .asBrowserUri(modulePathToHtml, require) + .with({ query: `config=${encodeURIComponent(JSON.stringify(config))}` }) + .toString(true); } diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 55567d4b537..798faa74ae8 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -5,9 +5,9 @@ import { IProductConfiguration } from 'vs/platform/product/common/productService'; import { isWeb } from 'vs/base/common/platform'; -import * as path from 'vs/base/common/path'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; import { env } from 'vs/base/common/process'; +import { FileAccess } from 'vs/base/common/network'; +import { dirname, joinPath } from 'vs/base/common/resources'; let product: IProductConfiguration; @@ -43,10 +43,10 @@ if (isWeb || typeof require === 'undefined' || typeof require.__$__nodeRequire ! else { // Obtain values from product.json and package.json - const rootPath = path.dirname(getPathFromAmdModule(require, '')); + const rootPath = dirname(FileAccess.asFileUri('', require)); - product = require.__$__nodeRequire(path.join(rootPath, 'product.json')); - const pkg = require.__$__nodeRequire(path.join(rootPath, 'package.json')) as { version: string; }; + product = require.__$__nodeRequire(joinPath(rootPath, 'product.json').fsPath); + const pkg = require.__$__nodeRequire(joinPath(rootPath, 'package.json').fsPath) as { version: string; }; // Running out of sources if (env['VSCODE_DEV']) { diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index a6a52a00e5a..f8accd9a983 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -54,7 +54,7 @@ import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { IQuickAccessRegistry, Extensions as QuickAccessExtensions } from 'vs/platform/quickinput/common/quickAccess'; import { ActiveGroupEditorsByMostRecentlyUsedQuickAccess, AllEditorsByAppearanceQuickAccess, AllEditorsByMostRecentlyUsedQuickAccess } from 'vs/workbench/browser/parts/editor/editorQuickAccess'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; -import { getUriFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; // Register String Editor Registry.as(EditorExtensions.Editors).registerEditor( @@ -423,13 +423,13 @@ editorCommands.setup(); // Touch Bar if (isMacintosh) { MenuRegistry.appendMenuItem(MenuId.TouchBarContext, { - command: { id: NavigateBackwardsAction.ID, title: NavigateBackwardsAction.LABEL, icon: { dark: getUriFromAmdModule(require, 'vs/workbench/browser/parts/editor/media/back-tb.png') } }, + command: { id: NavigateBackwardsAction.ID, title: NavigateBackwardsAction.LABEL, icon: { dark: FileAccess.asFileUri('vs/workbench/browser/parts/editor/media/back-tb.png', require) } }, group: 'navigation', order: 0 }); MenuRegistry.appendMenuItem(MenuId.TouchBarContext, { - command: { id: NavigateForwardAction.ID, title: NavigateForwardAction.LABEL, icon: { dark: getUriFromAmdModule(require, 'vs/workbench/browser/parts/editor/media/forward-tb.png') } }, + command: { id: NavigateForwardAction.ID, title: NavigateForwardAction.LABEL, icon: { dark: FileAccess.asFileUri('vs/workbench/browser/parts/editor/media/forward-tb.png', require) } }, group: 'navigation', order: 1 }); diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 4f209f32f0a..9f5c4d3ee01 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -46,13 +46,12 @@ import { withNullAsUndefined, withUndefinedAsNull } from 'vs/base/common/types'; import { hash } from 'vs/base/common/hash'; import { guessMimeTypes } from 'vs/base/common/mime'; import { extname } from 'vs/base/common/resources'; -import { Schemas } from 'vs/base/common/network'; +import { FileAccess, Schemas } from 'vs/base/common/network'; import { EditorActivation, EditorOpenContext } from 'vs/platform/editor/common/editor'; import { IDialogService, IFileDialogService, ConfirmResult } from 'vs/platform/dialogs/common/dialogs'; import { ILogService } from 'vs/platform/log/common/log'; import { Codicon } from 'vs/base/common/codicons'; import { IFilesConfigurationService, AutoSaveMode } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; export class EditorGroupView extends Themable implements IEditorGroupView { @@ -1781,7 +1780,7 @@ registerThemingParticipant((theme, collector, environment) => { const letterpress = `./media/letterpress${theme.type === 'dark' ? '-dark' : theme.type === 'hc' ? '-hc' : ''}.svg`; collector.addRule(` .monaco-workbench .part.editor > .content .editor-group-container.empty .editor-group-letterpress { - background-image: url('${getPathFromAmdModule(require, letterpress)}') + background-image: url('${FileAccess.asBrowserUri(letterpress, require).fsPath}') } `); diff --git a/src/vs/workbench/contrib/cli/node/cli.contribution.ts b/src/vs/workbench/contrib/cli/node/cli.contribution.ts index a0dfd14878a..2000693fdf3 100644 --- a/src/vs/workbench/contrib/cli/node/cli.contribution.ts +++ b/src/vs/workbench/contrib/cli/node/cli.contribution.ts @@ -19,7 +19,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import Severity from 'vs/base/common/severity'; import { ILogService } from 'vs/platform/log/common/log'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; import { IProductService } from 'vs/platform/product/common/productService'; function ignore(code: string, value: T): (err: any) => Promise { @@ -29,7 +29,7 @@ function ignore(code: string, value: T): (err: any) => Promise { let _source: string | null = null; function getSource(): string { if (!_source) { - const root = getPathFromAmdModule(require, ''); + const root = FileAccess.asFileUri('', require).fsPath; _source = path.resolve(root, '..', 'bin', 'code'); } return _source; diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index a359e971221..009fe56029d 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -52,7 +52,7 @@ import { DebugTitleContribution } from 'vs/workbench/contrib/debug/browser/debug import { Codicon } from 'vs/base/common/codicons'; import { registerColors } from 'vs/workbench/contrib/debug/browser/debugColors'; import { DebugEditorContribution } from 'vs/workbench/contrib/debug/browser/debugEditorContribution'; -import { getUriFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; const registry = Registry.as(WorkbenchActionRegistryExtensions.WorkbenchActions); const debugCategory = nls.localize('debugCategory', "Debug"); @@ -210,15 +210,15 @@ function registerCommandsAndActions(): void { }); }; - registerTouchBarEntry(StartAction.ID, StartAction.LABEL, 0, CONTEXT_IN_DEBUG_MODE.toNegated(), getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/continue-tb.png')); - registerTouchBarEntry(RunAction.ID, RunAction.LABEL, 1, CONTEXT_IN_DEBUG_MODE.toNegated(), getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/continue-without-debugging-tb.png')); - registerTouchBarEntry(CONTINUE_ID, CONTINUE_LABEL, 0, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/continue-tb.png')); - registerTouchBarEntry(PAUSE_ID, PAUSE_LABEL, 1, ContextKeyExpr.and(CONTEXT_IN_DEBUG_MODE, ContextKeyExpr.notEquals('debugState', 'stopped')), getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/pause-tb.png')); - registerTouchBarEntry(STEP_OVER_ID, STEP_OVER_LABEL, 2, CONTEXT_IN_DEBUG_MODE, getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/stepover-tb.png')); - registerTouchBarEntry(STEP_INTO_ID, STEP_INTO_LABEL, 3, CONTEXT_IN_DEBUG_MODE, getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/stepinto-tb.png')); - registerTouchBarEntry(STEP_OUT_ID, STEP_OUT_LABEL, 4, CONTEXT_IN_DEBUG_MODE, getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/stepout-tb.png')); - registerTouchBarEntry(RESTART_SESSION_ID, RESTART_LABEL, 5, CONTEXT_IN_DEBUG_MODE, getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/restart-tb.png')); - registerTouchBarEntry(STOP_ID, STOP_LABEL, 6, CONTEXT_IN_DEBUG_MODE, getUriFromAmdModule(require, 'vs/workbench/contrib/debug/browser/media/stop-tb.png')); + registerTouchBarEntry(StartAction.ID, StartAction.LABEL, 0, CONTEXT_IN_DEBUG_MODE.toNegated(), FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/continue-tb.png', require)); + registerTouchBarEntry(RunAction.ID, RunAction.LABEL, 1, CONTEXT_IN_DEBUG_MODE.toNegated(), FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/continue-without-debugging-tb.png', require)); + registerTouchBarEntry(CONTINUE_ID, CONTINUE_LABEL, 0, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/continue-tb.png', require)); + registerTouchBarEntry(PAUSE_ID, PAUSE_LABEL, 1, ContextKeyExpr.and(CONTEXT_IN_DEBUG_MODE, ContextKeyExpr.notEquals('debugState', 'stopped')), FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/pause-tb.png', require)); + registerTouchBarEntry(STEP_OVER_ID, STEP_OVER_LABEL, 2, CONTEXT_IN_DEBUG_MODE, FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/stepover-tb.png', require)); + registerTouchBarEntry(STEP_INTO_ID, STEP_INTO_LABEL, 3, CONTEXT_IN_DEBUG_MODE, FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/stepinto-tb.png', require)); + registerTouchBarEntry(STEP_OUT_ID, STEP_OUT_LABEL, 4, CONTEXT_IN_DEBUG_MODE, FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/stepout-tb.png', require)); + registerTouchBarEntry(RESTART_SESSION_ID, RESTART_LABEL, 5, CONTEXT_IN_DEBUG_MODE, FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/restart-tb.png', require)); + registerTouchBarEntry(STOP_ID, STOP_LABEL, 6, CONTEXT_IN_DEBUG_MODE, FileAccess.asFileUri('vs/workbench/contrib/debug/browser/media/stop-tb.png', require)); } } diff --git a/src/vs/workbench/contrib/debug/node/debugHelperService.ts b/src/vs/workbench/contrib/debug/node/debugHelperService.ts index 4089f00771a..a7bed36cf61 100644 --- a/src/vs/workbench/contrib/debug/node/debugHelperService.ts +++ b/src/vs/workbench/contrib/debug/node/debugHelperService.ts @@ -6,7 +6,7 @@ import { IDebugHelperService } from 'vs/workbench/contrib/debug/common/debug'; import { Client as TelemetryClient } from 'vs/base/parts/ipc/node/ipc.cp'; import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -24,7 +24,7 @@ export class NodeDebugHelperService implements IDebugHelperService { createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { const client = new TelemetryClient( - getPathFromAmdModule(require, 'bootstrap-fork'), + FileAccess.asFileUri('bootstrap-fork', require).fsPath, { serverName: 'Debug Telemetry', timeout: 1000 * 60 * 5, diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 3d1fbe7f7a3..7f1d1613ede 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -40,6 +40,7 @@ import { asDomUri } from 'vs/base/browser/dom'; import { getIgnoredExtensions } from 'vs/platform/userDataSync/common/extensionsMerge'; import { isWeb } from 'vs/base/common/platform'; import { getExtensionKind } from 'vs/workbench/services/extensions/common/extensionsUtil'; +import { FileAccess } from 'vs/base/common/network'; interface IExtensionStateProvider { (extension: Extension): T; @@ -151,10 +152,10 @@ class Extension implements IExtension { if (this.type === ExtensionType.System && this.local) { if (this.local.manifest && this.local.manifest.contributes) { if (Array.isArray(this.local.manifest.contributes.themes) && this.local.manifest.contributes.themes.length) { - return require.toUrl('./media/theme-icon.png'); + return FileAccess.asBrowserUri('./media/theme-icon.png', require).toString(true); } if (Array.isArray(this.local.manifest.contributes.grammars) && this.local.manifest.contributes.grammars.length) { - return require.toUrl('./media/language-icon.svg'); + return FileAccess.asBrowserUri('./media/language-icon.svg', require).toString(true); } } } diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index 9a55ddd4e97..3e0af5cc854 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -11,9 +11,9 @@ import * as pfs from 'vs/base/node/pfs'; import * as env from 'vs/base/common/platform'; import { IExternalTerminalService, IExternalTerminalConfiguration, IExternalTerminalSettings } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminal'; +import { FileAccess } from 'vs/base/common/network'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); @@ -144,7 +144,7 @@ export class MacExternalTerminalService implements IExternalTerminalService { // and then launches the program inside that window. const script = terminalApp === DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper'; - const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/externalTerminal/node/${script}.scpt`); + const scriptpath = FileAccess.asFileUri(`vs/workbench/contrib/externalTerminal/node/${script}.scpt`, require).fsPath; const osaArgs = [ scriptpath, diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index 92dab1a41f6..27bfc924f61 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -9,7 +9,7 @@ import { ThrottledDelayer } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { once } from 'vs/base/common/functional'; import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { Schemas } from 'vs/base/common/network'; +import { FileAccess, Schemas } from 'vs/base/common/network'; import { isMacintosh } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; @@ -206,7 +206,10 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme this.styledFindWidget(); } - this.element!.preload = require.toUrl('./pre/electron-index.js'); + // We must ensure to put a `file:` URI as the preload attribute + // and not the `vscode-file` URI because preload scripts are loaded + // via node.js from the main side and only allow `file:` protocol + this.element!.preload = FileAccess.asFileUri('./pre/electron-index.js', require).toString(true); this.element!.src = `${Schemas.vscodeWebview}://${this.id}/electron-browser/index.html?platform=electron`; } diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts index 76f716679d0..49b2111e54b 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts @@ -19,7 +19,7 @@ import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configur import { localize } from 'vs/nls'; import { Action, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { Schemas } from 'vs/base/common/network'; +import { FileAccess, Schemas } from 'vs/base/common/network'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { getInstalledExtensions, IExtensionStatus, onExtensionChanged, isKeymapExtension } from 'vs/workbench/contrib/extensions/common/extensionsUtils'; import { IExtensionManagementService, IExtensionGalleryService, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -47,7 +47,6 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { getUriFromAmdModule } from 'vs/base/common/amd'; const configurationKey = 'workbench.startupEditor'; const oldConfigurationKey = 'workbench.welcome.enabled'; @@ -300,7 +299,7 @@ class WelcomePage extends Disposable { const recentlyOpened = this.workspacesService.getRecentlyOpened(); const installedExtensions = this.instantiationService.invokeFunction(getInstalledExtensions); - const resource = getUriFromAmdModule(require, './vs_code_welcome_page') + const resource = FileAccess.asBrowserUri('./vs_code_welcome_page', require) .with({ scheme: Schemas.walkThrough, query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page' }) diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough.ts b/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough.ts index c02c5aadc85..04a605f1cc3 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough.ts @@ -8,16 +8,15 @@ import { localize } from 'vs/nls'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Action } from 'vs/base/common/actions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { getUriFromAmdModule } from 'vs/base/common/amd'; import { WalkThroughInput, WalkThroughInputOptions } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput'; -import { Schemas } from 'vs/base/common/network'; +import { FileAccess, Schemas } from 'vs/base/common/network'; import { IEditorInputFactory, EditorInput } from 'vs/workbench/common/editor'; const typeId = 'workbench.editors.walkThroughInput'; const inputOptions: WalkThroughInputOptions = { typeId, name: localize('editorWalkThrough.title', "Interactive Playground"), - resource: getUriFromAmdModule(require, './vs_code_editor_walkthrough.md') + resource: FileAccess.asBrowserUri('./vs_code_editor_walkthrough.md', require) .with({ scheme: Schemas.walkThrough, query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough' }) diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts index 8740402bd1c..9b601619a50 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts @@ -29,6 +29,7 @@ import { generateUuid } from 'vs/base/common/uuid'; import { canceled, onUnexpectedError } from 'vs/base/common/errors'; import { WEB_WORKER_IFRAME } from 'vs/workbench/services/extensions/common/webWorkerIframe'; import { Barrier } from 'vs/base/common/async'; +import { FileAccess } from 'vs/base/common/network'; export interface IWebWorkerExtensionHostInitData { readonly autoStart: boolean; @@ -92,7 +93,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost iframe.style.display = 'none'; const vscodeWebWorkerExtHostId = generateUuid(); - const workerUrl = require.toUrl('../worker/extensionHostWorkerMain.js'); + const workerUrl = FileAccess.asBrowserUri('../worker/extensionHostWorkerMain.js', require).toString(true); const workerSrc = getWorkerBootstrapUrl(workerUrl, 'WorkerExtensionHost', true); const escapeAttribute = (value: string): string => { return value.replace(/"/g, '"'); @@ -173,7 +174,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost private async _startOutsideIframe(): Promise { const emitter = new Emitter(); - const url = getWorkerBootstrapUrl(require.toUrl('../worker/extensionHostWorkerMain.js'), 'WorkerExtensionHost'); + const url = getWorkerBootstrapUrl(FileAccess.asBrowserUri('../worker/extensionHostWorkerMain.js', require).toString(true), 'WorkerExtensionHost'); const worker = new Worker(url, { name: 'WorkerExtensionHost' }); const barrier = new Barrier(); diff --git a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts index 600361d6275..2b68774b150 100644 --- a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts @@ -5,9 +5,8 @@ import * as nls from 'vs/nls'; import * as path from 'vs/base/common/path'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; import * as errors from 'vs/base/common/errors'; -import { Schemas } from 'vs/base/common/network'; +import { FileAccess, Schemas } from 'vs/base/common/network'; import * as objects from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; import { joinPath, originalFSPath } from 'vs/base/common/resources'; @@ -30,7 +29,7 @@ interface IExtensionCacheData { let _SystemExtensionsRoot: string | null = null; function getSystemExtensionsRoot(): string { if (!_SystemExtensionsRoot) { - _SystemExtensionsRoot = path.normalize(path.join(getPathFromAmdModule(require, ''), '..', 'extensions')); + _SystemExtensionsRoot = path.normalize(path.join(FileAccess.asFileUri('', require).fsPath, '..', 'extensions')); } return _SystemExtensionsRoot; } @@ -38,7 +37,7 @@ function getSystemExtensionsRoot(): string { let _ExtraDevSystemExtensionsRoot: string | null = null; function getExtraDevSystemExtensionsRoot(): string { if (!_ExtraDevSystemExtensionsRoot) { - _ExtraDevSystemExtensionsRoot = path.normalize(path.join(getPathFromAmdModule(require, ''), '..', '.build', 'builtInExtensions')); + _ExtraDevSystemExtensionsRoot = path.normalize(path.join(FileAccess.asFileUri('', require).fsPath, '..', '.build', 'builtInExtensions')); } return _ExtraDevSystemExtensionsRoot; } diff --git a/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts index fcb8ffa9a05..a92220fc8d6 100644 --- a/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { ChildProcess, fork } from 'child_process'; import { Server, Socket, createServer } from 'net'; import { CrashReporterStartOptions } from 'vs/base/parts/sandbox/electron-sandbox/electronTypes'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; import { timeout } from 'vs/base/common/async'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { Emitter, Event } from 'vs/base/common/event'; @@ -215,7 +215,7 @@ export class LocalProcessExtensionHost implements IExtensionHost { } // Run Extension Host as fork of current process - this._extensionHostProcess = fork(getPathFromAmdModule(require, 'bootstrap-fork'), ['--type=extensionHost'], opts); + this._extensionHostProcess = fork(FileAccess.asFileUri('bootstrap-fork', require).fsPath, ['--type=extensionHost'], opts); // Catch all output coming from the extension host process type Output = { data: string, format: string[] }; diff --git a/src/vs/workbench/services/integrity/node/integrityService.ts b/src/vs/workbench/services/integrity/node/integrityService.ts index cd348ebef86..7d50386ce6f 100644 --- a/src/vs/workbench/services/integrity/node/integrityService.ts +++ b/src/vs/workbench/services/integrity/node/integrityService.ts @@ -15,7 +15,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { getUriFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; interface IStorageData { dontShowPrompt: boolean; @@ -142,7 +142,7 @@ export class IntegrityServiceImpl implements IIntegrityService { } private _resolve(filename: string, expected: string): Promise { - const fileUri = getUriFromAmdModule(require, filename); + const fileUri = FileAccess.asFileUri(filename, require); return new Promise((resolve, reject) => { fs.readFile(fileUri.fsPath, (err, buff) => { if (err) { diff --git a/src/vs/workbench/services/search/electron-browser/searchService.ts b/src/vs/workbench/services/search/electron-browser/searchService.ts index 45ed77c6a42..ea15e40b57f 100644 --- a/src/vs/workbench/services/search/electron-browser/searchService.ts +++ b/src/vs/workbench/services/search/electron-browser/searchService.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { getPathFromAmdModule } from 'vs/base/common/amd'; import { CancellationToken } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; @@ -26,6 +25,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { FileAccess } from 'vs/base/common/network'; export class LocalSearchService extends SearchService { constructor( @@ -82,10 +82,7 @@ export class DiskSearch implements ISearchResultProvider { } } - const client = new Client( - getPathFromAmdModule(require, 'bootstrap-fork'), - opts); - + const client = new Client(FileAccess.asFileUri('bootstrap-fork', require).fsPath, opts); const channel = getNextTickChannel(client.getChannel('search')); this.raw = new SearchChannelClient(channel); } diff --git a/src/vs/workbench/services/textMate/browser/textMateService.ts b/src/vs/workbench/services/textMate/browser/textMateService.ts index ed781d23844..5a594121bf4 100644 --- a/src/vs/workbench/services/textMate/browser/textMateService.ts +++ b/src/vs/workbench/services/textMate/browser/textMateService.ts @@ -14,6 +14,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IStorageService } from 'vs/platform/storage/common/storage'; import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader'; import { IProgressService } from 'vs/platform/progress/common/progress'; +import { FileAccess } from 'vs/base/common/network'; export class TextMateService extends AbstractTextMateService { @@ -31,8 +32,7 @@ export class TextMateService extends AbstractTextMateService { } protected async _loadVSCodeOnigurumWASM(): Promise { - const wasmPath = require.toUrl('vscode-oniguruma/../onig.wasm'); - const response = await fetch(wasmPath); + const response = await fetch(FileAccess.asBrowserUri('vscode-oniguruma/../onig.wasm', require).toString(true)); // Using the response directly only works if the server sets the MIME type 'application/wasm'. // Otherwise, a TypeError is thrown when using the streaming compiler. // We therefore use the non-streaming compiler :(. diff --git a/src/vs/workbench/services/textMate/electron-sandbox/textMateService.ts b/src/vs/workbench/services/textMate/electron-sandbox/textMateService.ts index 57f6cda6726..209e19fbb5b 100644 --- a/src/vs/workbench/services/textMate/electron-sandbox/textMateService.ts +++ b/src/vs/workbench/services/textMate/electron-sandbox/textMateService.ts @@ -26,6 +26,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IProgressService } from 'vs/platform/progress/common/progress'; +import { FileAccess } from 'vs/base/common/network'; const RUN_TEXTMATE_IN_WORKER = false; @@ -182,12 +183,9 @@ export class TextMateService extends AbstractTextMateService { } protected async _loadVSCodeOnigurumWASM(): Promise { - const wasmPath = ( - this._environmentService.isBuilt - ? require.toUrl('../../../../../../node_modules.asar.unpacked/vscode-oniguruma/release/onig.wasm') - : require.toUrl('../../../../../../node_modules/vscode-oniguruma/release/onig.wasm') - ); - const response = await fetch(wasmPath); + const response = await fetch(this._environmentService.isBuilt + ? FileAccess.asBrowserUri('../../../../../../node_modules.asar.unpacked/vscode-oniguruma/release/onig.wasm', require).toString(true) + : FileAccess.asBrowserUri('../../../../../../node_modules/vscode-oniguruma/release/onig.wasm', require).toString(true)); return response; } diff --git a/src/vs/workbench/services/textMate/electron-sandbox/textMateWorker.ts b/src/vs/workbench/services/textMate/electron-sandbox/textMateWorker.ts index bf62c5393a9..5b811274fbc 100644 --- a/src/vs/workbench/services/textMate/electron-sandbox/textMateWorker.ts +++ b/src/vs/workbench/services/textMate/electron-sandbox/textMateWorker.ts @@ -14,6 +14,7 @@ import { TokenizationStateStore } from 'vs/editor/common/model/textModelTokens'; import type { IGrammar, StackElement, IRawTheme, IOnigLib } from 'vscode-textmate'; import { MultilineTokensBuilder, countEOL } from 'vs/editor/common/model/tokensStore'; import { LineTokens } from 'vs/editor/common/core/lineTokens'; +import { FileAccess } from 'vs/base/common/network'; export interface IValidGrammarDefinitionDTO { location: UriComponents; @@ -146,8 +147,7 @@ export class TextMateWorker { }); const vscodeTextmate = await import('vscode-textmate'); const vscodeOniguruma = await import('vscode-oniguruma'); - const wasmPath = require.toUrl('vscode-oniguruma/../onig.wasm'); - const response = await fetch(wasmPath); + const response = await fetch(FileAccess.asBrowserUri('vscode-oniguruma/../onig.wasm', require).toString(true)); // Using the response directly only works if the server sets the MIME type 'application/wasm'. // Otherwise, a TypeError is thrown when using the streaming compiler. // We therefore use the non-streaming compiler :(. diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index 3f29ac6cfa8..a1b6ef62746 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -32,7 +32,7 @@ function initLoader(opts) { nodeRequire: require, nodeMain: __filename, catchError: true, - baseUrl: bootstrap.fileUriFromPath(path.join(__dirname, '../../../src'), process.platform === 'win32'), + baseUrl: bootstrap.fileUriFromPath(path.join(__dirname, '../../../src'), { isWindows: process.platform === 'win32' }), paths: { 'vs': `../${outdir}/vs`, 'lib': `../${outdir}/lib`, From 74842ceac1e8f38109417426b1949e909aa362a1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 25 Sep 2020 14:18:39 +0200 Subject: [PATCH 06/12] debt - more FileAccess adoption --- src/vs/platform/environment/node/environmentService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 5f039341a18..16057c43a08 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -14,7 +14,7 @@ import { memoize } from 'vs/base/common/decorators'; import product from 'vs/platform/product/common/product'; import { toLocalISOString } from 'vs/base/common/date'; import { isWindows, Platform, platform } from 'vs/base/common/platform'; -import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { FileAccess } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; export class NativeEnvironmentService implements INativeEnvironmentService { @@ -24,7 +24,7 @@ export class NativeEnvironmentService implements INativeEnvironmentService { get args(): NativeParsedArgs { return this._args; } @memoize - get appRoot(): string { return path.dirname(getPathFromAmdModule(require, '')); } + get appRoot(): string { return path.dirname(FileAccess.asFileUri('', require).fsPath); } readonly logsPath: string; @@ -111,7 +111,7 @@ export class NativeEnvironmentService implements INativeEnvironmentService { if (fromArgs) { return fromArgs; } else { - return path.normalize(path.join(getPathFromAmdModule(require, ''), '..', 'extensions')); + return path.normalize(path.join(FileAccess.asFileUri('', require).fsPath, '..', 'extensions')); } } From 73084f5ccd68e0c3ab5465973f91cdc41fdea97d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 25 Sep 2020 15:23:44 +0200 Subject: [PATCH 07/12] :up: distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f4877172c8..a0cbf1a3ab6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.50.0", - "distro": "20bcc93e22ceef0a6c4464ae78363429f59be797", + "distro": "f4fbb2133880d47be366fb94ea9d149862bddaf3", "author": { "name": "Microsoft Corporation" }, From b67b5e8e31fc2ff7c9baea3f223e7e1544fb197b Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 25 Sep 2020 16:03:37 +0200 Subject: [PATCH 08/12] Exclude node inspect from auto port forwarding Fixes #107243 --- src/vs/workbench/contrib/remote/browser/remote.ts | 12 +++++++++++- src/vs/workbench/contrib/remote/browser/urlFinder.ts | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/remote/browser/remote.ts b/src/vs/workbench/contrib/remote/browser/remote.ts index 069249ebda9..3f5443776f5 100644 --- a/src/vs/workbench/contrib/remote/browser/remote.ts +++ b/src/vs/workbench/contrib/remote/browser/remote.ts @@ -841,6 +841,8 @@ class RemoteAgentConnectionStatusListener implements IWorkbenchContribution { } class AutomaticPortForwarding extends Disposable implements IWorkbenchContribution { + private contextServiceListener: IDisposable; + constructor( @ITerminalService private readonly terminalService: ITerminalService, @INotificationService private readonly notificationService: INotificationService, @@ -854,12 +856,20 @@ class AutomaticPortForwarding extends Disposable implements IWorkbenchContributi if (this.environmentService.configuration.remoteAuthority) { this.startUrlFinder(); } + this.contextServiceListener = this._register(this.contextKeyService.onDidChangeContext(e => { + if (e.affectsSome(new Set(forwardedPortsViewEnabled.keys()))) { + this.startUrlFinder(); + } + })); } + private isStarted = false; private startUrlFinder() { - if (!forwardedPortsViewEnabled.getValue(this.contextKeyService)) { + if (!this.isStarted && !forwardedPortsViewEnabled.getValue(this.contextKeyService)) { return; } + this.contextServiceListener.dispose(); + this.isStarted = true; const urlFinder = this._register(new UrlFinder(this.terminalService)); this._register(urlFinder.onDidMatchLocalUrl(async (localUrl) => { const forwarded = await this.remoteExplorerService.forward(localUrl); diff --git a/src/vs/workbench/contrib/remote/browser/urlFinder.ts b/src/vs/workbench/contrib/remote/browser/urlFinder.ts index d0ee06fd48b..2962235ee70 100644 --- a/src/vs/workbench/contrib/remote/browser/urlFinder.ts +++ b/src/vs/workbench/contrib/remote/browser/urlFinder.ts @@ -63,6 +63,10 @@ export class UrlFinder extends Disposable { if (host !== '0.0.0.0' && host !== '127.0.0.1') { host = 'localhost'; } + // Exclude node inspect, except when using defualt port + if (port !== 9229 && data.startsWith('Debugger listening on')) { + return; + } this._onDidMatchLocalUrl.fire({ port, host }); } } From 8932f62afac9b07b143e4935ed0f4de7deebe739 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 25 Sep 2020 15:59:15 +0200 Subject: [PATCH 09/12] adress API feedback https://github.com/microsoft/vscode/issues/54938 --- extensions/git/src/decorationProvider.ts | 36 +++++++++---------- extensions/git/src/repository.ts | 10 +++--- src/vs/vscode.proposed.d.ts | 34 ++++++++---------- .../workbench/api/common/extHost.api.impl.ts | 4 +-- .../api/common/extHostDecorations.ts | 14 ++++---- src/vs/workbench/api/common/extHostTypes.ts | 21 +++++++---- .../browser/api/extHostDecorations.test.ts | 10 +++--- 7 files changed, 65 insertions(+), 64 deletions(-) diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index ab6e5713e11..a61dd720caf 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { window, workspace, Uri, Disposable, Event, EventEmitter, Decoration, DecorationProvider, ThemeColor } from 'vscode'; +import { window, workspace, Uri, Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, ThemeColor } from 'vscode'; import * as path from 'path'; import { Repository, GitResourceGroup } from './repository'; import { Model } from './model'; @@ -11,16 +11,16 @@ import { debounce } from './decorators'; import { filterEvent, dispose, anyEvent, fireEvent, PromiseSource } from './util'; import { GitErrorCodes, Status } from './api/git'; -class GitIgnoreDecorationProvider implements DecorationProvider { +class GitIgnoreDecorationProvider implements FileDecorationProvider { - private static Decoration: Decoration = { priority: 3, color: new ThemeColor('gitDecoration.ignoredResourceForeground') }; + private static Decoration: FileDecoration = { priority: 3, color: new ThemeColor('gitDecoration.ignoredResourceForeground') }; - readonly onDidChangeDecorations: Event; - private queue = new Map>; }>(); + readonly onDidChange: Event; + private queue = new Map>; }>(); private disposables: Disposable[] = []; constructor(private model: Model) { - this.onDidChangeDecorations = fireEvent(anyEvent( + this.onDidChange = fireEvent(anyEvent( filterEvent(workspace.onDidSaveTextDocument, e => /\.gitignore$|\.git\/info\/exclude$/.test(e.uri.path)), model.onDidOpenRepository, model.onDidCloseRepository @@ -29,7 +29,7 @@ class GitIgnoreDecorationProvider implements DecorationProvider { this.disposables.push(window.registerDecorationProvider(this)); } - async provideDecoration(uri: Uri): Promise { + async provideFileDecoration(uri: Uri): Promise { const repository = this.model.getRepository(uri); if (!repository) { @@ -39,7 +39,7 @@ class GitIgnoreDecorationProvider implements DecorationProvider { let queueItem = this.queue.get(repository.root); if (!queueItem) { - queueItem = { repository, queue: new Map>() }; + queueItem = { repository, queue: new Map>() }; this.queue.set(repository.root, queueItem); } @@ -84,19 +84,19 @@ class GitIgnoreDecorationProvider implements DecorationProvider { } } -class GitDecorationProvider implements DecorationProvider { +class GitDecorationProvider implements FileDecorationProvider { - private static SubmoduleDecorationData: Decoration = { - title: 'Submodule', - letter: 'S', + private static SubmoduleDecorationData: FileDecoration = { + tooltip: 'Submodule', + badge: 'S', color: new ThemeColor('gitDecoration.submoduleResourceForeground') }; private readonly _onDidChangeDecorations = new EventEmitter(); - readonly onDidChangeDecorations: Event = this._onDidChangeDecorations.event; + readonly onDidChange: Event = this._onDidChangeDecorations.event; private disposables: Disposable[] = []; - private decorations = new Map(); + private decorations = new Map(); constructor(private repository: Repository) { this.disposables.push( @@ -106,7 +106,7 @@ class GitDecorationProvider implements DecorationProvider { } private onDidRunGitStatus(): void { - let newDecorations = new Map(); + let newDecorations = new Map(); this.collectSubmoduleDecorationData(newDecorations); this.collectDecorationData(this.repository.indexGroup, newDecorations); @@ -119,7 +119,7 @@ class GitDecorationProvider implements DecorationProvider { this._onDidChangeDecorations.fire([...uris.values()].map(value => Uri.parse(value, true))); } - private collectDecorationData(group: GitResourceGroup, bucket: Map): void { + private collectDecorationData(group: GitResourceGroup, bucket: Map): void { for (const r of group.resourceStates) { const decoration = r.resourceDecoration; @@ -134,13 +134,13 @@ class GitDecorationProvider implements DecorationProvider { } } - private collectSubmoduleDecorationData(bucket: Map): void { + private collectSubmoduleDecorationData(bucket: Map): void { for (const submodule of this.repository.submodules) { bucket.set(Uri.file(path.join(this.repository.root, submodule.path)).toString(), GitDecorationProvider.SubmoduleDecorationData); } } - provideDecoration(uri: Uri): Decoration | undefined { + provideFileDecoration(uri: Uri): FileDecoration | undefined { return this.decorations.get(uri.toString()); } diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index f5e8a5ccfb3..ab32edbff66 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, Decoration } from 'vscode'; +import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, FileDecoration } from 'vscode'; import * as nls from 'vscode-nls'; import { Branch, Change, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status, CommitOptions, BranchQuery } from './api/git'; import { AutoFetcher } from './autofetch'; @@ -253,11 +253,11 @@ export class Resource implements SourceControlResourceState { } } - get resourceDecoration(): Decoration { + get resourceDecoration(): FileDecoration { return { - bubble: this.type !== Status.DELETED && this.type !== Status.INDEX_DELETED, - title: this.tooltip, - letter: this.letter, + propagte: this.type !== Status.DELETED && this.type !== Status.INDEX_DELETED, + tooltip: this.tooltip, + badge: this.letter, color: this.color, priority: this.priority }; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index ae1b9cd29ed..22067ae3967 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -717,23 +717,18 @@ declare module 'vscode' { //#region file-decorations: https://github.com/microsoft/vscode/issues/54938 - // TODO@jrieken FileDecoration, FileDecorationProvider etc. - // TODO@jrieken Add selector notion to limit decorations to a view. - // TODO@jrieken Rename `Decoration.letter` to `short` so that it could be used for coverage et al. // TODO@jrieken priority -> DecorationSeverity.INFO,WARN,ERROR - // TODO@jrieken title -> tooltip - // TODO@jrieken bubble -> propagte - export class Decoration { + export class FileDecoration { /** - * A letter that represents this decoration. + * A very short string that represents this decoration. */ - letter?: string; + badge?: string; /** - * The human-readable title for this decoration. + * A human-readable tooltip for this decoration. */ - title?: string; + tooltip?: string; /** * The color of this decoration. @@ -747,46 +742,45 @@ declare module 'vscode' { /** * A flag expressing that this decoration should be - * propagted to its parents. + * propagated to its parents. */ - bubble?: boolean; + propagte?: boolean; /** * Creates a new decoration. * - * @param letter A letter that represents the decoration. - * @param title The title of the decoration. + * @param badge A letter that represents the decoration. + * @param tooltip The tooltip of the decoration. * @param color The color of the decoration. */ - constructor(letter?: string, title?: string, color?: ThemeColor); + constructor(badge?: string, tooltip?: string, color?: ThemeColor); } /** * The decoration provider interfaces defines the contract between extensions and * file decorations. */ - export interface DecorationProvider { + export interface FileDecorationProvider { /** * An event to signal decorations for one or many files have changed. * * @see [EventEmitter](#EventEmitter */ - onDidChangeDecorations: Event; + onDidChange: Event; /** * Provide decorations for a given uri. * - * * @param uri The uri of the file to provide a decoration for. * @param token A cancellation token. * @returns A decoration or a thenable that resolves to such. */ - provideDecoration(uri: Uri, token: CancellationToken): ProviderResult; + provideFileDecoration(uri: Uri, token: CancellationToken): ProviderResult; } export namespace window { - export function registerDecorationProvider(provider: DecorationProvider): Disposable; + export function registerDecorationProvider(provider: FileDecorationProvider): Disposable; } //#endregion diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 000b8a27af5..7917c012359 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -605,7 +605,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I registerCustomEditorProvider: (viewType: string, provider: vscode.CustomTextEditorProvider | vscode.CustomReadonlyEditorProvider, options: { webviewOptions?: vscode.WebviewPanelOptions, supportsMultipleEditorsPerDocument?: boolean } = {}) => { return extHostCustomEditors.registerCustomEditorProvider(extension, viewType, provider, options); }, - registerDecorationProvider(provider: vscode.DecorationProvider) { + registerDecorationProvider(provider: vscode.FileDecorationProvider) { checkProposedApiEnabled(extension); return extHostDecorations.registerDecorationProvider(provider, extension.identifier); }, @@ -1138,7 +1138,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I CallHierarchyItem: extHostTypes.CallHierarchyItem, DebugConsoleMode: extHostTypes.DebugConsoleMode, DebugConfigurationProviderTriggerKind: extHostTypes.DebugConfigurationProviderTriggerKind, - Decoration: extHostTypes.Decoration, + FileDecoration: extHostTypes.FileDecoration, UIKind: UIKind, ColorThemeKind: extHostTypes.ColorThemeKind, TimelineItem: extHostTypes.TimelineItem, diff --git a/src/vs/workbench/api/common/extHostDecorations.ts b/src/vs/workbench/api/common/extHostDecorations.ts index 3e52bbcc3aa..ddc119d1842 100644 --- a/src/vs/workbench/api/common/extHostDecorations.ts +++ b/src/vs/workbench/api/common/extHostDecorations.ts @@ -6,7 +6,7 @@ import type * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; import { MainContext, ExtHostDecorationsShape, MainThreadDecorationsShape, DecorationData, DecorationRequest, DecorationReply } from 'vs/workbench/api/common/extHost.protocol'; -import { Disposable, Decoration } from 'vs/workbench/api/common/extHostTypes'; +import { Disposable, FileDecoration } from 'vs/workbench/api/common/extHostTypes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -15,7 +15,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { asArray } from 'vs/base/common/arrays'; interface ProviderData { - provider: vscode.DecorationProvider; + provider: vscode.FileDecorationProvider; extensionId: ExtensionIdentifier; } @@ -34,12 +34,12 @@ export class ExtHostDecorations implements ExtHostDecorationsShape { this._proxy = extHostRpc.getProxy(MainContext.MainThreadDecorations); } - registerDecorationProvider(provider: vscode.DecorationProvider, extensionId: ExtensionIdentifier): vscode.Disposable { + registerDecorationProvider(provider: vscode.FileDecorationProvider, extensionId: ExtensionIdentifier): vscode.Disposable { const handle = ExtHostDecorations._handlePool++; this._provider.set(handle, { provider, extensionId }); this._proxy.$registerDecorationProvider(handle, extensionId.value); - const listener = provider.onDidChangeDecorations(e => { + const listener = provider.onDidChange(e => { this._proxy.$onDidChange(handle, !e || (Array.isArray(e) && e.length > 250) ? null : asArray(e)); @@ -65,13 +65,13 @@ export class ExtHostDecorations implements ExtHostDecorationsShape { await Promise.all(requests.map(async request => { try { const { uri, id } = request; - const data = await Promise.resolve(provider.provideDecoration(URI.revive(uri), token)); + const data = await Promise.resolve(provider.provideFileDecoration(URI.revive(uri), token)); if (!data) { return; } try { - Decoration.validate(data); - result[id] = [data.priority, data.bubble, data.title, data.letter, data.color]; + FileDecoration.validate(data); + result[id] = [data.priority, data.propagte, data.tooltip, data.badge, data.color]; } catch (e) { this._logService.warn(`INVALID decoration from extension '${extensionId.value}': ${e}`); } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 1497c19da9c..3ba9bc36d3c 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -2729,22 +2729,29 @@ export enum ExtensionKind { Workspace = 2 } -export class Decoration { +export class FileDecoration { - static validate(d: Decoration): void { - if (d.letter && d.letter.length !== 1) { + static validate(d: FileDecoration): void { + if (d.badge && d.badge.length !== 1) { throw new Error(`The 'letter'-property must be undefined or a single character`); } - if (!d.bubble && !d.color && !d.letter && !d.priority && !d.title) { + if (!d.color && !d.badge && !d.tooltip) { throw new Error(`The decoration is empty`); } } - letter?: string; - title?: string; + badge?: string; + tooltip?: string; color?: vscode.ThemeColor; priority?: number; - bubble?: boolean; + propagate?: boolean; + + + constructor(badge?: string, tooltip?: string, color?: ThemeColor) { + this.badge = badge; + this.tooltip = tooltip; + this.color = color; + } } //#region Theming diff --git a/src/vs/workbench/test/browser/api/extHostDecorations.test.ts b/src/vs/workbench/test/browser/api/extHostDecorations.test.ts index 073006e636d..d086c14226e 100644 --- a/src/vs/workbench/test/browser/api/extHostDecorations.test.ts +++ b/src/vs/workbench/test/browser/api/extHostDecorations.test.ts @@ -48,8 +48,8 @@ suite('ExtHostDecorations', function () { // never returns extHostDecorations.registerDecorationProvider({ - onDidChangeDecorations: Event.None, - provideDecoration() { + onDidChange: Event.None, + provideFileDecoration() { calledA = true; return new Promise(() => { }); } @@ -57,10 +57,10 @@ suite('ExtHostDecorations', function () { // always returns extHostDecorations.registerDecorationProvider({ - onDidChangeDecorations: Event.None, - provideDecoration() { + onDidChange: Event.None, + provideFileDecoration() { calledB = true; - return new Promise(resolve => resolve({ letter: 'H', title: 'Hello' })); + return new Promise(resolve => resolve({ badge: 'H', tooltip: 'Hello' })); } }, nullExtensionDescription.identifier); From 0a914e0e6106a87d2c18f43ce27b51ca1f03158b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 25 Sep 2020 16:13:18 +0200 Subject: [PATCH 10/12] remove priority all togther, maybe add something like severity in the future, https://github.com/microsoft/vscode/issues/54938 --- extensions/git/src/decorationProvider.ts | 2 +- src/vs/vscode.proposed.d.ts | 7 +------ src/vs/workbench/api/browser/mainThreadDecorations.ts | 4 ++-- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostDecorations.ts | 2 +- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index a61dd720caf..a4fbf0ad459 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -13,7 +13,7 @@ import { GitErrorCodes, Status } from './api/git'; class GitIgnoreDecorationProvider implements FileDecorationProvider { - private static Decoration: FileDecoration = { priority: 3, color: new ThemeColor('gitDecoration.ignoredResourceForeground') }; + private static Decoration: FileDecoration = { color: new ThemeColor('gitDecoration.ignoredResourceForeground') }; readonly onDidChange: Event; private queue = new Map>; }>(); diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 22067ae3967..2e06d3ee301 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -717,7 +717,7 @@ declare module 'vscode' { //#region file-decorations: https://github.com/microsoft/vscode/issues/54938 - // TODO@jrieken priority -> DecorationSeverity.INFO,WARN,ERROR + export class FileDecoration { /** @@ -735,11 +735,6 @@ declare module 'vscode' { */ color?: ThemeColor; - /** - * The priority of this decoration. - */ - priority?: number; - /** * A flag expressing that this decoration should be * propagated to its parents. diff --git a/src/vs/workbench/api/browser/mainThreadDecorations.ts b/src/vs/workbench/api/browser/mainThreadDecorations.ts index e2f865dfa4e..501f1841c8f 100644 --- a/src/vs/workbench/api/browser/mainThreadDecorations.ts +++ b/src/vs/workbench/api/browser/mainThreadDecorations.ts @@ -92,9 +92,9 @@ export class MainThreadDecorations implements MainThreadDecorationsShape { if (!data) { return undefined; } - const [weight, bubble, tooltip, letter, themeColor] = data; + const [bubble, tooltip, letter, themeColor] = data; return { - weight: weight ?? 0, + weight: 10, bubble: bubble ?? false, color: themeColor?.id, tooltip, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index d8c45c2afbf..79cd256ccaf 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1605,7 +1605,7 @@ export interface DecorationRequest { readonly uri: UriComponents; } -export type DecorationData = [number, boolean, string, string, ThemeColor]; +export type DecorationData = [boolean, string, string, ThemeColor]; export type DecorationReply = { [id: number]: DecorationData; }; export interface ExtHostDecorationsShape { diff --git a/src/vs/workbench/api/common/extHostDecorations.ts b/src/vs/workbench/api/common/extHostDecorations.ts index ddc119d1842..55224380b74 100644 --- a/src/vs/workbench/api/common/extHostDecorations.ts +++ b/src/vs/workbench/api/common/extHostDecorations.ts @@ -71,7 +71,7 @@ export class ExtHostDecorations implements ExtHostDecorationsShape { } try { FileDecoration.validate(data); - result[id] = [data.priority, data.propagte, data.tooltip, data.badge, data.color]; + result[id] = [data.propagte, data.tooltip, data.badge, data.color]; } catch (e) { this._logService.warn(`INVALID decoration from extension '${extensionId.value}': ${e}`); } From b241d4cd1fe455f4414fa511217d6b1283452aff Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 25 Sep 2020 16:26:52 +0200 Subject: [PATCH 11/12] fix typo, https://github.com/microsoft/vscode/issues/54938 --- extensions/git/src/repository.ts | 10 +++------- src/vs/vscode.proposed.d.ts | 2 +- src/vs/workbench/api/common/extHostDecorations.ts | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index ab32edbff66..d218e88bd6e 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -254,13 +254,9 @@ export class Resource implements SourceControlResourceState { } get resourceDecoration(): FileDecoration { - return { - propagte: this.type !== Status.DELETED && this.type !== Status.INDEX_DELETED, - tooltip: this.tooltip, - badge: this.letter, - color: this.color, - priority: this.priority - }; + const res = new FileDecoration(this.letter, this.tooltip, this.color); + res.propagate = this.type !== Status.DELETED && this.type !== Status.INDEX_DELETED; + return res; } constructor( diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 2e06d3ee301..7184fcdc1a5 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -739,7 +739,7 @@ declare module 'vscode' { * A flag expressing that this decoration should be * propagated to its parents. */ - propagte?: boolean; + propagate?: boolean; /** * Creates a new decoration. diff --git a/src/vs/workbench/api/common/extHostDecorations.ts b/src/vs/workbench/api/common/extHostDecorations.ts index 55224380b74..bb32c600312 100644 --- a/src/vs/workbench/api/common/extHostDecorations.ts +++ b/src/vs/workbench/api/common/extHostDecorations.ts @@ -71,7 +71,7 @@ export class ExtHostDecorations implements ExtHostDecorationsShape { } try { FileDecoration.validate(data); - result[id] = [data.propagte, data.tooltip, data.badge, data.color]; + result[id] = [data.propagate, data.tooltip, data.badge, data.color]; } catch (e) { this._logService.warn(`INVALID decoration from extension '${extensionId.value}': ${e}`); } From dab1430be0567e2ff66c1889e57524f70da1183b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 25 Sep 2020 07:31:02 -0700 Subject: [PATCH 12/12] Shutdown exthost terminal processes gracefully Fixes #107444 --- .../api/common/extHostTerminalService.ts | 43 +++++++++++-------- .../extensions/common/extensionHostMain.ts | 4 ++ 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 01c4ece2795..d722f2b428e 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -13,7 +13,7 @@ import { ITerminalChildProcess, ITerminalDimensions, EXT_HOST_CREATION_DELAY, IT import { timeout } from 'vs/base/common/async'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { TerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminalDataBuffering'; -import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { Disposable as VSCodeDisposable, EnvironmentVariableMutatorType } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; @@ -22,7 +22,7 @@ import { NotSupportedError } from 'vs/base/common/errors'; import { serializeEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableShared'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; -export interface IExtHostTerminalService extends ExtHostTerminalServiceShape { +export interface IExtHostTerminalService extends ExtHostTerminalServiceShape, IDisposable { readonly _serviceBrand: undefined; @@ -306,14 +306,14 @@ interface ICachedLinkEntry { link: vscode.TerminalLink; } -export abstract class BaseExtHostTerminalService implements IExtHostTerminalService, ExtHostTerminalServiceShape { +export abstract class BaseExtHostTerminalService extends Disposable implements IExtHostTerminalService, ExtHostTerminalServiceShape { readonly _serviceBrand: undefined; protected _proxy: MainThreadTerminalServiceShape; protected _activeTerminal: ExtHostTerminal | undefined; protected _terminals: ExtHostTerminal[] = []; - protected _terminalProcesses: { [id: number]: ITerminalChildProcess } = {}; + protected _terminalProcesses: Map = new Map(); protected _terminalProcessDisposables: { [id: number]: IDisposable } = {}; protected _extensionTerminalAwaitingStart: { [id: number]: { initialDimensions: ITerminalDimensionsDto | undefined } | undefined } = {}; protected _getTerminalPromises: { [id: number]: Promise } = {}; @@ -342,6 +342,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ supportsProcesses: boolean, @IExtHostRpcService extHostRpc: IExtHostRpcService ) { + super(); this._proxy = extHostRpc.getProxy(MainContext.MainThreadTerminalService); this._bufferer = new TerminalDataBufferer(this._proxy.$sendProcessData); this._onDidWriteTerminalData = new Emitter({ @@ -349,6 +350,13 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ onLastListenerRemove: () => this._proxy.$stopSendingDataEvents() }); this._proxy.$registerProcessSupport(supportsProcesses); + this._register({ + dispose: () => { + for (const [_, terminalProcess] of this._terminalProcesses) { + terminalProcess.shutdown(true); + } + } + }); } public abstract createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal; @@ -421,11 +429,9 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ public async $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): Promise { await this._getTerminalByIdEventually(id); - if (this._terminalProcesses[id]) { - // Extension pty terminal only - when virtual process resize fires it means that the - // terminal's maximum dimensions changed - this._terminalProcesses[id]?.resize(cols, rows); - } + // Extension pty terminal only - when virtual process resize fires it means that the + // terminal's maximum dimensions changed + this._terminalProcesses.get(id)?.resize(cols, rows); } public async $acceptTerminalTitleChange(id: number, name: string): Promise { @@ -497,8 +503,9 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ }); } - if (this._terminalProcesses[id]) { - (this._terminalProcesses[id] as ExtHostPseudoterminal).startSendingEvents(initialDimensions); + const terminalProcess = this._terminalProcesses.get(id); + if (terminalProcess) { + (terminalProcess as ExtHostPseudoterminal).startSendingEvents(initialDimensions); } else { // Defer startSendingEvents call to when _setupExtHostProcessListeners is called this._extensionTerminalAwaitingStart[id] = { initialDimensions }; @@ -520,7 +527,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ if (p.onProcessOverrideDimensions) { disposables.add(p.onProcessOverrideDimensions(e => this._proxy.$sendOverrideDimensions(id, e))); } - this._terminalProcesses[id] = p; + this._terminalProcesses.set(id, p); const awaitingStart = this._extensionTerminalAwaitingStart[id]; if (awaitingStart && p instanceof ExtHostPseudoterminal) { @@ -532,12 +539,12 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ } public $acceptProcessInput(id: number, data: string): void { - this._terminalProcesses[id]?.input(data); + this._terminalProcesses.get(id)?.input(data); } public $acceptProcessResize(id: number, cols: number, rows: number): void { try { - this._terminalProcesses[id]?.resize(cols, rows); + this._terminalProcesses.get(id)?.resize(cols, rows); } catch (error) { // We tried to write to a closed pipe / channel. if (error.code !== 'EPIPE' && error.code !== 'ERR_IPC_CHANNEL_CLOSED') { @@ -547,15 +554,15 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ } public $acceptProcessShutdown(id: number, immediate: boolean): void { - this._terminalProcesses[id]?.shutdown(immediate); + this._terminalProcesses.get(id)?.shutdown(immediate); } public $acceptProcessRequestInitialCwd(id: number): void { - this._terminalProcesses[id]?.getInitialCwd().then(initialCwd => this._proxy.$sendProcessInitialCwd(id, initialCwd)); + this._terminalProcesses.get(id)?.getInitialCwd().then(initialCwd => this._proxy.$sendProcessInitialCwd(id, initialCwd)); } public $acceptProcessRequestCwd(id: number): void { - this._terminalProcesses[id]?.getCwd().then(cwd => this._proxy.$sendProcessCwd(id, cwd)); + this._terminalProcesses.get(id)?.getCwd().then(cwd => this._proxy.$sendProcessCwd(id, cwd)); } public $acceptProcessRequestLatency(id: number): number { @@ -648,7 +655,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ this._bufferer.stopBuffering(id); // Remove process reference - delete this._terminalProcesses[id]; + this._terminalProcesses.delete(id); delete this._extensionTerminalAwaitingStart[id]; // Clean up process disposables diff --git a/src/vs/workbench/services/extensions/common/extensionHostMain.ts b/src/vs/workbench/services/extensions/common/extensionHostMain.ts index 552e08e1917..e6b9d6fcb17 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostMain.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostMain.ts @@ -21,6 +21,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IExtHostRpcService, ExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { IURITransformerService, URITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; import { IExtHostExtensionService, IHostUtils } from 'vs/workbench/api/common/extHostExtensionService'; +import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; export interface IExitFn { (code?: number): any; @@ -61,6 +62,9 @@ export class ExtensionHostMain { // todo@joh // ugly self - inject + const terminalService = instaService.invokeFunction(accessor => accessor.get(IExtHostTerminalService)); + this._disposables.add(terminalService); + const logService = instaService.invokeFunction(accessor => accessor.get(ILogService)); this._disposables.add(logService);