From a34e15b15f4fd68c655fd17438461a2f1b4260cc Mon Sep 17 00:00:00 2001 From: Janis Gailis <> Date: Thu, 21 May 2020 16:15:39 +0300 Subject: [PATCH 001/107] Add terminal colors Terminal colors are taken from Monokai, with the exception for ANSI black, which is the editor background color. --- .../themes/dimmed-monokai-color-theme.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json index 8b1fe2dd80e..935573463ee 100644 --- a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json +++ b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json @@ -42,7 +42,23 @@ "pickerGroup.foreground": "#b0b0b0", "terminal.ansiWhite": "#ffffff", "inputOption.activeBorder": "#3655b5", - "focusBorder": "#3655b5" + "focusBorder": "#3655b5", + "terminal.ansiBlack": "#1e1e1e", + "terminal.ansiRed": "#C4265E", // the bright color with ~75% transparent on the background + "terminal.ansiGreen": "#86B42B", + "terminal.ansiYellow": "#B3B42B", + "terminal.ansiBlue": "#6A7EC8", + "terminal.ansiMagenta": "#8C6BC8", + "terminal.ansiCyan": "#56ADBC", + "terminal.ansiWhite": "#e3e3dd", + "terminal.ansiBrightBlack": "#666666", + "terminal.ansiBrightRed": "#f92672", + "terminal.ansiBrightGreen": "#A6E22E", + "terminal.ansiBrightYellow": "#e2e22e", // hue shifted #A6E22E + "terminal.ansiBrightBlue": "#819aff", // hue shifted #AE81FF + "terminal.ansiBrightMagenta": "#AE81FF", + "terminal.ansiBrightCyan": "#66D9EF", + "terminal.ansiBrightWhite": "#f8f8f2" }, "tokenColors": [ { From 3514e96bf5b684579a1bdabbdac9fd9dda281906 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 22 May 2020 12:21:25 +0200 Subject: [PATCH 002/107] sandbox - add rules for new electron-sandbox layer --- .eslintrc.json | 133 +++++++++++++++++++++++++++++-------- build/lib/layersChecker.js | 8 +++ build/lib/layersChecker.ts | 9 +++ 3 files changed, 122 insertions(+), 28 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 1c420f93df5..82525d19afe 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -63,13 +63,18 @@ "browser": [ "common" ], - "electron-main": [ + "electron-sandbox": [ "common", - "node" + "browser" ], "electron-browser": [ "common", "browser", + "node", + "electron-sandbox" + ], + "electron-main": [ + "common", "node" ] } @@ -104,6 +109,14 @@ "**/vs/base/{common,browser}/**" ] }, + { + "target": "**/vs/base/electron-sandbox/**", + "restrictions": [ + "vs/nls", + "vs/css!./**/*", + "**/vs/base/{common,browser,electron-sandbox}/**" + ] + }, { "target": "**/vs/base/node/**", "restrictions": [ @@ -149,13 +162,22 @@ "*" // node modules ] }, + { + "target": "**/vs/base/parts/*/electron-sandbox/**", + "restrictions": [ + "vs/nls", + "vs/css!./**/*", + "**/vs/base/{common,browser,electron-sandbox}/**", + "**/vs/base/parts/*/{common,browser,electron-sandbox}/**" + ] + }, { "target": "**/vs/base/parts/*/electron-browser/**", "restrictions": [ "vs/nls", "vs/css!./**/*", - "**/vs/base/{common,browser,node,electron-browser}/**", - "**/vs/base/parts/*/{common,browser,node,electron-browser}/**", + "**/vs/base/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**", "*" // node modules ] }, @@ -209,14 +231,24 @@ "*" // node modules ] }, + { + "target": "**/vs/platform/*/electron-sandbox/**", + "restrictions": [ + "vs/nls", + "vs/css!./**/*", + "**/vs/base/{common,browser,electron-sandbox}/**", + "**/vs/base/parts/*/{common,browser,electron-sandbox}/**", + "**/vs/platform/*/{common,browser,electron-sandbox}/**" + ] + }, { "target": "**/vs/platform/*/electron-browser/**", "restrictions": [ "vs/nls", "vs/css!./**/*", - "**/vs/base/{common,browser,node}/**", - "**/vs/base/parts/*/{common,browser,node,electron-browser}/**", - "**/vs/platform/*/{common,browser,node,electron-browser}/**", + "**/vs/base/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/platform/*/{common,browser,node,electron-sandbox,electron-browser}/**", "*" // node modules ] }, @@ -420,18 +452,34 @@ "**/vs/**/{common,worker}/**" ] }, + { + "target": "**/vs/workbench/electron-sandbox/**", + "restrictions": [ + "vs/nls", + "vs/css!./**/*", + "**/vs/base/{common,browser,electron-sandbox}/**", + "**/vs/base/parts/*/{common,browser,electron-sandbox}/**", + "**/vs/platform/*/{common,browser,electron-sandbox}/**", + "**/vs/editor/{common,browser,electron-sandbox}/**", + "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention + "**/vs/workbench/{common,browser,electron-sandbox}/**", + "**/vs/workbench/api/{common,browser,electron-sandbox}/**", + "**/vs/workbench/services/*/{common,browser,electron-sandbox}/**" + ] + }, { "target": "**/vs/workbench/electron-browser/**", "restrictions": [ "vs/nls", "vs/css!./**/*", - "**/vs/base/{common,browser,node,electron-browser}/**", - "**/vs/base/parts/*/{common,browser,node,electron-browser}/**", - "**/vs/platform/*/{common,browser,node,electron-browser}/**", - "**/vs/editor/{common,browser,node,electron-browser}/**", + "**/vs/base/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/platform/*/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/editor/{common,browser,node,electron-sandbox,electron-browser}/**", "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention - "**/vs/workbench/{common,browser,node,electron-browser,api}/**", - "**/vs/workbench/services/*/{common,browser,node,electron-browser}/**", + "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/services/*/{common,browser,node,electron-sandbox,electron-browser}/**", "*" // node modules ] }, @@ -443,7 +491,7 @@ "**/vs/base/**", "**/vs/platform/**", "**/vs/editor/**", - "**/vs/workbench/{common,browser,node,electron-browser}/**", + "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", "vs/workbench/contrib/files/common/editors/fileEditorInput", "**/vs/workbench/services/**", "**/vs/workbench/test/**", @@ -507,16 +555,30 @@ "*" // node modules ] }, + { + "target": "**/vs/workbench/services/**/electron-sandbox/**", + "restrictions": [ + "vs/nls", + "vs/css!./**/*", + "**/vs/base/**/{common,browser,worker,electron-sandbox}/**", + "**/vs/platform/**/{common,browser,electron-sandbox}/**", + "**/vs/editor/**", + "**/vs/workbench/{common,browser,electron-sandbox}/**", + "**/vs/workbench/api/{common,browser,electron-sandbox}/**", + "**/vs/workbench/services/**/{common,browser,electron-sandbox}/**" + ] + }, { "target": "**/vs/workbench/services/**/electron-browser/**", "restrictions": [ "vs/nls", "vs/css!./**/*", - "**/vs/base/**/{common,browser,worker,node,electron-browser}/**", - "**/vs/platform/**/{common,browser,node,electron-browser}/**", + "**/vs/base/**/{common,browser,worker,node,electron-sandbox,electron-browser}/**", + "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", "**/vs/editor/**", - "**/vs/workbench/{common,browser,node,electron-browser,api}/**", - "**/vs/workbench/services/**/{common,browser,node,electron-browser}/**", + "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/services/**/{common,browser,node,electron-sandbox,electron-browser}/**", "*" // node modules ] }, @@ -529,7 +591,7 @@ "**/vs/base/**", "**/vs/platform/**", "**/vs/editor/**", - "**/vs/workbench/{common,browser,node,electron-browser}/**", + "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", "**/vs/workbench/services/**", "**/vs/workbench/contrib/**", "**/vs/workbench/test/**", @@ -623,17 +685,32 @@ "*" // node modules ] }, + { + "target": "**/vs/workbench/contrib/**/electron-sandbox/**", + "restrictions": [ + "vs/nls", + "vs/css!./**/*", + "**/vs/base/**/{common,browser,worker,electron-sandbox}/**", + "**/vs/platform/**/{common,browser,electron-sandbox}/**", + "**/vs/editor/**", + "**/vs/workbench/{common,browser,electron-sandbox}/**", + "**/vs/workbench/api/{common,browser,electron-sandbox}/**", + "**/vs/workbench/services/**/{common,browser,electron-sandbox}/**", + "**/vs/workbench/contrib/**/{common,browser,electron-sandbox}/**" + ] + }, { "target": "**/vs/workbench/contrib/**/electron-browser/**", "restrictions": [ "vs/nls", "vs/css!./**/*", - "**/vs/base/**/{common,browser,worker,node,electron-browser}/**", - "**/vs/platform/**/{common,browser,node,electron-browser}/**", + "**/vs/base/**/{common,browser,worker,node,electron-sandbox,electron-browser}/**", + "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", "**/vs/editor/**", - "**/vs/workbench/{common,browser,node,electron-browser,api}/**", - "**/vs/workbench/services/**/{common,browser,node,electron-browser}/**", - "**/vs/workbench/contrib/**/{common,browser,node,electron-browser}/**", + "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/services/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/contrib/**/{common,browser,node,electron-sandbox,electron-browser}/**", "*" // node modules ] }, @@ -653,10 +730,10 @@ "restrictions": [ "vs/nls", "vs/css!./**/*", - "**/vs/base/**/{common,browser,node,electron-browser}/**", - "**/vs/base/parts/**/{common,browser,node,electron-browser}/**", - "**/vs/platform/**/{common,browser,node,electron-browser}/**", - "**/vs/code/**/{common,browser,node,electron-browser}/**", + "**/vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/base/parts/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/code/**/{common,browser,node,electron-sandbox,electron-browser}/**", "*" // node modules ] }, diff --git a/build/lib/layersChecker.js b/build/lib/layersChecker.js index 663769dacea..f3cc2252b5e 100644 --- a/build/lib/layersChecker.js +++ b/build/lib/layersChecker.js @@ -130,6 +130,14 @@ const RULES = [ 'lib.dom.d.ts' // no DOM ] }, + // Electron (sandbox) + { + target: '**/vs/**/electron-sandbox/**', + allowedTypes: CORE_TYPES, + disallowedDefinitions: [ + '@types/node' // no node.js + ] + }, // Electron (renderer): skip { target: '**/vs/**/electron-browser/**', diff --git a/build/lib/layersChecker.ts b/build/lib/layersChecker.ts index 0dcedb8d4e3..508d2b986e9 100644 --- a/build/lib/layersChecker.ts +++ b/build/lib/layersChecker.ts @@ -143,6 +143,15 @@ const RULES = [ ] }, + // Electron (sandbox) + { + target: '**/vs/**/electron-sandbox/**', + allowedTypes: CORE_TYPES, + disallowedDefinitions: [ + '@types/node' // no node.js + ] + }, + // Electron (renderer): skip { target: '**/vs/**/electron-browser/**', From a4a5b1f19c5e2991024aa813b12f1f6a8a4cd75e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 22 May 2020 12:23:43 +0200 Subject: [PATCH 003/107] sandbox - expose limited IPC via preload script --- src/vs/base/electron-sandbox/globals.ts | 34 +++++++++++ .../electron-browser/workbench/preload.js | 61 +++++++++++++++++++ src/vs/code/electron-main/window.ts | 5 ++ 3 files changed, 100 insertions(+) create mode 100644 src/vs/base/electron-sandbox/globals.ts create mode 100644 src/vs/code/electron-browser/workbench/preload.js diff --git a/src/vs/base/electron-sandbox/globals.ts b/src/vs/base/electron-sandbox/globals.ts new file mode 100644 index 00000000000..a5f420cbd1b --- /dev/null +++ b/src/vs/base/electron-sandbox/globals.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const ipcRenderer = (window as any).vscode.ipcRenderer as { + + /** + * Listens to `channel`, when a new message arrives `listener` would be called with + * `listener(event, args...)`. + */ + on(channel: string, listener: Function): void; + + /** + * Removes the specified `listener` from the listener array for the specified + * `channel`. + */ + removeListener(channel: string, listener: Function): void; + + /** + * Send an asynchronous message to the main process via `channel`, along with + * arguments. Arguments will be serialized with the Structured Clone Algorithm, + * just like `postMessage`, so prototype chains will not be included. Sending + * Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an exception. + * + * > **NOTE**: Sending non-standard JavaScript types such as DOM objects or special + * Electron objects is deprecated, and will begin throwing an exception starting + * with Electron 9. + * + * The main process handles it by listening for `channel` with the `ipcMain` + * module. + */ + send(channel: string, ...args: any[]): void; +}; diff --git a/src/vs/code/electron-browser/workbench/preload.js b/src/vs/code/electron-browser/workbench/preload.js new file mode 100644 index 00000000000..d8d0d8d82c9 --- /dev/null +++ b/src/vs/code/electron-browser/workbench/preload.js @@ -0,0 +1,61 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// @ts-check +(function () { + 'use strict'; + + const { ipcRenderer } = require('electron'); + + /** + * @param {string} channel + */ + function validateIPC(channel) { + if (!channel || !channel.startsWith('vscode:')) { + throw new Error(`Unsupported event IPC channel '${channel}'`); + } + } + + // @ts-ignore + window.vscode = { + + /** + * A minimal set of methods exposed from ipcRenderer + * to support communication to electron-main + */ + ipcRenderer: { + + /** + * @param {string} channel + * @param {any[]} args + */ + send(channel, ...args) { + validateIPC(channel); + + ipcRenderer.send(channel, ...args); + }, + + /** + * @param {string} channel + * @param {(event: import('electron').IpcRendererEvent, ...args: any[]) => void} listener + */ + on(channel, listener) { + validateIPC(channel); + + ipcRenderer.on(channel, listener); + }, + + /** + * @param {string} channel + * @param {(event: import('electron').IpcRendererEvent, ...args: any[]) => void} listener + */ + removeListener(channel, listener) { + validateIPC(channel); + + ipcRenderer.removeListener(channel, listener); + } + } + }; +}()); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 98a37e53ae7..db8c6db420a 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -163,6 +163,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { show: !isFullscreenOrMaximized, title: product.nameLong, webPreferences: { + preload: URI.parse(this.doGetPreloadUrl()).fsPath, nodeIntegration: true, nodeIntegrationInWorker: RUN_TEXTMATE_IN_WORKER, webviewTag: true, @@ -777,6 +778,10 @@ export class CodeWindow extends Disposable implements ICodeWindow { return `${require.toUrl('vs/code/electron-browser/workbench/workbench.html')}?config=${encodeURIComponent(JSON.stringify(config))}`; } + private doGetPreloadUrl(): string { + return `${require.toUrl('vs/code/electron-browser/workbench/preload.js')}`; + } + serializeWindowState(): IWindowState { if (!this._win) { return defaultWindowState(); From c3c1a95c760e30202c44e24157f7b3075b77799b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 22 May 2020 12:25:54 +0200 Subject: [PATCH 004/107] sandbox - introduce IPC over sandbox helper --- src/vs/base/common/event.ts | 4 +-- .../ipc/{node => common}/ipc.electron.ts | 8 ++--- .../electron-browser/ipc.electron-browser.ts | 8 ++--- .../ipc/electron-main/ipc.electron-main.ts | 8 ++--- .../electron-sandbox/ipc.electron-sandbox.ts | 32 +++++++++++++++++++ 5 files changed, 46 insertions(+), 14 deletions(-) rename src/vs/base/parts/ipc/{node => common}/ipc.electron.ts (83%) create mode 100644 src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 032f447081e..b0bd0ab2799 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -328,8 +328,8 @@ export namespace Event { } export interface NodeEventEmitter { - on(event: string | symbol, listener: Function): this; - removeListener(event: string | symbol, listener: Function): this; + on(event: string | symbol, listener: Function): unknown; + removeListener(event: string | symbol, listener: Function): unknown; } export function fromNodeEventEmitter(emitter: NodeEventEmitter, eventName: string, map: (...args: any[]) => T = id => id): Event { diff --git a/src/vs/base/parts/ipc/node/ipc.electron.ts b/src/vs/base/parts/ipc/common/ipc.electron.ts similarity index 83% rename from src/vs/base/parts/ipc/node/ipc.electron.ts rename to src/vs/base/parts/ipc/common/ipc.electron.ts index 09c97ba47b1..516351e1509 100644 --- a/src/vs/base/parts/ipc/node/ipc.electron.ts +++ b/src/vs/base/parts/ipc/common/ipc.electron.ts @@ -8,7 +8,7 @@ import { Event } from 'vs/base/common/event'; import { VSBuffer } from 'vs/base/common/buffer'; export interface Sender { - send(channel: string, msg: Buffer | null): void; + send(channel: string, msg: unknown): void; } export class Protocol implements IMessagePassingProtocol { @@ -17,13 +17,13 @@ export class Protocol implements IMessagePassingProtocol { send(message: VSBuffer): void { try { - this.sender.send('ipc:message', (message.buffer)); + this.sender.send('vscode:message', message.buffer); } catch (e) { // systems are going down } } dispose(): void { - this.sender.send('ipc:disconnect', null); + this.sender.send('vscode:disconnect', null); } -} \ No newline at end of file +} diff --git a/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts b/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts index 2690300b83a..c5343bf61ec 100644 --- a/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts +++ b/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; -import { Protocol } from 'vs/base/parts/ipc/node/ipc.electron'; +import { Protocol } from 'vs/base/parts/ipc/common/ipc.electron'; import { ipcRenderer } from 'electron'; import { IDisposable } from 'vs/base/common/lifecycle'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -15,8 +15,8 @@ export class Client extends IPCClient implements IDisposable { private protocol: Protocol; private static createProtocol(): Protocol { - const onMessage = Event.fromNodeEventEmitter(ipcRenderer, 'ipc:message', (_, message: Buffer) => VSBuffer.wrap(message)); - ipcRenderer.send('ipc:hello'); + const onMessage = Event.fromNodeEventEmitter(ipcRenderer, 'vscode:message', (_, message: Buffer) => VSBuffer.wrap(message)); + ipcRenderer.send('vscode:hello'); return new Protocol(ipcRenderer, onMessage); } @@ -29,4 +29,4 @@ export class Client extends IPCClient implements IDisposable { dispose(): void { this.protocol.dispose(); } -} \ No newline at end of file +} diff --git a/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts b/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts index bac2223ede6..b84a1d653dc 100644 --- a/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts +++ b/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts @@ -5,7 +5,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IPCServer, ClientConnectionEvent } from 'vs/base/parts/ipc/common/ipc'; -import { Protocol } from 'vs/base/parts/ipc/node/ipc.electron'; +import { Protocol } from 'vs/base/parts/ipc/common/ipc.electron'; import { ipcMain, WebContents } from 'electron'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -26,7 +26,7 @@ export class Server extends IPCServer { private static readonly Clients = new Map(); private static getOnDidClientConnect(): Event { - const onHello = Event.fromNodeEventEmitter(ipcMain, 'ipc:hello', ({ sender }) => sender); + const onHello = Event.fromNodeEventEmitter(ipcMain, 'vscode:hello', ({ sender }) => sender); return Event.map(onHello, webContents => { const id = webContents.id; @@ -39,8 +39,8 @@ export class Server extends IPCServer { const onDidClientReconnect = new Emitter(); Server.Clients.set(id, toDisposable(() => onDidClientReconnect.fire())); - const onMessage = createScopedOnMessageEvent(id, 'ipc:message') as Event; - const onDidClientDisconnect = Event.any(Event.signal(createScopedOnMessageEvent(id, 'ipc:disconnect')), onDidClientReconnect.event); + const onMessage = createScopedOnMessageEvent(id, 'vscode:message') as Event; + const onDidClientDisconnect = Event.any(Event.signal(createScopedOnMessageEvent(id, 'vscode:disconnect')), onDidClientReconnect.event); const protocol = new Protocol(webContents, onMessage); return { protocol, onDidClientDisconnect }; diff --git a/src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts b/src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts new file mode 100644 index 00000000000..490d66fee48 --- /dev/null +++ b/src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event } from 'vs/base/common/event'; +import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; +import { Protocol } from 'vs/base/parts/ipc/common/ipc.electron'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; + +export class Client extends IPCClient implements IDisposable { + + private protocol: Protocol; + + private static createProtocol(): Protocol { + const onMessage = Event.fromNodeEventEmitter(ipcRenderer, 'vscode:message', (_, message) => VSBuffer.wrap(message)); + ipcRenderer.send('vscode:hello'); + return new Protocol(ipcRenderer, onMessage); + } + + constructor(id: string) { + const protocol = Client.createProtocol(); + super(protocol, id); + this.protocol = protocol; + } + + dispose(): void { + this.protocol.dispose(); + } +} From e4438f3d9b960a3d6293d6c6bf04c55c80d86736 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 22 May 2020 20:50:11 +0100 Subject: [PATCH 005/107] Fix spelling in snippets.contribution.ts powershell snippet json template contained a spelling mistake which has been fixed. --- .../workbench/contrib/snippets/browser/snippets.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts index 6c197f94cac..836225138b1 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts @@ -28,7 +28,7 @@ const languageScopeSchemaId = 'vscode://schemas/snippets'; const snippetSchemaProperties: IJSONSchemaMap = { prefix: { - description: nls.localize('snippetSchema.json.prefix', 'The prefix to used when selecting the snippet in intellisense'), + description: nls.localize('snippetSchema.json.prefix', 'The prefix to use when selecting the snippet in intellisense'), type: ['string', 'array'] }, body: { From dc8f291781000951ddbf6bea734ff7e16371ff94 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 08:05:47 +0200 Subject: [PATCH 006/107] sandbox - let workspaces service use sandboxed IPC --- .eslintrc.json | 48 +++++++ src/vs/base/parts/ipc/common/ipc.ts | 132 ++++++++++++++++- src/vs/base/parts/ipc/node/ipc.ts | 133 ------------------ .../ipc/test/{node => common}/ipc.test.ts | 3 +- .../issue/issueReporterMain.ts | 3 +- .../sharedProcess/sharedProcessMain.ts | 3 +- .../electron-browser/workbench/preload.js | 22 +-- src/vs/code/electron-main/app.ts | 3 +- src/vs/code/electron-main/main.ts | 2 +- .../electron-sandbox/mainProcessService.ts | 39 +++++ .../electron-browser/desktop.main.ts | 7 +- .../electron-browser/electronService.ts | 2 +- .../issue/electron-browser/issueService.ts | 2 +- .../electron-browser/localizationsService.ts | 2 +- .../electron-browser/menubarService.ts | 2 +- .../url/electron-browser/urlService.ts | 2 +- .../workspacesService.ts | 11 +- src/vs/workbench/workbench.desktop.main.ts | 5 +- src/vs/workbench/workbench.sandbox.main.ts | 18 +++ src/vs/workbench/workbench.web.main.ts | 1 + 20 files changed, 273 insertions(+), 167 deletions(-) delete mode 100644 src/vs/base/parts/ipc/node/ipc.ts rename src/vs/base/parts/ipc/test/{node => common}/ipc.test.ts (98%) create mode 100644 src/vs/platform/ipc/electron-sandbox/mainProcessService.ts rename src/vs/workbench/services/workspaces/{electron-browser => electron-sandbox}/workspacesService.ts (54%) create mode 100644 src/vs/workbench/workbench.sandbox.main.ts diff --git a/.eslintrc.json b/.eslintrc.json index 82525d19afe..f6eb6d80e18 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -761,6 +761,54 @@ "*" // node modules ] }, + { + "target": "**/src/vs/workbench/workbench.common.main.ts", + "restrictions": [ + "vs/nls", + "**/vs/base/**/{common,browser}/**", + "**/vs/base/parts/**/{common,browser}/**", + "**/vs/platform/**/{common,browser}/**", + "**/vs/editor/**", + "**/vs/workbench/**/{common,browser}/**" + ] + }, + { + "target": "**/src/vs/workbench/workbench.web.main.ts", + "restrictions": [ + "vs/nls", + "**/vs/base/**/{common,browser}/**", + "**/vs/base/parts/**/{common,browser}/**", + "**/vs/platform/**/{common,browser}/**", + "**/vs/editor/**", + "**/vs/workbench/**/{common,browser}/**", + "**/vs/workbench/workbench.common.main" + ] + }, + { + "target": "**/src/vs/workbench/workbench.sandbox.main.ts", + "restrictions": [ + "vs/nls", + "**/vs/base/**/{common,browser,electron-sandbox}/**", + "**/vs/base/parts/**/{common,browser,electron-sandbox}/**", + "**/vs/platform/**/{common,browser,electron-sandbox}/**", + "**/vs/editor/**", + "**/vs/workbench/**/{common,browser,electron-sandbox}/**", + "**/vs/workbench/workbench.common.main" + ] + }, + { + "target": "**/src/vs/workbench/workbench.desktop.main.ts", + "restrictions": [ + "vs/nls", + "**/vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/base/parts/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/editor/**", + "**/vs/workbench/**/{common,browser,node,electron-sandbox,electron-browser}/**", + "**/vs/workbench/workbench.common.main", + "**/vs/workbench/workbench.sandbox.main" + ] + }, { "target": "**/extensions/**", "restrictions": "**/*" diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 8acfc6bce4e..f909c554528 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -10,7 +10,9 @@ import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cance import * as errors from 'vs/base/common/errors'; import { VSBuffer } from 'vs/base/common/buffer'; import { getRandomElement } from 'vs/base/common/arrays'; -import { isFunction } from 'vs/base/common/types'; +import { isFunction, isUndefinedOrNull } from 'vs/base/common/types'; +import { revive } from 'vs/base/common/marshalling'; +import { isUpperAsciiLetter } from 'vs/base/common/strings'; /** * An `IChannel` is an abstraction over a collection of commands. @@ -919,3 +921,131 @@ export class StaticRouter implements IClientRouter return await this.route(hub); } } + + +//#region createChannelReceiver / createChannelSender + +/** + * Use both `createChannelReceiver` and `createChannelSender` + * for automated process <=> process communication over methods + * and events. You do not need to spell out each method on both + * sides, a proxy will take care of this. + * + * Rules: + * - if marshalling is enabled, only `URI` and `RegExp` is converted + * automatically for you + * - events must follow the naming convention `onUppercase` + * - `CancellationToken` is currently not supported + * - if a context is provided, you can use `AddFirstParameterToFunctions` + * utility to signal this in the receiving side type + */ + +export interface IBaseChannelOptions { + + /** + * Disables automatic marshalling of `URI`. + * If marshalling is disabled, `UriComponents` + * must be used instead. + */ + disableMarshalling?: boolean; +} + +export interface IChannelReceiverOptions extends IBaseChannelOptions { } + +export function createChannelReceiver(service: unknown, options?: IChannelReceiverOptions): IServerChannel { + const handler = service as { [key: string]: unknown }; + const disableMarshalling = options && options.disableMarshalling; + + // Buffer any event that should be supported by + // iterating over all property keys and finding them + const mapEventNameToEvent = new Map>(); + for (const key in handler) { + if (propertyIsEvent(key)) { + mapEventNameToEvent.set(key, Event.buffer(handler[key] as Event, true)); + } + } + + return new class implements IServerChannel { + + listen(_: unknown, event: string): Event { + const eventImpl = mapEventNameToEvent.get(event); + if (eventImpl) { + return eventImpl as Event; + } + + throw new Error(`Event not found: ${event}`); + } + + call(_: unknown, command: string, args?: any[]): Promise { + const target = handler[command]; + if (typeof target === 'function') { + + // Revive unless marshalling disabled + if (!disableMarshalling && Array.isArray(args)) { + for (let i = 0; i < args.length; i++) { + args[i] = revive(args[i]); + } + } + + return target.apply(handler, args); + } + + throw new Error(`Method not found: ${command}`); + } + }; +} + +export interface IChannelSenderOptions extends IBaseChannelOptions { + + /** + * If provided, will add the value of `context` + * to each method call to the target. + */ + context?: unknown; +} + +export function createChannelSender(channel: IChannel, options?: IChannelSenderOptions): T { + const disableMarshalling = options && options.disableMarshalling; + + return new Proxy({}, { + get(_target: T, propKey: PropertyKey) { + if (typeof propKey === 'string') { + + // Event + if (propertyIsEvent(propKey)) { + return channel.listen(propKey); + } + + // Function + return async function (...args: any[]) { + + // Add context if any + let methodArgs: any[]; + if (options && !isUndefinedOrNull(options.context)) { + methodArgs = [options.context, ...args]; + } else { + methodArgs = args; + } + + const result = await channel.call(propKey, methodArgs); + + // Revive unless marshalling disabled + if (!disableMarshalling) { + return revive(result); + } + + return result; + }; + } + + throw new Error(`Property not found: ${String(propKey)}`); + } + }) as T; +} + +function propertyIsEvent(name: string): boolean { + // Assume a property is an event if it has a form of "onSomething" + return name[0] === 'o' && name[1] === 'n' && isUpperAsciiLetter(name.charCodeAt(2)); +} + +//#endregion diff --git a/src/vs/base/parts/ipc/node/ipc.ts b/src/vs/base/parts/ipc/node/ipc.ts deleted file mode 100644 index 631e5139133..00000000000 --- a/src/vs/base/parts/ipc/node/ipc.ts +++ /dev/null @@ -1,133 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Event } from 'vs/base/common/event'; -import { IServerChannel, IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { revive } from 'vs/base/common/marshalling'; -import { isUndefinedOrNull } from 'vs/base/common/types'; -import { isUpperAsciiLetter } from 'vs/base/common/strings'; - -/** - * Use both `createChannelReceiver` and `createChannelSender` - * for automated process <=> process communication over methods - * and events. You do not need to spell out each method on both - * sides, a proxy will take care of this. - * - * Rules: - * - if marshalling is enabled, only `URI` and `RegExp` is converted - * automatically for you - * - events must follow the naming convention `onUppercase` - * - `CancellationToken` is currently not supported - * - if a context is provided, you can use `AddFirstParameterToFunctions` - * utility to signal this in the receiving side type - */ - -export interface IBaseChannelOptions { - - /** - * Disables automatic marshalling of `URI`. - * If marshalling is disabled, `UriComponents` - * must be used instead. - */ - disableMarshalling?: boolean; -} - -export interface IChannelReceiverOptions extends IBaseChannelOptions { } - -export function createChannelReceiver(service: unknown, options?: IChannelReceiverOptions): IServerChannel { - const handler = service as { [key: string]: unknown }; - const disableMarshalling = options && options.disableMarshalling; - - // Buffer any event that should be supported by - // iterating over all property keys and finding them - const mapEventNameToEvent = new Map>(); - for (const key in handler) { - if (propertyIsEvent(key)) { - mapEventNameToEvent.set(key, Event.buffer(handler[key] as Event, true)); - } - } - - return new class implements IServerChannel { - - listen(_: unknown, event: string): Event { - const eventImpl = mapEventNameToEvent.get(event); - if (eventImpl) { - return eventImpl as Event; - } - - throw new Error(`Event not found: ${event}`); - } - - call(_: unknown, command: string, args?: any[]): Promise { - const target = handler[command]; - if (typeof target === 'function') { - - // Revive unless marshalling disabled - if (!disableMarshalling && Array.isArray(args)) { - for (let i = 0; i < args.length; i++) { - args[i] = revive(args[i]); - } - } - - return target.apply(handler, args); - } - - throw new Error(`Method not found: ${command}`); - } - }; -} - -export interface IChannelSenderOptions extends IBaseChannelOptions { - - /** - * If provided, will add the value of `context` - * to each method call to the target. - */ - context?: unknown; -} - -export function createChannelSender(channel: IChannel, options?: IChannelSenderOptions): T { - const disableMarshalling = options && options.disableMarshalling; - - return new Proxy({}, { - get(_target: T, propKey: PropertyKey) { - if (typeof propKey === 'string') { - - // Event - if (propertyIsEvent(propKey)) { - return channel.listen(propKey); - } - - // Function - return async function (...args: any[]) { - - // Add context if any - let methodArgs: any[]; - if (options && !isUndefinedOrNull(options.context)) { - methodArgs = [options.context, ...args]; - } else { - methodArgs = args; - } - - const result = await channel.call(propKey, methodArgs); - - // Revive unless marshalling disabled - if (!disableMarshalling) { - return revive(result); - } - - return result; - }; - } - - throw new Error(`Property not found: ${String(propKey)}`); - } - }) as T; -} - -function propertyIsEvent(name: string): boolean { - // Assume a property is an event if it has a form of "onSomething" - return name[0] === 'o' && name[1] === 'n' && isUpperAsciiLetter(name.charCodeAt(2)); -} diff --git a/src/vs/base/parts/ipc/test/node/ipc.test.ts b/src/vs/base/parts/ipc/test/common/ipc.test.ts similarity index 98% rename from src/vs/base/parts/ipc/test/node/ipc.test.ts rename to src/vs/base/parts/ipc/test/common/ipc.test.ts index 3539f5dea8c..88a7b7744a7 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/common/ipc.test.ts @@ -4,8 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IChannel, IServerChannel, IMessagePassingProtocol, IPCServer, ClientConnectionEvent, IPCClient } from 'vs/base/parts/ipc/common/ipc'; -import { createChannelReceiver, createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { IChannel, IServerChannel, IMessagePassingProtocol, IPCServer, ClientConnectionEvent, IPCClient, createChannelReceiver, createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { Emitter, Event } from 'vs/base/common/event'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 24c2b5372ac..49bea4c7753 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -15,8 +15,7 @@ import { debounce } from 'vs/base/common/decorators'; import { Disposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { escape } from 'vs/base/common/strings'; -import { getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { getDelayedChannel, createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; import { normalizeGitHubUrl } from 'vs/platform/issue/common/issueReporterUtil'; import { IssueReporterData as IssueReporterModelData, IssueReporterModel } from 'vs/code/electron-browser/issue/issueReporterModel'; diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index d317071db46..80071f1274e 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -35,8 +35,7 @@ import { ILocalizationsService } from 'vs/platform/localizations/common/localiza import { combinedDisposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { DownloadService } from 'vs/platform/download/common/downloadService'; import { IDownloadService } from 'vs/platform/download/common/download'; -import { IChannel, IServerChannel, StaticRouter } from 'vs/base/parts/ipc/common/ipc'; -import { createChannelSender, createChannelReceiver } from 'vs/base/parts/ipc/node/ipc'; +import { IChannel, IServerChannel, StaticRouter, createChannelSender, createChannelReceiver } from 'vs/base/parts/ipc/common/ipc'; import { NodeCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner'; import { LanguagePackCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner'; import { StorageDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner'; diff --git a/src/vs/code/electron-browser/workbench/preload.js b/src/vs/code/electron-browser/workbench/preload.js index d8d0d8d82c9..07802dd616c 100644 --- a/src/vs/code/electron-browser/workbench/preload.js +++ b/src/vs/code/electron-browser/workbench/preload.js @@ -9,15 +9,6 @@ const { ipcRenderer } = require('electron'); - /** - * @param {string} channel - */ - function validateIPC(channel) { - if (!channel || !channel.startsWith('vscode:')) { - throw new Error(`Unsupported event IPC channel '${channel}'`); - } - } - // @ts-ignore window.vscode = { @@ -58,4 +49,17 @@ } } }; + + //#region Utilities + + /** + * @param {string} channel + */ + function validateIPC(channel) { + if (!channel || !channel.startsWith('vscode:')) { + throw new Error(`Unsupported event IPC channel '${channel}'`); + } + } + + //#endregion }()); diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 25300327917..cb4ca432196 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -32,8 +32,7 @@ import { NullTelemetryService, combinedAppender, LogAppender } from 'vs/platform import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; -import { getDelayedChannel, StaticRouter } from 'vs/base/parts/ipc/common/ipc'; -import { createChannelReceiver } from 'vs/base/parts/ipc/node/ipc'; +import { getDelayedChannel, StaticRouter, createChannelReceiver } from 'vs/base/parts/ipc/common/ipc'; import product from 'vs/platform/product/common/product'; import { ProxyAuthHandler } from 'vs/code/electron-main/auth'; import { Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 650d665d2ca..744bfea9530 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -13,7 +13,7 @@ import { mkdirp } from 'vs/base/node/pfs'; import { validatePaths } from 'vs/code/node/paths'; import { LifecycleMainService, ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { Server, serve, connect } from 'vs/base/parts/ipc/node/ipc.net'; -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { ILaunchMainService } from 'vs/platform/launch/electron-main/launchMainService'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; diff --git a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts new file mode 100644 index 00000000000..0a8da434d61 --- /dev/null +++ b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; +import { Client } from 'vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox'; +import { Disposable } from 'vs/base/common/lifecycle'; + +export const IMainProcessService2 = createDecorator('mainProcessService2'); + +export interface IMainProcessService2 { + + _serviceBrand: undefined; + + readonly windowId: number; + + getChannel(channelName: string): IChannel; +} + +export class MainProcessService2 extends Disposable implements IMainProcessService2 { + + _serviceBrand: undefined; + + private mainProcessConnection: Client; + + constructor( + public readonly windowId: number + ) { + super(); + + this.mainProcessConnection = this._register(new Client(`window:${windowId}`)); + } + + getChannel(channelName: string): IChannel { + return this.mainProcessConnection.getChannel(channelName); + } +} diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index ba9d01fbba8..753e080c5e3 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -31,6 +31,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { Disposable } from 'vs/base/common/lifecycle'; import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; import { IMainProcessService, MainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2, MainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { RemoteAuthorityResolverService } from 'vs/platform/remote/electron-browser/remoteAuthorityResolverService'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -169,10 +170,14 @@ class DesktopMain extends Disposable { // CONTRIBUTE IT VIA WORKBENCH.DESKTOP.MAIN.TS AND registerSingleton(). // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Main Process + // Main Process (legacy) const mainProcessService = this._register(new MainProcessService(this.configuration.windowId)); serviceCollection.set(IMainProcessService, mainProcessService); + // Main Process (sandbox) + const mainProcessService2 = this._register(new MainProcessService2(this.configuration.windowId)); + serviceCollection.set(IMainProcessService2, mainProcessService2); + // Environment serviceCollection.set(IWorkbenchEnvironmentService, this.environmentService); diff --git a/src/vs/workbench/services/electron/electron-browser/electronService.ts b/src/vs/workbench/services/electron/electron-browser/electronService.ts index ba25ebd672d..f684a0f530b 100644 --- a/src/vs/workbench/services/electron/electron-browser/electronService.ts +++ b/src/vs/workbench/services/electron/electron-browser/electronService.ts @@ -7,7 +7,7 @@ import { IElectronService } from 'vs/platform/electron/node/electron'; import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class ElectronService { diff --git a/src/vs/workbench/services/issue/electron-browser/issueService.ts b/src/vs/workbench/services/issue/electron-browser/issueService.ts index 0143cff6f3e..a34b1680071 100644 --- a/src/vs/workbench/services/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/services/issue/electron-browser/issueService.ts @@ -5,7 +5,7 @@ import { IIssueService } from 'vs/platform/issue/node/issue'; import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class IssueService { diff --git a/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts b/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts index 99394090da8..d8cae2cf01b 100644 --- a/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts +++ b/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/services/menubar/electron-browser/menubarService.ts b/src/vs/workbench/services/menubar/electron-browser/menubarService.ts index 9e4efbada0e..e50959840af 100644 --- a/src/vs/workbench/services/menubar/electron-browser/menubarService.ts +++ b/src/vs/workbench/services/menubar/electron-browser/menubarService.ts @@ -5,7 +5,7 @@ import { IMenubarService } from 'vs/platform/menubar/node/menubar'; import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class MenubarService { diff --git a/src/vs/workbench/services/url/electron-browser/urlService.ts b/src/vs/workbench/services/url/electron-browser/urlService.ts index c5e9d85e467..63476b51364 100644 --- a/src/vs/workbench/services/url/electron-browser/urlService.ts +++ b/src/vs/workbench/services/url/electron-browser/urlService.ts @@ -11,7 +11,7 @@ import { URLService } from 'vs/platform/url/node/urlService'; import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/common/opener'; import product from 'vs/platform/product/common/product'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { IElectronService } from 'vs/platform/electron/node/electron'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; diff --git a/src/vs/workbench/services/workspaces/electron-browser/workspacesService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts similarity index 54% rename from src/vs/workbench/services/workspaces/electron-browser/workspacesService.ts rename to src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts index 22707759bd2..ea112dc69d5 100644 --- a/src/vs/workbench/services/workspaces/electron-browser/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts @@ -4,21 +4,18 @@ *--------------------------------------------------------------------------------------------*/ import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; export class NativeWorkspacesService { _serviceBrand: undefined; constructor( - @IMainProcessService mainProcessService: IMainProcessService, - @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService + @IMainProcessService2 mainProcessService: IMainProcessService2 ) { - return createChannelSender(mainProcessService.getChannel('workspaces'), { context: environmentService.configuration.windowId }); + return createChannelSender(mainProcessService.getChannel('workspaces'), { context: mainProcessService.windowId }); } } diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 1f90204b3e3..081ccfb6878 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -11,9 +11,10 @@ // ####################################################################### -//#region --- workbench common +//#region --- workbench common & sandbox import 'vs/workbench/workbench.common.main'; +import 'vs/workbench/workbench.sandbox.main'; //#endregion @@ -27,6 +28,7 @@ import 'vs/workbench/electron-browser/desktop.main'; //#region --- workbench services + import 'vs/workbench/services/dialogs/electron-browser/fileDialogService'; import 'vs/workbench/services/integrity/node/integrityService'; import 'vs/workbench/services/textMate/electron-browser/textMateService'; @@ -48,7 +50,6 @@ import 'vs/workbench/services/accessibility/electron-browser/accessibilityServic import 'vs/workbench/services/remote/node/tunnelService'; import 'vs/workbench/services/backup/node/backupFileService'; import 'vs/workbench/services/url/electron-browser/urlService'; -import 'vs/workbench/services/workspaces/electron-browser/workspacesService'; import 'vs/workbench/services/workspaces/electron-browser/workspaceEditingService'; import 'vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts new file mode 100644 index 00000000000..07f800e96b7 --- /dev/null +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +// ####################################################################### +// ### ### +// ### !!! PLEASE ADD COMMON IMPORTS INTO WORKBENCH.COMMON.MAIN.TS !!! ### +// ### ### +// ####################################################################### + + +//#region --- workbench services + +import 'vs/workbench/services/workspaces/electron-sandbox/workspacesService'; + +//#endregion diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 9d89286a67e..29951124873 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -26,6 +26,7 @@ import 'vs/workbench/browser/web.main'; //#region --- workbench services + import 'vs/workbench/services/integrity/browser/integrityService'; import 'vs/workbench/services/textMate/browser/textMateService'; import 'vs/workbench/services/search/common/searchService'; From 88af9b528f03f3d82163528c13da977a92106ec2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 08:47:49 +0200 Subject: [PATCH 007/107] sandbox - make sure to use sandboxed main process service consistently in renderer --- .../electron-browser/issue/issueReporterMain.ts | 2 +- src/vs/platform/driver/electron-browser/driver.ts | 4 ++-- .../ipc/electron-sandbox/mainProcessService.ts | 8 +++++++- .../electron-browser/extensionHostDebugService.ts | 4 ++-- src/vs/workbench/electron-browser/desktop.main.ts | 13 ++++--------- .../electron/electron-browser/electronService.ts | 4 ++-- .../services/issue/electron-browser/issueService.ts | 4 ++-- .../services/log/electron-browser/logService.ts | 4 ++-- .../menubar/electron-browser/menubarService.ts | 4 ++-- .../electron-browser/sharedProcessService.ts | 4 ++-- .../update/electron-browser/updateService.ts | 4 ++-- .../services/url/electron-browser/urlService.ts | 4 ++-- .../storageKeysSyncRegistryService.ts | 5 ++--- 13 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 49bea4c7753..d65090933b3 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import 'vs/css!./media/issueReporter'; import { clipboard, ipcRenderer, shell, webFrame } from 'electron'; import * as os from 'os'; import * as browser from 'vs/base/browser/browser'; @@ -20,7 +21,6 @@ import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; import { normalizeGitHubUrl } from 'vs/platform/issue/common/issueReporterUtil'; import { IssueReporterData as IssueReporterModelData, IssueReporterModel } from 'vs/code/electron-browser/issue/issueReporterModel'; import BaseHtml from 'vs/code/electron-browser/issue/issueReporterPage'; -import 'vs/css!./media/issueReporter'; import { localize } from 'vs/nls'; import { isRemoteDiagnosticError, SystemInfo } from 'vs/platform/diagnostics/common/diagnostics'; import { EnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 2594eef1361..778854c389d 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -6,7 +6,7 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/node/driver'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import * as electron from 'electron'; import { timeout } from 'vs/base/common/async'; import { BaseWindowDriver } from 'vs/platform/driver/browser/baseDriver'; @@ -47,7 +47,7 @@ class WindowDriver extends BaseWindowDriver { export async function registerWindowDriver(accessor: ServicesAccessor, windowId: number): Promise { const instantiationService = accessor.get(IInstantiationService); - const mainProcessService = accessor.get(IMainProcessService); + const mainProcessService = accessor.get(IMainProcessService2); const windowDriver = instantiationService.createInstance(WindowDriver); const windowDriverChannel = new WindowDriverChannel(windowDriver); diff --git a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts index 0a8da434d61..e9cecd6341f 100644 --- a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts +++ b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Client } from 'vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -17,6 +17,8 @@ export interface IMainProcessService2 { readonly windowId: number; getChannel(channelName: string): IChannel; + + registerChannel(channelName: string, channel: IServerChannel): void; } export class MainProcessService2 extends Disposable implements IMainProcessService2 { @@ -36,4 +38,8 @@ export class MainProcessService2 extends Disposable implements IMainProcessServi getChannel(channelName: string): IChannel { return this.mainProcessConnection.getChannel(channelName); } + + registerChannel(channelName: string, channel: IServerChannel): void { + this.mainProcessConnection.registerChannel(channelName, channel); + } } diff --git a/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService.ts b/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService.ts index ce00abedcab..318d31a69ab 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService.ts @@ -5,13 +5,13 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { ExtensionHostDebugChannelClient, ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; export class ExtensionHostDebugService extends ExtensionHostDebugChannelClient { constructor( - @IMainProcessService readonly mainProcessService: IMainProcessService + @IMainProcessService2 readonly mainProcessService: IMainProcessService2 ) { super(mainProcessService.getChannel(ExtensionHostDebugBroadcastChannel.ChannelName)); } diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 753e080c5e3..98dd556daa2 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -30,7 +30,6 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IStorageService } from 'vs/platform/storage/common/storage'; import { Disposable } from 'vs/base/common/lifecycle'; import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; -import { IMainProcessService, MainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; import { IMainProcessService2, MainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { RemoteAuthorityResolverService } from 'vs/platform/remote/electron-browser/remoteAuthorityResolverService'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; @@ -170,13 +169,9 @@ class DesktopMain extends Disposable { // CONTRIBUTE IT VIA WORKBENCH.DESKTOP.MAIN.TS AND registerSingleton(). // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Main Process (legacy) - const mainProcessService = this._register(new MainProcessService(this.configuration.windowId)); - serviceCollection.set(IMainProcessService, mainProcessService); - - // Main Process (sandbox) - const mainProcessService2 = this._register(new MainProcessService2(this.configuration.windowId)); - serviceCollection.set(IMainProcessService2, mainProcessService2); + // Main Process + const mainProcessService = this._register(new MainProcessService2(this.configuration.windowId)); + serviceCollection.set(IMainProcessService2, mainProcessService); // Environment serviceCollection.set(IWorkbenchEnvironmentService, this.environmentService); @@ -302,7 +297,7 @@ class DesktopMain extends Disposable { } } - private async createStorageService(payload: IWorkspaceInitializationPayload, logService: ILogService, mainProcessService: IMainProcessService): Promise { + private async createStorageService(payload: IWorkspaceInitializationPayload, logService: ILogService, mainProcessService: IMainProcessService2): Promise { const globalStorageDatabase = new GlobalStorageDatabaseChannelClient(mainProcessService.getChannel('storage')); const storageService = new NativeStorageService(globalStorageDatabase, logService, this.environmentService); diff --git a/src/vs/workbench/services/electron/electron-browser/electronService.ts b/src/vs/workbench/services/electron/electron-browser/electronService.ts index f684a0f530b..837189b95e2 100644 --- a/src/vs/workbench/services/electron/electron-browser/electronService.ts +++ b/src/vs/workbench/services/electron/electron-browser/electronService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IElectronService } from 'vs/platform/electron/node/electron'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; @@ -15,7 +15,7 @@ export class ElectronService { _serviceBrand: undefined; constructor( - @IMainProcessService mainProcessService: IMainProcessService, + @IMainProcessService2 mainProcessService: IMainProcessService2, @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService ) { return createChannelSender(mainProcessService.getChannel('electron'), { context: environmentService.configuration.windowId }); diff --git a/src/vs/workbench/services/issue/electron-browser/issueService.ts b/src/vs/workbench/services/issue/electron-browser/issueService.ts index a34b1680071..14c46b836e5 100644 --- a/src/vs/workbench/services/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/services/issue/electron-browser/issueService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IIssueService } from 'vs/platform/issue/node/issue'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -12,7 +12,7 @@ export class IssueService { _serviceBrand: undefined; - constructor(@IMainProcessService mainProcessService: IMainProcessService) { + constructor(@IMainProcessService2 mainProcessService: IMainProcessService2) { return createChannelSender(mainProcessService.getChannel('issue')); } } diff --git a/src/vs/workbench/services/log/electron-browser/logService.ts b/src/vs/workbench/services/log/electron-browser/logService.ts index 6164cb48775..0f185b1c77f 100644 --- a/src/vs/workbench/services/log/electron-browser/logService.ts +++ b/src/vs/workbench/services/log/electron-browser/logService.ts @@ -6,7 +6,7 @@ import { DelegatedLogService, ILogService, ConsoleLogInMainService, ConsoleLogService, MultiplexLogService } from 'vs/platform/log/common/log'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -20,7 +20,7 @@ export class DesktopLogService extends DelegatedLogService { private readonly windowId: number; private readonly environmentService: NativeWorkbenchEnvironmentService; - constructor(windowId: number, mainProcessService: IMainProcessService, environmentService: NativeWorkbenchEnvironmentService) { + constructor(windowId: number, mainProcessService: IMainProcessService2, environmentService: NativeWorkbenchEnvironmentService) { const disposables = new DisposableStore(); const loggerClient = new LoggerChannelClient(mainProcessService.getChannel('logger')); diff --git a/src/vs/workbench/services/menubar/electron-browser/menubarService.ts b/src/vs/workbench/services/menubar/electron-browser/menubarService.ts index e50959840af..ecf39aa4bd3 100644 --- a/src/vs/workbench/services/menubar/electron-browser/menubarService.ts +++ b/src/vs/workbench/services/menubar/electron-browser/menubarService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IMenubarService } from 'vs/platform/menubar/node/menubar'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -12,7 +12,7 @@ export class MenubarService { _serviceBrand: undefined; - constructor(@IMainProcessService mainProcessService: IMainProcessService) { + constructor(@IMainProcessService2 mainProcessService: IMainProcessService2) { return createChannelSender(mainProcessService.getChannel('menubar')); } } diff --git a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts index 8ebf99ffb30..bce7088d5b9 100644 --- a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts +++ b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts @@ -6,7 +6,7 @@ import { Client } from 'vs/base/parts/ipc/common/ipc.net'; import { connect } from 'vs/base/parts/ipc/node/ipc.net'; import { IChannel, IServerChannel, getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -20,7 +20,7 @@ export class SharedProcessService implements ISharedProcessService { private sharedProcessMainChannel: IChannel; constructor( - @IMainProcessService mainProcessService: IMainProcessService, + @IMainProcessService2 mainProcessService: IMainProcessService2, @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService ) { this.sharedProcessMainChannel = mainProcessService.getChannel('sharedProcess'); diff --git a/src/vs/workbench/services/update/electron-browser/updateService.ts b/src/vs/workbench/services/update/electron-browser/updateService.ts index b8f6558b2ca..a8e4a33c662 100644 --- a/src/vs/workbench/services/update/electron-browser/updateService.ts +++ b/src/vs/workbench/services/update/electron-browser/updateService.ts @@ -6,7 +6,7 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event, Emitter } from 'vs/base/common/event'; import { IUpdateService, State } from 'vs/platform/update/common/update'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class NativeUpdateService implements IUpdateService { @@ -21,7 +21,7 @@ export class NativeUpdateService implements IUpdateService { private channel: IChannel; - constructor(@IMainProcessService mainProcessService: IMainProcessService) { + constructor(@IMainProcessService2 mainProcessService: IMainProcessService2) { this.channel = mainProcessService.getChannel('update'); // always set this._state as the state changes diff --git a/src/vs/workbench/services/url/electron-browser/urlService.ts b/src/vs/workbench/services/url/electron-browser/urlService.ts index 63476b51364..e04daed7d77 100644 --- a/src/vs/workbench/services/url/electron-browser/urlService.ts +++ b/src/vs/workbench/services/url/electron-browser/urlService.ts @@ -5,7 +5,7 @@ import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/common/url'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { URLHandlerChannel } from 'vs/platform/url/common/urlIpc'; import { URLService } from 'vs/platform/url/node/urlService'; import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/common/opener'; @@ -26,7 +26,7 @@ export class RelayURLService extends URLService implements IURLHandler, IOpener private urlService: IURLService; constructor( - @IMainProcessService mainProcessService: IMainProcessService, + @IMainProcessService2 mainProcessService: IMainProcessService2, @IOpenerService openerService: IOpenerService, @IWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, @IElectronService private electronService: IElectronService diff --git a/src/vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService.ts b/src/vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService.ts index ce4c1262861..0cf07f1afa6 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService.ts @@ -5,17 +5,16 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { StorageKeysSyncRegistryChannelClient } from 'vs/platform/userDataSync/common/userDataSyncIpc'; class StorageKeysSyncRegistryService extends StorageKeysSyncRegistryChannelClient implements IStorageKeysSyncRegistryService { constructor( - @IMainProcessService mainProcessService: IMainProcessService + @IMainProcessService2 mainProcessService: IMainProcessService2 ) { super(mainProcessService.getChannel('storageKeysSyncRegistryService')); } - } registerSingleton(IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService); From 97f43a2fab44e72c560c79c44ff056ccd3cef0a9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 13:56:25 +0200 Subject: [PATCH 008/107] sandbox - produce checksum for preload script --- build/gulpfile.vscode.js | 1 + 1 file changed, 1 insertion(+) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 25b41bd3a91..5c8abb020ef 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -157,6 +157,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op 'vs/workbench/workbench.desktop.main.js', 'vs/workbench/workbench.desktop.main.css', 'vs/workbench/services/extensions/node/extensionHostProcess.js', + 'vs/code/electron-browser/workbench/preload.js', 'vs/code/electron-browser/workbench/workbench.html', 'vs/code/electron-browser/workbench/workbench.js' ]); From 1ee6f73c9f1cdbcf5b1b33c37efab8ed6aa6aff5 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 14:05:51 +0200 Subject: [PATCH 009/107] sandbox - move storageKeysSyncRegistryService --- .../storageKeysSyncRegistryService.ts | 0 src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 1 + 3 files changed, 1 insertion(+), 1 deletion(-) rename src/vs/workbench/services/userDataSync/{electron-browser => electron-sandbox}/storageKeysSyncRegistryService.ts (100%) diff --git a/src/vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService.ts b/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts similarity index 100% rename from src/vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService.ts rename to src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 081ccfb6878..4fc9fe64b0f 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -51,7 +51,6 @@ import 'vs/workbench/services/remote/node/tunnelService'; import 'vs/workbench/services/backup/node/backupFileService'; import 'vs/workbench/services/url/electron-browser/urlService'; import 'vs/workbench/services/workspaces/electron-browser/workspaceEditingService'; -import 'vs/workbench/services/userDataSync/electron-browser/storageKeysSyncRegistryService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncService'; import 'vs/workbench/services/authentication/electron-browser/authenticationTokenService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 07f800e96b7..72cd3403f69 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -14,5 +14,6 @@ //#region --- workbench services import 'vs/workbench/services/workspaces/electron-sandbox/workspacesService'; +import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService'; //#endregion From b1c12cac1046886be24009e3d47e52824df0bec7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 14:09:38 +0200 Subject: [PATCH 010/107] sandbox - move menubarService --- src/vs/code/electron-main/app.ts | 2 +- src/vs/platform/menubar/{node => common}/menubar.ts | 0 src/vs/platform/menubar/electron-main/menubar.ts | 2 +- src/vs/platform/menubar/electron-main/menubarMainService.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 2 +- .../{electron-browser => electron-sandbox}/menubarService.ts | 2 +- src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 1 + 8 files changed, 6 insertions(+), 6 deletions(-) rename src/vs/platform/menubar/{node => common}/menubar.ts (100%) rename src/vs/workbench/services/menubar/{electron-browser => electron-sandbox}/menubarService.ts (92%) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index cb4ca432196..bad81ff0c87 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -50,7 +50,7 @@ import { LoggerChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler, onUnexpectedError } from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; -import { IMenubarService } from 'vs/platform/menubar/node/menubar'; +import { IMenubarService } from 'vs/platform/menubar/common/menubar'; import { MenubarMainService } from 'vs/platform/menubar/electron-main/menubarMainService'; import { RunOnceScheduler } from 'vs/base/common/async'; import { registerContextMenuListener } from 'vs/base/parts/contextmenu/electron-main/contextmenu'; diff --git a/src/vs/platform/menubar/node/menubar.ts b/src/vs/platform/menubar/common/menubar.ts similarity index 100% rename from src/vs/platform/menubar/node/menubar.ts rename to src/vs/platform/menubar/common/menubar.ts diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index ac66913edbf..46e88cd5537 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -18,7 +18,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { mnemonicMenuLabel as baseMnemonicLabel } from 'vs/base/common/labels'; import { IWindowsMainService, IWindowsCountChangedEvent } from 'vs/platform/windows/electron-main/windows'; import { IWorkspacesHistoryMainService } from 'vs/platform/workspaces/electron-main/workspacesHistoryMainService'; -import { IMenubarData, IMenubarKeybinding, MenubarMenuItem, isMenubarMenuItemSeparator, isMenubarMenuItemSubmenu, isMenubarMenuItemAction, IMenubarMenu, isMenubarMenuItemUriAction } from 'vs/platform/menubar/node/menubar'; +import { IMenubarData, IMenubarKeybinding, MenubarMenuItem, isMenubarMenuItemSeparator, isMenubarMenuItemSubmenu, isMenubarMenuItemAction, IMenubarMenu, isMenubarMenuItemUriAction } from 'vs/platform/menubar/common/menubar'; import { URI } from 'vs/base/common/uri'; import { IStateService } from 'vs/platform/state/node/state'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; diff --git a/src/vs/platform/menubar/electron-main/menubarMainService.ts b/src/vs/platform/menubar/electron-main/menubarMainService.ts index 7cadd57ecdb..f38655ffef5 100644 --- a/src/vs/platform/menubar/electron-main/menubarMainService.ts +++ b/src/vs/platform/menubar/electron-main/menubarMainService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IMenubarService, IMenubarData } from 'vs/platform/menubar/node/menubar'; +import { IMenubarService, IMenubarData } from 'vs/platform/menubar/common/menubar'; import { Menubar } from 'vs/platform/menubar/electron-main/menubar'; import { ILogService } from 'vs/platform/log/common/log'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 545bf31888b..981b1f75efd 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -49,7 +49,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IUpdateService } from 'vs/platform/update/common/update'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IPreferencesService } from '../services/preferences/common/preferences'; -import { IMenubarService, IMenubarData, IMenubarMenu, IMenubarKeybinding, IMenubarMenuItemSubmenu, IMenubarMenuItemAction, MenubarMenuItem } from 'vs/platform/menubar/node/menubar'; +import { IMenubarService, IMenubarData, IMenubarMenu, IMenubarKeybinding, IMenubarMenuItemSubmenu, IMenubarMenuItemAction, MenubarMenuItem } from 'vs/platform/menubar/common/menubar'; import { withNullAsUndefined, assertIsDefined } from 'vs/base/common/types'; import { IOpenerService, OpenOptions } from 'vs/platform/opener/common/opener'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/workbench/services/menubar/electron-browser/menubarService.ts b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts similarity index 92% rename from src/vs/workbench/services/menubar/electron-browser/menubarService.ts rename to src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts index ecf39aa4bd3..4ceb3959547 100644 --- a/src/vs/workbench/services/menubar/electron-browser/menubarService.ts +++ b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IMenubarService } from 'vs/platform/menubar/node/menubar'; +import { IMenubarService } from 'vs/platform/menubar/common/menubar'; import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 4fc9fe64b0f..04b59bfa8df 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -64,7 +64,6 @@ import 'vs/workbench/services/localizations/electron-browser/localizationsServic import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; import 'vs/workbench/services/update/electron-browser/updateService'; import 'vs/workbench/services/issue/electron-browser/issueService'; -import 'vs/workbench/services/menubar/electron-browser/menubarService'; import 'vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService'; import 'vs/workbench/services/path/electron-browser/pathService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 72cd3403f69..51f7f092f85 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -15,5 +15,6 @@ import 'vs/workbench/services/workspaces/electron-sandbox/workspacesService'; import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService'; +import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; //#endregion From 0565b5fc034501156f0b3e1fdbc2ba653bf68029 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 14:14:33 +0200 Subject: [PATCH 011/107] sandbox - move issueService --- src/vs/code/electron-browser/issue/issueReporterMain.ts | 2 +- src/vs/code/electron-browser/issue/issueReporterModel.ts | 2 +- .../code/electron-browser/issue/test/testReporterModel.test.ts | 2 +- .../electron-browser/processExplorer/processExplorerMain.ts | 2 +- src/vs/code/electron-main/app.ts | 2 +- src/vs/platform/issue/{node => common}/issue.ts | 0 src/vs/platform/issue/electron-main/issueMainService.ts | 2 +- .../contrib/issue/electron-browser/issue.contribution.ts | 2 +- src/vs/workbench/contrib/issue/electron-browser/issue.ts | 2 +- src/vs/workbench/contrib/issue/electron-browser/issueActions.ts | 2 +- src/vs/workbench/contrib/issue/electron-browser/issueService.ts | 2 +- .../{electron-browser => electron-sandbox}/issueService.ts | 2 +- src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 1 + 14 files changed, 12 insertions(+), 12 deletions(-) rename src/vs/platform/issue/{node => common}/issue.ts (100%) rename src/vs/workbench/services/issue/{electron-browser => electron-sandbox}/issueService.ts (93%) diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index d65090933b3..9c0c913085f 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -28,7 +28,7 @@ import { InstantiationService } from 'vs/platform/instantiation/common/instantia import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IMainProcessService, MainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; -import { ISettingsSearchIssueReporterData, IssueReporterData, IssueReporterExtensionData, IssueReporterFeatures, IssueReporterStyles, IssueType } from 'vs/platform/issue/node/issue'; +import { ISettingsSearchIssueReporterData, IssueReporterData, IssueReporterExtensionData, IssueReporterFeatures, IssueReporterStyles, IssueType } from 'vs/platform/issue/common/issue'; import { getLogLevel, ILogService } from 'vs/platform/log/common/log'; import { FollowerLogService, LoggerChannelClient } from 'vs/platform/log/common/logIpc'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; diff --git a/src/vs/code/electron-browser/issue/issueReporterModel.ts b/src/vs/code/electron-browser/issue/issueReporterModel.ts index 96bae9110ee..47059817368 100644 --- a/src/vs/code/electron-browser/issue/issueReporterModel.ts +++ b/src/vs/code/electron-browser/issue/issueReporterModel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { assign } from 'vs/base/common/objects'; -import { IssueType, ISettingSearchResult, IssueReporterExtensionData } from 'vs/platform/issue/node/issue'; +import { IssueType, ISettingSearchResult, IssueReporterExtensionData } from 'vs/platform/issue/common/issue'; import { SystemInfo, isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnostics'; export interface IssueReporterData { diff --git a/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts b/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts index 2dda07e6fed..e7ce5b7e463 100644 --- a/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts +++ b/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { IssueReporterModel } from 'vs/code/electron-browser/issue/issueReporterModel'; import { normalizeGitHubUrl } from 'vs/platform/issue/common/issueReporterUtil'; -import { IssueType } from 'vs/platform/issue/node/issue'; +import { IssueType } from 'vs/platform/issue/common/issue'; suite('IssueReporter', () => { diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 9684cbd4c20..9091e788eed 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -9,7 +9,7 @@ import { repeat } from 'vs/base/common/strings'; import { totalmem } from 'os'; import product from 'vs/platform/product/common/product'; import { localize } from 'vs/nls'; -import { ProcessExplorerStyles, ProcessExplorerData } from 'vs/platform/issue/node/issue'; +import { ProcessExplorerStyles, ProcessExplorerData } from 'vs/platform/issue/common/issue'; import * as browser from 'vs/base/browser/browser'; import * as platform from 'vs/base/common/platform'; import { IContextMenuItem } from 'vs/base/parts/contextmenu/common/contextmenu'; diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index bad81ff0c87..affd5c5f2bc 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -44,7 +44,7 @@ import { getMachineId } from 'vs/base/node/id'; import { Win32UpdateService } from 'vs/platform/update/electron-main/updateService.win32'; import { LinuxUpdateService } from 'vs/platform/update/electron-main/updateService.linux'; import { DarwinUpdateService } from 'vs/platform/update/electron-main/updateService.darwin'; -import { IIssueService } from 'vs/platform/issue/node/issue'; +import { IIssueService } from 'vs/platform/issue/common/issue'; import { IssueMainService } from 'vs/platform/issue/electron-main/issueMainService'; import { LoggerChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler, onUnexpectedError } from 'vs/base/common/errors'; diff --git a/src/vs/platform/issue/node/issue.ts b/src/vs/platform/issue/common/issue.ts similarity index 100% rename from src/vs/platform/issue/node/issue.ts rename to src/vs/platform/issue/common/issue.ts diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 90e20854239..94c599a5f38 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import * as objects from 'vs/base/common/objects'; import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; -import { IIssueService, IssueReporterData, IssueReporterFeatures, ProcessExplorerData } from 'vs/platform/issue/node/issue'; +import { IIssueService, IssueReporterData, IssueReporterFeatures, ProcessExplorerData } from 'vs/platform/issue/common/issue'; import { BrowserWindow, ipcMain, screen, IpcMainEvent, Display, shell } from 'electron'; import { ILaunchMainService } from 'vs/platform/launch/electron-main/launchMainService'; import { PerformanceInfo, isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnostics'; diff --git a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts index 542cfb5d5dc..7c4e6e51a35 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts @@ -13,7 +13,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; import { WorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issueService'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { IIssueService, IssueReporterData } from 'vs/platform/issue/node/issue'; +import { IIssueService, IssueReporterData } from 'vs/platform/issue/common/issue'; import { OpenIssueReporterArgs, OpenIssueReporterActionId } from 'vs/workbench/contrib/issue/common/commands'; const helpCategory = { value: nls.localize('help', "Help"), original: 'Help' }; diff --git a/src/vs/workbench/contrib/issue/electron-browser/issue.ts b/src/vs/workbench/contrib/issue/electron-browser/issue.ts index da0a15a4e64..fc6d4b70552 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issue.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issue.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IssueReporterData } from 'vs/platform/issue/node/issue'; +import { IssueReporterData } from 'vs/platform/issue/common/issue'; export const IWorkbenchIssueService = createDecorator('workbenchIssueService'); diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts b/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts index 4b6b25c31c0..4eaaf7c3029 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts @@ -5,7 +5,7 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; -import { IssueType } from 'vs/platform/issue/node/issue'; +import { IssueType } from 'vs/platform/issue/common/issue'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; export class OpenProcessExplorer extends Action { diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts index 3efe946f1ee..0f18222f7ff 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IssueReporterStyles, IIssueService, IssueReporterData, ProcessExplorerData, IssueReporterExtensionData } from 'vs/platform/issue/node/issue'; +import { IssueReporterStyles, IIssueService, IssueReporterData, ProcessExplorerData, IssueReporterExtensionData } from 'vs/platform/issue/common/issue'; import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; import { textLinkForeground, inputBackground, inputBorder, inputForeground, buttonBackground, buttonHoverBackground, buttonForeground, inputValidationErrorBorder, foreground, inputActiveOptionBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, editorBackground, editorForeground, listHoverBackground, listHoverForeground, listHighlightForeground, textLinkActiveForeground, inputValidationErrorBackground, inputValidationErrorForeground } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; diff --git a/src/vs/workbench/services/issue/electron-browser/issueService.ts b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts similarity index 93% rename from src/vs/workbench/services/issue/electron-browser/issueService.ts rename to src/vs/workbench/services/issue/electron-sandbox/issueService.ts index 14c46b836e5..15654b034d7 100644 --- a/src/vs/workbench/services/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IIssueService } from 'vs/platform/issue/node/issue'; +import { IIssueService } from 'vs/platform/issue/common/issue'; import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 04b59bfa8df..df70fc6b95c 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -63,7 +63,6 @@ import 'vs/workbench/services/electron/electron-browser/electronService'; import 'vs/workbench/services/localizations/electron-browser/localizationsService'; import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; import 'vs/workbench/services/update/electron-browser/updateService'; -import 'vs/workbench/services/issue/electron-browser/issueService'; import 'vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService'; import 'vs/workbench/services/path/electron-browser/pathService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 51f7f092f85..a1b5b8d2a1b 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -16,5 +16,6 @@ import 'vs/workbench/services/workspaces/electron-sandbox/workspacesService'; import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService'; import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; +import 'vs/workbench/services/issue/electron-sandbox/issueService'; //#endregion From bfe3cc05664da0b033573387378b7ac03d6e8434 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 14:19:47 +0200 Subject: [PATCH 012/107] sandbox - move IExtensionHostDebugService --- .../extensionHostDebugService.ts | 0 src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 8 ++++++++ 3 files changed, 8 insertions(+), 1 deletion(-) rename src/vs/workbench/contrib/debug/{electron-browser => electron-sandbox}/extensionHostDebugService.ts (100%) diff --git a/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService.ts b/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts similarity index 100% rename from src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService.ts rename to src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index df70fc6b95c..3d63bb51809 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -105,7 +105,6 @@ import 'vs/workbench/contrib/backup/electron-browser/backup.contribution'; // Debug import 'vs/workbench/contrib/debug/node/debugHelperService'; -import 'vs/workbench/contrib/debug/electron-browser/extensionHostDebugService'; // Webview import 'vs/workbench/contrib/webview/electron-browser/webview.contribution'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index a1b5b8d2a1b..6d396dcc526 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -19,3 +19,11 @@ import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; import 'vs/workbench/services/issue/electron-sandbox/issueService'; //#endregion + + +//#region --- workbench contributions + +// Debug +import 'vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService'; + +//#endregion From a5554716a0c9b1bcd3c0b0329fa356ae1647ac0c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 14:24:26 +0200 Subject: [PATCH 013/107] sandbox - move updateService --- .../{electron-browser => electron-sandbox}/updateService.ts | 0 src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 1 + 3 files changed, 1 insertion(+), 1 deletion(-) rename src/vs/workbench/services/update/{electron-browser => electron-sandbox}/updateService.ts (100%) diff --git a/src/vs/workbench/services/update/electron-browser/updateService.ts b/src/vs/workbench/services/update/electron-sandbox/updateService.ts similarity index 100% rename from src/vs/workbench/services/update/electron-browser/updateService.ts rename to src/vs/workbench/services/update/electron-sandbox/updateService.ts diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 3d63bb51809..96a0807b7c9 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -62,7 +62,6 @@ import 'vs/workbench/services/sharedProcess/electron-browser/sharedProcessServic import 'vs/workbench/services/electron/electron-browser/electronService'; import 'vs/workbench/services/localizations/electron-browser/localizationsService'; import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; -import 'vs/workbench/services/update/electron-browser/updateService'; import 'vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService'; import 'vs/workbench/services/path/electron-browser/pathService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 6d396dcc526..699e03efeeb 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -17,6 +17,7 @@ import 'vs/workbench/services/workspaces/electron-sandbox/workspacesService'; import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService'; import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; import 'vs/workbench/services/issue/electron-sandbox/issueService'; +import 'vs/workbench/services/update/electron-sandbox/updateService'; //#endregion From 2c2750be083ef78b58a6f3c47217aa699a5a3121 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 14:33:57 +0200 Subject: [PATCH 014/107] sandbox - get rid of IMainProcessService2 --- .../issue/issueReporterMain.ts | 3 ++- .../sharedProcess/sharedProcessMain.ts | 11 +++++++--- .../driver/electron-browser/driver.ts | 4 ++-- .../platform/ipc/common/mainProcessService.ts | 20 +++++++++++++++++++ .../electron-browser/mainProcessService.ts | 15 ++------------ .../electron-sandbox/mainProcessService.ts | 17 ++-------------- .../extensionHostDebugService.ts | 4 ++-- .../electron-browser/desktop.main.ts | 9 +++++---- .../electron-browser/electronService.ts | 4 ++-- .../issue/electron-sandbox/issueService.ts | 4 ++-- .../log/electron-browser/logService.ts | 4 ++-- .../electron-sandbox/menubarService.ts | 4 ++-- .../electron-browser/sharedProcessService.ts | 4 ++-- .../update/electron-sandbox/updateService.ts | 4 ++-- .../url/electron-browser/urlService.ts | 4 ++-- .../storageKeysSyncRegistryService.ts | 4 ++-- .../electron-sandbox/workspacesService.ts | 4 ++-- 17 files changed, 61 insertions(+), 58 deletions(-) create mode 100644 src/vs/platform/ipc/common/mainProcessService.ts diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 9c0c913085f..0bca9e03a6f 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -26,7 +26,8 @@ import { isRemoteDiagnosticError, SystemInfo } from 'vs/platform/diagnostics/com import { EnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { IMainProcessService, MainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { MainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { ISettingsSearchIssueReporterData, IssueReporterData, IssueReporterExtensionData, IssueReporterFeatures, IssueReporterStyles, IssueType } from 'vs/platform/issue/common/issue'; import { getLogLevel, ILogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 80071f1274e..c1586234236 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -40,7 +40,7 @@ import { NodeCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/co import { LanguagePackCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner'; import { StorageDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner'; import { LogsDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner'; -import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { DiagnosticsService, IDiagnosticsService } from 'vs/platform/diagnostics/node/diagnosticsService'; import { DiagnosticsChannel } from 'vs/platform/diagnostics/node/diagnosticsIpc'; @@ -89,7 +89,12 @@ interface ISharedProcessInitData { const eventPrefix = 'monacoworkbench'; class MainProcessService implements IMainProcessService { - constructor(private server: Server, private mainRouter: StaticRouter) { } + + constructor( + public readonly windowId: number, + private server: Server, + private mainRouter: StaticRouter + ) { } _serviceBrand: undefined; @@ -121,7 +126,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat disposables.add(logService); logService.info('main', JSON.stringify(configuration)); - const mainProcessService = new MainProcessService(server, mainRouter); + const mainProcessService = new MainProcessService(configuration.windowId, server, mainRouter); services.set(IMainProcessService, mainProcessService); // Files diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 778854c389d..c323db1b897 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -6,7 +6,7 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/node/driver'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import * as electron from 'electron'; import { timeout } from 'vs/base/common/async'; import { BaseWindowDriver } from 'vs/platform/driver/browser/baseDriver'; @@ -47,7 +47,7 @@ class WindowDriver extends BaseWindowDriver { export async function registerWindowDriver(accessor: ServicesAccessor, windowId: number): Promise { const instantiationService = accessor.get(IInstantiationService); - const mainProcessService = accessor.get(IMainProcessService2); + const mainProcessService = accessor.get(IMainProcessService); const windowDriver = instantiationService.createInstance(WindowDriver); const windowDriverChannel = new WindowDriverChannel(windowDriver); diff --git a/src/vs/platform/ipc/common/mainProcessService.ts b/src/vs/platform/ipc/common/mainProcessService.ts new file mode 100644 index 00000000000..3992ed9150e --- /dev/null +++ b/src/vs/platform/ipc/common/mainProcessService.ts @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; + +export const IMainProcessService = createDecorator('mainProcessService'); + +export interface IMainProcessService { + + _serviceBrand: undefined; + + readonly windowId: number; + + getChannel(channelName: string): IChannel; + + registerChannel(channelName: string, channel: IServerChannel): void; +} diff --git a/src/vs/platform/ipc/electron-browser/mainProcessService.ts b/src/vs/platform/ipc/electron-browser/mainProcessService.ts index c72b1c703d3..e31f8be7c7f 100644 --- a/src/vs/platform/ipc/electron-browser/mainProcessService.ts +++ b/src/vs/platform/ipc/electron-browser/mainProcessService.ts @@ -3,21 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Client } from 'vs/base/parts/ipc/electron-browser/ipc.electron-browser'; import { Disposable } from 'vs/base/common/lifecycle'; - -export const IMainProcessService = createDecorator('mainProcessService'); - -export interface IMainProcessService { - - _serviceBrand: undefined; - - getChannel(channelName: string): IChannel; - - registerChannel(channelName: string, channel: IServerChannel): void; -} +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; export class MainProcessService extends Disposable implements IMainProcessService { @@ -26,7 +15,7 @@ export class MainProcessService extends Disposable implements IMainProcessServic private mainProcessConnection: Client; constructor( - windowId: number + public readonly windowId: number ) { super(); diff --git a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts index e9cecd6341f..d496c839494 100644 --- a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts +++ b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts @@ -3,25 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Client } from 'vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox'; import { Disposable } from 'vs/base/common/lifecycle'; -export const IMainProcessService2 = createDecorator('mainProcessService2'); - -export interface IMainProcessService2 { - - _serviceBrand: undefined; - - readonly windowId: number; - - getChannel(channelName: string): IChannel; - - registerChannel(channelName: string, channel: IServerChannel): void; -} - -export class MainProcessService2 extends Disposable implements IMainProcessService2 { +export class MainProcessService extends Disposable implements IMainProcessService { _serviceBrand: undefined; diff --git a/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts b/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts index 318d31a69ab..15fef8975b9 100644 --- a/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts +++ b/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts @@ -5,13 +5,13 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { ExtensionHostDebugChannelClient, ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; export class ExtensionHostDebugService extends ExtensionHostDebugChannelClient { constructor( - @IMainProcessService2 readonly mainProcessService: IMainProcessService2 + @IMainProcessService readonly mainProcessService: IMainProcessService ) { super(mainProcessService.getChannel(ExtensionHostDebugBroadcastChannel.ChannelName)); } diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 98dd556daa2..bfc2ec1c9e2 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -30,7 +30,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IStorageService } from 'vs/platform/storage/common/storage'; import { Disposable } from 'vs/base/common/lifecycle'; import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; -import { IMainProcessService2, MainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { MainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { RemoteAuthorityResolverService } from 'vs/platform/remote/electron-browser/remoteAuthorityResolverService'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; @@ -170,8 +171,8 @@ class DesktopMain extends Disposable { // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Main Process - const mainProcessService = this._register(new MainProcessService2(this.configuration.windowId)); - serviceCollection.set(IMainProcessService2, mainProcessService); + const mainProcessService = this._register(new MainProcessService(this.configuration.windowId)); + serviceCollection.set(IMainProcessService, mainProcessService); // Environment serviceCollection.set(IWorkbenchEnvironmentService, this.environmentService); @@ -297,7 +298,7 @@ class DesktopMain extends Disposable { } } - private async createStorageService(payload: IWorkspaceInitializationPayload, logService: ILogService, mainProcessService: IMainProcessService2): Promise { + private async createStorageService(payload: IWorkspaceInitializationPayload, logService: ILogService, mainProcessService: IMainProcessService): Promise { const globalStorageDatabase = new GlobalStorageDatabaseChannelClient(mainProcessService.getChannel('storage')); const storageService = new NativeStorageService(globalStorageDatabase, logService, this.environmentService); diff --git a/src/vs/workbench/services/electron/electron-browser/electronService.ts b/src/vs/workbench/services/electron/electron-browser/electronService.ts index 837189b95e2..9eef2befcba 100644 --- a/src/vs/workbench/services/electron/electron-browser/electronService.ts +++ b/src/vs/workbench/services/electron/electron-browser/electronService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IElectronService } from 'vs/platform/electron/node/electron'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; @@ -15,7 +15,7 @@ export class ElectronService { _serviceBrand: undefined; constructor( - @IMainProcessService2 mainProcessService: IMainProcessService2, + @IMainProcessService mainProcessService: IMainProcessService, @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService ) { return createChannelSender(mainProcessService.getChannel('electron'), { context: environmentService.configuration.windowId }); diff --git a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts index 15654b034d7..d4f71d134e8 100644 --- a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IIssueService } from 'vs/platform/issue/common/issue'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -12,7 +12,7 @@ export class IssueService { _serviceBrand: undefined; - constructor(@IMainProcessService2 mainProcessService: IMainProcessService2) { + constructor(@IMainProcessService mainProcessService: IMainProcessService) { return createChannelSender(mainProcessService.getChannel('issue')); } } diff --git a/src/vs/workbench/services/log/electron-browser/logService.ts b/src/vs/workbench/services/log/electron-browser/logService.ts index 0f185b1c77f..63313c6b08d 100644 --- a/src/vs/workbench/services/log/electron-browser/logService.ts +++ b/src/vs/workbench/services/log/electron-browser/logService.ts @@ -6,7 +6,7 @@ import { DelegatedLogService, ILogService, ConsoleLogInMainService, ConsoleLogService, MultiplexLogService } from 'vs/platform/log/common/log'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -20,7 +20,7 @@ export class DesktopLogService extends DelegatedLogService { private readonly windowId: number; private readonly environmentService: NativeWorkbenchEnvironmentService; - constructor(windowId: number, mainProcessService: IMainProcessService2, environmentService: NativeWorkbenchEnvironmentService) { + constructor(windowId: number, mainProcessService: IMainProcessService, environmentService: NativeWorkbenchEnvironmentService) { const disposables = new DisposableStore(); const loggerClient = new LoggerChannelClient(mainProcessService.getChannel('logger')); diff --git a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts index 4ceb3959547..7d863122efa 100644 --- a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts +++ b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IMenubarService } from 'vs/platform/menubar/common/menubar'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -12,7 +12,7 @@ export class MenubarService { _serviceBrand: undefined; - constructor(@IMainProcessService2 mainProcessService: IMainProcessService2) { + constructor(@IMainProcessService mainProcessService: IMainProcessService) { return createChannelSender(mainProcessService.getChannel('menubar')); } } diff --git a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts index bce7088d5b9..3e9c579408b 100644 --- a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts +++ b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts @@ -6,7 +6,7 @@ import { Client } from 'vs/base/parts/ipc/common/ipc.net'; import { connect } from 'vs/base/parts/ipc/node/ipc.net'; import { IChannel, IServerChannel, getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -20,7 +20,7 @@ export class SharedProcessService implements ISharedProcessService { private sharedProcessMainChannel: IChannel; constructor( - @IMainProcessService2 mainProcessService: IMainProcessService2, + @IMainProcessService mainProcessService: IMainProcessService, @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService ) { this.sharedProcessMainChannel = mainProcessService.getChannel('sharedProcess'); diff --git a/src/vs/workbench/services/update/electron-sandbox/updateService.ts b/src/vs/workbench/services/update/electron-sandbox/updateService.ts index a8e4a33c662..84138f3e1d9 100644 --- a/src/vs/workbench/services/update/electron-sandbox/updateService.ts +++ b/src/vs/workbench/services/update/electron-sandbox/updateService.ts @@ -6,7 +6,7 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event, Emitter } from 'vs/base/common/event'; import { IUpdateService, State } from 'vs/platform/update/common/update'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class NativeUpdateService implements IUpdateService { @@ -21,7 +21,7 @@ export class NativeUpdateService implements IUpdateService { private channel: IChannel; - constructor(@IMainProcessService2 mainProcessService: IMainProcessService2) { + constructor(@IMainProcessService mainProcessService: IMainProcessService) { this.channel = mainProcessService.getChannel('update'); // always set this._state as the state changes diff --git a/src/vs/workbench/services/url/electron-browser/urlService.ts b/src/vs/workbench/services/url/electron-browser/urlService.ts index e04daed7d77..e293e2d79e1 100644 --- a/src/vs/workbench/services/url/electron-browser/urlService.ts +++ b/src/vs/workbench/services/url/electron-browser/urlService.ts @@ -5,7 +5,7 @@ import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/common/url'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { URLHandlerChannel } from 'vs/platform/url/common/urlIpc'; import { URLService } from 'vs/platform/url/node/urlService'; import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/common/opener'; @@ -26,7 +26,7 @@ export class RelayURLService extends URLService implements IURLHandler, IOpener private urlService: IURLService; constructor( - @IMainProcessService2 mainProcessService: IMainProcessService2, + @IMainProcessService mainProcessService: IMainProcessService, @IOpenerService openerService: IOpenerService, @IWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, @IElectronService private electronService: IElectronService diff --git a/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts b/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts index 0cf07f1afa6..e2d1ece582b 100644 --- a/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts +++ b/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts @@ -5,13 +5,13 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { StorageKeysSyncRegistryChannelClient } from 'vs/platform/userDataSync/common/userDataSyncIpc'; class StorageKeysSyncRegistryService extends StorageKeysSyncRegistryChannelClient implements IStorageKeysSyncRegistryService { constructor( - @IMainProcessService2 mainProcessService: IMainProcessService2 + @IMainProcessService mainProcessService: IMainProcessService ) { super(mainProcessService.getChannel('storageKeysSyncRegistryService')); } diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts index ea112dc69d5..2e68d7b154b 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; -import { IMainProcessService2 } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; @@ -13,7 +13,7 @@ export class NativeWorkspacesService { _serviceBrand: undefined; constructor( - @IMainProcessService2 mainProcessService: IMainProcessService2 + @IMainProcessService mainProcessService: IMainProcessService ) { return createChannelSender(mainProcessService.getChannel('workspaces'), { context: mainProcessService.windowId }); } From 88ae7a43871d9bda8c2cc1951be8857935cab30e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 23 May 2020 14:37:31 +0200 Subject: [PATCH 015/107] sandbox - fix tests --- src/vs/base/parts/ipc/test/common/ipc.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/base/parts/ipc/test/common/ipc.test.ts b/src/vs/base/parts/ipc/test/common/ipc.test.ts index 88a7b7744a7..8ed0f3797f1 100644 --- a/src/vs/base/parts/ipc/test/common/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/common/ipc.test.ts @@ -102,7 +102,7 @@ interface ITestService { error(message: string): Promise; neverComplete(): Promise; neverCompleteCT(cancellationToken: CancellationToken): Promise; - buffersLength(buffers: Buffer[]): Promise; + buffersLength(buffers: VSBuffer[]): Promise; marshall(uri: URI): Promise; context(): Promise; @@ -134,8 +134,8 @@ class TestService implements ITestService { return new Promise((_, e) => cancellationToken.onCancellationRequested(() => e(canceled()))); } - buffersLength(buffers: Buffer[]): Promise { - return Promise.resolve(buffers.reduce((r, b) => r + b.length, 0)); + buffersLength(buffers: VSBuffer[]): Promise { + return Promise.resolve(buffers.reduce((r, b) => r + b.buffer.length, 0)); } ping(msg: string): void { @@ -198,7 +198,7 @@ class TestChannelClient implements ITestService { return this.channel.call('neverCompleteCT', undefined, cancellationToken); } - buffersLength(buffers: Buffer[]): Promise { + buffersLength(buffers: VSBuffer[]): Promise { return this.channel.call('buffersLength', buffers); } @@ -316,7 +316,7 @@ suite('Base IPC', function () { }); test('buffers in arrays', async function () { - const r = await ipcService.buffersLength([Buffer.allocUnsafe(2), Buffer.allocUnsafe(3)]); + const r = await ipcService.buffersLength([VSBuffer.alloc(2), VSBuffer.alloc(3)]); return assert.equal(r, 5); }); }); @@ -382,7 +382,7 @@ suite('Base IPC', function () { }); test('buffers in arrays', async function () { - const r = await ipcService.buffersLength([Buffer.allocUnsafe(2), Buffer.allocUnsafe(3)]); + const r = await ipcService.buffersLength([VSBuffer.alloc(2), VSBuffer.alloc(3)]); return assert.equal(r, 5); }); }); From 60d906fd579f15dafe4e6c1f584b43a4598fbfb2 Mon Sep 17 00:00:00 2001 From: rzj17 Date: Thu, 14 Nov 2019 15:44:16 +0000 Subject: [PATCH 016/107] Modify git add/revert to use splitInChunks --- extensions/git/src/git.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index e952280f472..c38fdea0718 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1226,12 +1226,13 @@ export class Repository { args.push('--'); if (paths && paths.length) { - args.push.apply(args, paths.map(sanitizePath)); + for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) { + await this.run([...args, ...chunk]); + } } else { args.push('.'); + await this.run(args); } - - await this.run(args); } async rm(paths: string[]): Promise { @@ -1480,14 +1481,15 @@ export class Repository { args = ['reset', '-q', treeish, '--']; } - if (paths && paths.length) { - args.push.apply(args, paths.map(sanitizePath)); - } else { - args.push('.'); - } - try { - await this.run(args); + if (paths && paths.length > 0) { + for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) { + await this.run([...args, ...chunk]); + } + } else { + args.push('.'); + await this.run(args); + } } catch (err) { // In case there are merge conflicts to be resolved, git reset will output // some "needs merge" data. We try to get around that. From 9c36a570c3ba587aa35a219994e00ef855dfc926 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sun, 24 May 2020 07:49:37 +0200 Subject: [PATCH 017/107] sandbox - move contextMenuService --- build/gulpfile.vscode.js | 2 +- src/vs/base/electron-sandbox/globals.ts | 14 ++++++++++ .../contextmenu.ts | 2 +- .../issue/issueReporterMain.ts | 2 +- .../{workbench => }/preload.js | 26 ++++++++++++++++++- .../processExplorer/processExplorerMain.ts | 2 +- src/vs/code/electron-main/window.ts | 2 +- .../issue/electron-main/issueMainService.ts | 3 +++ .../contextmenuService.ts | 4 +-- src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 1 + 11 files changed, 50 insertions(+), 9 deletions(-) rename src/vs/base/parts/contextmenu/{electron-browser => electron-sandbox}/contextmenu.ts (97%) rename src/vs/code/electron-browser/{workbench => }/preload.js (71%) rename src/vs/workbench/services/contextmenu/{electron-browser => electron-sandbox}/contextmenuService.ts (98%) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 5c8abb020ef..c4c06a7e64c 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -157,7 +157,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op 'vs/workbench/workbench.desktop.main.js', 'vs/workbench/workbench.desktop.main.css', 'vs/workbench/services/extensions/node/extensionHostProcess.js', - 'vs/code/electron-browser/workbench/preload.js', + 'vs/code/electron-browser/preload.js', 'vs/code/electron-browser/workbench/workbench.html', 'vs/code/electron-browser/workbench/workbench.js' ]); diff --git a/src/vs/base/electron-sandbox/globals.ts b/src/vs/base/electron-sandbox/globals.ts index a5f420cbd1b..414e531765d 100644 --- a/src/vs/base/electron-sandbox/globals.ts +++ b/src/vs/base/electron-sandbox/globals.ts @@ -11,6 +11,12 @@ export const ipcRenderer = (window as any).vscode.ipcRenderer as { */ on(channel: string, listener: Function): void; + /** + * Adds a one time `listener` function for the event. This `listener` is invoked + * only the next time a message is sent to `channel`, after which it is removed. + */ + once(channel: string, listener: Function): void; + /** * Removes the specified `listener` from the listener array for the specified * `channel`. @@ -32,3 +38,11 @@ export const ipcRenderer = (window as any).vscode.ipcRenderer as { */ send(channel: string, ...args: any[]): void; }; + +export const webFrame = (window as any).vscode.webFrame as { + + /** + * The current zoom factor. + */ + getZoomFactor(): number; +}; diff --git a/src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts similarity index 97% rename from src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts rename to src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts index da008e59930..a08b8a54278 100644 --- a/src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts +++ b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer, Event } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { IContextMenuItem, ISerializableContextMenuItem, CONTEXT_MENU_CLOSE_CHANNEL, CONTEXT_MENU_CHANNEL, IPopupOptions, IContextMenuEvent } from 'vs/base/parts/contextmenu/common/contextmenu'; let contextMenuIdPool = 0; diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 0bca9e03a6f..406df2dc41e 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -27,7 +27,7 @@ import { EnvironmentService, INativeEnvironmentService } from 'vs/platform/envir import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; -import { MainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { MainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { ISettingsSearchIssueReporterData, IssueReporterData, IssueReporterExtensionData, IssueReporterFeatures, IssueReporterStyles, IssueType } from 'vs/platform/issue/common/issue'; import { getLogLevel, ILogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/code/electron-browser/workbench/preload.js b/src/vs/code/electron-browser/preload.js similarity index 71% rename from src/vs/code/electron-browser/workbench/preload.js rename to src/vs/code/electron-browser/preload.js index 07802dd616c..20012388f48 100644 --- a/src/vs/code/electron-browser/workbench/preload.js +++ b/src/vs/code/electron-browser/preload.js @@ -7,7 +7,7 @@ (function () { 'use strict'; - const { ipcRenderer } = require('electron'); + const { ipcRenderer, webFrame } = require('electron'); // @ts-ignore window.vscode = { @@ -15,6 +15,8 @@ /** * A minimal set of methods exposed from ipcRenderer * to support communication to electron-main + * + * @type {typeof import('../../base/electron-sandbox/globals').ipcRenderer} */ ipcRenderer: { @@ -38,6 +40,16 @@ ipcRenderer.on(channel, listener); }, + /** + * @param {string} channel + * @param {(event: import('electron').IpcRendererEvent, ...args: any[]) => void} listener + */ + once(channel, listener) { + validateIPC(channel); + + ipcRenderer.once(channel, listener); + }, + /** * @param {string} channel * @param {(event: import('electron').IpcRendererEvent, ...args: any[]) => void} listener @@ -47,6 +59,18 @@ ipcRenderer.removeListener(channel, listener); } + }, + + /** + * Support for methods of webFrame type. + * + * @type {typeof import('../../base/electron-sandbox/globals').webFrame} + */ + webFrame: { + + getZoomFactor() { + return webFrame.getZoomFactor(); + } } }; diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 9091e788eed..77575f4ce35 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -13,7 +13,7 @@ import { ProcessExplorerStyles, ProcessExplorerData } from 'vs/platform/issue/co import * as browser from 'vs/base/browser/browser'; import * as platform from 'vs/base/common/platform'; import { IContextMenuItem } from 'vs/base/parts/contextmenu/common/contextmenu'; -import { popup } from 'vs/base/parts/contextmenu/electron-browser/contextmenu'; +import { popup } from 'vs/base/parts/contextmenu/electron-sandbox/contextmenu'; import { ProcessItem } from 'vs/base/common/processes'; import { addDisposableListener } from 'vs/base/browser/dom'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index db8c6db420a..c0c2c435c72 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -779,7 +779,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { } private doGetPreloadUrl(): string { - return `${require.toUrl('vs/code/electron-browser/workbench/preload.js')}`; + return require.toUrl('vs/code/electron-browser/preload.js'); } serializeWindowState(): IWindowState { diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 94c599a5f38..d32efddec73 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -18,6 +18,7 @@ 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 { URI } from 'vs/base/common/uri'; const DEFAULT_BACKGROUND_COLOR = '#1E1E1E'; @@ -189,6 +190,7 @@ export class IssueMainService implements IIssueService { title: localize('issueReporter', "Issue Reporter"), backgroundColor: data.styles.backgroundColor || DEFAULT_BACKGROUND_COLOR, webPreferences: { + preload: URI.parse(require.toUrl('vs/code/electron-browser/preload.js')).fsPath, nodeIntegration: true, enableWebSQL: false } @@ -239,6 +241,7 @@ export class IssueMainService implements IIssueService { backgroundColor: data.styles.backgroundColor, title: localize('processExplorer', "Process Explorer"), webPreferences: { + preload: URI.parse(require.toUrl('vs/code/electron-browser/preload.js')).fsPath, nodeIntegration: true, enableWebSQL: false } diff --git a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts similarity index 98% rename from src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts rename to src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts index 70a68b7f35f..2290ea667c7 100644 --- a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts @@ -9,7 +9,7 @@ import * as dom from 'vs/base/browser/dom'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { webFrame } from 'electron'; +import { webFrame } from 'vs/base/electron-sandbox/globals'; import { unmnemonicLabel } from 'vs/base/common/labels'; import { Event, Emitter } from 'vs/base/common/event'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -17,7 +17,7 @@ import { IContextMenuDelegate, ContextSubMenu, IContextMenuEvent } from 'vs/base import { once } from 'vs/base/common/functional'; import { Disposable } from 'vs/base/common/lifecycle'; import { IContextMenuItem } from 'vs/base/parts/contextmenu/common/contextmenu'; -import { popup } from 'vs/base/parts/contextmenu/electron-browser/contextmenu'; +import { popup } from 'vs/base/parts/contextmenu/electron-sandbox/contextmenu'; import { getTitleBarStyle } from 'vs/platform/windows/common/windows'; import { isMacintosh } from 'vs/base/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 96a0807b7c9..20b6eea1eaf 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -39,7 +39,6 @@ import 'vs/workbench/services/dialogs/electron-browser/dialogService'; import 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; import 'vs/workbench/services/keybinding/electron-browser/keybinding.contribution'; import 'vs/workbench/services/extensions/electron-browser/extensionService'; -import 'vs/workbench/services/contextmenu/electron-browser/contextmenuService'; import 'vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService'; import 'vs/workbench/services/extensionManagement/electron-browser/extensionTipsService'; import 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 699e03efeeb..bd584574c96 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -18,6 +18,7 @@ import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegis import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; import 'vs/workbench/services/issue/electron-sandbox/issueService'; import 'vs/workbench/services/update/electron-sandbox/updateService'; +import 'vs/workbench/services/contextmenu/electron-sandbox/contextmenuService'; //#endregion From d2b5d323d0f8592824abe33fc325cdbbb94535e5 Mon Sep 17 00:00:00 2001 From: Pascal Fong Kye Date: Tue, 12 May 2020 18:17:21 +0200 Subject: [PATCH 018/107] feat:new command stage all merge --- extensions/git/package.json | 19 +++++++++++++++-- extensions/git/package.nls.json | 1 + extensions/git/src/commands.ts | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 1a5dea75d9f..29a049860ce 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -105,6 +105,12 @@ "category": "Git", "icon": "$(add)" }, + { + "command": "git.stageAllMerge", + "title": "%command.stageAllMerge%", + "category": "Git", + "icon": "$(add)" + }, { "command": "git.stageSelectedRanges", "title": "%command.stageSelectedRanges%", @@ -490,6 +496,10 @@ "command": "git.stageAllUntracked", "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0" }, + { + "command": "git.stageAllMerge", + "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0" + }, { "command": "git.stageSelectedRanges", "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0" @@ -837,6 +847,11 @@ "group": "5_stage", "when": "scmProvider == git" }, + { + "command": "git.stageAllMerge", + "group": "5_stage", + "when": "scmProvider == git" + }, { "command": "git.unstageAll", "group": "5_stage", @@ -897,12 +912,12 @@ ], "scm/resourceGroup/context": [ { - "command": "git.stageAll", + "command": "git.stageAllMerge", "when": "scmProvider == git && scmResourceGroup == merge", "group": "1_modification" }, { - "command": "git.stageAll", + "command": "git.stageAllMerge", "when": "scmProvider == git && scmResourceGroup == merge", "group": "inline" }, diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 43b13827aa8..be817e22df1 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -14,6 +14,7 @@ "command.stageAll": "Stage All Changes", "command.stageAllTracked": "Stage All Tracked Changes", "command.stageAllUntracked": "Stage All Untracked Changes", + "command.stageAllMerge": "Stage All Merge Changes", "command.stageSelectedRanges": "Stage Selected Ranges", "command.revertSelectedRanges": "Revert Selected Ranges", "command.stageChange": "Stage Change", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 6beae6fe6f8..513f4a0b346 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1086,6 +1086,43 @@ export class CommandCenter { await repository.add(uris); } + @command('git.stageAllMerge', { repository: true }) + async stageAllMerge(repository: Repository): Promise { + const resources = repository.mergeGroup.resourceStates.filter(s => s instanceof Resource) as Resource[]; + const { merge, unresolved, deletionConflicts } = await categorizeResourceByResolution(resources); + + try { + for (const deletionConflict of deletionConflicts) { + await this._stageDeletionConflict(repository, deletionConflict.resourceUri); + } + } catch (err) { + if (/Cancelled/.test(err.message)) { + return; + } + + throw err; + } + + if (unresolved.length > 0) { + const message = unresolved.length > 1 + ? localize('confirm stage files with merge conflicts', "Are you sure you want to stage {0} files with merge conflicts?", merge.length) + : localize('confirm stage file with merge conflicts', "Are you sure you want to stage {0} with merge conflicts?", path.basename(merge[0].resourceUri.fsPath)); + + const yes = localize('yes', "Yes"); + const pick = await window.showWarningMessage(message, { modal: true }, yes); + + if (pick !== yes) { + return; + } + } + + const uris = resources.map(r => r.resourceUri); + + if (uris.length > 0) { + await repository.add(uris); + } + } + @command('git.stageChange') async stageChange(uri: Uri, changes: LineChange[], index: number): Promise { const textEditor = window.visibleTextEditors.filter(e => e.document.uri.toString() === uri.toString())[0]; From 65fa899fbecb5d52ce65df2d1e88df335791a6f9 Mon Sep 17 00:00:00 2001 From: Pascal Fong Kye Date: Tue, 12 May 2020 19:27:56 +0200 Subject: [PATCH 019/107] refactor: stage all but merge --- extensions/git/src/commands.ts | 35 ++++++---------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 513f4a0b346..e60dc39e6a6 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1000,37 +1000,14 @@ export class CommandCenter { @command('git.stageAll', { repository: true }) async stageAll(repository: Repository): Promise { - const resources = repository.mergeGroup.resourceStates.filter(s => s instanceof Resource) as Resource[]; - const { merge, unresolved, deletionConflicts } = await categorizeResourceByResolution(resources); + const resources = [...repository.workingTreeGroup.resourceStates, ...repository.untrackedGroup.resourceStates]; + const uris = resources.map(r => r.resourceUri); - try { - for (const deletionConflict of deletionConflicts) { - await this._stageDeletionConflict(repository, deletionConflict.resourceUri); - } - } catch (err) { - if (/Cancelled/.test(err.message)) { - return; - } - - throw err; + if (uris.length > 0) { + const config = workspace.getConfiguration('git', Uri.file(repository.root)); + const untrackedChanges = config.get<'mixed' | 'separate' | 'hidden'>('untrackedChanges'); + await repository.add(uris, untrackedChanges === 'mixed' ? undefined : { update: true }); } - - if (unresolved.length > 0) { - const message = unresolved.length > 1 - ? localize('confirm stage files with merge conflicts', "Are you sure you want to stage {0} files with merge conflicts?", merge.length) - : localize('confirm stage file with merge conflicts', "Are you sure you want to stage {0} with merge conflicts?", path.basename(merge[0].resourceUri.fsPath)); - - const yes = localize('yes', "Yes"); - const pick = await window.showWarningMessage(message, { modal: true }, yes); - - if (pick !== yes) { - return; - } - } - - const config = workspace.getConfiguration('git', Uri.file(repository.root)); - const untrackedChanges = config.get<'mixed' | 'separate' | 'hidden'>('untrackedChanges'); - await repository.add([], untrackedChanges === 'mixed' ? undefined : { update: true }); } private async _stageDeletionConflict(repository: Repository, uri: Uri): Promise { From 41461768db2f648b0b33ed5ecc6ddee1738b74ce Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 08:20:26 +0200 Subject: [PATCH 020/107] sandbox - move context service back due to #98495 --- src/vs/workbench/workbench.desktop.main.ts | 1 + src/vs/workbench/workbench.sandbox.main.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 20b6eea1eaf..b2d21f9c51b 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -39,6 +39,7 @@ import 'vs/workbench/services/dialogs/electron-browser/dialogService'; import 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; import 'vs/workbench/services/keybinding/electron-browser/keybinding.contribution'; import 'vs/workbench/services/extensions/electron-browser/extensionService'; +import 'vs/workbench/services/contextmenu/electron-sandbox/contextmenuService'; // TODO@Miguel this cannot be moved to sandbox due to https://github.com/microsoft/vscode/issues/98495 import 'vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService'; import 'vs/workbench/services/extensionManagement/electron-browser/extensionTipsService'; import 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index bd584574c96..699e03efeeb 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -18,7 +18,6 @@ import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegis import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; import 'vs/workbench/services/issue/electron-sandbox/issueService'; import 'vs/workbench/services/update/electron-sandbox/updateService'; -import 'vs/workbench/services/contextmenu/electron-sandbox/contextmenuService'; //#endregion From 062d9393d8f4b9f382585bf3a8bb12192b1ba54c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 08:26:55 +0200 Subject: [PATCH 021/107] sandboy - more adoption of IPC API from preload script --- src/vs/base/electron-sandbox/globals.ts | 6 ++-- .../electron-sandbox/contextmenu.ts | 4 +-- .../issue/issueReporterMain.ts | 3 +- .../processExplorer/processExplorerMain.ts | 11 ++++--- .../sharedProcess/sharedProcessMain.ts | 12 +++---- src/vs/code/electron-main/sharedProcess.ts | 12 ++++--- .../issue/electron-main/issueMainService.ts | 5 ++- .../codeEditor.contribution.ts | 1 - .../codeEditor.contribution.ts | 6 ++++ .../sleepResumeRepaintMinimap.ts | 4 +-- .../files/browser/views/explorerViewer.ts | 2 ++ .../electron-browser/remote.contribution.ts | 10 +++--- .../partsSplash.contribution.ts | 4 +-- .../electron-browser/terminalNativeService.ts | 6 ++-- .../electron-browser/webviewElement.ts | 3 +- src/vs/workbench/electron-browser/window.ts | 31 ++++++++++--------- .../services/editor/browser/editorService.ts | 4 ++- .../electron-browser/extensionService.ts | 4 +-- .../electron-browser/lifecycleService.ts | 14 ++++----- src/vs/workbench/workbench.sandbox.main.ts | 3 ++ 20 files changed, 81 insertions(+), 64 deletions(-) create mode 100644 src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts rename src/vs/workbench/contrib/codeEditor/{electron-browser => electron-sandbox}/sleepResumeRepaintMinimap.ts (91%) diff --git a/src/vs/base/electron-sandbox/globals.ts b/src/vs/base/electron-sandbox/globals.ts index 414e531765d..504c5b018ab 100644 --- a/src/vs/base/electron-sandbox/globals.ts +++ b/src/vs/base/electron-sandbox/globals.ts @@ -9,19 +9,19 @@ export const ipcRenderer = (window as any).vscode.ipcRenderer as { * Listens to `channel`, when a new message arrives `listener` would be called with * `listener(event, args...)`. */ - on(channel: string, listener: Function): void; + on(channel: string, listener: (event: unknown, ...args: any[]) => void): void; /** * Adds a one time `listener` function for the event. This `listener` is invoked * only the next time a message is sent to `channel`, after which it is removed. */ - once(channel: string, listener: Function): void; + once(channel: string, listener: (event: unknown, ...args: any[]) => void): void; /** * Removes the specified `listener` from the listener array for the specified * `channel`. */ - removeListener(channel: string, listener: Function): void; + removeListener(channel: string, listener: (event: unknown, ...args: any[]) => void): void; /** * Send an asynchronous message to the main process via `channel`, along with diff --git a/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts index a08b8a54278..c3a2f865b6b 100644 --- a/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts +++ b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts @@ -13,7 +13,7 @@ export function popup(items: IContextMenuItem[], options?: IPopupOptions): void const contextMenuId = contextMenuIdPool++; const onClickChannel = `vscode:onContextMenu${contextMenuId}`; - const onClickChannelHandler = (_event: Event, itemId: number, context: IContextMenuEvent) => { + const onClickChannelHandler = (event: unknown, itemId: number, context: IContextMenuEvent) => { const item = processedItems[itemId]; if (item.click) { item.click(context); @@ -21,7 +21,7 @@ export function popup(items: IContextMenuItem[], options?: IPopupOptions): void }; ipcRenderer.once(onClickChannel, onClickChannelHandler); - ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (_event: Event, closedContextMenuId: number) => { + ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (event: unknown, closedContextMenuId: number) => { if (closedContextMenuId !== contextMenuId) { return; } diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 406df2dc41e..ffa8d678d88 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/issueReporter'; -import { clipboard, ipcRenderer, shell, webFrame } from 'electron'; +import { clipboard, shell, webFrame } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import * as os from 'os'; import * as browser from 'vs/base/browser/browser'; import { $ } from 'vs/base/browser/dom'; diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 77575f4ce35..7f7a7859381 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/processExplorer'; -import { webFrame, ipcRenderer, clipboard } from 'electron'; +import { webFrame, clipboard } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { repeat } from 'vs/base/common/strings'; import { totalmem } from 'os'; import product from 'vs/platform/product/common/product'; @@ -369,7 +370,7 @@ function requestProcessList(totalWaitTime: number): void { // Wait at least a second between requests. if (waited > 1000) { - ipcRenderer.send('windowsInfoRequest'); + ipcRenderer.send('vscode:windowsInfoRequest'); ipcRenderer.send('vscode:listProcesses'); } else { requestProcessList(waited); @@ -393,18 +394,18 @@ export function startup(data: ProcessExplorerData): void { createCloseListener(); // Map window process pids to titles, annotate process names with this when rendering to distinguish between them - ipcRenderer.on('vscode:windowsInfoResponse', (_event: unknown, windows: any[]) => { + ipcRenderer.on('vscode:windowsInfoResponse', (event: unknown, windows: any[]) => { mapPidToWindowTitle = new Map(); windows.forEach(window => mapPidToWindowTitle.set(window.pid, window.title)); }); - ipcRenderer.on('vscode:listProcessesResponse', (_event: Event, processRoots: [{ name: string, rootProcess: ProcessItem | IRemoteDiagnosticError }]) => { + ipcRenderer.on('vscode:listProcessesResponse', (event: unknown, processRoots: [{ name: string, rootProcess: ProcessItem | IRemoteDiagnosticError }]) => { updateProcessInfo(processRoots); requestProcessList(0); }); lastRequestTime = Date.now(); - ipcRenderer.send('windowsInfoRequest'); + ipcRenderer.send('vscode:windowsInfoRequest'); ipcRenderer.send('vscode:listProcesses'); document.onkeydown = (e: KeyboardEvent) => { diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index c1586234236..cc3187e8663 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -27,7 +27,7 @@ import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProper import { TelemetryAppenderChannel } from 'vs/platform/telemetry/node/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; -import { ipcRenderer } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { ILogService, LogLevel, ILoggerService } from 'vs/platform/log/common/log'; import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; @@ -114,7 +114,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat const onExit = () => disposables.dispose(); process.once('exit', onExit); - ipcRenderer.once('electron-main->shared-process: exit', onExit); + ipcRenderer.once('vscode:electron-main->shared-process=exit', onExit); disposables.add(server); @@ -302,17 +302,17 @@ async function handshake(configuration: ISharedProcessConfiguration): Promise(c => { - ipcRenderer.once('electron-main->shared-process: payload', (_: any, r: ISharedProcessInitData) => c(r)); + ipcRenderer.once('vscode:electron-main->shared-process=payload', (event: unknown, r: ISharedProcessInitData) => c(r)); // tell electron-main we are ready to receive payload - ipcRenderer.send('shared-process->electron-main: ready-for-payload'); + ipcRenderer.send('vscode:shared-process->electron-main=ready-for-payload'); }); // await IPC connection and signal this back to electron-main const server = await setupIPC(data.sharedIPCHandle); - ipcRenderer.send('shared-process->electron-main: ipc-ready'); + ipcRenderer.send('vscode:shared-process->electron-main=ipc-ready'); // await initialization and signal this back to electron-main await main(server, data, configuration); - ipcRenderer.send('shared-process->electron-main: init-done'); + ipcRenderer.send('vscode:shared-process->electron-main=init-done'); } diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index f44b3d08713..715387f24a8 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { URI } from 'vs/base/common/uri'; import { memoize } from 'vs/base/common/decorators'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { BrowserWindow, ipcMain, WebContents, Event as ElectronEvent } from 'electron'; @@ -32,7 +33,7 @@ export class SharedProcess implements ISharedProcess { @IThemeMainService private readonly themeMainService: IThemeMainService ) { // overall ready promise when shared process signals initialization is done - this._whenReady = new Promise(c => ipcMain.once('shared-process->electron-main: init-done', () => c(undefined))); + this._whenReady = new Promise(c => ipcMain.once('vscode:shared-process->electron-main=init-done', () => c(undefined))); } @memoize @@ -41,6 +42,7 @@ export class SharedProcess implements ISharedProcess { show: false, backgroundColor: this.themeMainService.getBackgroundColor(), webPreferences: { + preload: URI.parse(require.toUrl('vs/code/electron-browser/preload.js')).fsPath, images: false, nodeIntegration: true, webgl: false, @@ -105,18 +107,18 @@ export class SharedProcess implements ISharedProcess { return new Promise(c => { // send payload once shared process is ready to receive it - disposables.add(Event.once(Event.fromNodeEventEmitter(ipcMain, 'shared-process->electron-main: ready-for-payload', ({ sender }: { sender: WebContents }) => sender))(sender => { - sender.send('electron-main->shared-process: payload', { + disposables.add(Event.once(Event.fromNodeEventEmitter(ipcMain, 'vscode:shared-process->electron-main=ready-for-payload', ({ sender }: { sender: WebContents }) => sender))(sender => { + sender.send('vscode:electron-main->shared-process=payload', { sharedIPCHandle: this.environmentService.sharedIPCHandle, args: this.environmentService.args, logLevel: this.logService.getLevel() }); // signal exit to shared process when we get disposed - disposables.add(toDisposable(() => sender.send('electron-main->shared-process: exit'))); + disposables.add(toDisposable(() => sender.send('vscode:electron-main->shared-process=exit'))); // complete IPC-ready promise when shared process signals this to us - ipcMain.once('shared-process->electron-main: ipc-ready', () => c(undefined)); + ipcMain.once('vscode:shared-process->electron-main=ipc-ready', () => c(undefined)); })); }); } diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index d32efddec73..bfa139d20e7 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -164,12 +164,11 @@ export class IssueMainService implements IIssueService { } }); - ipcMain.on('windowsInfoRequest', (event: IpcMainEvent) => { + ipcMain.on('vscode:windowsInfoRequest', (event: IpcMainEvent) => { this.launchMainService.getMainProcessInfo().then(info => { event.sender.send('vscode:windowsInfoResponse', info.windows); }); }); - } openReporter(data: IssueReporterData): Promise { @@ -227,7 +226,7 @@ export class IssueMainService implements IIssueService { if (!this._processExplorerWindow) { this._processExplorerParentWindow = BrowserWindow.getFocusedWindow(); if (this._processExplorerParentWindow) { - const position = this.getWindowPosition(this._processExplorerParentWindow, 800, 300); + const position = this.getWindowPosition(this._processExplorerParentWindow, 800, 500); this._processExplorerWindow = new BrowserWindow({ skipTaskbar: true, resizable: true, diff --git a/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts index 21de3dba004..c037e4e5ea8 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts @@ -4,6 +4,5 @@ *--------------------------------------------------------------------------------------------*/ import './inputClipboardActions'; -import './sleepResumeRepaintMinimap'; import './selectionClipboard'; import './startDebugTextMate'; diff --git a/src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts new file mode 100644 index 00000000000..4c11f23fc72 --- /dev/null +++ b/src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import './sleepResumeRepaintMinimap'; diff --git a/src/vs/workbench/contrib/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts similarity index 91% rename from src/vs/workbench/contrib/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts rename to src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts index 7ade76dcb8d..55673b665e5 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts @@ -6,7 +6,7 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { ipcRenderer as ipc } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; class SleepResumeRepaintMinimap implements IWorkbenchContribution { @@ -14,7 +14,7 @@ class SleepResumeRepaintMinimap implements IWorkbenchContribution { constructor( @ICodeEditorService codeEditorService: ICodeEditorService ) { - ipc.on('vscode:osResume', () => { + ipcRenderer.on('vscode:osResume', () => { codeEditorService.listCodeEditors().forEach(editor => editor.render(true)); }); } diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index aed65162f39..37ec584ac78 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -1028,6 +1028,8 @@ export class FileDragAndDrop implements ITreeDragAndDrop { // Handle folder upload else { + + // Create target folder await this.fileService.createFolder(resource); // Recursive upload files in this directory diff --git a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts index bed450069dc..c37e60ffef5 100644 --- a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts @@ -21,7 +21,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { DialogChannel } from 'vs/platform/dialogs/electron-browser/dialogIpc'; import { DownloadServiceChannel } from 'vs/platform/download/common/downloadIpc'; import { LoggerChannel } from 'vs/platform/log/common/logIpc'; -import { ipcRenderer as ipc } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { IDiagnosticInfoOptions, IRemoteDiagnosticInfo } from 'vs/platform/diagnostics/common/diagnostics'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { PersistentConnectionEventType } from 'vs/platform/remote/common/remoteAgentConnection'; @@ -55,7 +55,7 @@ class RemoteAgentDiagnosticListener implements IWorkbenchContribution { @IRemoteAgentService remoteAgentService: IRemoteAgentService, @ILabelService labelService: ILabelService ) { - ipc.on('vscode:getDiagnosticInfo', (event: Event, request: { replyChannel: string, args: IDiagnosticInfoOptions }): void => { + ipcRenderer.on('vscode:getDiagnosticInfo', (event: unknown, request: { replyChannel: string, args: IDiagnosticInfoOptions }): void => { const connection = remoteAgentService.getConnection(); if (connection) { const hostName = labelService.getHostLabel(REMOTE_HOST_SCHEME, connection.remoteAuthority); @@ -65,14 +65,14 @@ class RemoteAgentDiagnosticListener implements IWorkbenchContribution { (info as IRemoteDiagnosticInfo).hostName = hostName; } - ipc.send(request.replyChannel, info); + ipcRenderer.send(request.replyChannel, info); }) .catch(e => { const errorMessage = e && e.message ? `Fetching remote diagnostics for '${hostName}' failed: ${e.message}` : `Fetching remote diagnostics for '${hostName}' failed.`; - ipc.send(request.replyChannel, { hostName, errorMessage }); + ipcRenderer.send(request.replyChannel, { hostName, errorMessage }); }); } else { - ipc.send(request.replyChannel); + ipcRenderer.send(request.replyChannel); } }); } diff --git a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts index 8fe4ddd1fc2..c14f795203f 100644 --- a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts +++ b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer as ipc } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { join } from 'vs/base/common/path'; import { onDidChangeFullscreen, isFullscreen } from 'vs/base/browser/browser'; import { getTotalHeight, getTotalWidth } from 'vs/base/browser/dom'; @@ -112,7 +112,7 @@ class PartsSplash { // the color needs to be in hex const backgroundColor = this._themeService.getColorTheme().getColor(editorBackground) || themes.WORKBENCH_BACKGROUND(this._themeService.getColorTheme()); const payload = JSON.stringify({ baseTheme, background: Color.Format.CSS.formatHex(backgroundColor) }); - ipc.send('vscode:changeColorTheme', this._envService.configuration.windowId, payload); + ipcRenderer.send('vscode:changeColorTheme', this._envService.configuration.windowId, payload); } } diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts index cc02eddf1ea..05c57aec60d 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer as ipc } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; import { ITerminalNativeService, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal'; import { URI } from 'vs/base/common/uri'; @@ -31,8 +31,8 @@ export class TerminalNativeService implements ITerminalNativeService { @IInstantiationService readonly instantiationService: IInstantiationService, @IRemoteAgentService remoteAgentService: IRemoteAgentService ) { - ipc.on('vscode:openFiles', (_event: any, request: IOpenFileRequest) => this._onOpenFileRequest.fire(request)); - ipc.on('vscode:osResume', () => this._onOsResume.fire()); + ipcRenderer.on('vscode:openFiles', (event: unknown, request: IOpenFileRequest) => this._onOpenFileRequest.fire(request)); + ipcRenderer.on('vscode:osResume', () => this._onOsResume.fire()); const connection = remoteAgentService.getConnection(); if (connection && connection.remoteAuthority) { diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index 32a0ee9b57b..a87e83ec7ef 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { FindInPageOptions, OnBeforeRequestListenerDetails, OnHeadersReceivedListenerDetails, Response, WebContents, WebviewTag, ipcRenderer } from 'electron'; +import { FindInPageOptions, OnBeforeRequestListenerDetails, OnHeadersReceivedListenerDetails, Response, WebContents, WebviewTag } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { addDisposableListener } from 'vs/base/browser/dom'; import { ThrottledDelayer } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 981b1f75efd..f95e03e84d0 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -22,7 +22,8 @@ import * as browser from 'vs/base/browser/browser'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; -import { ipcRenderer as ipc, webFrame, crashReporter, CrashReporterStartOptions, Event as IpcEvent } from 'electron'; +import { webFrame, crashReporter, CrashReporterStartOptions } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { IMenuService, MenuId, IMenu, MenuItemAction, ICommandAction, SubmenuItemAction, MenuRegistry } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -127,7 +128,7 @@ export class NativeWindow extends Disposable { }); // Support runAction event - ipc.on('vscode:runAction', async (event: IpcEvent, request: IRunActionInWindowRequest) => { + ipcRenderer.on('vscode:runAction', async (event: unknown, request: IRunActionInWindowRequest) => { const args: unknown[] = request.args || []; // If we run an action from the touchbar, we fill in the currently active resource @@ -158,47 +159,47 @@ export class NativeWindow extends Disposable { }); // Support runKeybinding event - ipc.on('vscode:runKeybinding', (event: IpcEvent, request: IRunKeybindingInWindowRequest) => { + ipcRenderer.on('vscode:runKeybinding', (event: unknown, request: IRunKeybindingInWindowRequest) => { if (document.activeElement) { this.keybindingService.dispatchByUserSettingsLabel(request.userSettingsLabel, document.activeElement); } }); // Error reporting from main - ipc.on('vscode:reportError', (event: IpcEvent, error: string) => { + ipcRenderer.on('vscode:reportError', (event: unknown, error: string) => { if (error) { errors.onUnexpectedError(JSON.parse(error)); } }); // Support openFiles event for existing and new files - ipc.on('vscode:openFiles', (event: IpcEvent, request: IOpenFileRequest) => this.onOpenFiles(request)); + ipcRenderer.on('vscode:openFiles', (event: unknown, request: IOpenFileRequest) => this.onOpenFiles(request)); // Support addFolders event if we have a workspace opened - ipc.on('vscode:addFolders', (event: IpcEvent, request: IAddFoldersRequest) => this.onAddFoldersRequest(request)); + ipcRenderer.on('vscode:addFolders', (event: unknown, request: IAddFoldersRequest) => this.onAddFoldersRequest(request)); // Message support - ipc.on('vscode:showInfoMessage', (event: IpcEvent, message: string) => { + ipcRenderer.on('vscode:showInfoMessage', (event: unknown, message: string) => { this.notificationService.info(message); }); - ipc.on('vscode:displayChanged', (event: IpcEvent) => { + ipcRenderer.on('vscode:displayChanged', () => { clearAllFontInfos(); }); // Fullscreen Events - ipc.on('vscode:enterFullScreen', async () => { + ipcRenderer.on('vscode:enterFullScreen', async () => { await this.lifecycleService.when(LifecyclePhase.Ready); browser.setFullscreen(true); }); - ipc.on('vscode:leaveFullScreen', async () => { + ipcRenderer.on('vscode:leaveFullScreen', async () => { await this.lifecycleService.when(LifecyclePhase.Ready); browser.setFullscreen(false); }); // High Contrast Events - ipc.on('vscode:enterHighContrast', async () => { + ipcRenderer.on('vscode:enterHighContrast', async () => { const windowConfig = this.configurationService.getValue('window'); if (windowConfig?.autoDetectHighContrast) { await this.lifecycleService.when(LifecyclePhase.Ready); @@ -206,7 +207,7 @@ export class NativeWindow extends Disposable { } }); - ipc.on('vscode:leaveHighContrast', async () => { + ipcRenderer.on('vscode:leaveHighContrast', async () => { const windowConfig = this.configurationService.getValue('window'); if (windowConfig?.autoDetectHighContrast) { await this.lifecycleService.when(LifecyclePhase.Ready); @@ -215,12 +216,12 @@ export class NativeWindow extends Disposable { }); // keyboard layout changed event - ipc.on('vscode:keyboardLayoutChanged', () => { + ipcRenderer.on('vscode:keyboardLayoutChanged', () => { KeyboardMapperFactory.INSTANCE._onKeyboardLayoutChanged(); }); // accessibility support changed event - ipc.on('vscode:accessibilitySupportChanged', (event: IpcEvent, accessibilitySupportEnabled: boolean) => { + ipcRenderer.on('vscode:accessibilitySupportChanged', (event: unknown, accessibilitySupportEnabled: boolean) => { this.accessibilityService.setAccessibilitySupport(accessibilitySupportEnabled ? AccessibilitySupport.Enabled : AccessibilitySupport.Disabled); }); @@ -399,7 +400,7 @@ export class NativeWindow extends Disposable { this.setupOpenHandlers(); // Emit event when vscode is ready - this.lifecycleService.when(LifecyclePhase.Ready).then(() => ipc.send('vscode:workbenchReady', this.environmentService.configuration.windowId)); + this.lifecycleService.when(LifecyclePhase.Ready).then(() => ipcRenderer.send('vscode:workbenchReady', this.environmentService.configuration.windowId)); // Integrity warning this.integrityService.isPure().then(res => this.titleService.updateProperties({ isPure: res.isPure })); diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index b025eadf1bf..8169816d162 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -63,6 +63,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { //#endregion + private readonly fileEditorInputFactory = Registry.as(EditorExtensions.EditorInputFactories).getFileEditorInputFactory(); + constructor( @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @IUntitledTextEditorService private readonly untitledTextEditorService: IUntitledTextEditorService, @@ -295,7 +297,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { } private closeOnFileDelete: boolean = false; - private fileEditorInputFactory = Registry.as(EditorExtensions.EditorInputFactories).getFileEditorInputFactory(); + private onConfigurationUpdated(configuration: IWorkbenchEditorConfiguration): void { if (typeof configuration.workbench?.editor?.closeOnFileDelete === 'boolean') { this.closeOnFileDelete = configuration.workbench.editor.closeOnFileDelete; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 88f766b777b..531e6554428 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer as ipc } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { ExtensionHostProcessWorker } from 'vs/workbench/services/extensions/electron-browser/extensionHost'; import { CachedExtensionScanner } from 'vs/workbench/services/extensions/electron-browser/cachedExtensionScanner'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -573,7 +573,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten public _onExtensionHostExit(code: number): void { if (this._isExtensionDevTestFromCli) { // When CLI testing make sure to exit with proper exit code - ipc.send('vscode:exit', code); + ipcRenderer.send('vscode:exit', code); } else { // Expected development extension termination: When the extension host goes down we also shutdown the window this._electronService.closeWindow(); diff --git a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts index 9fe1d298205..4377032a257 100644 --- a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts @@ -3,17 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { localize } from 'vs/nls'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ShutdownReason, StartupKind, handleVetos, ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IStorageService, StorageScope, WillSaveStateReason } from 'vs/platform/storage/common/storage'; -import { ipcRenderer as ipc } from 'electron'; +import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { onUnexpectedError } from 'vs/base/common/errors'; import { AbstractLifecycleService } from 'vs/platform/lifecycle/common/lifecycleService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import Severity from 'vs/base/common/severity'; -import { localize } from 'vs/nls'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; @@ -60,7 +60,7 @@ export class NativeLifecycleService extends AbstractLifecycleService { const windowId = this.environmentService.configuration.windowId; // Main side indicates that window is about to unload, check for vetos - ipc.on('vscode:onBeforeUnload', (_event: unknown, reply: { okChannel: string, cancelChannel: string, reason: ShutdownReason }) => { + ipcRenderer.on('vscode:onBeforeUnload', (event: unknown, reply: { okChannel: string, cancelChannel: string, reason: ShutdownReason }) => { this.logService.trace(`lifecycle: onBeforeUnload (reason: ${reply.reason})`); // trigger onBeforeShutdown events and veto collecting @@ -68,18 +68,18 @@ export class NativeLifecycleService extends AbstractLifecycleService { if (veto) { this.logService.trace('lifecycle: onBeforeUnload prevented via veto'); - ipc.send(reply.cancelChannel, windowId); + ipcRenderer.send(reply.cancelChannel, windowId); } else { this.logService.trace('lifecycle: onBeforeUnload continues without veto'); this.shutdownReason = reply.reason; - ipc.send(reply.okChannel, windowId); + ipcRenderer.send(reply.okChannel, windowId); } }); }); // Main side indicates that we will indeed shutdown - ipc.on('vscode:onWillUnload', async (_event: unknown, reply: { replyChannel: string, reason: ShutdownReason }) => { + ipcRenderer.on('vscode:onWillUnload', async (event: unknown, reply: { replyChannel: string, reason: ShutdownReason }) => { this.logService.trace(`lifecycle: onWillUnload (reason: ${reply.reason})`); // trigger onWillShutdown events and joining @@ -89,7 +89,7 @@ export class NativeLifecycleService extends AbstractLifecycleService { this._onShutdown.fire(); // acknowledge to main side - ipc.send(reply.replyChannel, windowId); + ipcRenderer.send(reply.replyChannel, windowId); }); // Save shutdown reason to retrieve on next startup diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 699e03efeeb..76979eb7dce 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -24,6 +24,9 @@ import 'vs/workbench/services/update/electron-sandbox/updateService'; //#region --- workbench contributions +// CodeEditor Contributions +import 'vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution'; + // Debug import 'vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService'; From 246d25965c7d2cdea40bfb96309e97f2d6545537 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 08:40:07 +0200 Subject: [PATCH 022/107] sandbox - add webFrame APIs --- src/vs/base/electron-sandbox/globals.ts | 12 ++++++++++++ .../code/electron-browser/issue/issueReporterMain.ts | 4 ++-- src/vs/code/electron-browser/preload.js | 11 +++++++++++ .../processExplorer/processExplorerMain.ts | 4 ++-- .../contrib/issue/electron-browser/issueService.ts | 2 +- .../electron-browser/actions/windowActions.ts | 2 +- src/vs/workbench/electron-browser/desktop.main.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 4 ++-- 8 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/vs/base/electron-sandbox/globals.ts b/src/vs/base/electron-sandbox/globals.ts index 504c5b018ab..b9fee9289f1 100644 --- a/src/vs/base/electron-sandbox/globals.ts +++ b/src/vs/base/electron-sandbox/globals.ts @@ -45,4 +45,16 @@ export const webFrame = (window as any).vscode.webFrame as { * The current zoom factor. */ getZoomFactor(): number; + + /** + * The current zoom level. + */ + getZoomLevel(): number; + + /** + * Changes the zoom level to the specified level. The original size is 0 and each + * increment above or below represents zooming 20% larger or smaller to default + * limits of 300% and 50% of original size, respectively. + */ + setZoomLevel(level: number): void; }; diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index ffa8d678d88..873f36802e1 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/issueReporter'; -import { clipboard, shell, webFrame } from 'electron'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { clipboard, shell } from 'electron'; +import { ipcRenderer, webFrame } from 'vs/base/electron-sandbox/globals'; import * as os from 'os'; import * as browser from 'vs/base/browser/browser'; import { $ } from 'vs/base/browser/dom'; diff --git a/src/vs/code/electron-browser/preload.js b/src/vs/code/electron-browser/preload.js index 20012388f48..14afb13f922 100644 --- a/src/vs/code/electron-browser/preload.js +++ b/src/vs/code/electron-browser/preload.js @@ -70,6 +70,17 @@ getZoomFactor() { return webFrame.getZoomFactor(); + }, + + getZoomLevel() { + return webFrame.getZoomLevel(); + }, + + /** + * @param {number} level + */ + setZoomLevel(level) { + webFrame.setZoomLevel(level); } } }; diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 7f7a7859381..47e56f51023 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/processExplorer'; -import { webFrame, clipboard } from 'electron'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { clipboard } from 'electron'; +import { webFrame, ipcRenderer } from 'vs/base/electron-sandbox/globals'; import { repeat } from 'vs/base/common/strings'; import { totalmem } from 'os'; import product from 'vs/platform/product/common/product'; diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts index 0f18222f7ff..d576577f0ac 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts @@ -9,7 +9,7 @@ import { textLinkForeground, inputBackground, inputBorder, inputForeground, butt import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; -import { webFrame } from 'electron'; +import { webFrame } from 'vs/base/electron-sandbox/globals'; import { assign } from 'vs/base/common/objects'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index 255a094fa06..4e9ebf5bad2 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -10,7 +10,7 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; import * as browser from 'vs/base/browser/browser'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { webFrame } from 'electron'; +import { webFrame } from 'vs/base/electron-sandbox/globals'; import { FileKind } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index bfc2ec1c9e2..18eeb4df089 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as gracefulFs from 'graceful-fs'; -import { webFrame } from 'electron'; +import { webFrame } from 'vs/base/electron-sandbox/globals'; import { importEntries, mark } from 'vs/base/common/performance'; import { Workbench } from 'vs/workbench/browser/workbench'; import { NativeWindow } from 'vs/workbench/electron-browser/window'; diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index f95e03e84d0..614f80144c7 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -22,8 +22,8 @@ import * as browser from 'vs/base/browser/browser'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; -import { webFrame, crashReporter, CrashReporterStartOptions } from 'electron'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { crashReporter, CrashReporterStartOptions } from 'electron'; +import { ipcRenderer, webFrame } from 'vs/base/electron-sandbox/globals'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { IMenuService, MenuId, IMenu, MenuItemAction, ICommandAction, SubmenuItemAction, MenuRegistry } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; From 9eb99077f9f60d058d35a2be6da4aa00574a388f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 09:38:05 +0200 Subject: [PATCH 023/107] sandbox - further reduce electron dependencies --- build/gulpfile.vscode.js | 2 +- .../electron-sandbox/contextmenu.ts | 2 +- .../electron-sandbox/ipc.electron-sandbox.ts | 2 +- .../parts/sandbox/common/electronTypes.ts | 250 ++++++++++++++++++ .../sandbox}/electron-browser/preload.js | 21 +- .../sandbox}/electron-sandbox/globals.ts | 33 +++ .../issue/issueReporterMain.ts | 10 +- .../processExplorer/processExplorerMain.ts | 2 +- .../sharedProcess/sharedProcessMain.ts | 2 +- src/vs/code/electron-main/sharedProcess.ts | 2 +- src/vs/code/electron-main/window.ts | 2 +- .../clipboard/common/clipboardService.ts | 1 + .../driver/electron-browser/driver.ts | 4 +- src/vs/platform/electron/node/electron.ts | 2 +- .../issue/electron-main/issueMainService.ts | 4 +- .../sleepResumeRepaintMinimap.ts | 2 +- .../issue/electron-browser/issueService.ts | 2 +- .../electron-browser/remote.contribution.ts | 2 +- .../partsSplash.contribution.ts | 2 +- .../electron-browser/terminalNativeService.ts | 2 +- .../electron-browser/webviewElement.ts | 2 +- .../electron-browser/actions/windowActions.ts | 2 +- .../electron-browser/desktop.main.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 4 +- .../electron-sandbox/contextmenuService.ts | 2 +- .../dialogs/electron-browser/dialogService.ts | 2 +- .../electron-browser/fileDialogService.ts | 2 +- .../electron-browser/extensionHost.ts | 2 +- .../electron-browser/extensionService.ts | 2 +- .../electron-browser/lifecycleService.ts | 2 +- 30 files changed, 335 insertions(+), 36 deletions(-) create mode 100644 src/vs/base/parts/sandbox/common/electronTypes.ts rename src/vs/{code => base/parts/sandbox}/electron-browser/preload.js (80%) rename src/vs/base/{ => parts/sandbox}/electron-sandbox/globals.ts (54%) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index c4c06a7e64c..a74014ae3d4 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -154,10 +154,10 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op const out = sourceFolderName; const checksums = computeChecksums(out, [ + 'vs/base/parts/sandbox/electron-browser/preload.js', 'vs/workbench/workbench.desktop.main.js', 'vs/workbench/workbench.desktop.main.css', 'vs/workbench/services/extensions/node/extensionHostProcess.js', - 'vs/code/electron-browser/preload.js', 'vs/code/electron-browser/workbench/workbench.html', 'vs/code/electron-browser/workbench/workbench.js' ]); diff --git a/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts index c3a2f865b6b..4b5c3fbdf75 100644 --- a/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts +++ b/src/vs/base/parts/contextmenu/electron-sandbox/contextmenu.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { IContextMenuItem, ISerializableContextMenuItem, CONTEXT_MENU_CLOSE_CHANNEL, CONTEXT_MENU_CHANNEL, IPopupOptions, IContextMenuEvent } from 'vs/base/parts/contextmenu/common/contextmenu'; let contextMenuIdPool = 0; diff --git a/src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts b/src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts index 490d66fee48..19ca487c890 100644 --- a/src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts +++ b/src/vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox.ts @@ -8,7 +8,7 @@ import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { Protocol } from 'vs/base/parts/ipc/common/ipc.electron'; import { IDisposable } from 'vs/base/common/lifecycle'; import { VSBuffer } from 'vs/base/common/buffer'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; export class Client extends IPCClient implements IDisposable { diff --git a/src/vs/base/parts/sandbox/common/electronTypes.ts b/src/vs/base/parts/sandbox/common/electronTypes.ts new file mode 100644 index 00000000000..043fb71b777 --- /dev/null +++ b/src/vs/base/parts/sandbox/common/electronTypes.ts @@ -0,0 +1,250 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +// ####################################################################### +// ### ### +// ### electron.d.ts types we need in a common layer for reuse ### +// ### (copied from Electron 8.3.0) ### +// ### ### +// ####################################################################### + + +export interface MessageBoxOptions { + /** + * Can be `"none"`, `"info"`, `"error"`, `"question"` or `"warning"`. On Windows, + * `"question"` displays the same icon as `"info"`, unless you set an icon using + * the `"icon"` option. On macOS, both `"warning"` and `"error"` display the same + * warning icon. + */ + type?: string; + /** + * Array of texts for buttons. On Windows, an empty array will result in one button + * labeled "OK". + */ + buttons?: string[]; + /** + * Index of the button in the buttons array which will be selected by default when + * the message box opens. + */ + defaultId?: number; + /** + * Title of the message box, some platforms will not show it. + */ + title?: string; + /** + * Content of the message box. + */ + message: string; + /** + * Extra information of the message. + */ + detail?: string; + /** + * If provided, the message box will include a checkbox with the given label. + */ + checkboxLabel?: string; + /** + * Initial checked state of the checkbox. `false` by default. + */ + checkboxChecked?: boolean; + // icon?: NativeImage; + /** + * The index of the button to be used to cancel the dialog, via the `Esc` key. By + * default this is assigned to the first button with "cancel" or "no" as the label. + * If no such labeled buttons exist and this option is not set, `0` will be used as + * the return value. + */ + cancelId?: number; + /** + * On Windows Electron will try to figure out which one of the `buttons` are common + * buttons (like "Cancel" or "Yes"), and show the others as command links in the + * dialog. This can make the dialog appear in the style of modern Windows apps. If + * you don't like this behavior, you can set `noLink` to `true`. + */ + noLink?: boolean; + /** + * Normalize the keyboard access keys across platforms. Default is `false`. + * Enabling this assumes `&` is used in the button labels for the placement of the + * keyboard shortcut access key and labels will be converted so they work correctly + * on each platform, `&` characters are removed on macOS, converted to `_` on + * Linux, and left untouched on Windows. For example, a button label of `Vie&w` + * will be converted to `Vie_w` on Linux and `View` on macOS and can be selected + * via `Alt-W` on Windows and Linux. + */ + normalizeAccessKeys?: boolean; +} + +export interface MessageBoxReturnValue { + /** + * The index of the clicked button. + */ + response: number; + /** + * The checked state of the checkbox if `checkboxLabel` was set. Otherwise `false`. + */ + checkboxChecked: boolean; +} + +export interface OpenDevToolsOptions { + /** + * Opens the devtools with specified dock state, can be `right`, `bottom`, + * `undocked`, `detach`. Defaults to last used dock state. In `undocked` mode it's + * possible to dock back. In `detach` mode it's not. + */ + mode: ('right' | 'bottom' | 'undocked' | 'detach'); + /** + * Whether to bring the opened devtools window to the foreground. The default is + * `true`. + */ + activate?: boolean; +} + +export interface SaveDialogOptions { + title?: string; + /** + * Absolute directory path, absolute file path, or file name to use by default. + */ + defaultPath?: string; + /** + * Custom label for the confirmation button, when left empty the default label will + * be used. + */ + buttonLabel?: string; + filters?: FileFilter[]; + /** + * Message to display above text fields. + * + * @platform darwin + */ + message?: string; + /** + * Custom label for the text displayed in front of the filename text field. + * + * @platform darwin + */ + nameFieldLabel?: string; + /** + * Show the tags input box, defaults to `true`. + * + * @platform darwin + */ + showsTagField?: boolean; + properties?: Array<'showHiddenFiles' | 'createDirectory' | 'treatPackageAsDirectory' | 'showOverwriteConfirmation' | 'dontAddToRecent'>; + /** + * Create a security scoped bookmark when packaged for the Mac App Store. If this + * option is enabled and the file doesn't already exist a blank file will be + * created at the chosen path. + * + * @platform darwin,mas + */ + securityScopedBookmarks?: boolean; +} + +export interface OpenDialogOptions { + title?: string; + defaultPath?: string; + /** + * Custom label for the confirmation button, when left empty the default label will + * be used. + */ + buttonLabel?: string; + filters?: FileFilter[]; + /** + * Contains which features the dialog should use. The following values are + * supported: + */ + properties?: Array<'openFile' | 'openDirectory' | 'multiSelections' | 'showHiddenFiles' | 'createDirectory' | 'promptToCreate' | 'noResolveAliases' | 'treatPackageAsDirectory' | 'dontAddToRecent'>; + /** + * Message to display above input boxes. + * + * @platform darwin + */ + message?: string; + /** + * Create security scoped bookmarks when packaged for the Mac App Store. + * + * @platform darwin,mas + */ + securityScopedBookmarks?: boolean; +} + +export interface OpenDialogReturnValue { + /** + * whether or not the dialog was canceled. + */ + canceled: boolean; + /** + * An array of file paths chosen by the user. If the dialog is cancelled this will + * be an empty array. + */ + filePaths: string[]; + /** + * An array matching the `filePaths` array of base64 encoded strings which contains + * security scoped bookmark data. `securityScopedBookmarks` must be enabled for + * this to be populated. (For return values, see table here.) + * + * @platform darwin,mas + */ + bookmarks?: string[]; +} + +export interface SaveDialogReturnValue { + /** + * whether or not the dialog was canceled. + */ + canceled: boolean; + /** + * If the dialog is canceled, this will be `undefined`. + */ + filePath?: string; + /** + * Base64 encoded string which contains the security scoped bookmark data for the + * saved file. `securityScopedBookmarks` must be enabled for this to be present. + * (For return values, see table here.) + * + * @platform darwin,mas + */ + bookmark?: string; +} + +export interface CrashReporterStartOptions { + companyName: string; + /** + * URL that crash reports will be sent to as POST. + */ + submitURL: string; + /** + * Defaults to `app.name`. + */ + productName?: string; + /** + * Whether crash reports should be sent to the server. Default is `true`. + */ + uploadToServer?: boolean; + /** + * Default is `false`. + */ + ignoreSystemCrashHandler?: boolean; + /** + * An object you can define that will be sent along with the report. Only string + * properties are sent correctly. Nested objects are not supported. When using + * Windows, the property names and values must be fewer than 64 characters. + */ + extra?: Record; + /** + * Directory to store the crash reports temporarily (only used when the crash + * reporter is started via `process.crashReporter.start`). + */ + crashesDirectory?: string; +} + +export interface FileFilter { + + // Docs: http://electronjs.org/docs/api/structures/file-filter + + extensions: string[]; + name: string; +} diff --git a/src/vs/code/electron-browser/preload.js b/src/vs/base/parts/sandbox/electron-browser/preload.js similarity index 80% rename from src/vs/code/electron-browser/preload.js rename to src/vs/base/parts/sandbox/electron-browser/preload.js index 14afb13f922..1cb22cfcdd8 100644 --- a/src/vs/code/electron-browser/preload.js +++ b/src/vs/base/parts/sandbox/electron-browser/preload.js @@ -7,7 +7,7 @@ (function () { 'use strict'; - const { ipcRenderer, webFrame } = require('electron'); + const { ipcRenderer, webFrame, crashReporter } = require('electron'); // @ts-ignore window.vscode = { @@ -16,7 +16,7 @@ * A minimal set of methods exposed from ipcRenderer * to support communication to electron-main * - * @type {typeof import('../../base/electron-sandbox/globals').ipcRenderer} + * @type {typeof import('../electron-sandbox/globals').ipcRenderer} */ ipcRenderer: { @@ -64,7 +64,7 @@ /** * Support for methods of webFrame type. * - * @type {typeof import('../../base/electron-sandbox/globals').webFrame} + * @type {typeof import('../electron-sandbox/globals').webFrame} */ webFrame: { @@ -82,6 +82,21 @@ setZoomLevel(level) { webFrame.setZoomLevel(level); } + }, + + /** + * Support for methods of crashReporter type. + * + * @type {typeof import('../electron-sandbox/globals').crashReporter} + */ + crashReporter: { + + /** + * @param {Electron.CrashReporterStartOptions} options + */ + start(options) { + crashReporter.start(options); + } } }; diff --git a/src/vs/base/electron-sandbox/globals.ts b/src/vs/base/parts/sandbox/electron-sandbox/globals.ts similarity index 54% rename from src/vs/base/electron-sandbox/globals.ts rename to src/vs/base/parts/sandbox/electron-sandbox/globals.ts index b9fee9289f1..0cd04e036d4 100644 --- a/src/vs/base/electron-sandbox/globals.ts +++ b/src/vs/base/parts/sandbox/electron-sandbox/globals.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { CrashReporterStartOptions } from 'vs/base/parts/sandbox/common/electronTypes'; + export const ipcRenderer = (window as any).vscode.ipcRenderer as { /** @@ -58,3 +60,34 @@ export const webFrame = (window as any).vscode.webFrame as { */ setZoomLevel(level: number): void; }; + +export const crashReporter = (window as any).vscode.crashReporter as { + + /** + * You are required to call this method before using any other `crashReporter` APIs + * and in each process (main/renderer) from which you want to collect crash + * reports. You can pass different options to `crashReporter.start` when calling + * from different processes. + * + * **Note** Child processes created via the `child_process` module will not have + * access to the Electron modules. Therefore, to collect crash reports from them, + * use `process.crashReporter.start` instead. Pass the same options as above along + * with an additional one called `crashesDirectory` that should point to a + * directory to store the crash reports temporarily. You can test this out by + * calling `process.crash()` to crash the child process. + * + * **Note:** If you need send additional/updated `extra` parameters after your + * first call `start` you can call `addExtraParameter` on macOS or call `start` + * again with the new/updated `extra` parameters on Linux and Windows. + * + * **Note:** On macOS and windows, Electron uses a new `crashpad` client for crash + * collection and reporting. If you want to enable crash reporting, initializing + * `crashpad` from the main process using `crashReporter.start` is required + * regardless of which process you want to collect crashes from. Once initialized + * this way, the crashpad handler collects crashes from all processes. You still + * have to call `crashReporter.start` from the renderer or child process, otherwise + * crashes from them will get reported without `companyName`, `productName` or any + * of the `extra` information. + */ + start(options: CrashReporterStartOptions): void; +}; diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 873f36802e1..d0e824c6cfa 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/issueReporter'; -import { clipboard, shell } from 'electron'; -import { ipcRenderer, webFrame } from 'vs/base/electron-sandbox/globals'; +import { clipboard } from 'electron'; +import { ipcRenderer, webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import * as os from 'os'; import * as browser from 'vs/base/browser/browser'; -import { $ } from 'vs/base/browser/dom'; +import { $, windowOpenNoOpener } from 'vs/base/browser/dom'; import { Button } from 'vs/base/browser/ui/button/button'; import 'vs/base/browser/ui/codicons/codiconStyles'; // make sure codicon css is loaded import { CodiconLabel } from 'vs/base/browser/ui/codicons/codiconLabel'; @@ -463,7 +463,7 @@ export class IssueReporter extends Disposable { this.addEventListener('extensionBugsLink', 'click', (e: Event) => { const url = (e.target).innerText; - shell.openExternal(url); + windowOpenNoOpener(url); }); this.addEventListener('disableExtensions', 'keydown', (e: Event) => { @@ -1195,7 +1195,7 @@ export class IssueReporter extends Disposable { event.stopPropagation(); // Exclude right click if (event.which < 3) { - shell.openExternal((event.target).href); + windowOpenNoOpener((event.target).href); this.telemetryService.publicLog2('issueReporterViewSimilarIssue'); } } diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 47e56f51023..250f09adab6 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/processExplorer'; import { clipboard } from 'electron'; -import { webFrame, ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { webFrame, ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { repeat } from 'vs/base/common/strings'; import { totalmem } from 'os'; import product from 'vs/platform/product/common/product'; diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index cc3187e8663..bbaf7ea6a20 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -27,7 +27,7 @@ import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProper import { TelemetryAppenderChannel } from 'vs/platform/telemetry/node/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ILogService, LogLevel, ILoggerService } from 'vs/platform/log/common/log'; import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index 715387f24a8..7ace2583d75 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -42,7 +42,7 @@ export class SharedProcess implements ISharedProcess { show: false, backgroundColor: this.themeMainService.getBackgroundColor(), webPreferences: { - preload: URI.parse(require.toUrl('vs/code/electron-browser/preload.js')).fsPath, + preload: URI.parse(require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js')).fsPath, images: false, nodeIntegration: true, webgl: false, diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index c0c2c435c72..e8116b8899d 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -779,7 +779,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { } private doGetPreloadUrl(): string { - return require.toUrl('vs/code/electron-browser/preload.js'); + return require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js'); } serializeWindowState(): IWindowState { diff --git a/src/vs/platform/clipboard/common/clipboardService.ts b/src/vs/platform/clipboard/common/clipboardService.ts index 11bf563393a..06db15745b7 100644 --- a/src/vs/platform/clipboard/common/clipboardService.ts +++ b/src/vs/platform/clipboard/common/clipboardService.ts @@ -22,6 +22,7 @@ export interface IClipboardService { */ readText(type?: string): Promise; + /** @deprecated */ readTextSync(): string | undefined; /** diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index c323db1b897..abb7104baa5 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -7,7 +7,7 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/node/driver'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; -import * as electron from 'electron'; +import { remote } from 'electron'; import { timeout } from 'vs/base/common/async'; import { BaseWindowDriver } from 'vs/platform/driver/browser/baseDriver'; import { IElectronService } from 'vs/platform/electron/node/electron'; @@ -32,7 +32,7 @@ class WindowDriver extends BaseWindowDriver { private async _click(selector: string, clickCount: number, offset?: { x: number, y: number }): Promise { const { x, y } = await this._getElementXY(selector, offset); - const webContents: electron.WebContents = (electron as any).remote.getCurrentWebContents(); + const webContents = remote.getCurrentWebContents(); webContents.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount } as any); await timeout(10); diff --git a/src/vs/platform/electron/node/electron.ts b/src/vs/platform/electron/node/electron.ts index 43203239b81..cea336852c1 100644 --- a/src/vs/platform/electron/node/electron.ts +++ b/src/vs/platform/electron/node/electron.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, SaveDialogOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogReturnValue, CrashReporterStartOptions } from 'electron'; +import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, SaveDialogOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogReturnValue, CrashReporterStartOptions } from 'vs/base/parts/sandbox/common/electronTypes'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index bfa139d20e7..3f37c34ad76 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -189,7 +189,7 @@ export class IssueMainService implements IIssueService { title: localize('issueReporter', "Issue Reporter"), backgroundColor: data.styles.backgroundColor || DEFAULT_BACKGROUND_COLOR, webPreferences: { - preload: URI.parse(require.toUrl('vs/code/electron-browser/preload.js')).fsPath, + preload: URI.parse(require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js')).fsPath, nodeIntegration: true, enableWebSQL: false } @@ -240,7 +240,7 @@ export class IssueMainService implements IIssueService { backgroundColor: data.styles.backgroundColor, title: localize('processExplorer', "Process Explorer"), webPreferences: { - preload: URI.parse(require.toUrl('vs/code/electron-browser/preload.js')).fsPath, + preload: URI.parse(require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js')).fsPath, nodeIntegration: true, enableWebSQL: false } diff --git a/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts index 55673b665e5..36e1dba73ac 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts @@ -6,7 +6,7 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; class SleepResumeRepaintMinimap implements IWorkbenchContribution { diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts index d576577f0ac..aca48cd6c5d 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts @@ -9,7 +9,7 @@ import { textLinkForeground, inputBackground, inputBorder, inputForeground, butt import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; -import { webFrame } from 'vs/base/electron-sandbox/globals'; +import { webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { assign } from 'vs/base/common/objects'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; diff --git a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts index c37e60ffef5..bf829f2aaed 100644 --- a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts @@ -21,7 +21,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { DialogChannel } from 'vs/platform/dialogs/electron-browser/dialogIpc'; import { DownloadServiceChannel } from 'vs/platform/download/common/downloadIpc'; import { LoggerChannel } from 'vs/platform/log/common/logIpc'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { IDiagnosticInfoOptions, IRemoteDiagnosticInfo } from 'vs/platform/diagnostics/common/diagnostics'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { PersistentConnectionEventType } from 'vs/platform/remote/common/remoteAgentConnection'; diff --git a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts index c14f795203f..b4c945f4714 100644 --- a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts +++ b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { join } from 'vs/base/common/path'; import { onDidChangeFullscreen, isFullscreen } from 'vs/base/browser/browser'; import { getTotalHeight, getTotalWidth } from 'vs/base/browser/dom'; diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts index 05c57aec60d..43d9e84ec57 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; import { ITerminalNativeService, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index a87e83ec7ef..551c17ec45f 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { FindInPageOptions, OnBeforeRequestListenerDetails, OnHeadersReceivedListenerDetails, Response, WebContents, WebviewTag } from 'electron'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { addDisposableListener } from 'vs/base/browser/dom'; import { ThrottledDelayer } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index 4e9ebf5bad2..25a63486980 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -10,7 +10,7 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; import * as browser from 'vs/base/browser/browser'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { webFrame } from 'vs/base/electron-sandbox/globals'; +import { webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { FileKind } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 18eeb4df089..1f7cb1740aa 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as gracefulFs from 'graceful-fs'; -import { webFrame } from 'vs/base/electron-sandbox/globals'; +import { webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { importEntries, mark } from 'vs/base/common/performance'; import { Workbench } from 'vs/workbench/browser/workbench'; import { NativeWindow } from 'vs/workbench/electron-browser/window'; diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 614f80144c7..7e239cf322c 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -22,8 +22,8 @@ import * as browser from 'vs/base/browser/browser'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/nativeKeymapService'; -import { crashReporter, CrashReporterStartOptions } from 'electron'; -import { ipcRenderer, webFrame } from 'vs/base/electron-sandbox/globals'; +import { CrashReporterStartOptions } from 'vs/base/parts/sandbox/common/electronTypes'; +import { crashReporter, ipcRenderer, webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { IMenuService, MenuId, IMenu, MenuItemAction, ICommandAction, SubmenuItemAction, MenuRegistry } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts index 2290ea667c7..7fbdad95cfd 100644 --- a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts @@ -9,7 +9,7 @@ import * as dom from 'vs/base/browser/dom'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { webFrame } from 'vs/base/electron-sandbox/globals'; +import { webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { unmnemonicLabel } from 'vs/base/common/labels'; import { Event, Emitter } from 'vs/base/common/event'; import { INotificationService } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts index 969a1e5a5dc..7066ae27f0b 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts @@ -22,7 +22,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IProductService } from 'vs/platform/product/common/productService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IElectronService } from 'vs/platform/electron/node/electron'; -import { MessageBoxOptions } from 'electron'; +import { MessageBoxOptions } from 'vs/base/parts/sandbox/common/electronTypes'; import { fromNow } from 'vs/base/common/date'; interface IMassagedMessageBoxOptions { diff --git a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts index 6457069b1e5..af1dae45238 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SaveDialogOptions, OpenDialogOptions } from 'electron'; +import { SaveDialogOptions, OpenDialogOptions } from 'vs/base/parts/sandbox/common/electronTypes'; import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IPickAndOpenOptions, ISaveDialogOptions, IOpenDialogOptions, IFileDialogService, IDialogService } from 'vs/platform/dialogs/common/dialogs'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index ee57b70741b..8cd42adc232 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { ChildProcess, fork } from 'child_process'; import { Server, Socket, createServer } from 'net'; -import { CrashReporterStartOptions } from 'electron'; +import { CrashReporterStartOptions } from 'vs/base/parts/sandbox/common/electronTypes'; import { getPathFromAmdModule } from 'vs/base/common/amd'; import { timeout } from 'vs/base/common/async'; import { toErrorMessage } from 'vs/base/common/errorMessage'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 531e6554428..161c29fa375 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ExtensionHostProcessWorker } from 'vs/workbench/services/extensions/electron-browser/extensionHost'; import { CachedExtensionScanner } from 'vs/workbench/services/extensions/electron-browser/cachedExtensionScanner'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts index 4377032a257..b675425335d 100644 --- a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ShutdownReason, StartupKind, handleVetos, ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IStorageService, StorageScope, WillSaveStateReason } from 'vs/platform/storage/common/storage'; -import { ipcRenderer } from 'vs/base/electron-sandbox/globals'; +import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { onUnexpectedError } from 'vs/base/common/errors'; From 233e723d594ddba71cc86d9d105e78ddc7d9e658 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 09:51:02 +0200 Subject: [PATCH 024/107] sandbox - make moveToTrash an electron service thing --- .../sharedProcess/sharedProcessMain.ts | 2 +- .../electron-main/electronMainService.ts | 4 ++++ src/vs/platform/electron/node/electron.ts | 1 + .../electron-browser/diskFileSystemProvider.ts | 17 +++++++++++++---- .../electron-browser/diskFileService.test.ts | 2 +- .../workbench/electron-browser/desktop.main.ts | 9 ++++++++- .../electron-browser/electronService.ts | 7 ++----- .../fileUserDataProvider.test.ts | 2 +- .../electron-browser/workbenchTestServices.ts | 1 + src/vs/workbench/workbench.desktop.main.ts | 1 - 10 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index bbaf7ea6a20..710d1f834f3 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -46,7 +46,7 @@ import { DiagnosticsService, IDiagnosticsService } from 'vs/platform/diagnostics import { DiagnosticsChannel } from 'vs/platform/diagnostics/node/diagnosticsIpc'; import { FileService } from 'vs/platform/files/common/fileService'; import { IFileService } from 'vs/platform/files/common/files'; -import { DiskFileSystemProvider } from 'vs/platform/files/electron-browser/diskFileSystemProvider'; +import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; import { Schemas } from 'vs/base/common/network'; import { IProductService } from 'vs/platform/product/common/productService'; import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, IUserDataSyncLogService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSync'; diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index c21fb966278..972548b11c9 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -293,6 +293,10 @@ export class ElectronMainService implements IElectronMainService { } } + async moveItemToTrash(windowId: number | undefined, fullPath: string, deleteOnFail?: boolean): Promise { + return shell.moveItemToTrash(fullPath, deleteOnFail); + } + //#endregion //#region macOS Touchbar diff --git a/src/vs/platform/electron/node/electron.ts b/src/vs/platform/electron/node/electron.ts index cea336852c1..b227cb811f3 100644 --- a/src/vs/platform/electron/node/electron.ts +++ b/src/vs/platform/electron/node/electron.ts @@ -61,6 +61,7 @@ export interface IElectronService { setDocumentEdited(edited: boolean): Promise; openExternal(url: string): Promise; updateTouchBar(items: ISerializableCommandAction[][]): Promise; + moveItemToTrash(fullPath: string, deleteOnFail?: boolean): Promise; // macOS Touchbar newWindowTab(): Promise; diff --git a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts index 2c23af873f1..2122e05aa0d 100644 --- a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts +++ b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts @@ -3,15 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { shell } from 'electron'; -import { DiskFileSystemProvider as NodeDiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; +import { DiskFileSystemProvider as NodeDiskFileSystemProvider, IDiskFileSystemProviderOptions } from 'vs/platform/files/node/diskFileSystemProvider'; import { FileDeleteOptions, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { isWindows } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { basename } from 'vs/base/common/path'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IElectronService } from 'vs/platform/electron/node/electron'; export class DiskFileSystemProvider extends NodeDiskFileSystemProvider { + constructor( + logService: ILogService, + private electronService: IElectronService, + options?: IDiskFileSystemProviderOptions + ) { + super(logService, options); + } + get capabilities(): FileSystemProviderCapabilities { if (!this._capabilities) { this._capabilities = super.capabilities | FileSystemProviderCapabilities.Trash; @@ -25,9 +34,9 @@ export class DiskFileSystemProvider extends NodeDiskFileSystemProvider { return super.doDelete(filePath, opts); } - const result = shell.moveItemToTrash(filePath); + const result = await this.electronService.moveItemToTrash(filePath); if (!result) { throw new Error(isWindows ? localize('binFailed', "Failed to move '{0}' to the recycle bin", basename(filePath)) : localize('trashFailed', "Failed to move '{0}' to the trash", basename(filePath))); } } -} \ No newline at end of file +} diff --git a/src/vs/platform/files/test/electron-browser/diskFileService.test.ts b/src/vs/platform/files/test/electron-browser/diskFileService.test.ts index 803ff185ab9..33579429f5e 100644 --- a/src/vs/platform/files/test/electron-browser/diskFileService.test.ts +++ b/src/vs/platform/files/test/electron-browser/diskFileService.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { tmpdir } from 'os'; import { FileService } from 'vs/platform/files/common/fileService'; import { Schemas } from 'vs/base/common/network'; -import { DiskFileSystemProvider } from 'vs/platform/files/electron-browser/diskFileSystemProvider'; +import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { generateUuid } from 'vs/base/common/uuid'; import { join, basename, dirname, posix } from 'vs/base/common/path'; diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 1f7cb1740aa..d977b9f89d1 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -50,6 +50,8 @@ import product from 'vs/platform/product/common/product'; import { NativeResourceIdentityService } from 'vs/platform/resource/node/resourceIdentityServiceImpl'; import { IResourceIdentityService } from 'vs/platform/resource/common/resourceIdentityService'; import { DesktopLogService } from 'vs/workbench/services/log/electron-browser/logService'; +import { ElectronService } from 'vs/workbench/services/electron/electron-browser/electronService'; +import { IElectronService } from 'vs/platform/electron/node/electron'; class DesktopMain extends Disposable { @@ -192,14 +194,19 @@ class DesktopMain extends Disposable { const signService = new SignService(); serviceCollection.set(ISignService, signService); + // Remote Agent const remoteAgentService = this._register(new RemoteAgentService(this.environmentService, remoteAuthorityResolverService, signService, logService)); serviceCollection.set(IRemoteAgentService, remoteAgentService); + // Electron + const electronService = new ElectronService(mainProcessService) as IElectronService; + serviceCollection.set(IElectronService, electronService); + // Files const fileService = this._register(new FileService(logService)); serviceCollection.set(IFileService, fileService); - const diskFileSystemProvider = this._register(new DiskFileSystemProvider(logService)); + const diskFileSystemProvider = this._register(new DiskFileSystemProvider(logService, electronService)); fileService.registerProvider(Schemas.file, diskFileSystemProvider); // User Data Provider diff --git a/src/vs/workbench/services/electron/electron-browser/electronService.ts b/src/vs/workbench/services/electron/electron-browser/electronService.ts index 9eef2befcba..a74fd62a8d3 100644 --- a/src/vs/workbench/services/electron/electron-browser/electronService.ts +++ b/src/vs/workbench/services/electron/electron-browser/electronService.ts @@ -6,19 +6,16 @@ import { IElectronService } from 'vs/platform/electron/node/electron'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class ElectronService { _serviceBrand: undefined; constructor( - @IMainProcessService mainProcessService: IMainProcessService, - @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService + @IMainProcessService mainProcessService: IMainProcessService ) { - return createChannelSender(mainProcessService.getChannel('electron'), { context: environmentService.configuration.windowId }); + return createChannelSender(mainProcessService.getChannel('electron'), { context: mainProcessService.windowId }); } } diff --git a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts index f511d55fe1f..7f01f78c3eb 100644 --- a/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts +++ b/src/vs/workbench/services/userData/test/electron-browser/fileUserDataProvider.test.ts @@ -16,7 +16,7 @@ import { URI } from 'vs/base/common/uri'; import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { joinPath, dirname } from 'vs/base/common/resources'; import { VSBuffer } from 'vs/base/common/buffer'; -import { DiskFileSystemProvider } from 'vs/platform/files/electron-browser/diskFileSystemProvider'; +import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; import { BACKUPS } from 'vs/platform/environment/common/environment'; import { DisposableStore, IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 0387e29d43b..6f0142b238f 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -200,6 +200,7 @@ export class TestElectronService implements IElectronService { async setDocumentEdited(edited: boolean): Promise { } async openExternal(url: string): Promise { return false; } async updateTouchBar(): Promise { } + async moveItemToTrash(): Promise { return false; } async newWindowTab(): Promise { } async showPreviousWindowTab(): Promise { } async showNextWindowTab(): Promise { } diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index b2d21f9c51b..63e1b4dbb53 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -59,7 +59,6 @@ import 'vs/workbench/services/host/electron-browser/desktopHostService'; import 'vs/workbench/services/request/electron-browser/requestService'; import 'vs/workbench/services/lifecycle/electron-browser/lifecycleService'; import 'vs/workbench/services/sharedProcess/electron-browser/sharedProcessService'; -import 'vs/workbench/services/electron/electron-browser/electronService'; import 'vs/workbench/services/localizations/electron-browser/localizationsService'; import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; import 'vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService'; From 03ad770fadade04843b4ab28759b56aff9afc868 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 09:55:57 +0200 Subject: [PATCH 025/107] sandbox - no more direct Electron IPC need --- .../electron-browser/ipc.electron-browser.ts | 32 ------------------- .../electron-browser/mainProcessService.ts | 32 ------------------- 2 files changed, 64 deletions(-) delete mode 100644 src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts delete mode 100644 src/vs/platform/ipc/electron-browser/mainProcessService.ts diff --git a/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts b/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts deleted file mode 100644 index c5343bf61ec..00000000000 --- a/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts +++ /dev/null @@ -1,32 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Event } from 'vs/base/common/event'; -import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; -import { Protocol } from 'vs/base/parts/ipc/common/ipc.electron'; -import { ipcRenderer } from 'electron'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { VSBuffer } from 'vs/base/common/buffer'; - -export class Client extends IPCClient implements IDisposable { - - private protocol: Protocol; - - private static createProtocol(): Protocol { - const onMessage = Event.fromNodeEventEmitter(ipcRenderer, 'vscode:message', (_, message: Buffer) => VSBuffer.wrap(message)); - ipcRenderer.send('vscode:hello'); - return new Protocol(ipcRenderer, onMessage); - } - - constructor(id: string) { - const protocol = Client.createProtocol(); - super(protocol, id); - this.protocol = protocol; - } - - dispose(): void { - this.protocol.dispose(); - } -} diff --git a/src/vs/platform/ipc/electron-browser/mainProcessService.ts b/src/vs/platform/ipc/electron-browser/mainProcessService.ts deleted file mode 100644 index e31f8be7c7f..00000000000 --- a/src/vs/platform/ipc/electron-browser/mainProcessService.ts +++ /dev/null @@ -1,32 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -import { Client } from 'vs/base/parts/ipc/electron-browser/ipc.electron-browser'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; - -export class MainProcessService extends Disposable implements IMainProcessService { - - _serviceBrand: undefined; - - private mainProcessConnection: Client; - - constructor( - public readonly windowId: number - ) { - super(); - - this.mainProcessConnection = this._register(new Client(`window:${windowId}`)); - } - - getChannel(channelName: string): IChannel { - return this.mainProcessConnection.getChannel(channelName); - } - - registerChannel(channelName: string, channel: IServerChannel): void { - this.mainProcessConnection.registerChannel(channelName, channel); - } -} From 7139ecdb6bb23d1470fe99fd46432ad7fef6e201 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 09:57:14 +0200 Subject: [PATCH 026/107] sandbox - do not double register electron service --- .../services/electron/electron-browser/electronService.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/workbench/services/electron/electron-browser/electronService.ts b/src/vs/workbench/services/electron/electron-browser/electronService.ts index a74fd62a8d3..8abb2f8b17e 100644 --- a/src/vs/workbench/services/electron/electron-browser/electronService.ts +++ b/src/vs/workbench/services/electron/electron-browser/electronService.ts @@ -5,7 +5,6 @@ import { IElectronService } from 'vs/platform/electron/node/electron'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; export class ElectronService { @@ -18,5 +17,3 @@ export class ElectronService { return createChannelSender(mainProcessService.getChannel('electron'), { context: mainProcessService.windowId }); } } - -registerSingleton(IElectronService, ElectronService, true); From bd62ffe1f4d5b17c5b69fd48f2af87a407ad4cca Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 10:13:03 +0200 Subject: [PATCH 027/107] sandbox - move electron service into common/sandbox --- .../sharedProcess/sharedProcessMain.ts | 2 +- src/vs/code/node/activeWindowTracker.ts | 2 +- src/vs/platform/dialogs/common/dialogs.ts | 9 +++++++++ .../platform/dialogs/electron-main/dialogs.ts | 2 +- src/vs/platform/dialogs/node/dialogs.ts | 15 --------------- .../platform/driver/electron-browser/driver.ts | 2 +- .../electron/{node => common}/electron.ts | 5 ++--- .../electron-main/electronMainService.ts | 8 ++++---- .../electron-browser/diskFileSystemProvider.ts | 2 +- .../userDataAutoSyncService.ts | 2 +- src/vs/platform/windows/common/windows.ts | 17 +++++++++++++++++ src/vs/platform/windows/node/window.ts | 18 +----------------- .../workspacesMainService.test.ts | 2 +- src/vs/workbench/api/node/extHostCLIServer.ts | 3 +-- .../backup/electron-browser/backupTracker.ts | 2 +- .../electron-browser/backupTracker.test.ts | 2 +- .../extensionProfileService.ts | 2 +- .../electron-browser/extensionsActions.ts | 2 +- .../runtimeExtensionsEditor.ts | 2 +- .../fileActions.contribution.ts | 2 +- .../files/electron-browser/fileCommands.ts | 2 +- .../files/electron-browser/textFileEditor.ts | 2 +- .../logs/electron-browser/logsActions.ts | 2 +- .../electron-browser/startupProfiler.ts | 2 +- .../electron-browser/startupTimings.ts | 2 +- .../userDataSync.contribution.ts | 2 +- .../electron-browser/telemetryOptOut.ts | 2 +- .../actions/developerActions.ts | 2 +- .../electron-browser/actions/windowActions.ts | 2 +- .../electron-browser/desktop.contribution.ts | 2 +- .../workbench/electron-browser/desktop.main.ts | 4 ++-- .../parts/titlebar/titlebarPart.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 2 +- .../dialogs/electron-browser/dialogService.ts | 2 +- .../electron-browser/fileDialogService.ts | 5 ++--- .../electronService.ts | 2 +- .../electron-browser/extensionHost.ts | 2 +- .../electron-browser/extensionService.ts | 2 +- .../electron-browser/desktopHostService.ts | 2 +- .../request/electron-browser/requestService.ts | 2 +- .../timer/electron-browser/timerService.ts | 2 +- .../url/electron-browser/urlService.ts | 2 +- .../workspaceEditingService.ts | 2 +- .../electron-browser/workbenchTestServices.ts | 9 ++++----- 44 files changed, 76 insertions(+), 85 deletions(-) delete mode 100644 src/vs/platform/dialogs/node/dialogs.ts rename src/vs/platform/electron/{node => common}/electron.ts (92%) rename src/vs/workbench/services/electron/{electron-browser => electron-sandbox}/electronService.ts (91%) diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 710d1f834f3..7cd6ff02b6c 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -53,7 +53,7 @@ import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; import { UserDataSyncChannel, UserDataSyncUtilServiceClient, UserDataAutoSyncChannel, StorageKeysSyncRegistryChannelClient, UserDataSyncMachinesServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { LoggerService } from 'vs/platform/log/node/loggerService'; import { UserDataSyncLogService } from 'vs/platform/userDataSync/common/userDataSyncLog'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; diff --git a/src/vs/code/node/activeWindowTracker.ts b/src/vs/code/node/activeWindowTracker.ts index a7dbeb98bf2..ed201b0981c 100644 --- a/src/vs/code/node/activeWindowTracker.ts +++ b/src/vs/code/node/activeWindowTracker.ts @@ -6,7 +6,7 @@ import { Event } from 'vs/base/common/event'; import { DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; export class ActiveWindowManager extends Disposable { diff --git a/src/vs/platform/dialogs/common/dialogs.ts b/src/vs/platform/dialogs/common/dialogs.ts index ece49da3e7c..50ef02af982 100644 --- a/src/vs/platform/dialogs/common/dialogs.ts +++ b/src/vs/platform/dialogs/common/dialogs.ts @@ -272,3 +272,12 @@ export function getFileNamesMessage(fileNamesOrResources: readonly (string | URI message.push(''); return message.join('\n'); } + +export interface INativeOpenDialogOptions { + forceNewWindow?: boolean; + + defaultPath?: string; + + telemetryEventName?: string; + telemetryExtraData?: ITelemetryData; +} diff --git a/src/vs/platform/dialogs/electron-main/dialogs.ts b/src/vs/platform/dialogs/electron-main/dialogs.ts index c694c003e9b..8f1b34aead4 100644 --- a/src/vs/platform/dialogs/electron-main/dialogs.ts +++ b/src/vs/platform/dialogs/electron-main/dialogs.ts @@ -11,7 +11,7 @@ import { isMacintosh } from 'vs/base/common/platform'; import { dirname } from 'vs/base/common/path'; import { normalizeNFC } from 'vs/base/common/normalization'; import { exists } from 'vs/base/node/pfs'; -import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; +import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { withNullAsUndefined } from 'vs/base/common/types'; import { localize } from 'vs/nls'; import { WORKSPACE_FILTER } from 'vs/platform/workspaces/common/workspaces'; diff --git a/src/vs/platform/dialogs/node/dialogs.ts b/src/vs/platform/dialogs/node/dialogs.ts deleted file mode 100644 index 754693da712..00000000000 --- a/src/vs/platform/dialogs/node/dialogs.ts +++ /dev/null @@ -1,15 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; - -export interface INativeOpenDialogOptions { - forceNewWindow?: boolean; - - defaultPath?: string; - - telemetryEventName?: string; - telemetryExtraData?: ITelemetryData; -} diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index abb7104baa5..ec6548552a4 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -10,7 +10,7 @@ import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { remote } from 'electron'; import { timeout } from 'vs/base/common/async'; import { BaseWindowDriver } from 'vs/platform/driver/browser/baseDriver'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; class WindowDriver extends BaseWindowDriver { diff --git a/src/vs/platform/electron/node/electron.ts b/src/vs/platform/electron/common/electron.ts similarity index 92% rename from src/vs/platform/electron/node/electron.ts rename to src/vs/platform/electron/common/electron.ts index b227cb811f3..c80cf992081 100644 --- a/src/vs/platform/electron/node/electron.ts +++ b/src/vs/platform/electron/common/electron.ts @@ -6,10 +6,9 @@ import { Event } from 'vs/base/common/event'; import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, SaveDialogOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogReturnValue, CrashReporterStartOptions } from 'vs/base/parts/sandbox/common/electronTypes'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; -import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; +import { IOpenedWindow, IWindowOpenable, IOpenEmptyWindowOptions, INativeOpenWindowOptions } from 'vs/platform/windows/common/windows'; +import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; -import { INativeOpenWindowOptions, IOpenedWindow } from 'vs/platform/windows/node/window'; export const IElectronService = createDecorator('electronService'); diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index 972548b11c9..d95d1c3f39d 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -6,12 +6,12 @@ import { Event } from 'vs/base/common/event'; import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu, BrowserWindow, app } from 'electron'; -import { INativeOpenWindowOptions, IOpenedWindow, OpenContext } from 'vs/platform/windows/node/window'; +import { OpenContext } from 'vs/platform/windows/node/window'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; -import { IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; -import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; +import { IOpenedWindow, INativeOpenWindowOptions, IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; +import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { isMacintosh } from 'vs/base/common/platform'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { AddFirstParameterToFunctions } from 'vs/base/common/types'; diff --git a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts index 2122e05aa0d..2dfe765a4bf 100644 --- a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts +++ b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts @@ -9,7 +9,7 @@ import { isWindows } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { basename } from 'vs/base/common/path'; import { ILogService } from 'vs/platform/log/common/log'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; export class DiskFileSystemProvider extends NodeDiskFileSystemProvider { diff --git a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts index 6fa694e1d27..3263565e376 100644 --- a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts @@ -5,7 +5,7 @@ import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { UserDataAutoSyncService as BaseUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index c8b432f5416..2b688cac842 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -8,6 +8,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { URI, UriComponents } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ThemeType } from 'vs/platform/theme/common/themeService'; +import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; export interface IBaseOpenWindowsOptions { forceReuseWindow?: boolean; @@ -20,6 +21,22 @@ export interface IOpenWindowOptions extends IBaseOpenWindowsOptions { noRecentEntry?: boolean; } +export interface INativeOpenWindowOptions extends IOpenWindowOptions { + diffMode?: boolean; + addMode?: boolean; + gotoLineMode?: boolean; + waitMarkerFileURI?: URI; +} + +export interface IOpenedWindow { + id: number; + workspace?: IWorkspaceIdentifier; + folderUri?: ISingleFolderWorkspaceIdentifier; + title: string; + filename?: string; + dirty: boolean; +} + export interface IOpenEmptyWindowOptions extends IBaseOpenWindowsOptions { remoteAuthority?: string; } diff --git a/src/vs/platform/windows/node/window.ts b/src/vs/platform/windows/node/window.ts index cf737ec23b4..13d68b48a84 100644 --- a/src/vs/platform/windows/node/window.ts +++ b/src/vs/platform/windows/node/window.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IOpenWindowOptions, IWindowConfiguration, IPath, IOpenFileRequest, IPathData } from 'vs/platform/windows/common/windows'; +import { IWindowConfiguration, IPath, IOpenFileRequest, IPathData } from 'vs/platform/windows/common/windows'; import { URI, UriComponents } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; import * as extpath from 'vs/base/common/extpath'; @@ -13,15 +13,6 @@ import { LogLevel } from 'vs/platform/log/common/log'; import { ExportData } from 'vs/base/common/performance'; import { ParsedArgs } from 'vs/platform/environment/node/argv'; -export interface IOpenedWindow { - id: number; - workspace?: IWorkspaceIdentifier; - folderUri?: ISingleFolderWorkspaceIdentifier; - title: string; - filename?: string; - dirty: boolean; -} - export const enum OpenContext { // opening when running from the command line @@ -100,13 +91,6 @@ export interface IPathsToWaitForData { waitMarkerFileUri: UriComponents; } -export interface INativeOpenWindowOptions extends IOpenWindowOptions { - diffMode?: boolean; - addMode?: boolean; - gotoLineMode?: boolean; - waitMarkerFileURI?: URI; -} - export interface IWindowContext { openedWorkspace?: IWorkspaceIdentifier; openedFolderUri?: URI; diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index 2356a099f18..96f8c6c93ad 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -19,7 +19,7 @@ import { isWindows } from 'vs/base/common/platform'; import { normalizeDriveLetter } from 'vs/base/common/labels'; import { dirname, joinPath } from 'vs/base/common/resources'; import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogs'; -import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; +import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { IBackupMainService, IWorkspaceBackupInfo } from 'vs/platform/backup/electron-main/backup'; import { IEmptyWindowBackupInfo } from 'vs/platform/backup/node/backup'; diff --git a/src/vs/workbench/api/node/extHostCLIServer.ts b/src/vs/workbench/api/node/extHostCLIServer.ts index ad28cc495c0..2a1941271c2 100644 --- a/src/vs/workbench/api/node/extHostCLIServer.ts +++ b/src/vs/workbench/api/node/extHostCLIServer.ts @@ -7,10 +7,9 @@ import { generateRandomPipeName } from 'vs/base/parts/ipc/node/ipc.net'; import * as http from 'http'; import * as fs from 'fs'; import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { IWindowOpenable } from 'vs/platform/windows/common/windows'; +import { IWindowOpenable, INativeOpenWindowOptions } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; import { hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; -import { INativeOpenWindowOptions } from 'vs/platform/windows/node/window'; import { ILogService } from 'vs/platform/log/common/log'; export interface OpenCommandPipeArgs { diff --git a/src/vs/workbench/contrib/backup/electron-browser/backupTracker.ts b/src/vs/workbench/contrib/backup/electron-browser/backupTracker.ts index 3048c945dc6..5e28807f032 100644 --- a/src/vs/workbench/contrib/backup/electron-browser/backupTracker.ts +++ b/src/vs/workbench/contrib/backup/electron-browser/backupTracker.ts @@ -14,7 +14,7 @@ import Severity from 'vs/base/common/severity'; import { WorkbenchState, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isMacintosh } from 'vs/base/common/platform'; import { HotExitConfiguration } from 'vs/platform/files/common/files'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { BackupTracker } from 'vs/workbench/contrib/backup/common/backupTracker'; import { ILogService } from 'vs/platform/log/common/log'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts index ea8c85ea656..76aadb7cdb8 100644 --- a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts +++ b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts @@ -34,7 +34,7 @@ import { HotExitConfiguration } from 'vs/platform/files/common/files'; import { ShutdownReason, ILifecycleService, BeforeShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { IFileDialogService, ConfirmResult, IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IWorkspaceContextService, Workspace } from 'vs/platform/workspace/common/workspace'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { BackupTracker } from 'vs/workbench/contrib/backup/common/backupTracker'; import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts index 7f988b5c93c..afa3bb703d1 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts @@ -12,7 +12,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor, IStatusbarEntry } from 'vs/workbench/services/statusbar/common/statusbar'; import { IExtensionHostProfileService, ProfileSessionState } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { randomPort } from 'vs/base/node/ports'; import product from 'vs/platform/product/common/product'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts index 94a29c5e229..4fc5cfdbcac 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts @@ -9,7 +9,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { Schemas } from 'vs/base/common/network'; export class OpenExtensionsFolderAction extends Action { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts index cc851c4bc4d..955f58e1199 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -24,7 +24,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { writeFile } from 'vs/base/node/pfs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { memoize } from 'vs/base/common/decorators'; diff --git a/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts index 52b1cf0897f..2162c0f6106 100644 --- a/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts @@ -9,7 +9,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { isWindows, isMacintosh } from 'vs/base/common/platform'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; diff --git a/src/vs/workbench/contrib/files/electron-browser/fileCommands.ts b/src/vs/workbench/contrib/files/electron-browser/fileCommands.ts index 274ee632713..ce96a316480 100644 --- a/src/vs/workbench/contrib/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/electron-browser/fileCommands.ts @@ -9,7 +9,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { sequence } from 'vs/base/common/async'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; // Commands diff --git a/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts b/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts index 4ea06a47056..cb243c53fce 100644 --- a/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts @@ -23,7 +23,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; /** diff --git a/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts b/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts index 97c16d4d4af..e4c3287f13f 100644 --- a/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts +++ b/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts @@ -7,7 +7,7 @@ import { Action } from 'vs/base/common/actions'; import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import * as nls from 'vs/nls'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts index 22caa9f65cf..a0a46cd288a 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts @@ -18,7 +18,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { URI } from 'vs/base/common/uri'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IProductService } from 'vs/platform/product/common/productService'; export class StartupProfiler implements IWorkbenchContribution { diff --git a/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts index 56f1145ba71..d9e7fed075f 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts @@ -14,7 +14,7 @@ import { ILifecycleService, StartupKind, StartupKindToString } from 'vs/platform import product from 'vs/platform/product/common/product'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUpdateService } from 'vs/platform/update/common/update'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import * as files from 'vs/workbench/contrib/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts index 3fc43388f2b..3ce0e565733 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts @@ -14,7 +14,7 @@ import { localize } from 'vs/nls'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { Action } from 'vs/base/common/actions'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; diff --git a/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts index d561cf83320..9d3660332b0 100644 --- a/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts +++ b/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts @@ -13,7 +13,7 @@ import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common import { IProductService } from 'vs/platform/product/common/productService'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { AbstractTelemetryOptOut } from 'vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; export class NativeTelemetryOptOut extends AbstractTelemetryOptOut { diff --git a/src/vs/workbench/electron-browser/actions/developerActions.ts b/src/vs/workbench/electron-browser/actions/developerActions.ts index e4c1160ca47..313b5154653 100644 --- a/src/vs/workbench/electron-browser/actions/developerActions.ts +++ b/src/vs/workbench/electron-browser/actions/developerActions.ts @@ -5,7 +5,7 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index 25a63486980..bbff3bb92e9 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -19,7 +19,7 @@ import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { ICommandHandler } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { Codicon } from 'vs/base/common/codicons'; diff --git a/src/vs/workbench/electron-browser/desktop.contribution.ts b/src/vs/workbench/electron-browser/desktop.contribution.ts index 7739d40e638..c61e44d6a22 100644 --- a/src/vs/workbench/electron-browser/desktop.contribution.ts +++ b/src/vs/workbench/electron-browser/desktop.contribution.ts @@ -19,7 +19,7 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IsDevelopmentContext, IsMacContext } from 'vs/platform/contextkey/common/contextkeys'; import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/editor'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import product from 'vs/platform/product/common/product'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index d977b9f89d1..cd46c8c8c2f 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -50,8 +50,8 @@ import product from 'vs/platform/product/common/product'; import { NativeResourceIdentityService } from 'vs/platform/resource/node/resourceIdentityServiceImpl'; import { IResourceIdentityService } from 'vs/platform/resource/common/resourceIdentityService'; import { DesktopLogService } from 'vs/workbench/services/log/electron-browser/logService'; -import { ElectronService } from 'vs/workbench/services/electron/electron-browser/electronService'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { ElectronService } from 'vs/workbench/services/electron/electron-sandbox/electronService'; +import { IElectronService } from 'vs/platform/electron/common/electron'; class DesktopMain extends Disposable { diff --git a/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart.ts index 66a5283bd04..6a95dee0fae 100644 --- a/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart.ts @@ -20,7 +20,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IProductService } from 'vs/platform/product/common/productService'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { getTitleBarStyle } from 'vs/platform/windows/common/windows'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Codicon } from 'vs/base/common/codicons'; diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 7e239cf322c..971d117d924 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -54,7 +54,7 @@ import { IMenubarService, IMenubarData, IMenubarMenu, IMenubarKeybinding, IMenub import { withNullAsUndefined, assertIsDefined } from 'vs/base/common/types'; import { IOpenerService, OpenOptions } from 'vs/platform/opener/common/opener'; import { Schemas } from 'vs/base/common/network'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { posix, dirname } from 'vs/base/common/path'; import { getBaseLabel } from 'vs/base/common/labels'; import { ITunnelService, extractLocalHostUriMetaDataForPortMapping } from 'vs/platform/remote/common/tunnel'; diff --git a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts index 7066ae27f0b..4e3c2854bf9 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts @@ -21,7 +21,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IProductService } from 'vs/platform/product/common/productService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { MessageBoxOptions } from 'vs/base/parts/sandbox/common/electronTypes'; import { fromNow } from 'vs/base/common/date'; diff --git a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts index af1dae45238..7c2da38e24b 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts @@ -4,9 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { SaveDialogOptions, OpenDialogOptions } from 'vs/base/parts/sandbox/common/electronTypes'; -import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IPickAndOpenOptions, ISaveDialogOptions, IOpenDialogOptions, IFileDialogService, IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IPickAndOpenOptions, ISaveDialogOptions, IOpenDialogOptions, IFileDialogService, IDialogService, INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -16,7 +15,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { AbstractFileDialogService } from 'vs/workbench/services/dialogs/browser/abstractFileDialogService'; import { Schemas } from 'vs/base/common/network'; import { IModeService } from 'vs/editor/common/services/modeService'; diff --git a/src/vs/workbench/services/electron/electron-browser/electronService.ts b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts similarity index 91% rename from src/vs/workbench/services/electron/electron-browser/electronService.ts rename to src/vs/workbench/services/electron/electron-sandbox/electronService.ts index 8abb2f8b17e..033d02dcdde 100644 --- a/src/vs/workbench/services/electron/electron-browser/electronService.ts +++ b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 8cd42adc232..bc5c5740ad8 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -28,7 +28,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import product from 'vs/platform/product/common/product'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol'; import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 161c29fa375..a14ab1a648e 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -34,7 +34,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { Logger } from 'vs/workbench/services/extensions/common/extensionPoints'; import { flatten } from 'vs/base/common/arrays'; import { IStaticExtensionsService } from 'vs/workbench/services/extensions/common/staticExtensions'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { IRemoteExplorerService } from 'vs/workbench/services/remote/common/remoteExplorerService'; import { Action } from 'vs/base/common/actions'; diff --git a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts index 45d69aa3d91..d883e646a1a 100644 --- a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts +++ b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; diff --git a/src/vs/workbench/services/request/electron-browser/requestService.ts b/src/vs/workbench/services/request/electron-browser/requestService.ts index ad433fbcd2a..457a39698f2 100644 --- a/src/vs/workbench/services/request/electron-browser/requestService.ts +++ b/src/vs/workbench/services/request/electron-browser/requestService.ts @@ -8,7 +8,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { RequestService } from 'vs/platform/request/browser/requestService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IRequestService } from 'vs/platform/request/common/request'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; export class NativeRequestService extends RequestService { diff --git a/src/vs/workbench/services/timer/electron-browser/timerService.ts b/src/vs/workbench/services/timer/electron-browser/timerService.ts index 47fd9783039..97649b59b58 100644 --- a/src/vs/workbench/services/timer/electron-browser/timerService.ts +++ b/src/vs/workbench/services/timer/electron-browser/timerService.ts @@ -7,7 +7,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { virtualMachineHint } from 'vs/base/node/id'; import * as perf from 'vs/base/common/performance'; import * as os from 'os'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/services/url/electron-browser/urlService.ts b/src/vs/workbench/services/url/electron-browser/urlService.ts index e293e2d79e1..bd4d601c7cd 100644 --- a/src/vs/workbench/services/url/electron-browser/urlService.ts +++ b/src/vs/workbench/services/url/electron-browser/urlService.ts @@ -12,7 +12,7 @@ import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/commo import product from 'vs/platform/product/common/product'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; diff --git a/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts index 144b9b16f8e..8ecb2863421 100644 --- a/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts @@ -27,7 +27,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { AbstractWorkspaceEditingService } from 'vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService'; -import { IElectronService } from 'vs/platform/electron/node/electron'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { isMacintosh } from 'vs/base/common/platform'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { BackupFileService } from 'vs/workbench/services/backup/common/backupFileService'; diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 6f0142b238f..67c69cb92c6 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -8,15 +8,14 @@ import { Event } from 'vs/base/common/event'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { NativeWorkbenchEnvironmentService, INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { NativeTextFileService, EncodingOracle, IEncodingOverride } from 'vs/workbench/services/textfile/electron-browser/nativeTextFileService'; -import { IElectronService } from 'vs/platform/electron/node/electron'; -import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs'; +import { IElectronService } from 'vs/platform/electron/common/electron'; import { FileOperationError, IFileService } from 'vs/platform/files/common/files'; import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { IDialogService, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IDialogService, IFileDialogService, INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; import { IProductService } from 'vs/platform/product/common/productService'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; @@ -25,7 +24,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { URI } from 'vs/base/common/uri'; import { IReadTextFileOptions, ITextFileStreamContent, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; -import { IOpenEmptyWindowOptions, IWindowOpenable, IOpenWindowOptions } from 'vs/platform/windows/common/windows'; +import { IOpenEmptyWindowOptions, IWindowOpenable, IOpenWindowOptions, IOpenedWindow } from 'vs/platform/windows/common/windows'; import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; import { LogLevel, ILogService } from 'vs/platform/log/common/log'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; @@ -37,7 +36,7 @@ import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { NodeTestBackupFileService } from 'vs/workbench/services/backup/test/electron-browser/backupFileService.test'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { INativeWindowConfiguration, IOpenedWindow } from 'vs/platform/windows/node/window'; +import { INativeWindowConfiguration } from 'vs/platform/windows/node/window'; import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; export const TestWindowConfiguration: INativeWindowConfiguration = { From de1c06c0615420cb6aba2b9f6fd918d604e42c77 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 10:20:43 +0200 Subject: [PATCH 028/107] sandbox - move url service --- src/vs/code/electron-main/app.ts | 4 ++-- src/vs/platform/url/common/urlService.ts | 14 +++++++++++++ src/vs/platform/url/node/urlService.ts | 21 ------------------- .../experimentService.test.ts | 4 ++-- .../extensionRecommendationsService.test.ts | 4 ++-- .../extensionsActions.test.ts | 4 ++-- .../electron-browser/extensionsViews.test.ts | 4 ++-- .../extensionsWorkbenchService.test.ts | 4 ++-- .../urlService.ts | 13 +++++------- src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 1 + 11 files changed, 32 insertions(+), 42 deletions(-) delete mode 100644 src/vs/platform/url/node/urlService.ts rename src/vs/workbench/services/url/{electron-browser => electron-sandbox}/urlService.ts (75%) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index affd5c5f2bc..a7eee01060d 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -64,7 +64,7 @@ import { GlobalStorageDatabaseChannel } from 'vs/platform/storage/node/storageIp import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainService'; import { IBackupMainService } from 'vs/platform/backup/electron-main/backup'; import { WorkspacesHistoryMainService, IWorkspacesHistoryMainService } from 'vs/platform/workspaces/electron-main/workspacesHistoryMainService'; -import { URLService } from 'vs/platform/url/node/urlService'; +import { NativeURLService } from 'vs/platform/url/common/urlService'; import { WorkspacesMainService, IWorkspacesMainService } from 'vs/platform/workspaces/electron-main/workspacesMainService'; import { statSync } from 'fs'; import { DiagnosticsService } from 'vs/platform/diagnostics/node/diagnosticsIpc'; @@ -484,7 +484,7 @@ export class CodeApplication extends Disposable { services.set(IBackupMainService, backupMainService); services.set(IWorkspacesHistoryMainService, new SyncDescriptor(WorkspacesHistoryMainService)); - services.set(IURLService, new SyncDescriptor(URLService)); + services.set(IURLService, new SyncDescriptor(NativeURLService)); services.set(IWorkspacesMainService, new SyncDescriptor(WorkspacesMainService)); // Telemetry diff --git a/src/vs/platform/url/common/urlService.ts b/src/vs/platform/url/common/urlService.ts index 030d52b587e..dbcac93deff 100644 --- a/src/vs/platform/url/common/urlService.ts +++ b/src/vs/platform/url/common/urlService.ts @@ -8,6 +8,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { values } from 'vs/base/common/map'; import { first } from 'vs/base/common/async'; import { toDisposable, IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import product from 'vs/platform/product/common/product'; export abstract class AbstractURLService extends Disposable implements IURLService { @@ -27,3 +28,16 @@ export abstract class AbstractURLService extends Disposable implements IURLServi return toDisposable(() => this.handlers.delete(handler)); } } + +export class NativeURLService extends AbstractURLService { + + create(options?: Partial): URI { + let { authority, path, query, fragment } = options ? options : { authority: undefined, path: undefined, query: undefined, fragment: undefined }; + + if (authority && path && path.indexOf('/') !== 0) { + path = `/${path}`; // URI validation requires a path if there is an authority + } + + return URI.from({ scheme: product.urlProtocol, authority, path, query, fragment }); + } +} diff --git a/src/vs/platform/url/node/urlService.ts b/src/vs/platform/url/node/urlService.ts deleted file mode 100644 index a0c9249dd7d..00000000000 --- a/src/vs/platform/url/node/urlService.ts +++ /dev/null @@ -1,21 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { URI, UriComponents } from 'vs/base/common/uri'; -import product from 'vs/platform/product/common/product'; -import { AbstractURLService } from 'vs/platform/url/common/urlService'; - -export class URLService extends AbstractURLService { - - create(options?: Partial): URI { - let { authority, path, query, fragment } = options ? options : { authority: undefined, path: undefined, query: undefined, fragment: undefined }; - - if (authority && path && path.indexOf('/') !== 0) { - path = `/${path}`; // URI validation requires a path if there is an authority - } - - return URI.from({ scheme: product.urlProtocol, authority, path, query, fragment }); - } -} diff --git a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts index 54d67cfe69c..a69f5495dc4 100644 --- a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts +++ b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts @@ -15,7 +15,7 @@ import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/exte import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; import { Emitter } from 'vs/base/common/event'; import { TestExtensionEnablementService } from 'vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test'; -import { URLService } from 'vs/platform/url/node/urlService'; +import { NativeURLService } from 'vs/platform/url/common/urlService'; import { IURLService } from 'vs/platform/url/common/url'; import { ITelemetryService, lastSessionDateStorageKey } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; @@ -89,7 +89,7 @@ suite('Experiment Service', () => { instantiationService.stub(IExtensionManagementService, 'onDidUninstallExtension', didUninstallEvent.event); instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService)); instantiationService.stub(ITelemetryService, NullTelemetryService); - instantiationService.stub(IURLService, URLService); + instantiationService.stub(IURLService, NativeURLService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); testConfigurationService = new TestConfigurationService(); instantiationService.stub(IConfigurationService, testConfigurationService); diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts index ef9b59e46c6..b20db7d9a94 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts @@ -41,7 +41,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService, Severity, IPromptChoice, IPromptOptions } from 'vs/platform/notification/common/notification'; -import { URLService } from 'vs/platform/url/node/urlService'; +import { NativeURLService } from 'vs/platform/url/common/urlService'; import { IExperimentService } from 'vs/workbench/contrib/experiments/common/experimentService'; import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -206,7 +206,7 @@ suite('ExtensionRecommendationsService Test', () => { instantiationService.stub(IExtensionManagementService, 'onDidUninstallExtension', didUninstallEvent.event); instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService)); instantiationService.stub(ITelemetryService, NullTelemetryService); - instantiationService.stub(IURLService, URLService); + instantiationService.stub(IURLService, NativeURLService); instantiationService.stub(IWorkspaceTagsService, new NoOpWorkspaceTagsService()); instantiationService.stub(IStorageService, new TestStorageService()); instantiationService.stub(ILogService, new NullLogService()); diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts index dfe557cec9d..7d55bdfcc36 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts @@ -30,7 +30,7 @@ import { TestContextService } from 'vs/workbench/test/common/workbenchTestServic import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; -import { URLService } from 'vs/platform/url/node/urlService'; +import { NativeURLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -105,7 +105,7 @@ async function setupTest() { instantiationService.stub(IExperimentService, instantiationService.createInstance(TestExperimentService)); instantiationService.stub(IExtensionTipsService, instantiationService.createInstance(ExtensionTipsService)); instantiationService.stub(IExtensionRecommendationsService, {}); - instantiationService.stub(IURLService, URLService); + instantiationService.stub(IURLService, NativeURLService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', []); instantiationService.stubPromise(IExtensionManagementService, 'getExtensionsReport', []); diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts index a9d3ab44f81..82fc05ca3f9 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts @@ -30,7 +30,7 @@ import { TestMenuService } from 'vs/workbench/test/browser/workbenchTestServices import { TestSharedProcessService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; -import { URLService } from 'vs/platform/url/node/urlService'; +import { NativeURLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { SinonStub } from 'sinon'; @@ -142,7 +142,7 @@ suite('ExtensionsListView Tests', () => { return reasons; } }); - instantiationService.stub(IURLService, URLService); + instantiationService.stub(IURLService, NativeURLService); }); setup(async () => { diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index 48af67b6e03..f7d70b79416 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -32,7 +32,7 @@ import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { ProgressService } from 'vs/workbench/services/progress/browser/progressService'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { URLService } from 'vs/platform/url/node/urlService'; +import { NativeURLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; @@ -72,7 +72,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { instantiationService.stub(IProductService, {}); instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService); - instantiationService.stub(IURLService, URLService); + instantiationService.stub(IURLService, NativeURLService); instantiationService.stub(ISharedProcessService, TestSharedProcessService); instantiationService.stub(IWorkspaceContextService, new TestContextService()); diff --git a/src/vs/workbench/services/url/electron-browser/urlService.ts b/src/vs/workbench/services/url/electron-sandbox/urlService.ts similarity index 75% rename from src/vs/workbench/services/url/electron-browser/urlService.ts rename to src/vs/workbench/services/url/electron-sandbox/urlService.ts index bd4d601c7cd..0d1363f509e 100644 --- a/src/vs/workbench/services/url/electron-browser/urlService.ts +++ b/src/vs/workbench/services/url/electron-sandbox/urlService.ts @@ -7,28 +7,25 @@ import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/commo import { URI, UriComponents } from 'vs/base/common/uri'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { URLHandlerChannel } from 'vs/platform/url/common/urlIpc'; -import { URLService } from 'vs/platform/url/node/urlService'; import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/common/opener'; import product from 'vs/platform/product/common/product'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { IElectronService } from 'vs/platform/electron/common/electron'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; +import { NativeURLService } from 'vs/platform/url/common/urlService'; export interface IRelayOpenURLOptions extends IOpenURLOptions { openToSide?: boolean; openExternal?: boolean; } -export class RelayURLService extends URLService implements IURLHandler, IOpener { +export class RelayURLService extends NativeURLService implements IURLHandler, IOpener { private urlService: IURLService; constructor( - @IMainProcessService mainProcessService: IMainProcessService, + @IMainProcessService private readonly mainProcessService: IMainProcessService, @IOpenerService openerService: IOpenerService, - @IWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, @IElectronService private electronService: IElectronService ) { super(); @@ -44,9 +41,9 @@ export class RelayURLService extends URLService implements IURLHandler, IOpener let query = uri.query; if (!query) { - query = `windowId=${encodeURIComponent(this.environmentService.configuration.windowId)}`; + query = `windowId=${encodeURIComponent(this.mainProcessService.windowId)}`; } else { - query += `&windowId=${encodeURIComponent(this.environmentService.configuration.windowId)}`; + query += `&windowId=${encodeURIComponent(this.mainProcessService.windowId)}`; } return uri.with({ query }); diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 63e1b4dbb53..4348c650491 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -49,7 +49,6 @@ import 'vs/workbench/services/extensionManagement/node/extensionManagementServic import 'vs/workbench/services/accessibility/electron-browser/accessibilityService'; import 'vs/workbench/services/remote/node/tunnelService'; import 'vs/workbench/services/backup/node/backupFileService'; -import 'vs/workbench/services/url/electron-browser/urlService'; import 'vs/workbench/services/workspaces/electron-browser/workspaceEditingService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 76979eb7dce..f9886185048 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -18,6 +18,7 @@ import 'vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegis import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; import 'vs/workbench/services/issue/electron-sandbox/issueService'; import 'vs/workbench/services/update/electron-sandbox/updateService'; +import 'vs/workbench/services/url/electron-sandbox/urlService'; //#endregion From 97a9b02ebcbbad5bf14f3dc1803e5ec174719d5b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 10:56:45 +0200 Subject: [PATCH 029/107] sandbox - add windowId to electron service --- src/vs/base/parts/ipc/common/ipc.ts | 11 +++++++++++ .../sharedProcess/sharedProcessMain.ts | 3 +-- src/vs/platform/electron/common/electron.ts | 3 +++ .../electron/electron-main/electronMainService.ts | 6 ++++++ src/vs/platform/ipc/common/mainProcessService.ts | 2 -- .../ipc/electron-sandbox/mainProcessService.ts | 2 +- .../electron-browser/partsSplash.contribution.ts | 4 +++- .../electron-browser/actions/windowActions.ts | 11 +++-------- src/vs/workbench/electron-browser/desktop.main.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 9 +++++---- .../electron/electron-sandbox/electronService.ts | 11 ++++++++++- .../host/electron-browser/desktopHostService.ts | 6 +++--- .../lifecycleService.ts | 7 +++---- .../electron-browser/outputChannelModelService.ts | 6 ++++-- .../electron-browser/sharedProcessService.ts | 4 +++- .../services/url/electron-sandbox/urlService.ts | 6 +++--- .../workspaces/electron-sandbox/workspacesService.ts | 6 ++++-- .../test/electron-browser/workbenchTestServices.ts | 2 ++ src/vs/workbench/workbench.desktop.main.ts | 1 - src/vs/workbench/workbench.sandbox.main.ts | 1 + 20 files changed, 67 insertions(+), 36 deletions(-) rename src/vs/workbench/services/lifecycle/{electron-browser => electron-sandbox}/lifecycleService.ts (93%) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index f909c554528..411bfe46cca 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -1002,6 +1002,12 @@ export interface IChannelSenderOptions extends IBaseChannelOptions { * to each method call to the target. */ context?: unknown; + + /** + * If provided, will not proxy any of the properties + * that are part of the Map but rather return that value. + */ + properties?: Map; } export function createChannelSender(channel: IChannel, options?: IChannelSenderOptions): T { @@ -1011,6 +1017,11 @@ export function createChannelSender(channel: IChannel, options?: IChannelSend get(_target: T, propKey: PropertyKey) { if (typeof propKey === 'string') { + // Check for predefined values + if (options?.properties?.has(propKey)) { + return options.properties.get(propKey); + } + // Event if (propertyIsEvent(propKey)) { return channel.listen(propKey); diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 7cd6ff02b6c..7820c103b27 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -91,7 +91,6 @@ const eventPrefix = 'monacoworkbench'; class MainProcessService implements IMainProcessService { constructor( - public readonly windowId: number, private server: Server, private mainRouter: StaticRouter ) { } @@ -126,7 +125,7 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat disposables.add(logService); logService.info('main', JSON.stringify(configuration)); - const mainProcessService = new MainProcessService(configuration.windowId, server, mainRouter); + const mainProcessService = new MainProcessService(server, mainRouter); services.set(IMainProcessService, mainProcessService); // Files diff --git a/src/vs/platform/electron/common/electron.ts b/src/vs/platform/electron/common/electron.ts index c80cf992081..f25e2bb1a1b 100644 --- a/src/vs/platform/electron/common/electron.ts +++ b/src/vs/platform/electron/common/electron.ts @@ -16,6 +16,9 @@ export interface IElectronService { _serviceBrand: undefined; + // Properties + readonly windowId: number; + // Events readonly onWindowOpen: Event; diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index d95d1c3f39d..e0078274351 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -41,6 +41,12 @@ export class ElectronMainService implements IElectronMainService { ) { } + //#region Properties + + get windowId(): never { throw new Error('Not implemented in electron-main'); } + + //#endregion + //#region Events readonly onWindowOpen: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); diff --git a/src/vs/platform/ipc/common/mainProcessService.ts b/src/vs/platform/ipc/common/mainProcessService.ts index 3992ed9150e..325eda580c4 100644 --- a/src/vs/platform/ipc/common/mainProcessService.ts +++ b/src/vs/platform/ipc/common/mainProcessService.ts @@ -12,8 +12,6 @@ export interface IMainProcessService { _serviceBrand: undefined; - readonly windowId: number; - getChannel(channelName: string): IChannel; registerChannel(channelName: string, channel: IServerChannel): void; diff --git a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts index d496c839494..e8ceeb88525 100644 --- a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts +++ b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts @@ -15,7 +15,7 @@ export class MainProcessService extends Disposable implements IMainProcessServic private mainProcessConnection: Client; constructor( - public readonly windowId: number + windowId: number ) { super(); diff --git a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts index b4c945f4714..0fb74c2e7cb 100644 --- a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts +++ b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts @@ -26,6 +26,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import * as perf from 'vs/base/common/performance'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { assertIsDefined } from 'vs/base/common/types'; +import { IElectronService } from 'vs/platform/electron/common/electron'; class PartsSplash { @@ -45,6 +46,7 @@ class PartsSplash { @ILifecycleService lifecycleService: ILifecycleService, @IEditorGroupsService editorGroupsService: IEditorGroupsService, @IConfigurationService configService: IConfigurationService, + @IElectronService private readonly _electronService: IElectronService ) { lifecycleService.when(LifecyclePhase.Restored).then(_ => { this._removePartsSplash(); @@ -112,7 +114,7 @@ class PartsSplash { // the color needs to be in hex const backgroundColor = this._themeService.getColorTheme().getColor(editorBackground) || themes.WORKBENCH_BACKGROUND(this._themeService.getColorTheme()); const payload = JSON.stringify({ baseTheme, background: Color.Format.CSS.formatHex(backgroundColor) }); - ipcRenderer.send('vscode:changeColorTheme', this._envService.configuration.windowId, payload); + ipcRenderer.send('vscode:changeColorTheme', this._electronService.windowId, payload); } } diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index bbff3bb92e9..08ad2588398 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -20,8 +20,6 @@ import { ICommandHandler } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IElectronService } from 'vs/platform/electron/common/electron'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { Codicon } from 'vs/base/common/codicons'; export class CloseCurrentWindowAction extends Action { @@ -169,7 +167,6 @@ export abstract class BaseSwitchWindow extends Action { constructor( id: string, label: string, - private readonly environmentService: INativeWorkbenchEnvironmentService, private readonly quickInputService: IQuickInputService, private readonly keybindingService: IKeybindingService, private readonly modelService: IModelService, @@ -182,7 +179,7 @@ export abstract class BaseSwitchWindow extends Action { protected abstract isQuickNavigate(): boolean; async run(): Promise { - const currentWindowId = this.environmentService.configuration.windowId; + const currentWindowId = this.electronService.windowId; const windows = await this.electronService.getWindows(); const placeHolder = nls.localize('switchWindowPlaceHolder', "Select a window to switch to"); @@ -225,14 +222,13 @@ export class SwitchWindow extends BaseSwitchWindow { constructor( id: string, label: string, - @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService, @IQuickInputService quickInputService: IQuickInputService, @IKeybindingService keybindingService: IKeybindingService, @IModelService modelService: IModelService, @IModeService modeService: IModeService, @IElectronService electronService: IElectronService ) { - super(id, label, environmentService, quickInputService, keybindingService, modelService, modeService, electronService); + super(id, label, quickInputService, keybindingService, modelService, modeService, electronService); } protected isQuickNavigate(): boolean { @@ -248,14 +244,13 @@ export class QuickSwitchWindow extends BaseSwitchWindow { constructor( id: string, label: string, - @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService, @IQuickInputService quickInputService: IQuickInputService, @IKeybindingService keybindingService: IKeybindingService, @IModelService modelService: IModelService, @IModeService modeService: IModeService, @IElectronService electronService: IElectronService ) { - super(id, label, environmentService, quickInputService, keybindingService, modelService, modeService, electronService); + super(id, label, quickInputService, keybindingService, modelService, modeService, electronService); } protected isQuickNavigate(): boolean { diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index cd46c8c8c2f..f4a86a58370 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -199,7 +199,7 @@ class DesktopMain extends Disposable { serviceCollection.set(IRemoteAgentService, remoteAgentService); // Electron - const electronService = new ElectronService(mainProcessService) as IElectronService; + const electronService = new ElectronService(this.configuration.windowId, mainProcessService) as IElectronService; serviceCollection.set(IElectronService, electronService); // Files diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 971d117d924..104dadf9cbe 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -285,8 +285,8 @@ export class NativeWindow extends Disposable { // Detect minimize / maximize this._register(Event.any( - Event.map(Event.filter(this.electronService.onWindowMaximize, id => id === this.environmentService.configuration.windowId), () => true), - Event.map(Event.filter(this.electronService.onWindowUnmaximize, id => id === this.environmentService.configuration.windowId), () => false) + Event.map(Event.filter(this.electronService.onWindowMaximize, id => id === this.electronService.windowId), () => true), + Event.map(Event.filter(this.electronService.onWindowUnmaximize, id => id === this.electronService.windowId), () => false) )(e => this.onDidChangeMaximized(e))); this.onDidChangeMaximized(this.environmentService.configuration.maximized ?? false); @@ -400,7 +400,7 @@ export class NativeWindow extends Disposable { this.setupOpenHandlers(); // Emit event when vscode is ready - this.lifecycleService.when(LifecyclePhase.Ready).then(() => ipcRenderer.send('vscode:workbenchReady', this.environmentService.configuration.windowId)); + this.lifecycleService.when(LifecyclePhase.Ready).then(() => ipcRenderer.send('vscode:workbenchReady', this.electronService.windowId)); // Integrity warning this.integrityService.isPure().then(res => this.titleService.updateProperties({ isPure: res.isPure })); @@ -727,6 +727,7 @@ class NativeMenubarControl extends MenubarControl { @IAccessibilityService accessibilityService: IAccessibilityService, @IMenubarService private readonly menubarService: IMenubarService, @IHostService hostService: IHostService, + @IElectronService private readonly electronService: IElectronService ) { super( menuService, @@ -775,7 +776,7 @@ class NativeMenubarControl extends MenubarControl { // Send menus to main process to be rendered by Electron const menubarData = { menus: {}, keybindings: {} }; if (this.getMenubarMenus(menubarData)) { - this.menubarService.updateMenubar(this.environmentService.configuration.windowId, menubarData); + this.menubarService.updateMenubar(this.electronService.windowId, menubarData); } } diff --git a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts index 033d02dcdde..1a3b40dff92 100644 --- a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts +++ b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts @@ -12,8 +12,17 @@ export class ElectronService { _serviceBrand: undefined; constructor( + readonly windowId: number, @IMainProcessService mainProcessService: IMainProcessService ) { - return createChannelSender(mainProcessService.getChannel('electron'), { context: mainProcessService.windowId }); + return createChannelSender(mainProcessService.getChannel('electron'), { + context: windowId, + properties: (() => { + const properties = new Map(); + properties.set('windowId', windowId); + + return properties; + })() + }); } } diff --git a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts index d883e646a1a..5ef55e3b63f 100644 --- a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts +++ b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts @@ -27,8 +27,8 @@ export class DesktopHostService extends Disposable implements IHostService { get onDidChangeFocus(): Event { return this._onDidChangeFocus; } private _onDidChangeFocus: Event = Event.latch(Event.any( - Event.map(Event.filter(this.electronService.onWindowFocus, id => id === this.environmentService.configuration.windowId), () => this.hasFocus), - Event.map(Event.filter(this.electronService.onWindowBlur, id => id === this.environmentService.configuration.windowId), () => this.hasFocus) + Event.map(Event.filter(this.electronService.onWindowFocus, id => id === this.electronService.windowId), () => this.hasFocus), + Event.map(Event.filter(this.electronService.onWindowBlur, id => id === this.electronService.windowId), () => this.hasFocus) )); get hasFocus(): boolean { @@ -42,7 +42,7 @@ export class DesktopHostService extends Disposable implements IHostService { return false; } - return activeWindowId === this.environmentService.configuration.windowId; + return activeWindowId === this.electronService.windowId; } openWindow(options?: IOpenEmptyWindowOptions): Promise; diff --git a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts similarity index 93% rename from src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts rename to src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts index b675425335d..9a7f621c073 100644 --- a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts @@ -14,8 +14,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { AbstractLifecycleService } from 'vs/platform/lifecycle/common/lifecycleService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import Severity from 'vs/base/common/severity'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; +import { IElectronService } from 'vs/platform/electron/common/electron'; export class NativeLifecycleService extends AbstractLifecycleService { @@ -27,7 +26,7 @@ export class NativeLifecycleService extends AbstractLifecycleService { constructor( @INotificationService private readonly notificationService: INotificationService, - @IWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, + @IElectronService private readonly electronService: IElectronService, @IStorageService readonly storageService: IStorageService, @ILogService readonly logService: ILogService ) { @@ -57,7 +56,7 @@ export class NativeLifecycleService extends AbstractLifecycleService { } private registerListeners(): void { - const windowId = this.environmentService.configuration.windowId; + const windowId = this.electronService.windowId; // Main side indicates that window is about to unload, check for vetos ipcRenderer.on('vscode:onBeforeUnload', (event: unknown, reply: { okChannel: string, cancelChannel: string, reason: ShutdownReason }) => { diff --git a/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts b/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts index c4322d81a9c..ae0c95b56ba 100644 --- a/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts +++ b/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts @@ -22,6 +22,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Emitter, Event } from 'vs/base/common/event'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; +import { IElectronService } from 'vs/platform/electron/common/electron'; class OutputChannelBackedByFile extends AbstractFileOutputChannelModel implements IOutputChannelModel { @@ -204,7 +205,8 @@ export class OutputChannelModelService extends AsbtractOutputChannelModelService constructor( @IInstantiationService instantiationService: IInstantiationService, @IWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, - @IFileService private readonly fileService: IFileService + @IFileService private readonly fileService: IFileService, + @IElectronService private readonly electronService: IElectronService ) { super(instantiationService); } @@ -217,7 +219,7 @@ export class OutputChannelModelService extends AsbtractOutputChannelModelService private _outputDir: Promise | null = null; private get outputDir(): Promise { if (!this._outputDir) { - const outputDir = URI.file(join(this.environmentService.logsPath, `output_${this.environmentService.configuration.windowId}_${toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '')}`)); + const outputDir = URI.file(join(this.environmentService.logsPath, `output_${this.electronService.windowId}_${toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '')}`)); this._outputDir = this.fileService.createFolder(outputDir).then(() => outputDir); } return this._outputDir; diff --git a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts index 3e9c579408b..f956a917667 100644 --- a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts +++ b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts @@ -11,6 +11,7 @@ import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedPr import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; +import { IElectronService } from 'vs/platform/electron/common/electron'; export class SharedProcessService implements ISharedProcessService { @@ -21,12 +22,13 @@ export class SharedProcessService implements ISharedProcessService { constructor( @IMainProcessService mainProcessService: IMainProcessService, + @IElectronService electronService: IElectronService, @IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService ) { this.sharedProcessMainChannel = mainProcessService.getChannel('sharedProcess'); this.withSharedProcessConnection = this.whenSharedProcessReady() - .then(() => connect(environmentService.sharedIPCHandle, `window:${environmentService.configuration.windowId}`)); + .then(() => connect(environmentService.sharedIPCHandle, `window:${electronService.windowId}`)); } whenSharedProcessReady(): Promise { diff --git a/src/vs/workbench/services/url/electron-sandbox/urlService.ts b/src/vs/workbench/services/url/electron-sandbox/urlService.ts index 0d1363f509e..c58ff6e89eb 100644 --- a/src/vs/workbench/services/url/electron-sandbox/urlService.ts +++ b/src/vs/workbench/services/url/electron-sandbox/urlService.ts @@ -24,7 +24,7 @@ export class RelayURLService extends NativeURLService implements IURLHandler, IO private urlService: IURLService; constructor( - @IMainProcessService private readonly mainProcessService: IMainProcessService, + @IMainProcessService mainProcessService: IMainProcessService, @IOpenerService openerService: IOpenerService, @IElectronService private electronService: IElectronService ) { @@ -41,9 +41,9 @@ export class RelayURLService extends NativeURLService implements IURLHandler, IO let query = uri.query; if (!query) { - query = `windowId=${encodeURIComponent(this.mainProcessService.windowId)}`; + query = `windowId=${encodeURIComponent(this.electronService.windowId)}`; } else { - query += `&windowId=${encodeURIComponent(this.mainProcessService.windowId)}`; + query += `&windowId=${encodeURIComponent(this.electronService.windowId)}`; } return uri.with({ query }); diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts index 2e68d7b154b..f0e2aef5650 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts @@ -7,15 +7,17 @@ import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; +import { IElectronService } from 'vs/platform/electron/common/electron'; export class NativeWorkspacesService { _serviceBrand: undefined; constructor( - @IMainProcessService mainProcessService: IMainProcessService + @IMainProcessService mainProcessService: IMainProcessService, + @IElectronService electronService: IElectronService ) { - return createChannelSender(mainProcessService.getChannel('workspaces'), { context: mainProcessService.windowId }); + return createChannelSender(mainProcessService.getChannel('workspaces'), { context: electronService.windowId }); } } diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 67c69cb92c6..b5f33a62fa6 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -162,6 +162,8 @@ export class TestSharedProcessService implements ISharedProcessService { export class TestElectronService implements IElectronService { _serviceBrand: undefined; + readonly windowId = -1; + onWindowOpen: Event = Event.None; onWindowMaximize: Event = Event.None; onWindowUnmaximize: Event = Event.None; diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 4348c650491..e6fc152ace3 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -56,7 +56,6 @@ import 'vs/workbench/services/authentication/electron-browser/authenticationToke import 'vs/workbench/services/authentication/browser/authenticationService'; import 'vs/workbench/services/host/electron-browser/desktopHostService'; import 'vs/workbench/services/request/electron-browser/requestService'; -import 'vs/workbench/services/lifecycle/electron-browser/lifecycleService'; import 'vs/workbench/services/sharedProcess/electron-browser/sharedProcessService'; import 'vs/workbench/services/localizations/electron-browser/localizationsService'; import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index f9886185048..30b737e8d2c 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -19,6 +19,7 @@ import 'vs/workbench/services/menubar/electron-sandbox/menubarService'; import 'vs/workbench/services/issue/electron-sandbox/issueService'; import 'vs/workbench/services/update/electron-sandbox/updateService'; import 'vs/workbench/services/url/electron-sandbox/urlService'; +import 'vs/workbench/services/lifecycle/electron-sandbox/lifecycleService'; //#endregion From 894ac7e2083b0c1e3bd420e842962c42d5016de8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 11:11:04 +0200 Subject: [PATCH 030/107] sandbox - move more things into electron-sandbox --- .../backup.contribution.ts | 2 +- .../backupTracker.ts | 0 .../backup/test/electron-browser/backupRestorer.test.ts | 2 +- .../backup/test/electron-browser/backupTracker.test.ts | 2 +- .../codeEditor/electron-browser/codeEditor.contribution.ts | 2 -- .../codeEditor/electron-sandbox/codeEditor.contribution.ts | 2 ++ .../inputClipboardActions.ts | 0 .../selectionClipboard.ts | 0 .../fileActions.contribution.ts | 2 +- .../{electron-browser => electron-sandbox}/fileCommands.ts | 0 src/vs/workbench/electron-browser/desktop.contribution.ts | 2 +- .../actions/media/actions.css | 0 .../actions/windowActions.ts | 0 .../parts/titlebar/titlebarPart.ts | 4 ++++ src/vs/workbench/workbench.desktop.main.ts | 7 ------- src/vs/workbench/workbench.sandbox.main.ts | 7 +++++++ 16 files changed, 18 insertions(+), 14 deletions(-) rename src/vs/workbench/contrib/backup/{electron-browser => electron-sandbox}/backup.contribution.ts (96%) rename src/vs/workbench/contrib/backup/{electron-browser => electron-sandbox}/backupTracker.ts (100%) rename src/vs/workbench/contrib/codeEditor/{electron-browser => electron-sandbox}/inputClipboardActions.ts (100%) rename src/vs/workbench/contrib/codeEditor/{electron-browser => electron-sandbox}/selectionClipboard.ts (100%) rename src/vs/workbench/contrib/files/{electron-browser => electron-sandbox}/fileActions.contribution.ts (99%) rename src/vs/workbench/contrib/files/{electron-browser => electron-sandbox}/fileCommands.ts (100%) rename src/vs/workbench/{electron-browser => electron-sandbox}/actions/media/actions.css (100%) rename src/vs/workbench/{electron-browser => electron-sandbox}/actions/windowActions.ts (100%) rename src/vs/workbench/{electron-browser => electron-sandbox}/parts/titlebar/titlebarPart.ts (97%) diff --git a/src/vs/workbench/contrib/backup/electron-browser/backup.contribution.ts b/src/vs/workbench/contrib/backup/electron-sandbox/backup.contribution.ts similarity index 96% rename from src/vs/workbench/contrib/backup/electron-browser/backup.contribution.ts rename to src/vs/workbench/contrib/backup/electron-sandbox/backup.contribution.ts index 9868c6285fe..43a574d8bf4 100644 --- a/src/vs/workbench/contrib/backup/electron-browser/backup.contribution.ts +++ b/src/vs/workbench/contrib/backup/electron-sandbox/backup.contribution.ts @@ -6,7 +6,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-browser/backupTracker'; +import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-sandbox/backupTracker'; // Register Backup Tracker Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(NativeBackupTracker, LifecyclePhase.Starting); diff --git a/src/vs/workbench/contrib/backup/electron-browser/backupTracker.ts b/src/vs/workbench/contrib/backup/electron-sandbox/backupTracker.ts similarity index 100% rename from src/vs/workbench/contrib/backup/electron-browser/backupTracker.ts rename to src/vs/workbench/contrib/backup/electron-sandbox/backupTracker.ts diff --git a/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts b/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts index cab5dd56e4b..68c8751e028 100644 --- a/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts +++ b/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts @@ -13,7 +13,7 @@ import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { DefaultEndOfLine } from 'vs/editor/common/model'; import { hashPath } from 'vs/workbench/services/backup/node/backupFileService'; -import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-browser/backupTracker'; +import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-sandbox/backupTracker'; import { workbenchInstantiationService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts index 76aadb7cdb8..d8695072585 100644 --- a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts +++ b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts @@ -11,7 +11,7 @@ import * as pfs from 'vs/base/node/pfs'; import { URI } from 'vs/base/common/uri'; import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { hashPath } from 'vs/workbench/services/backup/node/backupFileService'; -import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-browser/backupTracker'; +import { NativeBackupTracker } from 'vs/workbench/contrib/backup/electron-sandbox/backupTracker'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; diff --git a/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts index c037e4e5ea8..22513f6ef6c 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import './inputClipboardActions'; -import './selectionClipboard'; import './startDebugTextMate'; diff --git a/src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts index 4c11f23fc72..08763754187 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution.ts @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import './inputClipboardActions'; +import './selectionClipboard'; import './sleepResumeRepaintMinimap'; diff --git a/src/vs/workbench/contrib/codeEditor/electron-browser/inputClipboardActions.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/inputClipboardActions.ts similarity index 100% rename from src/vs/workbench/contrib/codeEditor/electron-browser/inputClipboardActions.ts rename to src/vs/workbench/contrib/codeEditor/electron-sandbox/inputClipboardActions.ts diff --git a/src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard.ts similarity index 100% rename from src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard.ts rename to src/vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard.ts diff --git a/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts similarity index 99% rename from src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts rename to src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts index 2162c0f6106..36512481251 100644 --- a/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts @@ -17,7 +17,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { getMultiSelectedResources } from 'vs/workbench/contrib/files/browser/files'; import { IListService } from 'vs/platform/list/browser/listService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { revealResourcesInOS } from 'vs/workbench/contrib/files/electron-browser/fileCommands'; +import { revealResourcesInOS } from 'vs/workbench/contrib/files/electron-sandbox/fileCommands'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { ResourceContextKey } from 'vs/workbench/common/resources'; import { appendToCommandPalette, appendEditorTitleContextMenuItem } from 'vs/workbench/contrib/files/browser/fileActions.contribution'; diff --git a/src/vs/workbench/contrib/files/electron-browser/fileCommands.ts b/src/vs/workbench/contrib/files/electron-sandbox/fileCommands.ts similarity index 100% rename from src/vs/workbench/contrib/files/electron-browser/fileCommands.ts rename to src/vs/workbench/contrib/files/electron-sandbox/fileCommands.ts diff --git a/src/vs/workbench/electron-browser/desktop.contribution.ts b/src/vs/workbench/electron-browser/desktop.contribution.ts index c61e44d6a22..b4b901cc809 100644 --- a/src/vs/workbench/electron-browser/desktop.contribution.ts +++ b/src/vs/workbench/electron-browser/desktop.contribution.ts @@ -12,7 +12,7 @@ import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/action import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { ToggleSharedProcessAction, ToggleDevToolsAction, ConfigureRuntimeArgumentsAction } from 'vs/workbench/electron-browser/actions/developerActions'; -import { ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, QuickSwitchWindow, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; +import { ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, QuickSwitchWindow, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-sandbox/actions/windowActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; diff --git a/src/vs/workbench/electron-browser/actions/media/actions.css b/src/vs/workbench/electron-sandbox/actions/media/actions.css similarity index 100% rename from src/vs/workbench/electron-browser/actions/media/actions.css rename to src/vs/workbench/electron-sandbox/actions/media/actions.css diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-sandbox/actions/windowActions.ts similarity index 100% rename from src/vs/workbench/electron-browser/actions/windowActions.ts rename to src/vs/workbench/electron-sandbox/actions/windowActions.ts diff --git a/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts similarity index 97% rename from src/vs/workbench/electron-browser/parts/titlebar/titlebarPart.ts rename to src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts index 6a95dee0fae..716b9350496 100644 --- a/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts @@ -24,6 +24,8 @@ import { IElectronService } from 'vs/platform/electron/common/electron'; import { getTitleBarStyle } from 'vs/platform/windows/common/windows'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Codicon } from 'vs/base/common/codicons'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ITitleService } from 'vs/workbench/services/title/common/titleService'; export class TitlebarPart extends BrowserTitleBarPart { private appIcon: HTMLElement | undefined; @@ -241,3 +243,5 @@ export class TitlebarPart extends BrowserTitleBarPart { } } } + +registerSingleton(ITitleService, TitlebarPart); diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index e6fc152ace3..bdfd6637f58 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -65,13 +65,10 @@ import 'vs/workbench/services/path/electron-browser/pathService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; import { KeytarCredentialsService } from 'vs/platform/credentials/node/credentialsService'; -import { TitlebarPart } from 'vs/workbench/electron-browser/parts/titlebar/titlebarPart'; -import { ITitleService } from 'vs/workbench/services/title/common/titleService'; import { IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataAutoSyncService } from 'vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService'; registerSingleton(ICredentialsService, KeytarCredentialsService, true); -registerSingleton(ITitleService, TitlebarPart); registerSingleton(IUserDataAutoSyncService, UserDataAutoSyncService); //#endregion @@ -94,10 +91,6 @@ import 'vs/workbench/contrib/splash/electron-browser/partsSplash.contribution'; // Explorer import 'vs/workbench/contrib/files/electron-browser/files.contribution'; -import 'vs/workbench/contrib/files/electron-browser/fileActions.contribution'; - -// Backup -import 'vs/workbench/contrib/backup/electron-browser/backup.contribution'; // Debug import 'vs/workbench/contrib/debug/node/debugHelperService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 30b737e8d2c..b8ae3171eab 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -20,12 +20,19 @@ import 'vs/workbench/services/issue/electron-sandbox/issueService'; import 'vs/workbench/services/update/electron-sandbox/updateService'; import 'vs/workbench/services/url/electron-sandbox/urlService'; import 'vs/workbench/services/lifecycle/electron-sandbox/lifecycleService'; +import 'vs/workbench/electron-sandbox/parts/titlebar/titlebarPart'; //#endregion //#region --- workbench contributions +// Explorer +import 'vs/workbench/contrib/files/electron-sandbox/fileActions.contribution'; + +// Backup +import 'vs/workbench/contrib/backup/electron-sandbox/backup.contribution'; + // CodeEditor Contributions import 'vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution'; From af832dbd743b17f40c0b1762e2225f543107645d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 11:22:42 +0200 Subject: [PATCH 031/107] sandbox - move developer actions --- .../actions/developerActions.ts | 44 +++-------------- .../actions/developerActions.ts | 47 +++++++++++++++++++ .../desktop.contribution.ts | 6 +-- src/vs/workbench/workbench.desktop.main.ts | 9 +++- src/vs/workbench/workbench.sandbox.main.ts | 9 ++++ 5 files changed, 71 insertions(+), 44 deletions(-) create mode 100644 src/vs/workbench/electron-sandbox/actions/developerActions.ts rename src/vs/workbench/{electron-browser => electron-sandbox}/desktop.contribution.ts (97%) diff --git a/src/vs/workbench/electron-browser/actions/developerActions.ts b/src/vs/workbench/electron-browser/actions/developerActions.ts index 313b5154653..41520472442 100644 --- a/src/vs/workbench/electron-browser/actions/developerActions.ts +++ b/src/vs/workbench/electron-browser/actions/developerActions.ts @@ -5,28 +5,10 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; -import { IElectronService } from 'vs/platform/electron/common/electron'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; - -export class ToggleDevToolsAction extends Action { - - static readonly ID = 'workbench.action.toggleDevTools'; - static readonly LABEL = nls.localize('toggleDevTools', "Toggle Developer Tools"); - - constructor( - id: string, - label: string, - @IElectronService private readonly electronService: IElectronService - ) { - super(id, label); - } - - run(): Promise { - return this.electronService.toggleDevTools(); - } -} +import { Registry } from 'vs/platform/registry/common/platform'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; export class ToggleSharedProcessAction extends Action { @@ -46,21 +28,7 @@ export class ToggleSharedProcessAction extends Action { } } -export class ConfigureRuntimeArgumentsAction extends Action { +const registry = Registry.as(Extensions.WorkbenchActions); - static readonly ID = 'workbench.action.configureRuntimeArguments'; - static readonly LABEL = nls.localize('configureRuntimeArguments', "Configure Runtime Arguments"); - - constructor( - id: string, - label: string, - @IEnvironmentService private readonly environmentService: IEnvironmentService, - @IEditorService private readonly editorService: IEditorService - ) { - super(id, label); - } - - async run(): Promise { - await this.editorService.openEditor({ resource: this.environmentService.argvResource }); - } -} +const developerCategory = nls.localize('developer', "Developer"); +registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleSharedProcessAction), 'Developer: Toggle Shared Process', developerCategory); diff --git a/src/vs/workbench/electron-sandbox/actions/developerActions.ts b/src/vs/workbench/electron-sandbox/actions/developerActions.ts new file mode 100644 index 00000000000..06e5abbeb1a --- /dev/null +++ b/src/vs/workbench/electron-sandbox/actions/developerActions.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Action } from 'vs/base/common/actions'; +import * as nls from 'vs/nls'; +import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; + +export class ToggleDevToolsAction extends Action { + + static readonly ID = 'workbench.action.toggleDevTools'; + static readonly LABEL = nls.localize('toggleDevTools', "Toggle Developer Tools"); + + constructor( + id: string, + label: string, + @IElectronService private readonly electronService: IElectronService + ) { + super(id, label); + } + + run(): Promise { + return this.electronService.toggleDevTools(); + } +} + +export class ConfigureRuntimeArgumentsAction extends Action { + + static readonly ID = 'workbench.action.configureRuntimeArguments'; + static readonly LABEL = nls.localize('configureRuntimeArguments', "Configure Runtime Arguments"); + + constructor( + id: string, + label: string, + @IEnvironmentService private readonly environmentService: IEnvironmentService, + @IEditorService private readonly editorService: IEditorService + ) { + super(id, label); + } + + async run(): Promise { + await this.editorService.openEditor({ resource: this.environmentService.argvResource }); + } +} diff --git a/src/vs/workbench/electron-browser/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts similarity index 97% rename from src/vs/workbench/electron-browser/desktop.contribution.ts rename to src/vs/workbench/electron-sandbox/desktop.contribution.ts index b4b901cc809..3bca736118a 100644 --- a/src/vs/workbench/electron-browser/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -5,13 +5,12 @@ import { Registry } from 'vs/platform/registry/common/platform'; import * as nls from 'vs/nls'; -import * as os from 'os'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; -import { ToggleSharedProcessAction, ToggleDevToolsAction, ConfigureRuntimeArgumentsAction } from 'vs/workbench/electron-browser/actions/developerActions'; +import { ToggleDevToolsAction, ConfigureRuntimeArgumentsAction } from 'vs/workbench/electron-sandbox/actions/developerActions'; import { ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, QuickSwitchWindow, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-sandbox/actions/windowActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -91,7 +90,6 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; // Actions: Developer (function registerDeveloperActions(): void { const developerCategory = nls.localize('developer', "Developer"); - registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleSharedProcessAction), 'Developer: Toggle Shared Process', developerCategory); registry.registerWorkbenchAction(SyncActionDescriptor.from(ReloadWindowWithExtensionsDisabledAction), 'Developer: Reload With Extensions Disabled', developerCategory); registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleDevToolsAction), 'Developer: Toggle Developer Tools', developerCategory); @@ -282,7 +280,7 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; 'default': false, 'scope': ConfigurationScope.APPLICATION, 'description': nls.localize('window.nativeTabs', "Enables macOS Sierra window tabs. Note that changes require a full restart to apply and that native tabs will disable a custom title bar style if configured."), - 'included': isMacintosh && parseFloat(os.release()) >= 17 // Minimum: macOS Sierra (10.13.x = darwin 17.x) + 'included': isMacintosh }, 'window.nativeFullScreen': { 'type': 'boolean', diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index bdfd6637f58..8cbac1542aa 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -13,15 +13,20 @@ //#region --- workbench common & sandbox -import 'vs/workbench/workbench.common.main'; import 'vs/workbench/workbench.sandbox.main'; //#endregion +//#region --- workbench actions + +import 'vs/workbench/electron-browser/actions/developerActions'; + +//#endregion + + //#region --- workbench (desktop main) -import 'vs/workbench/electron-browser/desktop.contribution'; import 'vs/workbench/electron-browser/desktop.main'; //#endregion diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index b8ae3171eab..c2c74830e91 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -10,6 +10,12 @@ // ### ### // ####################################################################### +//#region --- workbench common + +import 'vs/workbench/workbench.common.main'; + +//#endregion + //#region --- workbench services @@ -27,6 +33,9 @@ import 'vs/workbench/electron-sandbox/parts/titlebar/titlebarPart'; //#region --- workbench contributions +// Desktop +import 'vs/workbench/electron-sandbox/desktop.contribution'; + // Explorer import 'vs/workbench/contrib/files/electron-sandbox/fileActions.contribution'; From 231bee5c77c31592b212b3bacbd0fe1f7fa0540a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 12:25:59 +0200 Subject: [PATCH 032/107] sandbox - fix build --- build/gulpfile.vscode.js | 1 + 1 file changed, 1 insertion(+) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index a74014ae3d4..5881bc66e91 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -66,6 +66,7 @@ const vscodeResources = [ 'out-build/vs/base/node/languagePacks.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', 'out-build/vs/base/browser/ui/codicons/codicon/**', + 'out-build/vs/base/parts/sandbox/electron-browser/preload.js', 'out-build/vs/workbench/browser/media/*-theme.css', 'out-build/vs/workbench/contrib/debug/**/*.json', 'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt', From 7f34cb53849ae5b6d1bb2ed798cd853d0d112c00 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 12:41:39 +0200 Subject: [PATCH 033/107] sandbox - ensure IElectronService is declared from electron-sandbox layer --- .../sharedProcess/sharedProcessMain.ts | 2 +- src/vs/code/electron-main/app.ts | 2 +- .../windows.ts} | 6 +++--- src/vs/platform/driver/electron-browser/driver.ts | 2 +- src/vs/platform/electron/common/electron.ts | 5 +---- .../electron/electron-main/electronMainService.ts | 6 +++--- src/vs/platform/electron/electron-sandbox/electron.ts | 11 +++++++++++ .../files/electron-browser/diskFileSystemProvider.ts | 2 +- .../electron-browser/userDataAutoSyncService.ts | 2 +- .../contrib/backup/electron-sandbox/backupTracker.ts | 2 +- .../test/electron-browser/backupTracker.test.ts | 2 +- .../electron-browser/extensionProfileService.ts | 2 +- .../extensions/electron-browser/extensionsActions.ts | 2 +- .../electron-browser/runtimeExtensionsEditor.ts | 2 +- .../contrib/files/electron-browser/textFileEditor.ts | 2 +- .../electron-sandbox/fileActions.contribution.ts | 2 +- .../contrib/files/electron-sandbox/fileCommands.ts | 2 +- .../contrib/logs/electron-browser/logsActions.ts | 2 +- .../performance/electron-browser/startupProfiler.ts | 2 +- .../performance/electron-browser/startupTimings.ts | 2 +- .../electron-browser/partsSplash.contribution.ts | 2 +- .../electron-browser/userDataSync.contribution.ts | 2 +- .../electron-browser/telemetryOptOut.ts | 2 +- src/vs/workbench/electron-browser/desktop.main.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 2 +- .../electron-sandbox/actions/developerActions.ts | 2 +- .../electron-sandbox/actions/windowActions.ts | 2 +- .../electron-sandbox/desktop.contribution.ts | 2 +- .../electron-sandbox/parts/titlebar/titlebarPart.ts | 2 +- .../dialogs/electron-browser/dialogService.ts | 2 +- .../dialogs/electron-browser/fileDialogService.ts | 2 +- .../electron/electron-sandbox/electronService.ts | 2 +- .../extensions/electron-browser/extensionHost.ts | 2 +- .../extensions/electron-browser/extensionService.ts | 2 +- .../host/electron-browser/desktopHostService.ts | 2 +- .../lifecycle/electron-sandbox/lifecycleService.ts | 2 +- .../electron-browser/outputChannelModelService.ts | 2 +- .../request/electron-browser/requestService.ts | 2 +- .../electron-browser/sharedProcessService.ts | 2 +- .../services/timer/electron-browser/timerService.ts | 2 +- .../services/url/electron-sandbox/urlService.ts | 2 +- .../electron-browser/workspaceEditingService.ts | 2 +- .../workspaces/electron-sandbox/workspacesService.ts | 2 +- .../test/electron-browser/workbenchTestServices.ts | 2 +- 44 files changed, 58 insertions(+), 50 deletions(-) rename src/vs/code/{node/activeWindowTracker.ts => electron-main/windows.ts} (89%) create mode 100644 src/vs/platform/electron/electron-sandbox/electron.ts diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 7820c103b27..b924bc99ab9 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -53,7 +53,7 @@ import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; import { UserDataSyncChannel, UserDataSyncUtilServiceClient, UserDataAutoSyncChannel, StorageKeysSyncRegistryChannelClient, UserDataSyncMachinesServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { LoggerService } from 'vs/platform/log/node/loggerService'; import { UserDataSyncLogService } from 'vs/platform/userDataSync/common/userDataSyncLog'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index a7eee01060d..260c1e49d41 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -8,7 +8,7 @@ import { IProcessEnvironment, isWindows, isMacintosh } from 'vs/base/common/plat import { WindowsMainService } from 'vs/platform/windows/electron-main/windowsMainService'; import { IWindowOpenable } from 'vs/platform/windows/common/windows'; import { OpenContext } from 'vs/platform/windows/node/window'; -import { ActiveWindowManager } from 'vs/code/node/activeWindowTracker'; +import { ActiveWindowManager } from 'vs/code/electron-main/windows'; import { ILifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { getShellEnvironment } from 'vs/code/node/shellEnv'; import { IUpdateService } from 'vs/platform/update/common/update'; diff --git a/src/vs/code/node/activeWindowTracker.ts b/src/vs/code/electron-main/windows.ts similarity index 89% rename from src/vs/code/node/activeWindowTracker.ts rename to src/vs/code/electron-main/windows.ts index ed201b0981c..82723f9d171 100644 --- a/src/vs/code/node/activeWindowTracker.ts +++ b/src/vs/code/electron-main/windows.ts @@ -6,7 +6,7 @@ import { Event } from 'vs/base/common/event'; import { DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronMainService } from 'vs/platform/electron/electron-main/electronMainService'; export class ActiveWindowManager extends Disposable { @@ -15,7 +15,7 @@ export class ActiveWindowManager extends Disposable { private activeWindowId: number | undefined; - constructor(@IElectronService electronService: IElectronService) { + constructor(@IElectronMainService electronService: IElectronMainService) { super(); // remember last active window id upon events @@ -23,7 +23,7 @@ export class ActiveWindowManager extends Disposable { onActiveWindowChange(this.setActiveWindow, this, this.disposables); // resolve current active window - this.firstActiveWindowIdPromise = createCancelablePromise(() => electronService.getActiveWindowId()); + this.firstActiveWindowIdPromise = createCancelablePromise(() => electronService.getActiveWindowId(-1)); (async () => { try { const windowId = await this.firstActiveWindowIdPromise; diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index ec6548552a4..c3391a7ef79 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -10,7 +10,7 @@ import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { remote } from 'electron'; import { timeout } from 'vs/base/common/async'; import { BaseWindowDriver } from 'vs/platform/driver/browser/baseDriver'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; class WindowDriver extends BaseWindowDriver { diff --git a/src/vs/platform/electron/common/electron.ts b/src/vs/platform/electron/common/electron.ts index f25e2bb1a1b..ae1243e1b7f 100644 --- a/src/vs/platform/electron/common/electron.ts +++ b/src/vs/platform/electron/common/electron.ts @@ -5,14 +5,11 @@ import { Event } from 'vs/base/common/event'; import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, SaveDialogOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogReturnValue, CrashReporterStartOptions } from 'vs/base/parts/sandbox/common/electronTypes'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IOpenedWindow, IWindowOpenable, IOpenEmptyWindowOptions, INativeOpenWindowOptions } from 'vs/platform/windows/common/windows'; import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; -export const IElectronService = createDecorator('electronService'); - -export interface IElectronService { +export interface ICommonElectronService { _serviceBrand: undefined; diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index e0078274351..c9c5c7dc0a3 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -11,7 +11,7 @@ import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifec import { IOpenedWindow, INativeOpenWindowOptions, IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { isMacintosh } from 'vs/base/common/platform'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { ICommonElectronService } from 'vs/platform/electron/common/electron'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { AddFirstParameterToFunctions } from 'vs/base/common/types'; @@ -23,9 +23,9 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { ILogService } from 'vs/platform/log/common/log'; import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; -export interface IElectronMainService extends AddFirstParameterToFunctions /* only methods, not events */, number | undefined /* window ID */> { } +export interface IElectronMainService extends AddFirstParameterToFunctions /* only methods, not events */, number | undefined /* window ID */> { } -export const IElectronMainService = createDecorator('electronMainService'); +export const IElectronMainService = createDecorator('electronMainService'); export class ElectronMainService implements IElectronMainService { diff --git a/src/vs/platform/electron/electron-sandbox/electron.ts b/src/vs/platform/electron/electron-sandbox/electron.ts new file mode 100644 index 00000000000..13626f87a29 --- /dev/null +++ b/src/vs/platform/electron/electron-sandbox/electron.ts @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { ICommonElectronService } from 'vs/platform/electron/common/electron'; + +export const IElectronService = createDecorator('electronService'); + +export interface IElectronService extends ICommonElectronService { } diff --git a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts index 2dfe765a4bf..de3211dae17 100644 --- a/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts +++ b/src/vs/platform/files/electron-browser/diskFileSystemProvider.ts @@ -9,7 +9,7 @@ import { isWindows } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { basename } from 'vs/base/common/path'; import { ILogService } from 'vs/platform/log/common/log'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; export class DiskFileSystemProvider extends NodeDiskFileSystemProvider { diff --git a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts index 3263565e376..04c5fa7f6e2 100644 --- a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts @@ -5,7 +5,7 @@ import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { UserDataAutoSyncService as BaseUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/workbench/contrib/backup/electron-sandbox/backupTracker.ts b/src/vs/workbench/contrib/backup/electron-sandbox/backupTracker.ts index 5e28807f032..8585de7a240 100644 --- a/src/vs/workbench/contrib/backup/electron-sandbox/backupTracker.ts +++ b/src/vs/workbench/contrib/backup/electron-sandbox/backupTracker.ts @@ -14,7 +14,7 @@ import Severity from 'vs/base/common/severity'; import { WorkbenchState, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isMacintosh } from 'vs/base/common/platform'; import { HotExitConfiguration } from 'vs/platform/files/common/files'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { BackupTracker } from 'vs/workbench/contrib/backup/common/backupTracker'; import { ILogService } from 'vs/platform/log/common/log'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts index d8695072585..485390ddab3 100644 --- a/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts +++ b/src/vs/workbench/contrib/backup/test/electron-browser/backupTracker.test.ts @@ -34,7 +34,7 @@ import { HotExitConfiguration } from 'vs/platform/files/common/files'; import { ShutdownReason, ILifecycleService, BeforeShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { IFileDialogService, ConfirmResult, IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IWorkspaceContextService, Workspace } from 'vs/platform/workspace/common/workspace'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { BackupTracker } from 'vs/workbench/contrib/backup/common/backupTracker'; import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts index afa3bb703d1..f95e31cd436 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts @@ -12,7 +12,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntryAccessor, IStatusbarEntry } from 'vs/workbench/services/statusbar/common/statusbar'; import { IExtensionHostProfileService, ProfileSessionState } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { randomPort } from 'vs/base/node/ports'; import product from 'vs/platform/product/common/product'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts index 4fc5cfdbcac..4289877aade 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts @@ -9,7 +9,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { Schemas } from 'vs/base/common/network'; export class OpenExtensionsFolderAction extends Action { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts index 955f58e1199..c5144f24436 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -24,7 +24,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { writeFile } from 'vs/base/node/pfs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { memoize } from 'vs/base/common/decorators'; diff --git a/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts b/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts index cb243c53fce..c495a1e1a58 100644 --- a/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts @@ -23,7 +23,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; /** diff --git a/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts b/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts index 36512481251..a335946a0d5 100644 --- a/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts @@ -9,7 +9,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { isWindows, isMacintosh } from 'vs/base/common/platform'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; diff --git a/src/vs/workbench/contrib/files/electron-sandbox/fileCommands.ts b/src/vs/workbench/contrib/files/electron-sandbox/fileCommands.ts index ce96a316480..e941d1ece27 100644 --- a/src/vs/workbench/contrib/files/electron-sandbox/fileCommands.ts +++ b/src/vs/workbench/contrib/files/electron-sandbox/fileCommands.ts @@ -9,7 +9,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { sequence } from 'vs/base/common/async'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; // Commands diff --git a/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts b/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts index e4c3287f13f..3109475f950 100644 --- a/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts +++ b/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts @@ -7,7 +7,7 @@ import { Action } from 'vs/base/common/actions'; import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import * as nls from 'vs/nls'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts index a0a46cd288a..27297f24966 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts @@ -18,7 +18,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { URI } from 'vs/base/common/uri'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IProductService } from 'vs/platform/product/common/productService'; export class StartupProfiler implements IWorkbenchContribution { diff --git a/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts index d9e7fed075f..4943b79c0dd 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts @@ -14,7 +14,7 @@ import { ILifecycleService, StartupKind, StartupKindToString } from 'vs/platform import product from 'vs/platform/product/common/product'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUpdateService } from 'vs/platform/update/common/update'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import * as files from 'vs/workbench/contrib/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts index 0fb74c2e7cb..8bf519fd308 100644 --- a/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts +++ b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts @@ -26,7 +26,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import * as perf from 'vs/base/common/performance'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { assertIsDefined } from 'vs/base/common/types'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; class PartsSplash { diff --git a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts index 3ce0e565733..5c7c757451f 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts @@ -14,7 +14,7 @@ import { localize } from 'vs/nls'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { Action } from 'vs/base/common/actions'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; diff --git a/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts index 9d3660332b0..0adc911b514 100644 --- a/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts +++ b/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts @@ -13,7 +13,7 @@ import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common import { IProductService } from 'vs/platform/product/common/productService'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { AbstractTelemetryOptOut } from 'vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; export class NativeTelemetryOptOut extends AbstractTelemetryOptOut { diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index f4a86a58370..3c36dbb9c14 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -51,7 +51,7 @@ import { NativeResourceIdentityService } from 'vs/platform/resource/node/resourc import { IResourceIdentityService } from 'vs/platform/resource/common/resourceIdentityService'; import { DesktopLogService } from 'vs/workbench/services/log/electron-browser/logService'; import { ElectronService } from 'vs/workbench/services/electron/electron-sandbox/electronService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; class DesktopMain extends Disposable { diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 104dadf9cbe..00a2eb68b5e 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -54,7 +54,7 @@ import { IMenubarService, IMenubarData, IMenubarMenu, IMenubarKeybinding, IMenub import { withNullAsUndefined, assertIsDefined } from 'vs/base/common/types'; import { IOpenerService, OpenOptions } from 'vs/platform/opener/common/opener'; import { Schemas } from 'vs/base/common/network'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { posix, dirname } from 'vs/base/common/path'; import { getBaseLabel } from 'vs/base/common/labels'; import { ITunnelService, extractLocalHostUriMetaDataForPortMapping } from 'vs/platform/remote/common/tunnel'; diff --git a/src/vs/workbench/electron-sandbox/actions/developerActions.ts b/src/vs/workbench/electron-sandbox/actions/developerActions.ts index 06e5abbeb1a..6c20467143d 100644 --- a/src/vs/workbench/electron-sandbox/actions/developerActions.ts +++ b/src/vs/workbench/electron-sandbox/actions/developerActions.ts @@ -5,7 +5,7 @@ import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/electron-sandbox/actions/windowActions.ts b/src/vs/workbench/electron-sandbox/actions/windowActions.ts index 08ad2588398..e34b546a20b 100644 --- a/src/vs/workbench/electron-sandbox/actions/windowActions.ts +++ b/src/vs/workbench/electron-sandbox/actions/windowActions.ts @@ -19,7 +19,7 @@ import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { ICommandHandler } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { Codicon } from 'vs/base/common/codicons'; export class CloseCurrentWindowAction extends Action { diff --git a/src/vs/workbench/electron-sandbox/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts index 3bca736118a..98a5a69a614 100644 --- a/src/vs/workbench/electron-sandbox/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -18,7 +18,7 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IsDevelopmentContext, IsMacContext } from 'vs/platform/contextkey/common/contextkeys'; import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/editor'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import product from 'vs/platform/product/common/product'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; diff --git a/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts index 716b9350496..683e63c6776 100644 --- a/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts @@ -20,7 +20,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IProductService } from 'vs/platform/product/common/productService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { getTitleBarStyle } from 'vs/platform/windows/common/windows'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Codicon } from 'vs/base/common/codicons'; diff --git a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts index 4e3c2854bf9..8229d42214b 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts @@ -21,7 +21,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IProductService } from 'vs/platform/product/common/productService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { MessageBoxOptions } from 'vs/base/parts/sandbox/common/electronTypes'; import { fromNow } from 'vs/base/common/date'; diff --git a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts index 7c2da38e24b..071dcc85732 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts @@ -15,7 +15,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { AbstractFileDialogService } from 'vs/workbench/services/dialogs/browser/abstractFileDialogService'; import { Schemas } from 'vs/base/common/network'; import { IModeService } from 'vs/editor/common/services/modeService'; diff --git a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts index 1a3b40dff92..bb9663a128a 100644 --- a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts +++ b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index bc5c5740ad8..c7581d7c5fb 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -28,7 +28,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import product from 'vs/platform/product/common/product'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol'; import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index a14ab1a648e..56b1275cf9f 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -34,7 +34,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { Logger } from 'vs/workbench/services/extensions/common/extensionPoints'; import { flatten } from 'vs/base/common/arrays'; import { IStaticExtensionsService } from 'vs/workbench/services/extensions/common/staticExtensions'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { IRemoteExplorerService } from 'vs/workbench/services/remote/common/remoteExplorerService'; import { Action } from 'vs/base/common/actions'; diff --git a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts index 5ef55e3b63f..0a42ff5ec1e 100644 --- a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts +++ b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; diff --git a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts index 9a7f621c073..fd388e1a2e7 100644 --- a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts @@ -14,7 +14,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { AbstractLifecycleService } from 'vs/platform/lifecycle/common/lifecycleService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import Severity from 'vs/base/common/severity'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; export class NativeLifecycleService extends AbstractLifecycleService { diff --git a/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts b/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts index ae0c95b56ba..e94f6c963bd 100644 --- a/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts +++ b/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts @@ -22,7 +22,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Emitter, Event } from 'vs/base/common/event'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; class OutputChannelBackedByFile extends AbstractFileOutputChannelModel implements IOutputChannelModel { diff --git a/src/vs/workbench/services/request/electron-browser/requestService.ts b/src/vs/workbench/services/request/electron-browser/requestService.ts index 457a39698f2..18ee94b099c 100644 --- a/src/vs/workbench/services/request/electron-browser/requestService.ts +++ b/src/vs/workbench/services/request/electron-browser/requestService.ts @@ -8,7 +8,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { RequestService } from 'vs/platform/request/browser/requestService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IRequestService } from 'vs/platform/request/common/request'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; export class NativeRequestService extends RequestService { diff --git a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts index f956a917667..9fcc8f78e7c 100644 --- a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts +++ b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts @@ -11,7 +11,7 @@ import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedPr import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; export class SharedProcessService implements ISharedProcessService { diff --git a/src/vs/workbench/services/timer/electron-browser/timerService.ts b/src/vs/workbench/services/timer/electron-browser/timerService.ts index 97649b59b58..18e9ad060dc 100644 --- a/src/vs/workbench/services/timer/electron-browser/timerService.ts +++ b/src/vs/workbench/services/timer/electron-browser/timerService.ts @@ -7,7 +7,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { virtualMachineHint } from 'vs/base/node/id'; import * as perf from 'vs/base/common/performance'; import * as os from 'os'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/services/url/electron-sandbox/urlService.ts b/src/vs/workbench/services/url/electron-sandbox/urlService.ts index c58ff6e89eb..c1b948c898d 100644 --- a/src/vs/workbench/services/url/electron-sandbox/urlService.ts +++ b/src/vs/workbench/services/url/electron-sandbox/urlService.ts @@ -11,7 +11,7 @@ import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/commo import product from 'vs/platform/product/common/product'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { NativeURLService } from 'vs/platform/url/common/urlService'; export interface IRelayOpenURLOptions extends IOpenURLOptions { diff --git a/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts b/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts index 8ecb2863421..ba261dea854 100644 --- a/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService.ts @@ -27,7 +27,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { AbstractWorkspaceEditingService } from 'vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { isMacintosh } from 'vs/base/common/platform'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { BackupFileService } from 'vs/workbench/services/backup/common/backupFileService'; diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts index f0e2aef5650..65696c656fe 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts @@ -7,7 +7,7 @@ import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; export class NativeWorkspacesService { diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index b5f33a62fa6..4854872156b 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -8,7 +8,7 @@ import { Event } from 'vs/base/common/event'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { NativeWorkbenchEnvironmentService, INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { NativeTextFileService, EncodingOracle, IEncodingOverride } from 'vs/workbench/services/textfile/electron-browser/nativeTextFileService'; -import { IElectronService } from 'vs/platform/electron/common/electron'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { FileOperationError, IFileService } from 'vs/platform/files/common/files'; import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; From c86de794a0ea2f7a82a324cdd4eb66a5af10742d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 13:57:24 +0200 Subject: [PATCH 034/107] sandbox - move main process service into electron-sandbox --- .../issue/issueReporterMain.ts | 3 +- .../sharedProcess/sharedProcessMain.ts | 4 +- src/vs/code/electron-main/app.ts | 3 +- src/vs/code/electron-main/windows.ts | 51 ------------------- .../authenticationIpc.ts | 1 - .../driver/electron-browser/driver.ts | 2 +- .../platform/ipc/common/mainProcessService.ts | 18 ------- .../electron-sandbox/mainProcessService.ts | 13 ++++- .../platform/windows/electron-main/windows.ts | 46 ++++++++++++++++- .../extensionHostDebugService.ts | 2 +- .../electron-browser/desktop.main.ts | 3 +- .../electron-sandbox/electronService.ts | 2 +- .../issue/electron-sandbox/issueService.ts | 2 +- .../log/electron-browser/logService.ts | 2 +- .../electron-sandbox/menubarService.ts | 2 +- .../electron-browser/sharedProcessService.ts | 2 +- .../update/electron-sandbox/updateService.ts | 2 +- .../url/electron-sandbox/urlService.ts | 2 +- .../storageKeysSyncRegistryService.ts | 2 +- .../electron-sandbox/workspacesService.ts | 2 +- 20 files changed, 73 insertions(+), 91 deletions(-) delete mode 100644 src/vs/code/electron-main/windows.ts rename src/vs/platform/authentication/{common => electron-browser}/authenticationIpc.ts (99%) delete mode 100644 src/vs/platform/ipc/common/mainProcessService.ts diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index d0e824c6cfa..78f75975fd3 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -27,8 +27,7 @@ import { isRemoteDiagnosticError, SystemInfo } from 'vs/platform/diagnostics/com import { EnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; -import { MainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService, MainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { ISettingsSearchIssueReporterData, IssueReporterData, IssueReporterExtensionData, IssueReporterFeatures, IssueReporterStyles, IssueType } from 'vs/platform/issue/common/issue'; import { getLogLevel, ILogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index b924bc99ab9..850ae498d0c 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -40,7 +40,7 @@ import { NodeCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/co import { LanguagePackCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner'; import { StorageDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner'; import { LogsDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { DiagnosticsService, IDiagnosticsService } from 'vs/platform/diagnostics/node/diagnosticsService'; import { DiagnosticsChannel } from 'vs/platform/diagnostics/node/diagnosticsIpc'; @@ -65,7 +65,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; import { IAuthenticationTokenService, AuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; -import { AuthenticationTokenServiceChannel } from 'vs/platform/authentication/common/authenticationIpc'; +import { AuthenticationTokenServiceChannel } from 'vs/platform/authentication/electron-browser/authenticationIpc'; import { UserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSyncBackupStoreService'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; import { ExtensionTipsService } from 'vs/platform/extensionManagement/node/extensionTipsService'; diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 260c1e49d41..b33b9476000 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -8,7 +8,6 @@ import { IProcessEnvironment, isWindows, isMacintosh } from 'vs/base/common/plat import { WindowsMainService } from 'vs/platform/windows/electron-main/windowsMainService'; import { IWindowOpenable } from 'vs/platform/windows/common/windows'; import { OpenContext } from 'vs/platform/windows/node/window'; -import { ActiveWindowManager } from 'vs/code/electron-main/windows'; import { ILifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { getShellEnvironment } from 'vs/code/node/shellEnv'; import { IUpdateService } from 'vs/platform/update/common/update'; @@ -36,7 +35,7 @@ import { getDelayedChannel, StaticRouter, createChannelReceiver } from 'vs/base/ import product from 'vs/platform/product/common/product'; import { ProxyAuthHandler } from 'vs/code/electron-main/auth'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; +import { IWindowsMainService, ICodeWindow, ActiveWindowManager } from 'vs/platform/windows/electron-main/windows'; import { URI } from 'vs/base/common/uri'; import { hasWorkspaceFileExtension, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { WorkspacesService } from 'vs/platform/workspaces/electron-main/workspacesService'; diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts deleted file mode 100644 index 82723f9d171..00000000000 --- a/src/vs/code/electron-main/windows.ts +++ /dev/null @@ -1,51 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Event } from 'vs/base/common/event'; -import { DisposableStore, Disposable } from 'vs/base/common/lifecycle'; -import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; -import { IElectronMainService } from 'vs/platform/electron/electron-main/electronMainService'; - -export class ActiveWindowManager extends Disposable { - - private readonly disposables = this._register(new DisposableStore()); - private firstActiveWindowIdPromise: CancelablePromise | undefined; - - private activeWindowId: number | undefined; - - constructor(@IElectronMainService electronService: IElectronMainService) { - super(); - - // remember last active window id upon events - const onActiveWindowChange = Event.latch(Event.any(electronService.onWindowOpen, electronService.onWindowFocus)); - onActiveWindowChange(this.setActiveWindow, this, this.disposables); - - // resolve current active window - this.firstActiveWindowIdPromise = createCancelablePromise(() => electronService.getActiveWindowId(-1)); - (async () => { - try { - const windowId = await this.firstActiveWindowIdPromise; - this.activeWindowId = (typeof this.activeWindowId === 'number') ? this.activeWindowId : windowId; - } finally { - this.firstActiveWindowIdPromise = undefined; - } - })(); - } - - private setActiveWindow(windowId: number | undefined) { - if (this.firstActiveWindowIdPromise) { - this.firstActiveWindowIdPromise.cancel(); - this.firstActiveWindowIdPromise = undefined; - } - - this.activeWindowId = windowId; - } - - async getActiveClientId(): Promise { - const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId; - - return `window:${id}`; - } -} diff --git a/src/vs/platform/authentication/common/authenticationIpc.ts b/src/vs/platform/authentication/electron-browser/authenticationIpc.ts similarity index 99% rename from src/vs/platform/authentication/common/authenticationIpc.ts rename to src/vs/platform/authentication/electron-browser/authenticationIpc.ts index e9f74ac9659..2b9411b9465 100644 --- a/src/vs/platform/authentication/common/authenticationIpc.ts +++ b/src/vs/platform/authentication/electron-browser/authenticationIpc.ts @@ -7,7 +7,6 @@ import { IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event } from 'vs/base/common/event'; import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; - export class AuthenticationTokenServiceChannel implements IServerChannel { constructor(private readonly service: IAuthenticationTokenService) { } diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index c3391a7ef79..9e39b4d6eb0 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -6,7 +6,7 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/node/driver'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { remote } from 'electron'; import { timeout } from 'vs/base/common/async'; import { BaseWindowDriver } from 'vs/platform/driver/browser/baseDriver'; diff --git a/src/vs/platform/ipc/common/mainProcessService.ts b/src/vs/platform/ipc/common/mainProcessService.ts deleted file mode 100644 index 325eda580c4..00000000000 --- a/src/vs/platform/ipc/common/mainProcessService.ts +++ /dev/null @@ -1,18 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; - -export const IMainProcessService = createDecorator('mainProcessService'); - -export interface IMainProcessService { - - _serviceBrand: undefined; - - getChannel(channelName: string): IChannel; - - registerChannel(channelName: string, channel: IServerChannel): void; -} diff --git a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts index e8ceeb88525..b8ffa053a08 100644 --- a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts +++ b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts @@ -3,10 +3,21 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Client } from 'vs/base/parts/ipc/electron-sandbox/ipc.electron-sandbox'; import { Disposable } from 'vs/base/common/lifecycle'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const IMainProcessService = createDecorator('mainProcessService'); + +export interface IMainProcessService { + + _serviceBrand: undefined; + + getChannel(channelName: string): IChannel; + + registerChannel(channelName: string, channel: IServerChannel): void; +} export class MainProcessService extends Disposable implements IMainProcessService { diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index 5c6facab0a9..52c92d45936 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -13,7 +13,9 @@ import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { URI } from 'vs/base/common/uri'; import { Rectangle, BrowserWindow } from 'electron'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; +import { IElectronMainService } from 'vs/platform/electron/electron-main/electronMainService'; export interface IWindowState { width?: number; @@ -141,3 +143,45 @@ export interface IOpenConfiguration extends IBaseOpenConfiguration { } export interface IOpenEmptyConfiguration extends IBaseOpenConfiguration { } + +export class ActiveWindowManager extends Disposable { + + private readonly disposables = this._register(new DisposableStore()); + private firstActiveWindowIdPromise: CancelablePromise | undefined; + + private activeWindowId: number | undefined; + + constructor(@IElectronMainService electronService: IElectronMainService) { + super(); + + // remember last active window id upon events + const onActiveWindowChange = Event.latch(Event.any(electronService.onWindowOpen, electronService.onWindowFocus)); + onActiveWindowChange(this.setActiveWindow, this, this.disposables); + + // resolve current active window + this.firstActiveWindowIdPromise = createCancelablePromise(() => electronService.getActiveWindowId(-1)); + (async () => { + try { + const windowId = await this.firstActiveWindowIdPromise; + this.activeWindowId = (typeof this.activeWindowId === 'number') ? this.activeWindowId : windowId; + } finally { + this.firstActiveWindowIdPromise = undefined; + } + })(); + } + + private setActiveWindow(windowId: number | undefined) { + if (this.firstActiveWindowIdPromise) { + this.firstActiveWindowIdPromise.cancel(); + this.firstActiveWindowIdPromise = undefined; + } + + this.activeWindowId = windowId; + } + + async getActiveClientId(): Promise { + const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId; + + return `window:${id}`; + } +} diff --git a/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts b/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts index 15fef8975b9..5b504f89cbf 100644 --- a/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts +++ b/src/vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService.ts @@ -5,7 +5,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { ExtensionHostDebugChannelClient, ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; export class ExtensionHostDebugService extends ExtensionHostDebugChannelClient { diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 3c36dbb9c14..4f7686c0be4 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -30,8 +30,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IStorageService } from 'vs/platform/storage/common/storage'; import { Disposable } from 'vs/base/common/lifecycle'; import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; -import { MainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { IMainProcessService, MainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { RemoteAuthorityResolverService } from 'vs/platform/remote/electron-browser/remoteAuthorityResolverService'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; diff --git a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts index bb9663a128a..15c9aeb4806 100644 --- a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts +++ b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; export class ElectronService { diff --git a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts index d4f71d134e8..c75ebf7dadf 100644 --- a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IIssueService } from 'vs/platform/issue/common/issue'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/services/log/electron-browser/logService.ts b/src/vs/workbench/services/log/electron-browser/logService.ts index 63313c6b08d..caa1bd713c0 100644 --- a/src/vs/workbench/services/log/electron-browser/logService.ts +++ b/src/vs/workbench/services/log/electron-browser/logService.ts @@ -6,7 +6,7 @@ import { DelegatedLogService, ILogService, ConsoleLogInMainService, ConsoleLogService, MultiplexLogService } from 'vs/platform/log/common/log'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { SpdLogService } from 'vs/platform/log/node/spdlogService'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts index 7d863122efa..08a36faec0a 100644 --- a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts +++ b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IMenubarService } from 'vs/platform/menubar/common/menubar'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts index 9fcc8f78e7c..5e60aa284ec 100644 --- a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts +++ b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts @@ -6,7 +6,7 @@ import { Client } from 'vs/base/parts/ipc/common/ipc.net'; import { connect } from 'vs/base/parts/ipc/node/ipc.net'; import { IChannel, IServerChannel, getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; diff --git a/src/vs/workbench/services/update/electron-sandbox/updateService.ts b/src/vs/workbench/services/update/electron-sandbox/updateService.ts index 84138f3e1d9..fd815a792f5 100644 --- a/src/vs/workbench/services/update/electron-sandbox/updateService.ts +++ b/src/vs/workbench/services/update/electron-sandbox/updateService.ts @@ -6,7 +6,7 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event, Emitter } from 'vs/base/common/event'; import { IUpdateService, State } from 'vs/platform/update/common/update'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class NativeUpdateService implements IUpdateService { diff --git a/src/vs/workbench/services/url/electron-sandbox/urlService.ts b/src/vs/workbench/services/url/electron-sandbox/urlService.ts index c1b948c898d..e7a7df6360c 100644 --- a/src/vs/workbench/services/url/electron-sandbox/urlService.ts +++ b/src/vs/workbench/services/url/electron-sandbox/urlService.ts @@ -5,7 +5,7 @@ import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/common/url'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { URLHandlerChannel } from 'vs/platform/url/common/urlIpc'; import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/common/opener'; import product from 'vs/platform/product/common/product'; diff --git a/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts b/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts index e2d1ece582b..12287d95d05 100644 --- a/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts +++ b/src/vs/workbench/services/userDataSync/electron-sandbox/storageKeysSyncRegistryService.ts @@ -5,7 +5,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { StorageKeysSyncRegistryChannelClient } from 'vs/platform/userDataSync/common/userDataSyncIpc'; class StorageKeysSyncRegistryService extends StorageKeysSyncRegistryChannelClient implements IStorageKeysSyncRegistryService { diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts index 65696c656fe..05621320243 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; -import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; From 04792c38748cd13d849e727cad00452fa7e2303f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 13:59:53 +0200 Subject: [PATCH 035/107] sandbox - fix cyclic dependency --- src/vs/code/electron-main/app.ts | 3 +- .../windows/electron-main/windowTracker.ts | 51 +++++++++++++++++++ .../platform/windows/electron-main/windows.ts | 46 +---------------- 3 files changed, 54 insertions(+), 46 deletions(-) create mode 100644 src/vs/platform/windows/electron-main/windowTracker.ts diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index b33b9476000..6fcfe1cfd98 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -35,7 +35,8 @@ import { getDelayedChannel, StaticRouter, createChannelReceiver } from 'vs/base/ import product from 'vs/platform/product/common/product'; import { ProxyAuthHandler } from 'vs/code/electron-main/auth'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IWindowsMainService, ICodeWindow, ActiveWindowManager } from 'vs/platform/windows/electron-main/windows'; +import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; +import { ActiveWindowManager } from 'vs/platform/windows/electron-main/windowTracker'; import { URI } from 'vs/base/common/uri'; import { hasWorkspaceFileExtension, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { WorkspacesService } from 'vs/platform/workspaces/electron-main/workspacesService'; diff --git a/src/vs/platform/windows/electron-main/windowTracker.ts b/src/vs/platform/windows/electron-main/windowTracker.ts new file mode 100644 index 00000000000..f9c5c9fe055 --- /dev/null +++ b/src/vs/platform/windows/electron-main/windowTracker.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event } from 'vs/base/common/event'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; +import { IElectronMainService } from 'vs/platform/electron/electron-main/electronMainService'; + +export class ActiveWindowManager extends Disposable { + + private readonly disposables = this._register(new DisposableStore()); + private firstActiveWindowIdPromise: CancelablePromise | undefined; + + private activeWindowId: number | undefined; + + constructor(@IElectronMainService electronService: IElectronMainService) { + super(); + + // remember last active window id upon events + const onActiveWindowChange = Event.latch(Event.any(electronService.onWindowOpen, electronService.onWindowFocus)); + onActiveWindowChange(this.setActiveWindow, this, this.disposables); + + // resolve current active window + this.firstActiveWindowIdPromise = createCancelablePromise(() => electronService.getActiveWindowId(-1)); + (async () => { + try { + const windowId = await this.firstActiveWindowIdPromise; + this.activeWindowId = (typeof this.activeWindowId === 'number') ? this.activeWindowId : windowId; + } finally { + this.firstActiveWindowIdPromise = undefined; + } + })(); + } + + private setActiveWindow(windowId: number | undefined) { + if (this.firstActiveWindowIdPromise) { + this.firstActiveWindowIdPromise.cancel(); + this.firstActiveWindowIdPromise = undefined; + } + + this.activeWindowId = windowId; + } + + async getActiveClientId(): Promise { + const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId; + + return `window:${id}`; + } +} diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index 52c92d45936..5c6facab0a9 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -13,9 +13,7 @@ import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { URI } from 'vs/base/common/uri'; import { Rectangle, BrowserWindow } from 'electron'; -import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; -import { IElectronMainService } from 'vs/platform/electron/electron-main/electronMainService'; +import { IDisposable } from 'vs/base/common/lifecycle'; export interface IWindowState { width?: number; @@ -143,45 +141,3 @@ export interface IOpenConfiguration extends IBaseOpenConfiguration { } export interface IOpenEmptyConfiguration extends IBaseOpenConfiguration { } - -export class ActiveWindowManager extends Disposable { - - private readonly disposables = this._register(new DisposableStore()); - private firstActiveWindowIdPromise: CancelablePromise | undefined; - - private activeWindowId: number | undefined; - - constructor(@IElectronMainService electronService: IElectronMainService) { - super(); - - // remember last active window id upon events - const onActiveWindowChange = Event.latch(Event.any(electronService.onWindowOpen, electronService.onWindowFocus)); - onActiveWindowChange(this.setActiveWindow, this, this.disposables); - - // resolve current active window - this.firstActiveWindowIdPromise = createCancelablePromise(() => electronService.getActiveWindowId(-1)); - (async () => { - try { - const windowId = await this.firstActiveWindowIdPromise; - this.activeWindowId = (typeof this.activeWindowId === 'number') ? this.activeWindowId : windowId; - } finally { - this.firstActiveWindowIdPromise = undefined; - } - })(); - } - - private setActiveWindow(windowId: number | undefined) { - if (this.firstActiveWindowIdPromise) { - this.firstActiveWindowIdPromise.cancel(); - this.firstActiveWindowIdPromise = undefined; - } - - this.activeWindowId = windowId; - } - - async getActiveClientId(): Promise { - const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId; - - return `window:${id}`; - } -} From 81d13e9f731dc23a1b3cbae840a43e32416edf77 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 25 May 2020 14:07:26 +0200 Subject: [PATCH 036/107] sandbox - move menubar service --- src/vs/code/electron-main/app.ts | 9 ++++----- src/vs/platform/menubar/common/menubar.ts | 7 +------ .../menubar/electron-main/menubarMainService.ts | 12 +++++++++--- src/vs/platform/menubar/electron-sandbox/menubar.ts | 13 +++++++++++++ src/vs/workbench/electron-browser/window.ts | 3 ++- .../menubar/electron-sandbox/menubarService.ts | 2 +- 6 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 src/vs/platform/menubar/electron-sandbox/menubar.ts diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 6fcfe1cfd98..cf2cdf9b2ff 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -50,8 +50,7 @@ import { LoggerChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler, onUnexpectedError } from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; -import { IMenubarService } from 'vs/platform/menubar/common/menubar'; -import { MenubarMainService } from 'vs/platform/menubar/electron-main/menubarMainService'; +import { IMenubarMainService, MenubarMainService } from 'vs/platform/menubar/electron-main/menubarMainService'; import { RunOnceScheduler } from 'vs/base/common/async'; import { registerContextMenuListener } from 'vs/base/parts/contextmenu/electron-main/contextmenu'; import { homedir } from 'os'; @@ -474,7 +473,7 @@ export class CodeApplication extends Disposable { services.set(IIssueService, new SyncDescriptor(IssueMainService, [machineId, this.userEnv])); services.set(IElectronMainService, new SyncDescriptor(ElectronMainService)); services.set(IWorkspacesService, new SyncDescriptor(WorkspacesService)); - services.set(IMenubarService, new SyncDescriptor(MenubarMainService)); + services.set(IMenubarMainService, new SyncDescriptor(MenubarMainService)); const storageMainService = new StorageMainService(this.logService, this.environmentService); services.set(IStorageMainService, storageMainService); @@ -572,8 +571,8 @@ export class CodeApplication extends Disposable { const workspacesChannel = createChannelReceiver(workspacesService); electronIpcServer.registerChannel('workspaces', workspacesChannel); - const menubarService = accessor.get(IMenubarService); - const menubarChannel = createChannelReceiver(menubarService); + const menubarMainService = accessor.get(IMenubarMainService); + const menubarChannel = createChannelReceiver(menubarMainService); electronIpcServer.registerChannel('menubar', menubarChannel); const urlService = accessor.get(IURLService); diff --git a/src/vs/platform/menubar/common/menubar.ts b/src/vs/platform/menubar/common/menubar.ts index db246d1b487..69b74dfbe33 100644 --- a/src/vs/platform/menubar/common/menubar.ts +++ b/src/vs/platform/menubar/common/menubar.ts @@ -3,14 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; -export const IMenubarService = createDecorator('menubarService'); - -export interface IMenubarService { - _serviceBrand: undefined; - +export interface ICommonMenubarService { updateMenubar(windowId: number, menuData: IMenubarData): Promise; } diff --git a/src/vs/platform/menubar/electron-main/menubarMainService.ts b/src/vs/platform/menubar/electron-main/menubarMainService.ts index f38655ffef5..243bc205d7b 100644 --- a/src/vs/platform/menubar/electron-main/menubarMainService.ts +++ b/src/vs/platform/menubar/electron-main/menubarMainService.ts @@ -3,13 +3,19 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IMenubarService, IMenubarData } from 'vs/platform/menubar/common/menubar'; +import { ICommonMenubarService, IMenubarData } from 'vs/platform/menubar/common/menubar'; import { Menubar } from 'vs/platform/menubar/electron-main/menubar'; import { ILogService } from 'vs/platform/log/common/log'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; -export class MenubarMainService implements IMenubarService { +export const IMenubarMainService = createDecorator('menubarMainService'); + +export interface IMenubarMainService extends ICommonMenubarService { + _serviceBrand: undefined; +} + +export class MenubarMainService implements IMenubarMainService { _serviceBrand: undefined; diff --git a/src/vs/platform/menubar/electron-sandbox/menubar.ts b/src/vs/platform/menubar/electron-sandbox/menubar.ts new file mode 100644 index 00000000000..51ef554c932 --- /dev/null +++ b/src/vs/platform/menubar/electron-sandbox/menubar.ts @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { ICommonMenubarService } from 'vs/platform/menubar/common/menubar'; + +export const IMenubarService = createDecorator('menubarService'); + +export interface IMenubarService extends ICommonMenubarService { + _serviceBrand: undefined; +} diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 00a2eb68b5e..6f9ab62f25e 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -50,7 +50,8 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IUpdateService } from 'vs/platform/update/common/update'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IPreferencesService } from '../services/preferences/common/preferences'; -import { IMenubarService, IMenubarData, IMenubarMenu, IMenubarKeybinding, IMenubarMenuItemSubmenu, IMenubarMenuItemAction, MenubarMenuItem } from 'vs/platform/menubar/common/menubar'; +import { IMenubarData, IMenubarMenu, IMenubarKeybinding, IMenubarMenuItemSubmenu, IMenubarMenuItemAction, MenubarMenuItem } from 'vs/platform/menubar/common/menubar'; +import { IMenubarService } from 'vs/platform/menubar/electron-sandbox/menubar'; import { withNullAsUndefined, assertIsDefined } from 'vs/base/common/types'; import { IOpenerService, OpenOptions } from 'vs/platform/opener/common/opener'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts index 08a36faec0a..443e6b97e95 100644 --- a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts +++ b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IMenubarService } from 'vs/platform/menubar/common/menubar'; +import { IMenubarService } from 'vs/platform/menubar/electron-sandbox/menubar'; import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; From 45552c0a2d406917e153734bdb0c7b423f5c4a55 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 08:12:09 +0200 Subject: [PATCH 037/107] sandbox - reduce clipboard dependencies in renderer --- .../test/electron-sandbox/globals.test.ts | 15 +++++ .../issue/issueReporterMain.ts | 10 +++- src/vs/editor/contrib/find/findController.ts | 4 +- .../clipboard/browser/clipboardService.ts | 58 +++++++++++++------ .../clipboard/common/clipboardService.ts | 23 +++++--- src/vs/platform/electron/common/electron.ts | 9 +++ .../electron-main/electronMainService.ts | 35 ++++++++++- .../electron/electron-sandbox/electron.ts | 22 +++++++ .../files/browser/fileActions.contribution.ts | 4 +- .../contrib/files/browser/fileActions.ts | 12 ++-- .../files/browser/views/explorerView.ts | 4 +- .../contrib/files/common/explorerService.ts | 4 +- .../workbench/contrib/files/common/files.ts | 2 +- .../contrib/search/browser/searchWidget.ts | 8 +-- .../electron-browser/desktop.main.ts | 3 +- .../electron-browser/clipboardService.ts | 57 ++++++++++++------ .../electron-sandbox/electronService.ts | 28 --------- .../electron-browser/workbenchTestServices.ts | 8 +++ test/unit/browser/index.js | 2 +- test/unit/electron/index.js | 3 +- 20 files changed, 213 insertions(+), 98 deletions(-) create mode 100644 src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts delete mode 100644 src/vs/workbench/services/electron/electron-sandbox/electronService.ts diff --git a/src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts b/src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts new file mode 100644 index 00000000000..ac3e6511710 --- /dev/null +++ b/src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { ipcRenderer, crashReporter, webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; + +suite('Sandbox', () => { + test('globals', () => { + assert.ok(ipcRenderer); + assert.ok(crashReporter); + assert.ok(webFrame); + }); +}); diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 78f75975fd3..06797ea956c 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/issueReporter'; -import { clipboard } from 'electron'; +import { ElectronService, IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { ipcRenderer, webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import * as os from 'os'; import * as browser from 'vs/base/browser/browser'; @@ -64,6 +64,7 @@ export function startup(configuration: IssueReporterConfiguration) { export class IssueReporter extends Disposable { private environmentService!: INativeEnvironmentService; + private electronService!: IElectronService; private telemetryService!: ITelemetryService; private logService!: ILogService; private readonly issueReporterModel: IssueReporterModel; @@ -324,6 +325,9 @@ export class IssueReporter extends Disposable { const mainProcessService = new MainProcessService(configuration.windowId); serviceCollection.set(IMainProcessService, mainProcessService); + this.electronService = new ElectronService(configuration.windowId, mainProcessService) as IElectronService; + serviceCollection.set(IElectronService, this.electronService); + this.environmentService = new EnvironmentService(configuration, configuration.execPath); const logService = new SpdLogService(`issuereporter${configuration.windowId}`, this.environmentService.logsPath, getLogLevel(this.environmentService)); @@ -941,9 +945,9 @@ export class IssueReporter extends Disposable { private async writeToClipboard(baseUrl: string, issueBody: string): Promise { return new Promise((resolve, reject) => { - ipcRenderer.once('vscode:issueReporterClipboardResponse', (_: unknown, shouldWrite: boolean) => { + ipcRenderer.once('vscode:issueReporterClipboardResponse', async (event: unknown, shouldWrite: boolean) => { if (shouldWrite) { - clipboard.writeText(issueBody); + await this.electronService.writeClipboardText(issueBody); resolve(baseUrl + `&body=${encodeURIComponent(localize('pasteData', "We have written the needed data into your clipboard because it was too large to send. Please paste."))}`); } else { reject(); diff --git a/src/vs/editor/contrib/find/findController.ts b/src/vs/editor/contrib/find/findController.ts index b22036d6b2f..8d2f6668924 100644 --- a/src/vs/editor/contrib/find/findController.ts +++ b/src/vs/editor/contrib/find/findController.ts @@ -359,7 +359,7 @@ export class CommonFindController extends Disposable implements IEditorContribut && this._editor.hasModel() && !this._editor.getModel().isTooLargeForSyncing() ) { - return this._clipboardService.readFindText(); + return this._clipboardService.readFindTextSync(); } return ''; } @@ -370,7 +370,7 @@ export class CommonFindController extends Disposable implements IEditorContribut && this._editor.hasModel() && !this._editor.getModel().isTooLargeForSyncing() ) { - this._clipboardService.writeFindText(text); + this._clipboardService.writeFindTextSync(text); } } } diff --git a/src/vs/platform/clipboard/browser/clipboardService.ts b/src/vs/platform/clipboard/browser/clipboardService.ts index 8cbddd37004..85855d06dd8 100644 --- a/src/vs/platform/clipboard/browser/clipboardService.ts +++ b/src/vs/platform/clipboard/browser/clipboardService.ts @@ -11,11 +11,15 @@ export class BrowserClipboardService implements IClipboardService { _serviceBrand: undefined; - private _internalResourcesClipboard: URI[] | undefined; + private readonly mapTextToType = new Map(); // unsupported in web (only in-memory) async writeText(text: string, type?: string): Promise { + + // With type: only in-memory is supported if (type) { - return; // TODO@sbatten support for writing a specific type into clipboard is unsupported + this.mapTextToType.set(type, text); + + return; } // Guard access to navigator.clipboard with try/catch @@ -52,8 +56,10 @@ export class BrowserClipboardService implements IClipboardService { } async readText(type?: string): Promise { + + // With type: only in-memory is supported if (type) { - return ''; // TODO@sbatten support for reading a specific type from clipboard is unsupported + return this.mapTextToType.get(type) || ''; } // Guard access to navigator.clipboard with try/catch @@ -68,26 +74,42 @@ export class BrowserClipboardService implements IClipboardService { } } + private findText = ''; // unsupported in web (only in-memory) + + async readFindText(): Promise { + return this.findText; + } + + async writeFindText(text: string): Promise { + this.findText = text; + } + + private resources: URI[] = []; // unsupported in web (only in-memory) + + async writeResources(resources: URI[]): Promise { + this.resources = resources; + } + + async readResources(): Promise { + return this.resources; + } + + async hasResources(): Promise { + return this.resources.length > 0; + } + + /** @deprecated */ readTextSync(): string | undefined { return undefined; } - readFindText(): string { - // @ts-expect-error - return undefined; + /** @deprecated */ + readFindTextSync(): string { + return this.findText; } - writeFindText(text: string): void { } - - writeResources(resources: URI[]): void { - this._internalResourcesClipboard = resources; - } - - readResources(): URI[] { - return this._internalResourcesClipboard || []; - } - - hasResources(): boolean { - return this._internalResourcesClipboard !== undefined && this._internalResourcesClipboard.length > 0; + /** @deprecated */ + writeFindTextSync(text: string): void { + this.findText = text; } } diff --git a/src/vs/platform/clipboard/common/clipboardService.ts b/src/vs/platform/clipboard/common/clipboardService.ts index 06db15745b7..73cc53f0ae2 100644 --- a/src/vs/platform/clipboard/common/clipboardService.ts +++ b/src/vs/platform/clipboard/common/clipboardService.ts @@ -22,31 +22,38 @@ export interface IClipboardService { */ readText(type?: string): Promise; - /** @deprecated */ - readTextSync(): string | undefined; - /** * Reads text from the system find pasteboard. */ - readFindText(): string; + readFindText(): Promise; /** * Writes text to the system find pasteboard. */ - writeFindText(text: string): void; + writeFindText(text: string): Promise; /** * Writes resources to the system clipboard. */ - writeResources(resources: URI[]): void; + writeResources(resources: URI[]): Promise; /** * Reads resources from the system clipboard. */ - readResources(): URI[]; + readResources(): Promise; /** * Find out if resources are copied to the clipboard. */ - hasResources(): boolean; + hasResources(): Promise; + + + /** @deprecated */ + readTextSync(): string | undefined; + + /** @deprecated */ + readFindTextSync(): string; + + /** @deprecated */ + writeFindTextSync(text: string): void; } diff --git a/src/vs/platform/electron/common/electron.ts b/src/vs/platform/electron/common/electron.ts index ae1243e1b7f..506bfb5af27 100644 --- a/src/vs/platform/electron/common/electron.ts +++ b/src/vs/platform/electron/common/electron.ts @@ -62,6 +62,15 @@ export interface ICommonElectronService { updateTouchBar(items: ISerializableCommandAction[][]): Promise; moveItemToTrash(fullPath: string, deleteOnFail?: boolean): Promise; + // clipboard + readClipboardText(type?: 'selection' | 'clipboard'): Promise; + writeClipboardText(text: string, type?: 'selection' | 'clipboard'): Promise; + readClipboardFindText(): Promise; + writeClipboardFindText(text: string): Promise; + writeClipboardBuffer(format: string, buffer: Uint8Array, type?: 'selection' | 'clipboard'): Promise; + readClipboardBuffer(format: string): Promise; + hasClipboard(format: string, type?: 'selection' | 'clipboard'): Promise; + // macOS Touchbar newWindowTab(): Promise; showPreviousWindowTab(): Promise; diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index c9c5c7dc0a3..f9920a829a7 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; -import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu, BrowserWindow, app } from 'electron'; +import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu, BrowserWindow, app, clipboard } from 'electron'; import { OpenContext } from 'vs/platform/windows/node/window'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IOpenedWindow, INativeOpenWindowOptions, IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; @@ -305,6 +305,39 @@ export class ElectronMainService implements IElectronMainService { //#endregion + + //#region clipboard + + async readClipboardText(windowId: number | undefined, type?: 'selection' | 'clipboard'): Promise { + return clipboard.readText(type); + } + + async writeClipboardText(windowId: number | undefined, text: string, type?: 'selection' | 'clipboard'): Promise { + return clipboard.writeText(text, type); + } + + async readClipboardFindText(windowId: number | undefined,): Promise { + return clipboard.readFindText(); + } + + async writeClipboardFindText(windowId: number | undefined, text: string): Promise { + return clipboard.writeFindText(text); + } + + async writeClipboardBuffer(windowId: number | undefined, format: string, buffer: Uint8Array, type?: 'selection' | 'clipboard'): Promise { + return clipboard.writeBuffer(format, buffer as Buffer, type); + } + + async readClipboardBuffer(windowId: number | undefined, format: string): Promise { + return clipboard.readBuffer(format); + } + + async hasClipboard(windowId: number | undefined, format: string, type?: 'selection' | 'clipboard'): Promise { + return clipboard.has(format, type); + } + + //#endregion + //#region macOS Touchbar async newWindowTab(): Promise { diff --git a/src/vs/platform/electron/electron-sandbox/electron.ts b/src/vs/platform/electron/electron-sandbox/electron.ts index 13626f87a29..aa17d948100 100644 --- a/src/vs/platform/electron/electron-sandbox/electron.ts +++ b/src/vs/platform/electron/electron-sandbox/electron.ts @@ -5,7 +5,29 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ICommonElectronService } from 'vs/platform/electron/common/electron'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; export const IElectronService = createDecorator('electronService'); export interface IElectronService extends ICommonElectronService { } + +export class ElectronService { + + _serviceBrand: undefined; + + constructor( + readonly windowId: number, + @IMainProcessService mainProcessService: IMainProcessService + ) { + return createChannelSender(mainProcessService.getChannel('electron'), { + context: windowId, + properties: (() => { + const properties = new Map(); + properties.set('windowId', windowId); + + return properties; + })() + }); + } +} diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 4ef2a0dd098..b30f36916e5 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -144,9 +144,9 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingWeight.WorkbenchContrib + explorerCommandsWeightBonus, when: ContextKeyExpr.and(FilesExplorerFocusCondition, ExplorerResourceCut), primary: KeyCode.Escape, - handler: (accessor: ServicesAccessor) => { + handler: async (accessor: ServicesAccessor) => { const explorerService = accessor.get(IExplorerService); - explorerService.setToCopy([], true); + await explorerService.setToCopy([], true); } }); diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 2b4911f6fde..21071623023 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -1060,20 +1060,20 @@ export const deleteFileHandler = async (accessor: ServicesAccessor) => { }; let pasteShouldMove = false; -export const copyFileHandler = (accessor: ServicesAccessor) => { +export const copyFileHandler = async (accessor: ServicesAccessor) => { const explorerService = accessor.get(IExplorerService); const stats = explorerService.getContext(true); if (stats.length > 0) { - explorerService.setToCopy(stats, false); + await explorerService.setToCopy(stats, false); pasteShouldMove = false; } }; -export const cutFileHandler = (accessor: ServicesAccessor) => { +export const cutFileHandler = async (accessor: ServicesAccessor) => { const explorerService = accessor.get(IExplorerService); const stats = explorerService.getContext(true); if (stats.length > 0) { - explorerService.setToCopy(stats, true); + await explorerService.setToCopy(stats, true); pasteShouldMove = true; } }; @@ -1140,7 +1140,7 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { const configurationService = accessor.get(IConfigurationService); const context = explorerService.getContext(true); - const toPaste = resources.distinctParents(clipboardService.readResources(), r => r); + const toPaste = resources.distinctParents(await clipboardService.readResources(), r => r); const element = context.length ? context[0] : explorerService.roots[0]; // Check if target is ancestor of pasted folder @@ -1178,7 +1178,7 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { if (pasteShouldMove) { // Cut is done. Make sure to clear cut state. - explorerService.setToCopy([], false); + await explorerService.setToCopy([], false); pasteShouldMove = false; } if (stats.length >= 1) { diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 01e0db2c640..457b02dc588 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -471,7 +471,7 @@ export class ExplorerView extends ViewPane { } } - private onContextMenu(e: ITreeContextMenuEvent): void { + private async onContextMenu(e: ITreeContextMenuEvent): Promise { const disposables = new DisposableStore(); let stat = e.element; let anchor = e.anchor; @@ -490,7 +490,7 @@ export class ExplorerView extends ViewPane { } // update dynamic contexts - this.fileCopiedContextKey.set(this.clipboardService.hasResources()); + this.fileCopiedContextKey.set(await this.clipboardService.hasResources()); this.setContextKeys(stat); const selection = this.tree.getSelection(); diff --git a/src/vs/workbench/contrib/files/common/explorerService.ts b/src/vs/workbench/contrib/files/common/explorerService.ts index a411f52ba7b..616c81daf57 100644 --- a/src/vs/workbench/contrib/files/common/explorerService.ts +++ b/src/vs/workbench/contrib/files/common/explorerService.ts @@ -126,10 +126,10 @@ export class ExplorerService implements IExplorerService { await this.view.setEditable(stat, isEditing); } - setToCopy(items: ExplorerItem[], cut: boolean): void { + async setToCopy(items: ExplorerItem[], cut: boolean): Promise { const previouslyCutItems = this.cutItems; this.cutItems = cut ? items : undefined; - this.clipboardService.writeResources(items.map(s => s.resource)); + await this.clipboardService.writeResources(items.map(s => s.resource)); this.view?.itemsCopied(items, cut, previouslyCutItems); } diff --git a/src/vs/workbench/contrib/files/common/files.ts b/src/vs/workbench/contrib/files/common/files.ts index d9e592b2779..c970d8a04b7 100644 --- a/src/vs/workbench/contrib/files/common/files.ts +++ b/src/vs/workbench/contrib/files/common/files.ts @@ -51,7 +51,7 @@ export interface IExplorerService { isEditable(stat: ExplorerItem | undefined): boolean; findClosest(resource: URI): ExplorerItem | null; refresh(): Promise; - setToCopy(stats: ExplorerItem[], cut: boolean): void; + setToCopy(stats: ExplorerItem[], cut: boolean): Promise; isCut(stat: ExplorerItem): boolean; /** diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index 9c21aabdfdd..65eaa29d085 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -329,12 +329,12 @@ export class SearchWidget extends Widget { })); this.searchInputFocusTracker = this._register(dom.trackFocus(this.searchInput.inputBox.inputElement)); - this._register(this.searchInputFocusTracker.onDidFocus(() => { + this._register(this.searchInputFocusTracker.onDidFocus(async () => { this.searchInputBoxFocused.set(true); const useGlobalFindBuffer = this.searchConfiguration.globalFindClipboard; if (!this.ignoreGlobalFindBufferOnNextFocus && useGlobalFindBuffer) { - const globalBufferText = this.clipboardServce.readFindText(); + const globalBufferText = await this.clipboardServce.readFindText(); if (this.previousGlobalFindBufferValue !== globalBufferText) { this.searchInput.inputBox.addToHistory(); this.searchInput.setValue(globalBufferText); @@ -614,7 +614,7 @@ export class SearchWidget extends Widget { } } - private submitSearch(triggeredOnType = false, delay: number = 0): void { + private async submitSearch(triggeredOnType = false, delay: number = 0): Promise { this.searchInput.validate(); if (!this.searchInput.inputBox.isInputValid()) { return; @@ -623,7 +623,7 @@ export class SearchWidget extends Widget { const value = this.searchInput.getValue(); const useGlobalFindBuffer = this.searchConfiguration.globalFindClipboard; if (value && useGlobalFindBuffer) { - this.clipboardServce.writeFindText(value); + await this.clipboardServce.writeFindText(value); } this._onSearchSubmit.fire({ triggeredOnType, delay }); } diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 4f7686c0be4..e180d652ea9 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -49,8 +49,7 @@ import product from 'vs/platform/product/common/product'; import { NativeResourceIdentityService } from 'vs/platform/resource/node/resourceIdentityServiceImpl'; import { IResourceIdentityService } from 'vs/platform/resource/common/resourceIdentityService'; import { DesktopLogService } from 'vs/workbench/services/log/electron-browser/logService'; -import { ElectronService } from 'vs/workbench/services/electron/electron-sandbox/electronService'; -import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; +import { IElectronService, ElectronService } from 'vs/platform/electron/electron-sandbox/electron'; class DesktopMain extends Disposable { diff --git a/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts b/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts index 623385c0a79..8e19430639c 100644 --- a/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts +++ b/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts @@ -8,6 +8,7 @@ import { clipboard } from 'electron'; import { URI } from 'vs/base/common/uri'; import { isMacintosh } from 'vs/base/common/platform'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; export class NativeClipboardService implements IClipboardService { @@ -15,51 +16,52 @@ export class NativeClipboardService implements IClipboardService { _serviceBrand: undefined; + constructor( + @IElectronService private readonly electronService: IElectronService + ) { } + async writeText(text: string, type?: 'selection' | 'clipboard'): Promise { - clipboard.writeText(text, type); + return this.electronService.writeClipboardText(text, type); } async readText(type?: 'selection' | 'clipboard'): Promise { - return clipboard.readText(type); + return this.electronService.readClipboardText(type); } - readTextSync(): string { - return clipboard.readText(); - } - - readFindText(): string { + async readFindText(): Promise { if (isMacintosh) { - return clipboard.readFindText(); + return this.electronService.readClipboardFindText(); } return ''; } - writeFindText(text: string): void { + async writeFindText(text: string): Promise { if (isMacintosh) { - clipboard.writeFindText(text); + return this.electronService.writeClipboardFindText(text); } } - writeResources(resources: URI[]): void { + async writeResources(resources: URI[]): Promise { if (resources.length) { - clipboard.writeBuffer(NativeClipboardService.FILE_FORMAT, this.resourcesToBuffer(resources)); + return this.electronService.writeClipboardBuffer(NativeClipboardService.FILE_FORMAT, this.resourcesToBuffer(resources)); } } - readResources(): URI[] { - return this.bufferToResources(clipboard.readBuffer(NativeClipboardService.FILE_FORMAT)); + async readResources(): Promise { + return this.bufferToResources(await this.electronService.readClipboardBuffer(NativeClipboardService.FILE_FORMAT)); } - hasResources(): boolean { - return clipboard.has(NativeClipboardService.FILE_FORMAT); + + async hasResources(): Promise { + return this.electronService.hasClipboard(NativeClipboardService.FILE_FORMAT); } private resourcesToBuffer(resources: URI[]): Buffer { return Buffer.from(resources.map(r => r.toString()).join('\n')); } - private bufferToResources(buffer: Buffer): URI[] { + private bufferToResources(buffer: Uint8Array): URI[] { if (!buffer) { return []; } @@ -75,6 +77,27 @@ export class NativeClipboardService implements IClipboardService { return []; // do not trust clipboard data } } + + /** @deprecated */ + readTextSync(): string { + return clipboard.readText(); + } + + /** @deprecated */ + readFindTextSync(): string { + if (isMacintosh) { + return clipboard.readFindText(); + } + + return ''; + } + + /** @deprecated */ + writeFindTextSync(text: string): void { + if (isMacintosh) { + clipboard.writeFindText(text); + } + } } registerSingleton(IClipboardService, NativeClipboardService, true); diff --git a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts b/src/vs/workbench/services/electron/electron-sandbox/electronService.ts deleted file mode 100644 index 15c9aeb4806..00000000000 --- a/src/vs/workbench/services/electron/electron-sandbox/electronService.ts +++ /dev/null @@ -1,28 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; -import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; -import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; - -export class ElectronService { - - _serviceBrand: undefined; - - constructor( - readonly windowId: number, - @IMainProcessService mainProcessService: IMainProcessService - ) { - return createChannelSender(mainProcessService.getChannel('electron'), { - context: windowId, - properties: (() => { - const properties = new Map(); - properties.set('windowId', windowId); - - return properties; - })() - }); - } -} diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 4854872156b..f5f61e1272d 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -160,6 +160,7 @@ export class TestSharedProcessService implements ISharedProcessService { } export class TestElectronService implements IElectronService { + _serviceBrand: undefined; readonly windowId = -1; @@ -217,6 +218,13 @@ export class TestElectronService implements IElectronService { async toggleDevTools(): Promise { } async startCrashReporter(options: Electron.CrashReporterStartOptions): Promise { } async resolveProxy(url: string): Promise { return undefined; } + async readClipboardText(type?: 'selection' | 'clipboard' | undefined): Promise { return ''; } + async writeClipboardText(text: string, type?: 'selection' | 'clipboard' | undefined): Promise { } + async readClipboardFindText(): Promise { return ''; } + async writeClipboardFindText(text: string): Promise { } + async writeClipboardBuffer(format: string, buffer: Uint8Array, type?: 'selection' | 'clipboard' | undefined): Promise { } + async readClipboardBuffer(format: string): Promise { return Uint8Array.from([]); } + async hasClipboard(format: string, type?: 'selection' | 'clipboard' | undefined): Promise { return false; } } export function workbenchInstantiationService(): ITestInstantiationService { diff --git a/test/unit/browser/index.js b/test/unit/browser/index.js index 71514111a10..926d96f6352 100644 --- a/test/unit/browser/index.js +++ b/test/unit/browser/index.js @@ -72,7 +72,7 @@ function ensureIsArray(a) { const testModules = (async function () { - const excludeGlob = '**/{node,electron-browser,electron-main}/**/*.test.js'; + const excludeGlob = '**/{node,electron-sandbox,electron-browser,electron-main}/**/*.test.js'; let isDefaultModules = true; let promise; diff --git a/test/unit/electron/index.js b/test/unit/electron/index.js index b72b59a91e9..363579df477 100644 --- a/test/unit/electron/index.js +++ b/test/unit/electron/index.js @@ -116,7 +116,8 @@ app.on('ready', () => { nodeIntegration: true, webSecurity: false, webviewTag: true, - enableWebSQL: false + enableWebSQL: false, + preload: path.join(__dirname, '..', '..', '..', 'src', 'vs', 'base', 'parts', 'sandbox', 'electron-browser', 'preload.js') // ensure similar environment as VSCode as tests may depend on this } }); From 58186544a3a9ded91919ba0d830e6dd8b466970b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 08:33:00 +0200 Subject: [PATCH 038/107] sandbox - move more services to electron-sandbox --- .../electron-sandbox/parts/titlebar/titlebarPart.ts | 4 ---- .../extensionResourceLoaderService.ts | 0 .../desktopHostService.ts | 3 +-- .../requestService.ts | 0 .../test/electron-browser/tokenStyleResolving.test.ts | 2 +- .../services/title/electron-sandbox/titleService.ts | 10 ++++++++++ src/vs/workbench/workbench.desktop.main.ts | 3 --- src/vs/workbench/workbench.sandbox.main.ts | 5 ++++- 8 files changed, 16 insertions(+), 11 deletions(-) rename src/vs/workbench/services/extensionResourceLoader/{electron-browser => electron-sandbox}/extensionResourceLoaderService.ts (100%) rename src/vs/workbench/services/host/{electron-browser => electron-sandbox}/desktopHostService.ts (95%) rename src/vs/workbench/services/request/{electron-browser => electron-sandbox}/requestService.ts (100%) create mode 100644 src/vs/workbench/services/title/electron-sandbox/titleService.ts diff --git a/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts index 683e63c6776..2753d07ac5b 100644 --- a/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts @@ -24,8 +24,6 @@ import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron import { getTitleBarStyle } from 'vs/platform/windows/common/windows'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Codicon } from 'vs/base/common/codicons'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ITitleService } from 'vs/workbench/services/title/common/titleService'; export class TitlebarPart extends BrowserTitleBarPart { private appIcon: HTMLElement | undefined; @@ -243,5 +241,3 @@ export class TitlebarPart extends BrowserTitleBarPart { } } } - -registerSingleton(ITitleService, TitlebarPart); diff --git a/src/vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService.ts b/src/vs/workbench/services/extensionResourceLoader/electron-sandbox/extensionResourceLoaderService.ts similarity index 100% rename from src/vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService.ts rename to src/vs/workbench/services/extensionResourceLoader/electron-sandbox/extensionResourceLoaderService.ts diff --git a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts b/src/vs/workbench/services/host/electron-sandbox/desktopHostService.ts similarity index 95% rename from src/vs/workbench/services/host/electron-browser/desktopHostService.ts rename to src/vs/workbench/services/host/electron-sandbox/desktopHostService.ts index 0a42ff5ec1e..c49a1d38043 100644 --- a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts +++ b/src/vs/workbench/services/host/electron-sandbox/desktopHostService.ts @@ -11,7 +11,6 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWindowOpenable, IOpenWindowOptions, isFolderToOpen, isWorkspaceToOpen, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; import { Disposable } from 'vs/base/common/lifecycle'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; export class DesktopHostService extends Disposable implements IHostService { @@ -20,7 +19,7 @@ export class DesktopHostService extends Disposable implements IHostService { constructor( @IElectronService private readonly electronService: IElectronService, @ILabelService private readonly labelService: ILabelService, - @IWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService ) { super(); } diff --git a/src/vs/workbench/services/request/electron-browser/requestService.ts b/src/vs/workbench/services/request/electron-sandbox/requestService.ts similarity index 100% rename from src/vs/workbench/services/request/electron-browser/requestService.ts rename to src/vs/workbench/services/request/electron-sandbox/requestService.ts diff --git a/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts b/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts index 15422f0975f..07d9b97cbb6 100644 --- a/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts +++ b/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts @@ -15,7 +15,7 @@ import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemPro import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; import { getPathFromAmdModule } from 'vs/base/common/amd'; -import { ExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService'; +import { ExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/electron-sandbox/extensionResourceLoaderService'; import { ITokenStyle } from 'vs/platform/theme/common/themeService'; const undefinedStyle = { bold: undefined, underline: undefined, italic: undefined }; diff --git a/src/vs/workbench/services/title/electron-sandbox/titleService.ts b/src/vs/workbench/services/title/electron-sandbox/titleService.ts new file mode 100644 index 00000000000..d19614e0e48 --- /dev/null +++ b/src/vs/workbench/services/title/electron-sandbox/titleService.ts @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { TitlebarPart } from 'vs/workbench/browser/parts/titlebar/titlebarPart'; +import { ITitleService } from 'vs/workbench/services/title/common/titleService'; + +registerSingleton(ITitleService, TitlebarPart); diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 8cbac1542aa..012228b6b84 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -59,12 +59,9 @@ import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncMachines import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncService'; import 'vs/workbench/services/authentication/electron-browser/authenticationTokenService'; import 'vs/workbench/services/authentication/browser/authenticationService'; -import 'vs/workbench/services/host/electron-browser/desktopHostService'; -import 'vs/workbench/services/request/electron-browser/requestService'; import 'vs/workbench/services/sharedProcess/electron-browser/sharedProcessService'; import 'vs/workbench/services/localizations/electron-browser/localizationsService'; import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; -import 'vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService'; import 'vs/workbench/services/path/electron-browser/pathService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index c2c74830e91..2e75b2c1016 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -26,7 +26,10 @@ import 'vs/workbench/services/issue/electron-sandbox/issueService'; import 'vs/workbench/services/update/electron-sandbox/updateService'; import 'vs/workbench/services/url/electron-sandbox/urlService'; import 'vs/workbench/services/lifecycle/electron-sandbox/lifecycleService'; -import 'vs/workbench/electron-sandbox/parts/titlebar/titlebarPart'; +import 'vs/workbench/services/title/electron-sandbox/titleService.ts'; +import 'vs/workbench/services/host/electron-sandbox/desktopHostService'; +import 'vs/workbench/services/request/electron-sandbox/requestService'; +import 'vs/workbench/services/extensionResourceLoader/electron-sandbox/extensionResourceLoaderService'; //#endregion From 3c4820c794c2310ff16fd58470448b0c1f223da0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 09:07:12 +0200 Subject: [PATCH 039/107] sandbox - move more things around --- src/vs/platform/environment/node/argvHelper.ts | 2 +- src/vs/platform/files/common/files.ts | 7 ++++++- src/vs/platform/files/node/files.ts | 7 ------- .../files.contribution.ts | 11 +---------- .../textFileEditor.ts | 3 +-- .../telemetryOptOut.contribution.ts | 2 +- .../telemetryOptOut.ts | 0 src/vs/workbench/workbench.desktop.main.ts | 9 --------- src/vs/workbench/workbench.sandbox.main.ts | 9 ++++++++- 9 files changed, 18 insertions(+), 32 deletions(-) delete mode 100644 src/vs/platform/files/node/files.ts rename src/vs/workbench/contrib/files/{electron-browser => electron-sandbox}/files.contribution.ts (76%) rename src/vs/workbench/contrib/files/{electron-browser => electron-sandbox}/textFileEditor.ts (95%) rename src/vs/workbench/contrib/welcome/telemetryOptOut/{electron-browser => electron-sandbox}/telemetryOptOut.contribution.ts (93%) rename src/vs/workbench/contrib/welcome/telemetryOptOut/{electron-browser => electron-sandbox}/telemetryOptOut.ts (100%) diff --git a/src/vs/platform/environment/node/argvHelper.ts b/src/vs/platform/environment/node/argvHelper.ts index 11e54c68b8a..eda11907549 100644 --- a/src/vs/platform/environment/node/argvHelper.ts +++ b/src/vs/platform/environment/node/argvHelper.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { firstIndex } from 'vs/base/common/arrays'; import { localize } from 'vs/nls'; -import { MIN_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/node/files'; +import { MIN_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/common/files'; import { parseArgs, ErrorReporter, OPTIONS, ParsedArgs } from 'vs/platform/environment/node/argv'; function parseAndValidate(cmdLineArgs: string[], reportWarnings: boolean): ParsedArgs { diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 7438ec84efe..058deff7c26 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -824,7 +824,6 @@ export function etag(stat: { mtime: number | undefined, size: number | undefined return stat.mtime.toString(29) + stat.size.toString(31); } - export function whenProviderRegistered(file: URI, fileService: IFileService): Promise { if (fileService.canHandleResource(URI.from({ scheme: file.scheme }))) { return Promise.resolve(); @@ -838,3 +837,9 @@ export function whenProviderRegistered(file: URI, fileService: IFileService): Pr }); }); } + +/** + * Desktop only: limits for memory sizes + */ +export const MIN_MAX_MEMORY_SIZE_MB = 2048; +export const FALLBACK_MAX_MEMORY_SIZE_MB = 4096; diff --git a/src/vs/platform/files/node/files.ts b/src/vs/platform/files/node/files.ts deleted file mode 100644 index bbb85376228..00000000000 --- a/src/vs/platform/files/node/files.ts +++ /dev/null @@ -1,7 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -export const MIN_MAX_MEMORY_SIZE_MB = 2048; -export const FALLBACK_MAX_MEMORY_SIZE_MB = 4096; diff --git a/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts b/src/vs/workbench/contrib/files/electron-sandbox/files.contribution.ts similarity index 76% rename from src/vs/workbench/contrib/files/electron-browser/files.contribution.ts rename to src/vs/workbench/contrib/files/electron-sandbox/files.contribution.ts index 737eeea2d5c..3f6524d0f64 100644 --- a/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-sandbox/files.contribution.ts @@ -3,17 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as os from 'os'; -import * as fs from 'fs'; import * as nls from 'vs/nls'; -import { join } from 'vs/base/common/path'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorInput } from 'vs/workbench/common/editor'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; -import { NativeTextFileEditor } from 'vs/workbench/contrib/files/electron-browser/textFileEditor'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { NativeTextFileEditor } from 'vs/workbench/contrib/files/electron-sandbox/textFileEditor'; // Register file editor Registry.as(EditorExtensions.Editors).registerEditor( @@ -26,8 +22,3 @@ Registry.as(EditorExtensions.Editors).registerEditor( new SyncDescriptor(FileEditorInput) ] ); - -// Register mkdtemp command -CommandsRegistry.registerCommand('mkdtemp', function () { - return fs.promises.mkdtemp(join(os.tmpdir(), 'vscodetmp-')); -}); diff --git a/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts b/src/vs/workbench/contrib/files/electron-sandbox/textFileEditor.ts similarity index 95% rename from src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts rename to src/vs/workbench/contrib/files/electron-sandbox/textFileEditor.ts index c495a1e1a58..b5e50bd3c54 100644 --- a/src/vs/workbench/contrib/files/electron-browser/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/electron-sandbox/textFileEditor.ts @@ -7,8 +7,7 @@ import * as nls from 'vs/nls'; import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textFileEditor'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files'; -import { MIN_MAX_MEMORY_SIZE_MB, FALLBACK_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/node/files'; +import { FileOperationError, FileOperationResult, IFileService, MIN_MAX_MEMORY_SIZE_MB, FALLBACK_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/common/files'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { Action } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.contribution.ts b/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-sandbox/telemetryOptOut.contribution.ts similarity index 93% rename from src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.contribution.ts rename to src/vs/workbench/contrib/welcome/telemetryOptOut/electron-sandbox/telemetryOptOut.contribution.ts index 44b1e266005..5c4f1ccf06e 100644 --- a/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.contribution.ts +++ b/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-sandbox/telemetryOptOut.contribution.ts @@ -6,6 +6,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { NativeTelemetryOptOut } from 'vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut'; +import { NativeTelemetryOptOut } from 'vs/workbench/contrib/welcome/telemetryOptOut/electron-sandbox/telemetryOptOut'; Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(NativeTelemetryOptOut, LifecyclePhase.Eventually); diff --git a/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-sandbox/telemetryOptOut.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.ts rename to src/vs/workbench/contrib/welcome/telemetryOptOut/electron-sandbox/telemetryOptOut.ts diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 012228b6b84..cb270d205c5 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -78,9 +78,6 @@ registerSingleton(IUserDataAutoSyncService, UserDataAutoSyncService); //#region --- workbench contributions -// Localizations -import 'vs/workbench/contrib/localizations/browser/localizations.contribution'; - // Logs import 'vs/workbench/contrib/logs/electron-browser/logs.contribution'; @@ -91,9 +88,6 @@ import 'vs/workbench/contrib/tags/electron-browser/tags.contribution'; // Rapid Render Splash import 'vs/workbench/contrib/splash/electron-browser/partsSplash.contribution'; -// Explorer -import 'vs/workbench/contrib/files/electron-browser/files.contribution'; - // Debug import 'vs/workbench/contrib/debug/node/debugHelperService'; @@ -136,9 +130,6 @@ import 'vs/workbench/contrib/tasks/electron-browser/taskService'; // User Data Sync import 'vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution'; -// Telemetry Opt Out -import 'vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut.contribution'; - // Configuration Exporter import 'vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper.contribution'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 2e75b2c1016..dd514a58ff6 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -26,7 +26,7 @@ import 'vs/workbench/services/issue/electron-sandbox/issueService'; import 'vs/workbench/services/update/electron-sandbox/updateService'; import 'vs/workbench/services/url/electron-sandbox/urlService'; import 'vs/workbench/services/lifecycle/electron-sandbox/lifecycleService'; -import 'vs/workbench/services/title/electron-sandbox/titleService.ts'; +import 'vs/workbench/services/title/electron-sandbox/titleService'; import 'vs/workbench/services/host/electron-sandbox/desktopHostService'; import 'vs/workbench/services/request/electron-sandbox/requestService'; import 'vs/workbench/services/extensionResourceLoader/electron-sandbox/extensionResourceLoaderService'; @@ -36,10 +36,14 @@ import 'vs/workbench/services/extensionResourceLoader/electron-sandbox/extension //#region --- workbench contributions +// Localizations +import 'vs/workbench/contrib/localizations/browser/localizations.contribution'; + // Desktop import 'vs/workbench/electron-sandbox/desktop.contribution'; // Explorer +import 'vs/workbench/contrib/files/electron-sandbox/files.contribution'; import 'vs/workbench/contrib/files/electron-sandbox/fileActions.contribution'; // Backup @@ -51,4 +55,7 @@ import 'vs/workbench/contrib/codeEditor/electron-sandbox/codeEditor.contribution // Debug import 'vs/workbench/contrib/debug/electron-sandbox/extensionHostDebugService'; +// Telemetry Opt Out +import 'vs/workbench/contrib/welcome/telemetryOptOut/electron-sandbox/telemetryOptOut.contribution'; + //#endregion From 54faf8ea41134c6382f77d12fed521b7d561c33b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 10:07:50 +0200 Subject: [PATCH 040/107] debt - remove unused services --- .../api/browser/mainThreadFileSystemEventService.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts index d88424433fb..aec20a76da9 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts @@ -8,12 +8,9 @@ import { FileChangeType, IFileService, FileOperation } from 'vs/platform/files/c import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, FileSystemEvents, IExtHostContext } from '../common/extHost.protocol'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IProgressService } from 'vs/platform/progress/common/progress'; import { localize } from 'vs/nls'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ILogService } from 'vs/platform/log/common/log'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; @extHostCustomer @@ -25,9 +22,6 @@ export class MainThreadFileSystemEventService { extHostContext: IExtHostContext, @IFileService fileService: IFileService, @ITextFileService textFileService: ITextFileService, - @IProgressService progressService: IProgressService, - @IConfigurationService configService: IConfigurationService, - @ILogService logService: ILogService, @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService ) { From 0155d41405fd86c7195bfc73cf6c30fc981c23a8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 10:48:01 +0200 Subject: [PATCH 041/107] web - support to open a file on a line --- src/vs/base/common/extpath.ts | 36 ++++++++++++++++ src/vs/base/test/common/extpath.test.ts | 37 +++++++++++++++++ src/vs/code/node/paths.ts | 41 ++----------------- src/vs/platform/windows/common/windows.ts | 3 ++ .../electron-main/windowsMainService.ts | 3 +- .../environment/browser/environmentService.ts | 16 +++++++- .../host/browser/browserHostService.ts | 28 ++++++++++--- 7 files changed, 118 insertions(+), 46 deletions(-) diff --git a/src/vs/base/common/extpath.ts b/src/vs/base/common/extpath.ts index e064829c5a0..8fe9f9e1c2a 100644 --- a/src/vs/base/common/extpath.ts +++ b/src/vs/base/common/extpath.ts @@ -7,6 +7,7 @@ import { isWindows } from 'vs/base/common/platform'; import { startsWithIgnoreCase, equalsIgnoreCase, rtrim } from 'vs/base/common/strings'; import { CharCode } from 'vs/base/common/charCode'; import { sep, posix, isAbsolute, join, normalize } from 'vs/base/common/path'; +import { isNumber } from 'vs/base/common/types'; export function isPathSeparator(code: number) { return code === CharCode.Slash || code === CharCode.Backslash; @@ -300,3 +301,38 @@ export function indexOfPath(path: string, candidate: string, ignoreCase: boolean return path.indexOf(candidate); } + +export interface IPathWithLineAndColumn { + path: string; + line?: number; + column?: number; +} + +export function parseLineAndColumnAware(rawPath: string): IPathWithLineAndColumn { + const segments = rawPath.split(':'); // C:\file.txt:: + + let path: string | undefined = undefined; + let line: number | undefined = undefined; + let column: number | undefined = undefined; + + segments.forEach(segment => { + const segmentAsNumber = Number(segment); + if (!isNumber(segmentAsNumber)) { + path = !!path ? [path, segment].join(':') : segment; // a colon can well be part of a path (e.g. C:\...) + } else if (line === undefined) { + line = segmentAsNumber; + } else if (column === undefined) { + column = segmentAsNumber; + } + }); + + if (!path) { + throw new Error('Format for `--goto` should be: `FILE:LINE(:COLUMN)`'); + } + + return { + path, + line: line !== undefined ? line : undefined, + column: column !== undefined ? column : line !== undefined ? 1 : undefined // if we have a line, make sure column is also set + }; +} diff --git a/src/vs/base/test/common/extpath.test.ts b/src/vs/base/test/common/extpath.test.ts index 02aa3a96377..0760e2c8b91 100644 --- a/src/vs/base/test/common/extpath.test.ts +++ b/src/vs/base/test/common/extpath.test.ts @@ -130,4 +130,41 @@ suite('Paths', () => { assert.equal(extpath.indexOfPath('/some/long/path', '/some/long', false), 0); assert.equal(extpath.indexOfPath('/some/long/path', '/PATH', true), 10); }); + + test('parseLineAndColumnAware', () => { + let res = extpath.parseLineAndColumnAware('/foo/bar'); + assert.equal(res.path, '/foo/bar'); + assert.equal(res.line, undefined); + assert.equal(res.column, undefined); + + res = extpath.parseLineAndColumnAware('/foo/bar:33'); + assert.equal(res.path, '/foo/bar'); + assert.equal(res.line, 33); + assert.equal(res.column, 1); + + res = extpath.parseLineAndColumnAware('/foo/bar:33:34'); + assert.equal(res.path, '/foo/bar'); + assert.equal(res.line, 33); + assert.equal(res.column, 34); + + res = extpath.parseLineAndColumnAware('C:\\foo\\bar'); + assert.equal(res.path, 'C:\\foo\\bar'); + assert.equal(res.line, undefined); + assert.equal(res.column, undefined); + + res = extpath.parseLineAndColumnAware('C:\\foo\\bar:33'); + assert.equal(res.path, 'C:\\foo\\bar'); + assert.equal(res.line, 33); + assert.equal(res.column, 1); + + res = extpath.parseLineAndColumnAware('C:\\foo\\bar:33:34'); + assert.equal(res.path, 'C:\\foo\\bar'); + assert.equal(res.line, 33); + assert.equal(res.column, 34); + + res = extpath.parseLineAndColumnAware('/foo/bar:abb'); + assert.equal(res.path, '/foo/bar:abb'); + assert.equal(res.line, undefined); + assert.equal(res.column, undefined); + }); }); diff --git a/src/vs/code/node/paths.ts b/src/vs/code/node/paths.ts index 24c2529c587..b2912383c3c 100644 --- a/src/vs/code/node/paths.ts +++ b/src/vs/code/node/paths.ts @@ -33,9 +33,9 @@ function doValidatePaths(args: string[], gotoLineMode?: boolean): string[] { const result = args.map(arg => { let pathCandidate = String(arg); - let parsedPath: IPathWithLineAndColumn | undefined = undefined; + let parsedPath: extpath.IPathWithLineAndColumn | undefined = undefined; if (gotoLineMode) { - parsedPath = parseLineAndColumnAware(pathCandidate); + parsedPath = extpath.parseLineAndColumnAware(pathCandidate); pathCandidate = parsedPath.path; } @@ -87,42 +87,7 @@ function preparePath(cwd: string, p: string): string { return p; } -export interface IPathWithLineAndColumn { - path: string; - line?: number; - column?: number; -} - -export function parseLineAndColumnAware(rawPath: string): IPathWithLineAndColumn { - const segments = rawPath.split(':'); // C:\file.txt:: - - let path: string | null = null; - let line: number | null = null; - let column: number | null = null; - - segments.forEach(segment => { - const segmentAsNumber = Number(segment); - if (!types.isNumber(segmentAsNumber)) { - path = !!path ? [path, segment].join(':') : segment; // a colon can well be part of a path (e.g. C:\...) - } else if (line === null) { - line = segmentAsNumber; - } else if (column === null) { - column = segmentAsNumber; - } - }); - - if (!path) { - throw new Error('Format for `--goto` should be: `FILE:LINE(:COLUMN)`'); - } - - return { - path: path, - line: line !== null ? line : undefined, - column: column !== null ? column : line !== null ? 1 : undefined // if we have a line, make sure column is also set - }; -} - -function toPath(p: IPathWithLineAndColumn): string { +function toPath(p: extpath.IPathWithLineAndColumn): string { const segments = [p.path]; if (types.isNumber(p.line)) { diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index c8b432f5416..7a98f4d1883 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -18,6 +18,9 @@ export interface IOpenWindowOptions extends IBaseOpenWindowsOptions { preferNewWindow?: boolean; noRecentEntry?: boolean; + + diffMode?: boolean; + gotoLineMode?: boolean; } export interface IOpenEmptyWindowOptions extends IBaseOpenWindowsOptions { diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index cdd6731748d..58ba2a8ae86 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -16,7 +16,6 @@ import { INativeEnvironmentService } from 'vs/platform/environment/node/environm import { IStateService } from 'vs/platform/state/node/state'; import { CodeWindow, defaultWindowState } from 'vs/code/electron-main/window'; import { ipcMain as ipc, screen, BrowserWindow, MessageBoxOptions, Display, app, nativeTheme } from 'electron'; -import { parseLineAndColumnAware } from 'vs/code/node/paths'; import { ILifecycleMainService, UnloadReason, LifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; @@ -39,7 +38,7 @@ import { once } from 'vs/base/common/functional'; import { Disposable } from 'vs/base/common/lifecycle'; import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogs'; import { withNullAsUndefined } from 'vs/base/common/types'; -import { isWindowsDriveLetter, toSlashes } from 'vs/base/common/extpath'; +import { isWindowsDriveLetter, toSlashes, parseLineAndColumnAware } from 'vs/base/common/extpath'; import { CharCode } from 'vs/base/common/charCode'; export interface IWindowState { diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 165fbd000f6..350e5f9b7a4 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -15,6 +15,7 @@ import product from 'vs/platform/product/common/product'; import { memoize } from 'vs/base/common/decorators'; import { onUnexpectedError } from 'vs/base/common/errors'; import { LIGHT } from 'vs/platform/theme/common/themeService'; +import { parseLineAndColumnAware } from 'vs/base/common/extpath'; export class BrowserEnvironmentConfiguration implements IEnvironmentConfiguration { @@ -38,7 +39,20 @@ export class BrowserEnvironmentConfiguration implements IEnvironmentConfiguratio if (this.payload) { const fileToOpen = this.payload.get('openFile'); if (fileToOpen) { - return [{ fileUri: URI.parse(fileToOpen) }]; + const fileUri = URI.parse(fileToOpen); + + // Support: --goto parameter to open on line/col + if (this.payload.has('gotoLineMode')) { + const pathColumnAware = parseLineAndColumnAware(fileUri.path); + + return [{ + fileUri: fileUri.with({ path: pathColumnAware.path }), + lineNumber: pathColumnAware.line, + columnNumber: pathColumnAware.column + }]; + } + + return [{ fileUri }]; } } diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index e3366db8981..63374ea3b85 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -7,9 +7,9 @@ import { Event } from 'vs/base/common/event'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; -import { IResourceEditorInputType, IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWindowSettings, IWindowOpenable, IOpenWindowOptions, isFolderToOpen, isWorkspaceToOpen, isFileToOpen, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; +import { IWindowSettings, IWindowOpenable, IOpenWindowOptions, isFolderToOpen, isWorkspaceToOpen, isFileToOpen, IOpenEmptyWindowOptions, IPathData } from 'vs/platform/windows/common/windows'; import { pathsToEditors } from 'vs/workbench/common/editor'; import { IFileService } from 'vs/platform/files/common/files'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -19,6 +19,7 @@ import { URI } from 'vs/base/common/uri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { domEvent } from 'vs/base/browser/event'; import { memoize } from 'vs/base/common/decorators'; +import { parseLineAndColumnAware } from 'vs/base/common/extpath'; /** * A workspace to open in the workbench can either be: @@ -135,8 +136,21 @@ export class BrowserHostService extends Disposable implements IHostService { // Same Window: open via editor service in current window if (this.shouldReuse(options, true /* file */)) { - const inputs: IResourceEditorInputType[] = await pathsToEditors([openable], this.fileService); - this.editorService.openEditors(inputs); + let openables: IPathData[] = []; + + // Support: --goto parameter to open on line/col + if (options?.gotoLineMode) { + const pathColumnAware = parseLineAndColumnAware(openable.fileUri.path); + openables = [{ + fileUri: openable.fileUri.with({ path: pathColumnAware.path }), + lineNumber: pathColumnAware.line, + columnNumber: pathColumnAware.column + }]; + } else { + openables = [openable]; + } + + this.editorService.openEditors(await pathsToEditors(openables, this.fileService)); } // New Window: open into empty window @@ -144,6 +158,10 @@ export class BrowserHostService extends Disposable implements IHostService { const environment = new Map(); environment.set('openFile', openable.fileUri.toString()); + if (options?.gotoLineMode) { + environment.set('gotoLineMode', 'true'); + } + this.workspaceProvider.open(undefined, { payload: Array.from(environment.entries()) }); } } @@ -183,7 +201,7 @@ export class BrowserHostService extends Disposable implements IHostService { return this.labelService.getUriLabel(openable.fileUri); } - private shouldReuse(options: IOpenWindowOptions = {}, isFile: boolean): boolean { + private shouldReuse(options: IOpenWindowOptions = Object.create(null), isFile: boolean): boolean { const windowConfig = this.configurationService.getValue('window'); const openInNewWindowConfig = isFile ? (windowConfig?.openFilesInNewWindow || 'off' /* default */) : (windowConfig?.openFoldersInNewWindow || 'default' /* default */); From 1ba6a15920c23d44a38f79e2225312c4417d9b56 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 11:00:50 +0200 Subject: [PATCH 042/107] web - support --diff from command line --- .../host/browser/browserHostService.ts | 85 +++++++++++++------ 1 file changed, 60 insertions(+), 25 deletions(-) diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index 63374ea3b85..54775ca1bb9 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -9,7 +9,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWindowSettings, IWindowOpenable, IOpenWindowOptions, isFolderToOpen, isWorkspaceToOpen, isFileToOpen, IOpenEmptyWindowOptions, IPathData } from 'vs/platform/windows/common/windows'; +import { IWindowSettings, IWindowOpenable, IOpenWindowOptions, isFolderToOpen, isWorkspaceToOpen, isFileToOpen, IOpenEmptyWindowOptions, IPathData, IFileToOpen } from 'vs/platform/windows/common/windows'; import { pathsToEditors } from 'vs/workbench/common/editor'; import { IFileService } from 'vs/platform/files/common/files'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -115,12 +115,11 @@ export class BrowserHostService extends Disposable implements IHostService { private async doOpenWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise { const payload = this.preservePayload(); + const fileOpenables: IFileToOpen[] = []; - for (let i = 0; i < toOpen.length; i++) { - const openable = toOpen[i]; + for (const openable of toOpen) { openable.label = openable.label || this.getRecentLabel(openable); - // Folder if (isFolderToOpen(openable)) { this.workspaceProvider.open({ folderUri: openable.folderUri }, { reuse: this.shouldReuse(options, false /* no file */), payload }); @@ -131,40 +130,76 @@ export class BrowserHostService extends Disposable implements IHostService { this.workspaceProvider.open({ workspaceUri: openable.workspaceUri }, { reuse: this.shouldReuse(options, false /* no file */), payload }); } - // File + // File (handled later in bulk) else if (isFileToOpen(openable)) { + fileOpenables.push(openable); + } + } + + // Handle Files + if (fileOpenables.length > 0) { + + // Support diffMode + if (options?.diffMode && fileOpenables.length === 2) { + const editors = await pathsToEditors(fileOpenables, this.fileService); + if (editors.length !== 2 || !editors[0].resource || !editors[1].resource) { + return; // invalid resources + } // Same Window: open via editor service in current window if (this.shouldReuse(options, true /* file */)) { - let openables: IPathData[] = []; - - // Support: --goto parameter to open on line/col - if (options?.gotoLineMode) { - const pathColumnAware = parseLineAndColumnAware(openable.fileUri.path); - openables = [{ - fileUri: openable.fileUri.with({ path: pathColumnAware.path }), - lineNumber: pathColumnAware.line, - columnNumber: pathColumnAware.column - }]; - } else { - openables = [openable]; - } - - this.editorService.openEditors(await pathsToEditors(openables, this.fileService)); + this.editorService.openEditor({ + leftResource: editors[0].resource, + rightResource: editors[1].resource + }); } // New Window: open into empty window else { const environment = new Map(); - environment.set('openFile', openable.fileUri.toString()); - - if (options?.gotoLineMode) { - environment.set('gotoLineMode', 'true'); - } + environment.set('diffFileDetail', editors[0].resource.toString()); + environment.set('diffFileMaster', editors[1].resource.toString()); this.workspaceProvider.open(undefined, { payload: Array.from(environment.entries()) }); } } + + // Just open normally + else { + for (const openable of fileOpenables) { + + // Same Window: open via editor service in current window + if (this.shouldReuse(options, true /* file */)) { + let openables: IPathData[] = []; + + // Support: --goto parameter to open on line/col + if (options?.gotoLineMode) { + const pathColumnAware = parseLineAndColumnAware(openable.fileUri.path); + openables = [{ + fileUri: openable.fileUri.with({ path: pathColumnAware.path }), + lineNumber: pathColumnAware.line, + columnNumber: pathColumnAware.column + }]; + } else { + openables = [openable]; + } + + this.editorService.openEditors(await pathsToEditors(openables, this.fileService)); + } + + // New Window: open into empty window + else { + const environment = new Map(); + environment.set('openFile', openable.fileUri.toString()); + + if (options?.gotoLineMode) { + environment.set('gotoLineMode', 'true'); + } + + this.workspaceProvider.open(undefined, { payload: Array.from(environment.entries()) }); + } + } + } } } From d6354443f436ee88df485e11b74f5bfb81118ea9 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 26 May 2020 11:30:58 +0200 Subject: [PATCH 043/107] Hack to work around terminal firing exit before line data Part of #92868 --- .../contrib/tasks/browser/terminalTaskSystem.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 34777c0470d..143aab4a0b3 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -821,7 +821,6 @@ export class TerminalTaskSystem implements ITaskSystem { }); promise = new Promise((resolve, reject) => { const onExit = terminal!.onExit((exitCode) => { - onData.dispose(); onExit.dispose(); let key = task.getMapKey(); this.removeFromActiveTasks(task); @@ -847,8 +846,12 @@ export class TerminalTaskSystem implements ITaskSystem { this.terminalService.setActiveInstance(terminal); this.terminalService.showPanel(false); } - startStopProblemMatcher.done(); - startStopProblemMatcher.dispose(); + // Hack to work around #92868 until terminal is fixed. + setTimeout(() => { + onData.dispose(); + startStopProblemMatcher.done(); + startStopProblemMatcher.dispose(); + }, 100); if (!processStartedSignaled && terminal) { this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal.processId!)); processStartedSignaled = true; From 0d1d37012a7427c9fb85c499c555ec24cfc6b256 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 26 May 2020 11:46:40 +0200 Subject: [PATCH 044/107] Use canonical uri inside `ITextModelService#createModelReference`, https://github.com/microsoft/vscode/issues/93368 fyi @bpasero --- .../test/electron-browser/keybindingEditing.test.ts | 3 +++ .../textmodelResolver/common/textModelResolverService.ts | 9 +++++++-- .../services/uriIdentity/common/uriIdentityService.ts | 3 --- src/vs/workbench/test/browser/workbenchTestServices.ts | 3 +++ src/vs/workbench/workbench.common.main.ts | 4 +++- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 7416fd9418d..0fd8abac93b 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -58,6 +58,8 @@ import { TestTextResourcePropertiesService, TestContextService, TestWorkingCopyS import { IThemeService } from 'vs/platform/theme/common/themeService'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; class TestEnvironmentService extends NativeWorkbenchEnvironmentService { @@ -117,6 +119,7 @@ suite('KeybindingsEditing', () => { fileService.registerProvider(Schemas.file, diskFileSystemProvider); fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService, new NullLogService())); instantiationService.stub(IFileService, fileService); + instantiationService.stub(IUriIdentityService, new UriIdentityService(fileService)); instantiationService.stub(IWorkingCopyService, new TestWorkingCopyService()); instantiationService.stub(IWorkingCopyFileService, instantiationService.createInstance(WorkingCopyFileService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index b00bdc79286..88eb19fda83 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -16,6 +16,7 @@ import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textF import { IFileService } from 'vs/platform/files/common/files'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; class ResourceModelCollection extends ReferenceCollection> { @@ -167,12 +168,16 @@ export class TextModelResolverService implements ITextModelService { constructor( @IInstantiationService private readonly instantiationService: IInstantiationService, - @IFileService private readonly fileService: IFileService + @IFileService private readonly fileService: IFileService, + @IUriIdentityService private readonly uriIdentService: IUriIdentityService, ) { } async createModelReference(resource: URI): Promise> { - const ref = this.resourceModelCollection.acquire(resource.toString()); + + const canonicalResource = this.uriIdentService.asCanonicalUri(resource); + + const ref = this.resourceModelCollection.acquire(canonicalResource.toString()); try { const model = await ref.object; diff --git a/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts b/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts index 34dd86b86d5..e50260f2982 100644 --- a/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts +++ b/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts @@ -5,7 +5,6 @@ import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; import { URI } from 'vs/base/common/uri'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { binarySearch } from 'vs/base/common/arrays'; import { ExtUri, IExtUri, normalizePath } from 'vs/base/common/resources'; @@ -67,5 +66,3 @@ export class UriIdentityService implements IUriIdentityService { return uri; } } - -registerSingleton(IUriIdentityService, UriIdentityService, true); diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index c1561a0ba6e..ebcfbda3955 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -107,6 +107,8 @@ import { TestWorkingCopyService, TestContextService, TestStorageService, TestTex import { IViewsService, IView, ViewContainer, ViewContainerLocation } from 'vs/workbench/common/views'; import { IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; +import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export function createFileEditorInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined); @@ -150,6 +152,7 @@ export function workbenchInstantiationService(overrides?: { instantiationService.stub(IThemeService, themeService); instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); instantiationService.stub(IFileService, new TestFileService()); + instantiationService.stub(IUriIdentityService, instantiationService.createInstance(UriIdentityService)); instantiationService.stub(IBackupFileService, new TestBackupFileService()); instantiationService.stub(ITelemetryService, NullTelemetryService); instantiationService.stub(INotificationService, new TestNotificationService()); diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index e7e58eba1c2..a28a125ef72 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -53,7 +53,6 @@ import 'vs/workbench/browser/parts/views/viewsService'; //#region --- workbench services import 'vs/platform/undoRedo/common/undoRedoService'; -import 'vs/workbench/services/uriIdentity/common/uriIdentityService'; import 'vs/workbench/services/extensions/browser/extensionUrlHandler'; import 'vs/workbench/services/bulkEdit/browser/bulkEditService'; import 'vs/workbench/services/keybinding/common/keybindingEditing'; @@ -112,6 +111,8 @@ import { OpenerService } from 'vs/editor/browser/services/openerService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; +import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; registerSingleton(IUserDataSyncEnablementService, UserDataSyncEnablementService); registerSingleton(IGlobalExtensionEnablementService, GlobalExtensionEnablementService); @@ -127,6 +128,7 @@ registerSingleton(ITextResourceConfigurationService, TextResourceConfigurationSe registerSingleton(IMenuService, MenuService, true); registerSingleton(IDownloadService, DownloadService, true); registerSingleton(IOpenerService, OpenerService, true); +registerSingleton(IUriIdentityService, UriIdentityService, true); //#endregion From fb80143165634d1fa90390243d101b620c4f9d28 Mon Sep 17 00:00:00 2001 From: Jackson Kearl Date: Tue, 26 May 2020 02:58:15 -0700 Subject: [PATCH 045/107] Fix #98573 --- src/vs/workbench/contrib/url/browser/trustedDomains.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/url/browser/trustedDomains.ts b/src/vs/workbench/contrib/url/browser/trustedDomains.ts index 48b63c75984..f6bd446b7bc 100644 --- a/src/vs/workbench/contrib/url/browser/trustedDomains.ts +++ b/src/vs/workbench/contrib/url/browser/trustedDomains.ts @@ -142,8 +142,8 @@ async function getRemotes(fileService: IFileService, textFileService: ITextFileS const RemoteMatcher = /^\s*url\s*=\s*(?:git@|https:\/\/)github\.com(?::|\/)([^.]*)\.git\s*$/mg; while (match = RemoteMatcher.exec(content)) { - const [domain, repo] = [match[1], match[2]]; - if (domain && repo) { + const repo = match[1]; + if (repo) { domains.add(`https://github.com/${repo}/`); } } From bfc03a753c600ca014bbdb6f26a5ff73f8c424ad Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 26 May 2020 12:16:57 +0200 Subject: [PATCH 046/107] Cannot add folder to workspace. Fixes #97294 --- .../workspaces/browser/abstractWorkspaceEditingService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts index c48f999da64..c26ceb99b95 100644 --- a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts @@ -14,7 +14,7 @@ import { ConfigurationScope, IConfigurationRegistry, Extensions as Configuration import { Registry } from 'vs/platform/registry/common/platform'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { distinct } from 'vs/base/common/arrays'; -import { isEqual, getComparisonKey } from 'vs/base/common/resources'; +import { isEqual, getComparisonKey, isEqualAuthority } from 'vs/base/common/resources'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IFileService } from 'vs/platform/files/common/files'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -131,7 +131,7 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi const remoteAuthority = this.environmentService.configuration.remoteAuthority; if (remoteAuthority) { // https://github.com/microsoft/vscode/issues/94191 - foldersToAdd = foldersToAdd.filter(f => f.uri.scheme !== Schemas.file && (f.uri.scheme !== Schemas.vscodeRemote || f.uri.authority === remoteAuthority)); + foldersToAdd = foldersToAdd.filter(f => f.uri.scheme !== Schemas.file && (f.uri.scheme !== Schemas.vscodeRemote || isEqualAuthority(f.uri.authority, remoteAuthority))); } // If we are in no-workspace or single-folder workspace, adding folders has to From 452f06b4781b8e0c001eb4e9cf8a53f3f228bba8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 26 May 2020 12:26:49 +0200 Subject: [PATCH 047/107] Check all extensions --- .../contrib/extensions/browser/configBasedRecommendations.ts | 3 +-- .../contrib/extensions/browser/exeBasedRecommendations.ts | 3 +-- .../contrib/extensions/browser/fileBasedRecommendations.ts | 3 +-- .../contrib/extensions/browser/workspaceRecommendations.ts | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/configBasedRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/configBasedRecommendations.ts index c092c7c81ea..9bb5657c0cc 100644 --- a/src/vs/workbench/contrib/extensions/browser/configBasedRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/configBasedRecommendations.ts @@ -7,7 +7,6 @@ import { IExtensionTipsService, IExtensionManagementService, ILocalExtension, IC import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ExtensionRecommendations, ExtensionRecommendation } from 'vs/workbench/contrib/extensions/browser/extensionRecommendations'; import { localize } from 'vs/nls'; -import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ExtensionRecommendationReason } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; @@ -75,7 +74,7 @@ export class ConfigBasedRecommendations extends ExtensionRecommendations { return; } - const local = await this.extensionManagementService.getInstalled(ExtensionType.User); + const local = await this.extensionManagementService.getInstalled(); const { uninstalled } = this.groupByInstalled(distinct(this.importantTips.map(({ extensionId }) => extensionId)), local); if (uninstalled.length === 0) { return; diff --git a/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts index 92d7e07c4fe..f153ecd7a3a 100644 --- a/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts @@ -9,7 +9,6 @@ import { ExtensionRecommendations, ExtensionRecommendation } from 'vs/workbench/ import { timeout } from 'vs/base/common/async'; import { localize } from 'vs/nls'; import { IStringDictionary } from 'vs/base/common/collections'; -import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { basename } from 'vs/base/common/path'; @@ -61,7 +60,7 @@ export class ExeBasedRecommendations extends ExtensionRecommendations { importantExeBasedRecommendations[tip.extensionId.toLowerCase()] = tip; }); - const local = await this.extensionManagementService.getInstalled(ExtensionType.User); + const local = await this.extensionManagementService.getInstalled(); const { installed, uninstalled } = this.groupByInstalled(Object.keys(importantExeBasedRecommendations), local); /* Log installed and uninstalled exe based recommendations */ diff --git a/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts index af198f44531..527d8180ca3 100644 --- a/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts @@ -12,7 +12,6 @@ import { ExtensionRecommendationSource, ExtensionRecommendationReason } from 'vs import { IExtensionsViewPaneContainer, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { CancellationToken } from 'vs/base/common/cancellation'; import { localize } from 'vs/nls'; -import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -181,7 +180,7 @@ export class FileBasedRecommendations extends ExtensionRecommendations { return; } - const installed = await this.extensionManagementService.getInstalled(ExtensionType.User); + const installed = await this.extensionManagementService.getInstalled(); if (await this.promptRecommendedExtensionForFileType(recommendationsToPrompt, installed)) { return; } diff --git a/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts index 4d05b1d420e..b17fd1dec71 100644 --- a/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts @@ -17,7 +17,6 @@ import { EXTENSIONS_CONFIG } from 'vs/workbench/contrib/extensions/common/extens import { ILogService } from 'vs/platform/log/common/log'; import { CancellationToken } from 'vs/base/common/cancellation'; import { localize } from 'vs/nls'; -import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { InstallWorkspaceRecommendedExtensionsAction, ShowRecommendedExtensionsAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; @@ -105,7 +104,7 @@ export class WorkspaceRecommendations extends ExtensionRecommendations { return; } - let installed = await this.extensionManagementService.getInstalled(ExtensionType.User); + let installed = await this.extensionManagementService.getInstalled(); installed = installed.filter(l => this.extensionEnablementService.getEnablementState(l) !== EnablementState.DisabledByExtensionKind); // Filter extensions disabled by kind const recommendations = allowedRecommendations.filter(({ extensionId }) => installed.every(local => !areSameExtensions({ id: extensionId }, local.identifier))); From 9734b138773cbf174c855d299d805db307599385 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 26 May 2020 13:20:03 +0200 Subject: [PATCH 048/107] Revert "Use canonical uri inside `ITextModelService#createModelReference`, https://github.com/microsoft/vscode/issues/93368" This reverts commit 0d1d37012a7427c9fb85c499c555ec24cfc6b256. --- .../test/electron-browser/keybindingEditing.test.ts | 3 --- .../textmodelResolver/common/textModelResolverService.ts | 9 ++------- .../services/uriIdentity/common/uriIdentityService.ts | 3 +++ src/vs/workbench/test/browser/workbenchTestServices.ts | 3 --- src/vs/workbench/workbench.common.main.ts | 4 +--- 5 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 0fd8abac93b..7416fd9418d 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -58,8 +58,6 @@ import { TestTextResourcePropertiesService, TestContextService, TestWorkingCopyS import { IThemeService } from 'vs/platform/theme/common/themeService'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; -import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; -import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; class TestEnvironmentService extends NativeWorkbenchEnvironmentService { @@ -119,7 +117,6 @@ suite('KeybindingsEditing', () => { fileService.registerProvider(Schemas.file, diskFileSystemProvider); fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService, new NullLogService())); instantiationService.stub(IFileService, fileService); - instantiationService.stub(IUriIdentityService, new UriIdentityService(fileService)); instantiationService.stub(IWorkingCopyService, new TestWorkingCopyService()); instantiationService.stub(IWorkingCopyFileService, instantiationService.createInstance(WorkingCopyFileService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index 88eb19fda83..b00bdc79286 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -16,7 +16,6 @@ import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textF import { IFileService } from 'vs/platform/files/common/files'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; class ResourceModelCollection extends ReferenceCollection> { @@ -168,16 +167,12 @@ export class TextModelResolverService implements ITextModelService { constructor( @IInstantiationService private readonly instantiationService: IInstantiationService, - @IFileService private readonly fileService: IFileService, - @IUriIdentityService private readonly uriIdentService: IUriIdentityService, + @IFileService private readonly fileService: IFileService ) { } async createModelReference(resource: URI): Promise> { - - const canonicalResource = this.uriIdentService.asCanonicalUri(resource); - - const ref = this.resourceModelCollection.acquire(canonicalResource.toString()); + const ref = this.resourceModelCollection.acquire(resource.toString()); try { const model = await ref.object; diff --git a/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts b/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts index e50260f2982..34dd86b86d5 100644 --- a/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts +++ b/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts @@ -5,6 +5,7 @@ import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; import { URI } from 'vs/base/common/uri'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { binarySearch } from 'vs/base/common/arrays'; import { ExtUri, IExtUri, normalizePath } from 'vs/base/common/resources'; @@ -66,3 +67,5 @@ export class UriIdentityService implements IUriIdentityService { return uri; } } + +registerSingleton(IUriIdentityService, UriIdentityService, true); diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index ebcfbda3955..c1561a0ba6e 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -107,8 +107,6 @@ import { TestWorkingCopyService, TestContextService, TestStorageService, TestTex import { IViewsService, IView, ViewContainer, ViewContainerLocation } from 'vs/workbench/common/views'; import { IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; -import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; -import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export function createFileEditorInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined); @@ -152,7 +150,6 @@ export function workbenchInstantiationService(overrides?: { instantiationService.stub(IThemeService, themeService); instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); instantiationService.stub(IFileService, new TestFileService()); - instantiationService.stub(IUriIdentityService, instantiationService.createInstance(UriIdentityService)); instantiationService.stub(IBackupFileService, new TestBackupFileService()); instantiationService.stub(ITelemetryService, NullTelemetryService); instantiationService.stub(INotificationService, new TestNotificationService()); diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index a28a125ef72..e7e58eba1c2 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -53,6 +53,7 @@ import 'vs/workbench/browser/parts/views/viewsService'; //#region --- workbench services import 'vs/platform/undoRedo/common/undoRedoService'; +import 'vs/workbench/services/uriIdentity/common/uriIdentityService'; import 'vs/workbench/services/extensions/browser/extensionUrlHandler'; import 'vs/workbench/services/bulkEdit/browser/bulkEditService'; import 'vs/workbench/services/keybinding/common/keybindingEditing'; @@ -111,8 +112,6 @@ import { OpenerService } from 'vs/editor/browser/services/openerService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; -import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; -import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; registerSingleton(IUserDataSyncEnablementService, UserDataSyncEnablementService); registerSingleton(IGlobalExtensionEnablementService, GlobalExtensionEnablementService); @@ -128,7 +127,6 @@ registerSingleton(ITextResourceConfigurationService, TextResourceConfigurationSe registerSingleton(IMenuService, MenuService, true); registerSingleton(IDownloadService, DownloadService, true); registerSingleton(IOpenerService, OpenerService, true); -registerSingleton(IUriIdentityService, UriIdentityService, true); //#endregion From 89e939512567b3289318654010c6e355f3996c4b Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 26 May 2020 13:50:48 +0200 Subject: [PATCH 049/107] Don't make URI for task cwd when UNC Fixes #93724 --- src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 143aab4a0b3..1f00527bd18 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -1043,7 +1043,7 @@ export class TerminalTaskSystem implements ITaskSystem { } } // This must be normalized to the OS - shellLaunchConfig.cwd = resources.toLocalResource(URI.from({ scheme: Schemas.file, path: cwd }), this.environmentService.configuration.remoteAuthority); + shellLaunchConfig.cwd = isUNC(cwd) ? cwd : resources.toLocalResource(URI.from({ scheme: Schemas.file, path: cwd }), this.environmentService.configuration.remoteAuthority); } if (options.env) { shellLaunchConfig.env = options.env; From 07a56fd95d26499351af05077043361b1cbe5830 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 26 May 2020 14:14:31 +0200 Subject: [PATCH 050/107] quote '$' properly; fixes #98471 --- src/vs/workbench/contrib/debug/node/terminals.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 9abe1a5cb22..719360dd924 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -164,7 +164,7 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments case ShellType.bash: quote = (s: string) => { - s = s.replace(/(["'\\])/g, '\\$1'); + s = s.replace(/(["'\\\$])/g, '\\$1'); return (s.indexOf(' ') >= 0 || s.indexOf(';') >= 0 || s.length === 0) ? `"${s}"` : s; }; From 21d611657794ece49e01407214e1860bfc294e5d Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 26 May 2020 14:32:26 +0200 Subject: [PATCH 051/107] code-web: fix scss not available --- scripts/code-web.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/scripts/code-web.js b/scripts/code-web.js index b7441ea0158..b208a1e908e 100755 --- a/scripts/code-web.js +++ b/scripts/code-web.js @@ -148,11 +148,6 @@ async function handleRoot(req, res) { if (packageJSON.main && packageJSON.name !== 'vscode-web-playground') { return; // unsupported } - - if (packageJSON.name === 'scss') { - return; // seems to fail to JSON.parse()?! - } - packageJSON.extensionKind = ['web']; // enable for Web mapExtensionFolderToExtensionPackageJSON.set(extensionFolder, packageJSON); @@ -171,11 +166,10 @@ async function handleRoot(req, res) { }); }); + const webConfiguration = escapeAttribute(JSON.stringify({ staticExtensions, folderUri: { scheme: 'memfs', path: `/sample-folder` }})); + const data = (await util.promisify(fs.readFile)(WEB_MAIN)).toString() - .replace('{{WORKBENCH_WEB_CONFIGURATION}}', escapeAttribute(JSON.stringify({ - staticExtensions, - folderUri: { scheme: 'memfs', path: `/sample-folder` } - }))) + .replace('{{WORKBENCH_WEB_CONFIGURATION}}', () => webConfiguration) // use a replace function to avoid that regexp replace patterns ($&, $0, ...) are applied .replace('{{WEBVIEW_ENDPOINT}}', '') .replace('{{REMOTE_USER_DATA_URI}}', ''); From 72550d1808c33c45173af77781f815e535bd4687 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 26 May 2020 06:51:15 -0700 Subject: [PATCH 052/107] Add comments to automationShell localize calls Part of #98576 --- .../terminal/common/terminalConfiguration.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index f369566829c..91a5f251a3a 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -16,17 +16,26 @@ export const terminalConfiguration: IConfigurationNode = { type: 'object', properties: { 'terminal.integrated.automationShell.linux': { - markdownDescription: localize('terminal.integrated.automationShell.linux', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.linux`', '`shellArgs`'), + markdownDescription: localize({ + key: 'terminal.integrated.automationShell.linux', + comment: ['{0} and {1} are the `shell` and `shellArgs` settings keys'] + }, "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.linux`', '`shellArgs`'), type: ['string', 'null'], default: null }, 'terminal.integrated.automationShell.osx': { - markdownDescription: localize('terminal.integrated.automationShell.osx', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.osx`', '`shellArgs`'), + markdownDescription: localize({ + key: 'terminal.integrated.automationShell.osx', + comment: ['{0} and {1} are the `shell` and `shellArgs` settings keys'] + }, "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.osx`', '`shellArgs`'), type: ['string', 'null'], default: null }, 'terminal.integrated.automationShell.windows': { - markdownDescription: localize('terminal.integrated.automationShell.windows', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.windows`', '`shellArgs`'), + markdownDescription: localize({ + key: 'terminal.integrated.automationShell.windows', + comment: ['{0} and {1} are the `shell` and `shellArgs` settings keys'] + }, "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.windows`', '`shellArgs`'), type: ['string', 'null'], default: null }, From d52ca79f0c0b394a9f0588f0e38613bc8707235c Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 26 May 2020 15:56:00 +0200 Subject: [PATCH 053/107] Improve text match splitting --- .../contrib/scm/browser/repositoryPane.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts b/src/vs/workbench/contrib/scm/browser/repositoryPane.ts index 92c78aa28a2..e68afdfbdfe 100644 --- a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts +++ b/src/vs/workbench/contrib/scm/browser/repositoryPane.ts @@ -89,13 +89,18 @@ function splitMatches(uri: URI, filterData: FuzzyScore | undefined): [IMatch[] | const allMatches = createMatches(filterData); for (const match of allMatches) { - if (match.end <= fileName.length) { - matches!.push(match); + if (match.start < fileName.length) { + matches!.push( + { + start: match.start, + end: Math.min(match.end, fileName.length) + } + ); } else { descriptionMatches!.push( { - start: match.start - fileName.length, - end: match.end - fileName.length + start: match.start - (fileName.length + 1), + end: match.end - (fileName.length + 1) } ); } @@ -403,7 +408,7 @@ export class SCMTreeKeyboardNavigationLabelProvider implements ICompressibleKeyb const fileName = basename(element.sourceUri); const filePath = this.labelService.getUriLabel(dirname(element.sourceUri), { relative: true }); - return filePath.length !== 0 ? `${fileName}${filePath}` : fileName; + return filePath.length !== 0 ? `${fileName} ${filePath}` : fileName; } } From 9a2062ff5df3cf05c763b7ed6dadff26ddce00c4 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 26 May 2020 15:56:50 +0200 Subject: [PATCH 054/107] translation clarifications #98576 --- src/vs/workbench/contrib/debug/browser/debugHover.ts | 2 +- .../workbench/contrib/debug/browser/debugQuickAccess.ts | 9 +++++++-- src/vs/workbench/contrib/debug/browser/variablesView.ts | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts index 754fc963e34..72a879b493e 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts @@ -341,7 +341,7 @@ class DebugHoverAccessibilityProvider implements IListAccessibilityProvider 0) { - picks.push({ type: 'separator', label: localize('contributed', "contributed") }); + picks.push({ + type: 'separator', label: localize({ + key: 'contributed', + comment: ['contributed is lower case because it looks better like that in UI. Nothing preceeds it. It is a name of the grouping of debug configurations.'] + }, "contributed") + }); } dynamicProviders.forEach(provider => { picks.push({ label: `$(folder) ${provider.label}...`, - ariaLabel: localize('providerAriaLabel', "{0} contributed configurations", provider.label), + ariaLabel: localize({ key: 'providerAriaLabel', comment: ['Placeholder stands for the provider label. For example "NodeJS".'] }, "{0} contributed configurations", provider.label), accept: async () => { const pick = await provider.pick(); if (pick) { diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index d9c75bd8be4..9f7b7ab5e1a 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -359,7 +359,7 @@ class VariablesAccessibilityProvider implements IListAccessibilityProvider Date: Mon, 25 May 2020 20:23:44 -0500 Subject: [PATCH 055/107] Don't leak context key services --- .../notebook/browser/view/renderers/cellRenderer.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts index f090abdede6..8ff3f971dc7 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -359,11 +359,10 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR } renderTemplate(container: HTMLElement): MarkdownCellRenderTemplate { - const contextKeyService = this.contextKeyServiceProvider(container); - container.tabIndex = -1; container.classList.add('markdown-cell-row'); const disposables = new DisposableStore(); + const contextKeyService = disposables.add(this.contextKeyServiceProvider(container)); const toolbar = disposables.add(this.createToolbar(container)); const focusIndicator = DOM.append(container, DOM.$('.notebook-cell-focus-indicator')); focusIndicator.setAttribute('draggable', 'true'); @@ -897,11 +896,10 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende } renderTemplate(container: HTMLElement): CodeCellRenderTemplate { - const contextKeyService = this.contextKeyServiceProvider(container); - container.classList.add('code-cell-row'); container.tabIndex = -1; const disposables = new DisposableStore(); + const contextKeyService = disposables.add(this.contextKeyServiceProvider(container)); const toolbar = disposables.add(this.createToolbar(container)); const focusIndicator = DOM.append(container, DOM.$('.notebook-cell-focus-indicator')); focusIndicator.setAttribute('draggable', 'true'); @@ -914,7 +912,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende const executionOrderLabel = DOM.append(runButtonContainer, $('div.execution-count-label')); // create a special context key service that set the inCompositeEditor-contextkey - const editorContextKeyService = this.contextKeyServiceProvider(container); + const editorContextKeyService = disposables.add(this.contextKeyServiceProvider(container)); const editorInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, editorContextKeyService])); EditorContextKeys.inCompositeEditor.bindTo(editorContextKeyService).set(true); From 63d6a654ec5e1eee01a2bdc2676f28d480865fc7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 26 May 2020 16:04:43 +0200 Subject: [PATCH 056/107] fix https://github.com/microsoft/vscode/issues/97731 --- src/vs/workbench/api/common/extHostDecorations.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/common/extHostDecorations.ts b/src/vs/workbench/api/common/extHostDecorations.ts index cccb18f5fa9..9ed26739e6d 100644 --- a/src/vs/workbench/api/common/extHostDecorations.ts +++ b/src/vs/workbench/api/common/extHostDecorations.ts @@ -9,10 +9,10 @@ import { MainContext, ExtHostDecorationsShape, MainThreadDecorationsShape, Decor import { Disposable, Decoration } from 'vs/workbench/api/common/extHostTypes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { asArray } from 'vs/base/common/arrays'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ILogService } from 'vs/platform/log/common/log'; +import { asArray } from 'vs/base/common/arrays'; interface ProviderData { provider: vscode.DecorationProvider; @@ -40,7 +40,9 @@ export class ExtHostDecorations implements IExtHostDecorations { this._proxy.$registerDecorationProvider(handle, extensionId.value); const listener = provider.onDidChangeDecorations(e => { - this._proxy.$onDidChange(handle, !e ? null : asArray(e)); + this._proxy.$onDidChange(handle, !e || (Array.isArray(e) && e.length > 250) + ? null + : asArray(e)); }); return new Disposable(() => { From a23d4daefa9f45d2d060b46361f99162f3da1e6f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 16:29:12 +0200 Subject: [PATCH 057/107] Dangling text file models of deleted files hanging around in memory (#98154) * Dangling text file models of deleted files hanging around in memory (fix #98057) * address feedback --- .../src/singlefolder-tests/languages.test.ts | 11 +- .../api/browser/mainThreadDocuments.ts | 34 +++-- .../browser/mainThreadDocumentsAndEditors.ts | 6 +- .../browser/api/mainThreadDocuments.test.ts | 119 ++++++++++++++---- .../api/mainThreadDocumentsAndEditors.test.ts | 5 +- .../browser/api/mainThreadEditors.test.ts | 1 + .../test/common/workbenchTestServices.ts | 28 ++++- 7 files changed, 162 insertions(+), 42 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts index 9c30a873e85..8c407fb6c8b 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts @@ -29,31 +29,34 @@ suite('vscode API - languages', () => { const doc = await vscode.workspace.openTextDocument(file); const langIdNow = doc.languageId; let clock = 0; + const disposables: vscode.Disposable[] = []; let close = new Promise(resolve => { - vscode.workspace.onDidCloseTextDocument(e => { + disposables.push(vscode.workspace.onDidCloseTextDocument(e => { if (e === doc) { assert.equal(doc.languageId, langIdNow); assert.equal(clock, 0); clock += 1; resolve(); } - }); + })); }); let open = new Promise(resolve => { - vscode.workspace.onDidOpenTextDocument(e => { + disposables.push(vscode.workspace.onDidOpenTextDocument(e => { if (e === doc) { // same instance! assert.equal(doc.languageId, 'json'); assert.equal(clock, 1); clock += 1; resolve(); } - }); + })); }); let change = vscode.languages.setTextDocumentLanguage(doc, 'json'); await Promise.all([change, close, open]); assert.equal(clock, 2); assert.equal(doc.languageId, 'json'); + disposables.forEach(disposable => disposable.dispose()); + disposables.length = 0; }); test('setTextDocumentLanguage -> error when language does not exist', async function () { diff --git a/src/vs/workbench/api/browser/mainThreadDocuments.ts b/src/vs/workbench/api/browser/mainThreadDocuments.ts index 68454e67aca..f0138dc77cb 100644 --- a/src/vs/workbench/api/browser/mainThreadDocuments.ts +++ b/src/vs/workbench/api/browser/mainThreadDocuments.ts @@ -10,17 +10,18 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService, shouldSynchronizeModel } from 'vs/editor/common/services/modelService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { IFileService } from 'vs/platform/files/common/files'; +import { IFileService, FileOperation } from 'vs/platform/files/common/files'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/browser/mainThreadDocumentsAndEditors'; import { ExtHostContext, ExtHostDocumentsShape, IExtHostContext, MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ITextEditorModel } from 'vs/workbench/common/editor'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { toLocalResource } from 'vs/base/common/resources'; +import { toLocalResource, isEqualOrParent } from 'vs/base/common/resources'; +import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; export class BoundModelReferenceCollection { - private _data = new Array<{ length: number, dispose(): void }>(); + private _data = new Array<{ uri: URI, length: number, dispose(): void }>(); private _length = 0; constructor( @@ -34,10 +35,18 @@ export class BoundModelReferenceCollection { this._data = dispose(this._data); } - add(ref: IReference): void { + remove(uri: URI): void { + for (const entry of [...this._data] /* copy array because dispose will modify it */) { + if (isEqualOrParent(entry.uri, uri)) { + entry.dispose(); + } + } + } + + add(uri: URI, ref: IReference): void { const length = ref.object.textEditorModel.getValueLength(); let handle: any; - let entry: { length: number, dispose(): void }; + let entry: { uri: URI, length: number, dispose(): void }; const dispose = () => { const idx = this._data.indexOf(entry); if (idx >= 0) { @@ -48,7 +57,7 @@ export class BoundModelReferenceCollection { } }; handle = setTimeout(dispose, this._maxAge); - entry = { length, dispose }; + entry = { uri, length, dispose }; this._data.push(entry); this._length += length; @@ -74,7 +83,7 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { private _modelToDisposeMap: { [modelUrl: string]: IDisposable; }; private readonly _proxy: ExtHostDocumentsShape; private readonly _modelIsSynced = new Set(); - private _modelReferenceCollection = new BoundModelReferenceCollection(); + private readonly _modelReferenceCollection = new BoundModelReferenceCollection(); constructor( documentsAndEditors: MainThreadDocumentsAndEditors, @@ -83,7 +92,8 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { @ITextFileService textFileService: ITextFileService, @IFileService fileService: IFileService, @ITextModelService textModelResolverService: ITextModelService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService ) { this._modelService = modelService; this._textModelResolverService = textModelResolverService; @@ -109,6 +119,12 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { } })); + this._toDispose.add(workingCopyFileService.onDidRunWorkingCopyFileOperation(e => { + if (e.source && (e.operation === FileOperation.MOVE || e.operation === FileOperation.DELETE)) { + this._modelReferenceCollection.remove(e.source); + } + })); + this._modelToDisposeMap = Object.create(null); } @@ -199,7 +215,7 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { private _handleAsResourceInput(uri: URI): Promise { return this._textModelResolverService.createModelReference(uri).then(ref => { - this._modelReferenceCollection.add(ref); + this._modelReferenceCollection.add(uri, ref); const result = !!ref.object; return result; }); diff --git a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts index 78da88e8955..5d430ea017d 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts @@ -27,6 +27,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; namespace delta { @@ -326,11 +327,12 @@ export class MainThreadDocumentsAndEditors { @IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService, @IBulkEditService bulkEditService: IBulkEditService, @IPanelService panelService: IPanelService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentsAndEditors); - const mainThreadDocuments = this._toDispose.add(new MainThreadDocuments(this, extHostContext, this._modelService, this._textFileService, fileService, textModelResolverService, environmentService)); + const mainThreadDocuments = this._toDispose.add(new MainThreadDocuments(this, extHostContext, this._modelService, this._textFileService, fileService, textModelResolverService, environmentService, workingCopyFileService)); extHostContext.set(MainContext.MainThreadDocuments, mainThreadDocuments); const mainThreadTextEditors = this._toDispose.add(new MainThreadTextEditors(this, extHostContext, codeEditorService, bulkEditService, this._editorService, this._editorGroupService)); diff --git a/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts b/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts index a14eca8b02a..896dd76ee26 100644 --- a/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts +++ b/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts @@ -7,6 +7,7 @@ import * as assert from 'assert'; import { BoundModelReferenceCollection } from 'vs/workbench/api/browser/mainThreadDocuments'; import { createTextModel } from 'vs/editor/test/common/editorTestUtils'; import { timeout } from 'vs/base/common/async'; +import { URI } from 'vs/base/common/uri'; suite('BoundModelReferenceCollection', () => { @@ -20,12 +21,14 @@ suite('BoundModelReferenceCollection', () => { let didDispose = false; - col.add({ - object: { textEditorModel: createTextModel('farboo') }, - dispose() { - didDispose = true; - } - }); + col.add( + URI.parse('test://farboo'), + { + object: { textEditorModel: createTextModel('farboo') }, + dispose() { + didDispose = true; + } + }); await timeout(30); assert.equal(didDispose, true); @@ -35,27 +38,95 @@ suite('BoundModelReferenceCollection', () => { let disposed: number[] = []; - col.add({ - object: { textEditorModel: createTextModel('farboo') }, - dispose() { - disposed.push(0); - } - }); - col.add({ - object: { textEditorModel: createTextModel('boofar') }, - dispose() { - disposed.push(1); - } - }); + col.add( + URI.parse('test://farboo'), + { + object: { textEditorModel: createTextModel('farboo') }, + dispose() { + disposed.push(0); + } + }); - col.add({ - object: { textEditorModel: createTextModel(new Array(71).join('x')) }, - dispose() { - disposed.push(2); - } - }); + col.add( + URI.parse('test://boofar'), + { + object: { textEditorModel: createTextModel('boofar') }, + dispose() { + disposed.push(1); + } + }); + + col.add( + URI.parse('test://xxxxxxx'), + { + object: { textEditorModel: createTextModel(new Array(71).join('x')) }, + dispose() { + disposed.push(2); + } + }); assert.deepEqual(disposed, [0, 1]); }); + test('dispose uri', () => { + + let disposed: number[] = []; + + col.add( + URI.parse('test:///farboo'), + { + object: { textEditorModel: createTextModel('farboo') }, + dispose() { + disposed.push(0); + } + }); + + col.add( + URI.parse('test:///boofar'), + { + object: { textEditorModel: createTextModel('boofar') }, + dispose() { + disposed.push(1); + } + }); + + col.add( + URI.parse('test:///boo/far1'), + { + object: { textEditorModel: createTextModel('boo/far1') }, + dispose() { + disposed.push(2); + } + }); + + col.add( + URI.parse('test:///boo/far2'), + { + object: { textEditorModel: createTextModel('boo/far2') }, + dispose() { + disposed.push(3); + } + }); + + col.add( + URI.parse('test:///boo1/far'), + { + object: { textEditorModel: createTextModel('boo1/far') }, + dispose() { + disposed.push(4); + } + }); + + col.remove(URI.parse('test:///unknown')); + assert.equal(disposed.length, 0); + + col.remove(URI.parse('test:///farboo')); + assert.deepEqual(disposed, [0]); + + disposed = []; + + col.remove(URI.parse('test:///boo')); + assert.deepEqual(disposed, [2, 3]); + }); + }); diff --git a/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts index 01111a204e1..065874bd281 100644 --- a/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts @@ -25,7 +25,7 @@ import { NullLogService } from 'vs/platform/log/common/log'; import { UndoRedoService } from 'vs/platform/undoRedo/common/undoRedoService'; import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogService'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; -import { TestTextResourcePropertiesService } from 'vs/workbench/test/common/workbenchTestServices'; +import { TestTextResourcePropertiesService, TestWorkingCopyFileService } from 'vs/workbench/test/common/workbenchTestServices'; suite('MainThreadDocumentsAndEditors', () => { @@ -88,7 +88,8 @@ suite('MainThreadDocumentsAndEditors', () => { return undefined; } }, - TestEnvironmentService + TestEnvironmentService, + new TestWorkingCopyFileService() ); }); diff --git a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts index e4c707e454d..9cc9f8ee181 100644 --- a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts @@ -104,6 +104,7 @@ suite('MainThreadEditors', () => { }; }); services.set(IWorkingCopyFileService, new class extends mock() { + onDidRunWorkingCopyFileOperation = Event.None; move(source: URI, target: URI) { movedResources.set(source, target); return Promise.resolve(Object.create(null)); diff --git a/src/vs/workbench/test/common/workbenchTestServices.ts b/src/vs/workbench/test/common/workbenchTestServices.ts index 3f4f21f7cec..8c9574d17be 100644 --- a/src/vs/workbench/test/common/workbenchTestServices.ts +++ b/src/vs/workbench/test/common/workbenchTestServices.ts @@ -14,8 +14,11 @@ import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderW import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfigurationService'; import { isLinux, isMacintosh } from 'vs/base/common/platform'; import { InMemoryStorageService, IWillSaveStateEvent } from 'vs/platform/storage/common/storage'; -import { WorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; +import { WorkingCopyService, IWorkingCopy } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { NullExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IWorkingCopyFileService, IWorkingCopyFileOperationParticipant, WorkingCopyFileEvent } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { FileOperation, IFileStatWithMetadata } from 'vs/platform/files/common/files'; export class TestTextResourcePropertiesService implements ITextResourcePropertiesService { @@ -121,6 +124,29 @@ export class TestStorageService extends InMemoryStorageService { export class TestWorkingCopyService extends WorkingCopyService { } +export class TestWorkingCopyFileService implements IWorkingCopyFileService { + + _serviceBrand: undefined; + + onWillRunWorkingCopyFileOperation: Event = Event.None; + onDidFailWorkingCopyFileOperation: Event = Event.None; + onDidRunWorkingCopyFileOperation: Event = Event.None; + + addFileOperationParticipant(participant: IWorkingCopyFileOperationParticipant): IDisposable { return Disposable.None; } + + async runFileOperationParticipants(target: URI, source: URI | undefined, operation: FileOperation): Promise { } + + async delete(resource: URI, options?: { useTrash?: boolean | undefined; recursive?: boolean | undefined; } | undefined): Promise { } + + registerWorkingCopyProvider(provider: (resourceOrFolder: URI) => IWorkingCopy[]): IDisposable { return Disposable.None; } + + getDirty(resource: URI): IWorkingCopy[] { return []; } + + move(source: URI, target: URI, overwrite?: boolean | undefined): Promise { throw new Error('Method not implemented.'); } + + copy(source: URI, target: URI, overwrite?: boolean | undefined): Promise { throw new Error('Method not implemented.'); } +} + export function mock(): Ctor { return function () { } as any; } From 941f9c4d602af5817699be209f96df1fc1b1affb Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 26 May 2020 07:35:12 -0700 Subject: [PATCH 058/107] Add back original strings to terminal commands using Action2 Fixes #98311 --- .../terminal/browser/terminalActions.ts | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index dfaef3ea7e4..330f1227a89 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -26,7 +26,7 @@ import { URI } from 'vs/base/common/uri'; import { isWindows } from 'vs/base/common/platform'; import { withNullAsUndefined } from 'vs/base/common/types'; import { ITerminalInstance, ITerminalService, Direction } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; +import { Action2, registerAction2, ILocalizedString } from 'vs/platform/actions/common/actions'; import { TerminalQuickAccessProvider } from 'vs/workbench/contrib/terminal/browser/terminalQuickAccess'; import { ToggleViewAction } from 'vs/workbench/browser/actions/layoutActions'; import { IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; @@ -393,13 +393,13 @@ export class ClearTerminalAction extends Action { } export function registerTerminalActions() { - const category = TERMINAL_ACTION_CATEGORY; + const category: ILocalizedString = { value: TERMINAL_ACTION_CATEGORY, original: 'Terminal' }; registerAction2(class extends Action2 { constructor() { super({ id: TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE, - title: localize('workbench.action.terminal.newInActiveWorkspace', "Create New Integrated Terminal (In Active Workspace)"), + title: { value: localize('workbench.action.terminal.newInActiveWorkspace', "Create New Integrated Terminal (In Active Workspace)"), original: 'Create New Integrated Terminal (In Active Workspace)' }, f1: true, category }); @@ -418,7 +418,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE, - title: localize('workbench.action.terminal.focusPreviousPane', "Focus Previous Pane"), + title: { value: localize('workbench.action.terminal.focusPreviousPane', "Focus Previous Pane"), original: 'Focus Previous Pane' }, f1: true, category, keybinding: { @@ -443,7 +443,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE, - title: localize('workbench.action.terminal.focusNextPane', "Focus Next Pane"), + title: { value: localize('workbench.action.terminal.focusNextPane', "Focus Next Pane"), original: 'Focus Next Pane' }, f1: true, category, keybinding: { @@ -468,7 +468,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT, - title: localize('workbench.action.terminal.resizePaneLeft', "Resize Pane Left"), + title: { value: localize('workbench.action.terminal.resizePaneLeft', "Resize Pane Left"), original: 'Resize Pane Left' }, f1: true, category, keybinding: { @@ -487,7 +487,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT, - title: localize('workbench.action.terminal.resizePaneRight', "Resize Pane Right"), + title: { value: localize('workbench.action.terminal.resizePaneRight', "Resize Pane Right"), original: 'Resize Pane Right' }, f1: true, category, keybinding: { @@ -506,7 +506,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RESIZE_PANE_UP, - title: localize('workbench.action.terminal.resizePaneUp', "Resize Pane Up"), + title: { value: localize('workbench.action.terminal.resizePaneUp', "Resize Pane Up"), original: 'Resize Pane Up' }, f1: true, category, keybinding: { @@ -524,7 +524,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN, - title: localize('workbench.action.terminal.resizePaneDown', "Resize Pane Down"), + title: { value: localize('workbench.action.terminal.resizePaneDown', "Resize Pane Down"), original: 'Resize Pane Down' }, f1: true, category, keybinding: { @@ -542,7 +542,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FOCUS, - title: localize('workbench.action.terminal.focus', "Focus Terminal"), + title: { value: localize('workbench.action.terminal.focus', "Focus Terminal"), original: 'Focus Terminal' }, f1: true, category }); @@ -561,7 +561,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FOCUS_NEXT, - title: localize('workbench.action.terminal.focusNext', "Focus Next Terminal"), + title: { value: localize('workbench.action.terminal.focusNext', "Focus Next Terminal"), original: 'Focus Next Terminal' }, f1: true, category }); @@ -576,7 +576,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FOCUS_PREVIOUS, - title: localize('workbench.action.terminal.focusPrevious', "Focus Previous Terminal"), + title: { value: localize('workbench.action.terminal.focusPrevious', "Focus Previous Terminal"), original: 'Focus Previous Terminal' }, f1: true, category }); @@ -591,7 +591,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT, - title: localize('workbench.action.terminal.runSelectedText', "Run Selected Text In Active Terminal"), + title: { value: localize('workbench.action.terminal.runSelectedText', "Run Selected Text In Active Terminal"), original: 'Run Selected Text In Active Terminal' }, f1: true, category }); @@ -621,7 +621,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE, - title: localize('workbench.action.terminal.runActiveFile', "Run Active File In Active Terminal"), + title: { value: localize('workbench.action.terminal.runActiveFile', "Run Active File In Active Terminal"), original: 'Run Active File In Active Terminal' }, f1: true, category }); @@ -655,7 +655,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE, - title: localize('workbench.action.terminal.scrollDown', "Scroll Down (Line)"), + title: { value: localize('workbench.action.terminal.scrollDown', "Scroll Down (Line)"), original: 'Scroll Down (Line)' }, f1: true, category, keybinding: { @@ -674,7 +674,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE, - title: localize('workbench.action.terminal.scrollDownPage', "Scroll Down (Page)"), + title: { value: localize('workbench.action.terminal.scrollDownPage', "Scroll Down (Page)"), original: 'Scroll Down (Page)' }, f1: true, category, keybinding: { @@ -693,7 +693,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM, - title: localize('workbench.action.terminal.scrollToBottom', "Scroll to Bottom"), + title: { value: localize('workbench.action.terminal.scrollToBottom', "Scroll to Bottom"), original: 'Scroll to Bottom' }, f1: true, category, keybinding: { @@ -712,7 +712,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_UP_LINE, - title: localize('workbench.action.terminal.scrollUp', "Scroll Up (Line)"), + title: { value: localize('workbench.action.terminal.scrollUp', "Scroll Up (Line)"), original: 'Scroll Up (Line)' }, f1: true, category, keybinding: { @@ -731,7 +731,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_UP_PAGE, - title: localize('workbench.action.terminal.scrollUpPage', "Scroll Up (Page)"), + title: { value: localize('workbench.action.terminal.scrollUpPage', "Scroll Up (Page)"), original: 'Scroll Up (Page)' }, f1: true, category, keybinding: { @@ -750,7 +750,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_TO_TOP, - title: localize('workbench.action.terminal.scrollToTop', "Scroll to Top"), + title: { value: localize('workbench.action.terminal.scrollToTop', "Scroll to Top"), original: 'Scroll to Top' }, f1: true, category, keybinding: { @@ -769,7 +769,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT, - title: localize('workbench.action.terminal.navigationModeExit', "Exit Navigation Mode"), + title: { value: localize('workbench.action.terminal.navigationModeExit', "Exit Navigation Mode"), original: 'Exit Navigation Mode' }, f1: true, category, keybinding: { @@ -787,7 +787,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS, - title: localize('workbench.action.terminal.navigationModeFocusPrevious', "Focus Previous Line (Navigation Mode)"), + title: { value: localize('workbench.action.terminal.navigationModeFocusPrevious', "Focus Previous Line (Navigation Mode)"), original: 'Focus Previous Line (Navigation Mode)' }, f1: true, category, keybinding: { @@ -808,7 +808,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT, - title: localize('workbench.action.terminal.navigationModeFocusNext', "Focus Next Line (Navigation Mode)"), + title: { value: localize('workbench.action.terminal.navigationModeFocusNext', "Focus Next Line (Navigation Mode)"), original: 'Focus Next Line (Navigation Mode)' }, f1: true, category, keybinding: { @@ -829,7 +829,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.CLEAR_SELECTION, - title: localize('workbench.action.terminal.clearSelection', "Clear Selection"), + title: { value: localize('workbench.action.terminal.clearSelection', "Clear Selection"), original: 'Clear Selection' }, f1: true, category, keybinding: { @@ -850,7 +850,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.MANAGE_WORKSPACE_SHELL_PERMISSIONS, - title: localize('workbench.action.terminal.manageWorkspaceShellPermissions', "Manage Workspace Shell Permissions"), + title: { value: localize('workbench.action.terminal.manageWorkspaceShellPermissions', "Manage Workspace Shell Permissions"), original: 'Manage Workspace Shell Permissions' }, f1: true, category }); @@ -863,7 +863,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RENAME, - title: localize('workbench.action.terminal.rename', "Rename"), + title: { value: localize('workbench.action.terminal.rename', "Rename"), original: 'Rename' }, f1: true, category }); @@ -884,7 +884,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FIND_FOCUS, - title: localize('workbench.action.terminal.focusFind', "Focus Find"), + title: { value: localize('workbench.action.terminal.focusFind', "Focus Find"), original: 'Focus Find' }, f1: true, category, keybinding: { @@ -902,7 +902,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FIND_HIDE, - title: localize('workbench.action.terminal.hideFind', "Hide Find"), + title: { value: localize('workbench.action.terminal.hideFind', "Hide Find"), original: 'Hide Find' }, f1: true, category, keybinding: { @@ -921,7 +921,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.QUICK_OPEN_TERM, - title: localize('quickAccessTerminal', "Switch Active Terminal"), + title: { value: localize('quickAccessTerminal', "Switch Active Terminal"), original: 'Switch Active Terminal' }, f1: true, category }); @@ -934,7 +934,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND, - title: localize('workbench.action.terminal.scrollToPreviousCommand', "Scroll To Previous Command"), + title: { value: localize('workbench.action.terminal.scrollToPreviousCommand', "Scroll To Previous Command"), original: 'Scroll To Previous Command' }, f1: true, category, keybinding: { @@ -955,7 +955,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND, - title: localize('workbench.action.terminal.scrollToNextCommand', "Scroll To Next Command"), + title: { value: localize('workbench.action.terminal.scrollToNextCommand', "Scroll To Next Command"), original: 'Scroll To Next Command' }, f1: true, category, keybinding: { @@ -976,7 +976,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND, - title: localize('workbench.action.terminal.selectToPreviousCommand', "Select To Previous Command"), + title: { value: localize('workbench.action.terminal.selectToPreviousCommand', "Select To Previous Command"), original: 'Select To Previous Command' }, f1: true, category, keybinding: { @@ -997,7 +997,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND, - title: localize('workbench.action.terminal.selectToNextCommand', "Select To Next Command"), + title: { value: localize('workbench.action.terminal.selectToNextCommand', "Select To Next Command"), original: 'Select To Next Command' }, f1: true, category, keybinding: { @@ -1018,7 +1018,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE, - title: localize('workbench.action.terminal.selectToPreviousLine', "Select To Previous Line"), + title: { value: localize('workbench.action.terminal.selectToPreviousLine', "Select To Previous Line"), original: 'Select To Previous Line' }, f1: true, category }); @@ -1034,7 +1034,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE, - title: localize('workbench.action.terminal.selectToNextLine', "Select To Next Line"), + title: { value: localize('workbench.action.terminal.selectToNextLine', "Select To Next Line"), original: 'Select To Next Line' }, f1: true, category }); @@ -1050,7 +1050,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_ESCAPE_SEQUENCE_LOGGING, - title: localize('workbench.action.terminal.toggleEscapeSequenceLogging', "Toggle Escape Sequence Logging"), + title: { value: localize('workbench.action.terminal.toggleEscapeSequenceLogging', "Toggle Escape Sequence Logging"), original: 'Toggle Escape Sequence Logging' }, f1: true, category }); @@ -1064,7 +1064,7 @@ export function registerTerminalActions() { const title = localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); super({ id: TERMINAL_COMMAND_ID.SEND_SEQUENCE, - title, + title: { value: title, original: 'Send Custom Sequence To Terminal' }, category, description: { description: title, @@ -1090,7 +1090,7 @@ export function registerTerminalActions() { const title = localize('workbench.action.terminal.newWithCwd', "Create New Integrated Terminal Starting in a Custom Working Directory"); super({ id: TERMINAL_COMMAND_ID.NEW_WITH_CWD, - title, + title: { value: title, original: 'Create New Integrated Terminal Starting in a Custom Working Directory' }, category, description: { description: title, @@ -1125,7 +1125,7 @@ export function registerTerminalActions() { const title = localize('workbench.action.terminal.renameWithArg', "Rename the Currently Active Terminal"); super({ id: TERMINAL_COMMAND_ID.RENAME_WITH_ARG, - title, + title: { value: title, original: 'Rename the Currently Active Terminal' }, category, description: { description: title, @@ -1159,7 +1159,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, - title: localize('workbench.action.terminal.toggleFindRegex', "Toggle Find Using Regex"), + title: { value: localize('workbench.action.terminal.toggleFindRegex', "Toggle Find Using Regex"), original: 'Toggle Find Using Regex' }, f1: true, category, keybinding: { @@ -1179,7 +1179,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, - title: localize('workbench.action.terminal.toggleFindWholeWord', "Toggle Find Using Whole Word"), + title: { value: localize('workbench.action.terminal.toggleFindWholeWord', "Toggle Find Using Whole Word"), original: 'Toggle Find Using Whole Word' }, f1: true, category, keybinding: { @@ -1199,7 +1199,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, - title: localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle Find Using Case Sensitive"), + title: { value: localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle Find Using Case Sensitive"), original: 'Toggle Find Using Case Sensitive' }, f1: true, category, keybinding: { @@ -1219,7 +1219,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FIND_NEXT, - title: localize('workbench.action.terminal.findNext', "Find Next"), + title: { value: localize('workbench.action.terminal.findNext', "Find Next"), original: 'Find Next' }, f1: true, category, keybinding: [ @@ -1245,7 +1245,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FIND_PREVIOUS, - title: localize('workbench.action.terminal.findPrevious', "Find Previous"), + title: { value: localize('workbench.action.terminal.findPrevious', "Find Previous"), original: 'Find Previous' }, f1: true, category, keybinding: [ @@ -1271,7 +1271,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.RELAUNCH, - title: localize('workbench.action.terminal.relaunch', "Relaunch Active Terminal"), + title: { value: localize('workbench.action.terminal.relaunch', "Relaunch Active Terminal"), original: 'Relaunch Active Terminal' }, f1: true, category }); @@ -1284,7 +1284,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.SHOW_ENVIRONMENT_INFORMATION, - title: localize('workbench.action.terminal.showEnvironmentInformation', "Show Environment Information"), + title: { value: localize('workbench.action.terminal.showEnvironmentInformation', "Show Environment Information"), original: 'Show Environment Information' }, f1: true, category }); From 667142d6b98768f998919109c91c1c39963feda6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 26 May 2020 16:50:41 +0200 Subject: [PATCH 059/107] Fix #98366 --- .../common/extensionGalleryService.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 25c274ca05f..2df5bfb9329 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -362,10 +362,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } const { id, uuid } = extension ? extension.identifier : arg1; let query = new Query() - .withFlags(Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties, Flags.ExcludeNonValidated) + .withFlags(Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, 1) - .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') - .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)); + .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code'); if (uuid) { query = query.withFilter(FilterType.ExtensionId, uuid); @@ -426,8 +425,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { let query = new Query() .withFlags(Flags.IncludeLatestVersionOnly, Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, pageSize) - .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') - .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)); + .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code'); if (text) { // Use category filter instead of "category:themes" @@ -484,6 +482,11 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } private queryGallery(query: Query, token: CancellationToken): Promise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> { + // Always exclude non validated and unpublished extensions + query = query + .withFlags(query.flags, Flags.ExcludeNonValidated) + .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)); + if (!this.isEnabled()) { return Promise.reject(new Error('No extension gallery service configured.')); } @@ -602,10 +605,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { getAllVersions(extension: IGalleryExtension, compatible: boolean): Promise { let query = new Query() - .withFlags(Flags.IncludeVersions, Flags.IncludeFiles, Flags.IncludeVersionProperties, Flags.ExcludeNonValidated) + .withFlags(Flags.IncludeVersions, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, 1) - .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') - .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)); + .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code'); if (extension.identifier.uuid) { query = query.withFilter(FilterType.ExtensionId, extension.identifier.uuid); From 553a11c6c87eb1b07ceb1a940a1ecec883bb9d25 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 26 May 2020 16:59:01 +0200 Subject: [PATCH 060/107] group bulk edit preview by document, https://github.com/microsoft/vscode/issues/97881 --- src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts index 4a9b99b6971..0b321ee1f68 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts @@ -20,6 +20,7 @@ import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { ConflictDetector } from 'vs/workbench/services/bulkEdit/browser/conflicts'; import { ResourceMap } from 'vs/base/common/map'; import { localize } from 'vs/nls'; +import { exturi } from 'vs/base/common/resources'; export class CheckedStates { @@ -209,13 +210,13 @@ export class BulkFileOperations { } const insert = (uri: URI, map: Map) => { - let key = uri.toString(); + let key = exturi.getComparisonKey(uri, true); let operation = map.get(key); // rename if (!operation && newToOldUri.has(uri)) { uri = newToOldUri.get(uri)!; - key = uri.toString(); + key = exturi.getComparisonKey(uri, true); operation = map.get(key); } From b26e0bcf39c1b8faaf770265391b5a387d1d9172 Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 26 May 2020 08:07:51 -0700 Subject: [PATCH 061/107] send out missing selection change event when moving cells. --- src/vs/workbench/api/browser/mainThreadNotebook.ts | 1 + .../contrib/notebook/browser/contrib/coreActions.ts | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index e9f673616bf..54e67c584d3 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -35,6 +35,7 @@ export class MainThreadNotebookDocument extends Disposable { this._textModel = new NotebookTextModel(handle, viewType, uri); this._register(this._textModel.onDidModelChange(e => { this._proxy.$acceptModelChanged(this.uri, e); + this._proxy.$acceptEditorPropertiesChanged(uri, { selections: { selections: this._textModel.selections }, metadata: null }); })); this._register(this._textModel.onDidSelectionChange(e => { const selectionsChange = e ? { selections: e } : null; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts b/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts index 69d0a1ad357..b997ba59d80 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts @@ -469,10 +469,10 @@ export async function changeCellToKind(kind: CellKind, context: INotebookCellAct } export interface INotebookCellActionContext { - cellTemplate?: BaseCellRenderTemplate; - cell: ICellViewModel; - notebookEditor: INotebookEditor; - ui?: boolean; + readonly cellTemplate?: BaseCellRenderTemplate; + readonly cell: ICellViewModel; + readonly notebookEditor: INotebookEditor; + readonly ui?: boolean; } abstract class InsertCellCommand extends NotebookAction { From 8213982e27a900b67339a8cbb1776314a5524537 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Tue, 26 May 2020 08:50:43 -0700 Subject: [PATCH 062/107] Update seti-ui theme --- extensions/theme-seti/cgmanifest.json | 2 +- extensions/theme-seti/icons/seti.woff | Bin 35092 -> 34972 bytes .../theme-seti/icons/vs-seti-icon-theme.json | 16 +++++----------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/extensions/theme-seti/cgmanifest.json b/extensions/theme-seti/cgmanifest.json index a3df8c6b322..b3bb41d3eb9 100644 --- a/extensions/theme-seti/cgmanifest.json +++ b/extensions/theme-seti/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "seti-ui", "repositoryUrl": "https://github.com/jesseweed/seti-ui", - "commitHash": "8f22764c37feb7f706465f5186132111a2401b6b" + "commitHash": "f3b2775662b0075aab56e5f0c03269f21f3f0f30" } }, "version": "0.1.0" diff --git a/extensions/theme-seti/icons/seti.woff b/extensions/theme-seti/icons/seti.woff index b4b8366f16556d911cc2bf1332ffa1e24a5ec2ca..5dc3bb8d9b0386a5cd2b60a122305f7040296dac 100644 GIT binary patch delta 33010 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�Zmv^u0e};eg%^L=DH*nF@=;ib@KN0^0lySJ78>+@cd+(X8&_{Jm;(XV0@D z%S-6F=UwnU(}h7)4vpPMMkSTEDU~txgGvfR?|;mDmf;`KVe+&8EQNe+qG8 zet&g@w=$_*B>{Ys4i(}}OJ(6xhjvu#2pwXN9x0l_Z@^yHR-64>dz;G^sbb}ZNy0y< zuAQ(g?u2&(>^LedpSC2ogEvL=!tOA_%MaC-dj}RrLCUJ}Q$`Dow0)!-*g`yFI-U=m z(6S?%zPB5e71~e=EI#e~NX!zCe>z>bHqWv$@mk#%Jh_zV?mIeQt9Y_?l#8BCHgR!L z91K3%lf4ans;l#d=bgavuUXyfc3<{RTR(j0rO&=GGE8_k@HD=m(u~(iG?PWN)T=Hx zc8|Jl71`vp_L+2{+$mqSRGDMGGhZQd`stTkG5)CKg(c77-@R(*|YjgP3o!k(Hl;eLpzi-;70CxZdjLHeDWz_qvIWH+dx3p7fOfrs;LL3vg%sz zm%_*m5@mko^FJ2YxwVv^SEH~}=oJnrd?W1Kb+W-8lcV8alciG(@AzMRAR~}WL%}+2 z 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 D2WcfJ delta 33112 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 Iv)_Zg1kOSVP5=M^ diff --git a/extensions/theme-seti/icons/vs-seti-icon-theme.json b/extensions/theme-seti/icons/vs-seti-icon-theme.json index efa15be7bca..a1f5817da5c 100644 --- a/extensions/theme-seti/icons/vs-seti-icon-theme.json +++ b/extensions/theme-seti/icons/vs-seti-icon-theme.json @@ -1030,12 +1030,6 @@ "fontCharacter": "\\E074", "fontColor": "#cc3e44" }, - "_rmd_light": { - "fontColor": "#498ba7" - }, - "_rmd": { - "fontColor": "#519aba" - }, "_rollup_light": { "fontCharacter": "\\E075", "fontColor": "#b8383d" @@ -1483,7 +1477,7 @@ "test.tsx": "_react_2", "re": "_reasonml", "r": "_R", - "rmd": "_rmd", + "rmd": "_R", "erb": "_html_erb", "erb.html": "_html_erb", "html.erb": "_html_erb", @@ -1678,7 +1672,7 @@ "sql": "_db", "swift": "_swift", "typescript": "_typescript", - "typescriptreact": "_react", + "typescriptreact": "_typescript", "xml": "_xml", "yaml": "_yml", "argdown": "_argdown", @@ -1811,7 +1805,7 @@ "test.tsx": "_react_2_light", "re": "_reasonml_light", "r": "_R_light", - "rmd": "_rmd_light", + "rmd": "_R_light", "erb": "_html_erb_light", "erb.html": "_html_erb_light", "html.erb": "_html_erb_light", @@ -1949,7 +1943,7 @@ "sql": "_db_light", "swift": "_swift_light", "typescript": "_typescript_light", - "typescriptreact": "_react_light", + "typescriptreact": "_typescript_light", "xml": "_xml_light", "yaml": "_yml_light", "argdown": "_argdown_light", @@ -2030,5 +2024,5 @@ "npm-debug.log": "_npm_ignored_light" } }, - "version": "https://github.com/jesseweed/seti-ui/commit/8f22764c37feb7f706465f5186132111a2401b6b" + "version": "https://github.com/jesseweed/seti-ui/commit/f3b2775662b0075aab56e5f0c03269f21f3f0f30" } \ No newline at end of file From a87478c19e3ab55392e64fd469487f459c7709a1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 26 May 2020 17:51:31 +0200 Subject: [PATCH 063/107] #98530 add commit --- src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 27f7095a451..23b661add1c 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -292,7 +292,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo this.disableSync(); this.notificationService.notify({ severity: Severity.Error, - message: localize('error upgrade required', "Turned off sync because the current version ({0}) of {1} is not compatible with the Preferences Sync Service. Please update and turn on sync to continue syncing.", this.productService.version, this.productService.nameLong), + message: localize('error upgrade required', "Turned off sync because the current version ({0}, {1}) of {2} is not compatible with the Preferences Sync Service. Please update and turn on sync to continue syncing.", this.productService.version, this.productService.commit, this.productService.nameLong), }); return true; } From 5575473244abeb32a537ba5fe52d10d0d0a8817e Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 26 May 2020 18:07:41 +0200 Subject: [PATCH 064/107] #98584 --- src/vs/base/browser/ui/selectBox/selectBoxCustom.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index 4924646f11c..50558044d09 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -727,7 +727,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi mouseSupport: false, accessibilityProvider: { getAriaLabel: (element) => element.text, - getWidgetAriaLabel: () => localize('selectBox', "Select Box"), + getWidgetAriaLabel: () => localize({ key: 'selectBox', comment: ['Behave like native select dropdown element.'] }, "Select Box"), getRole: () => 'option', getWidgetRole: () => 'listbox' } From dd62fa471cb39a36df06afb416d2b98966626251 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Tue, 26 May 2020 09:10:54 -0700 Subject: [PATCH 065/107] refs #98576 --- src/vs/workbench/browser/actions/layoutActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 6312c90b200..88371fe8b4c 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -687,7 +687,7 @@ export class MoveFocusedViewAction extends Action { const quickPick = this.quickInputService.createQuickPick(); quickPick.placeholder = nls.localize('moveFocusedView.selectDestination', "Select a Destination for the View"); - quickPick.title = nls.localize('moveFocusedView.title', "View: Move {0}", viewDescriptor.name); + quickPick.title = nls.localize({ key: 'moveFocusedView.title', comment: ['{0} indicates the title of the view the user has selected to move.'] }, "View: Move {0}", viewDescriptor.name); const items: Array = []; const currentContainer = this.viewDescriptorService.getViewContainerByViewId(focusedViewId)!; From 19bab9afecbd835af3b7e87e879b9208835cdceb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 26 May 2020 18:15:39 +0200 Subject: [PATCH 066/107] clarify nls string, #98584 --- src/vs/editor/contrib/rename/renameInputField.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/rename/renameInputField.ts b/src/vs/editor/contrib/rename/renameInputField.ts index d527c20ea96..2be443c8c55 100644 --- a/src/vs/editor/contrib/rename/renameInputField.ts +++ b/src/vs/editor/contrib/rename/renameInputField.ts @@ -82,7 +82,7 @@ export class RenameInputField implements IContentWidget { const updateLabel = () => { const [accept, preview] = this._acceptKeybindings; this._keybindingService.lookupKeybinding(accept); - this._label!.innerText = localize('label', "{0} to Rename, {1} to Preview", this._keybindingService.lookupKeybinding(accept)?.getLabel(), this._keybindingService.lookupKeybinding(preview)?.getLabel()); + this._label!.innerText = localize({ key: 'label', comment: ['placeholders are keybindings, e.g "F2 to Rename, Shift+F2 to Preview"'] }, "{0} to Rename, {1} to Preview", this._keybindingService.lookupKeybinding(accept)?.getLabel(), this._keybindingService.lookupKeybinding(preview)?.getLabel()); }; updateLabel(); this._disposables.add(this._keybindingService.onDidUpdateKeybindings(updateLabel)); From cc8c848416b7a042255b6257ba9bd58963bcf630 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Tue, 26 May 2020 09:56:51 -0700 Subject: [PATCH 067/107] fixes #98337 --- .../browser/parts/views/viewPaneContainer.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index 5ef6556da13..e7665253a05 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -49,7 +49,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { URI } from 'vs/base/common/uri'; -import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; +import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; export interface IPaneColors extends IColorMapping { @@ -1580,8 +1580,8 @@ registerAction2( id: 'views.moveViewUp', title: nls.localize('viewMoveUp', "Move View Up"), keybinding: { - primary: KeyMod.Shift + KeyMod.Alt + KeyCode.UpArrow, - weight: KeybindingWeight.WorkbenchContrib, + primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.UpArrow), + weight: KeybindingWeight.WorkbenchContrib + 1, when: FocusedViewContext.notEqualsTo('') } }, -1); @@ -1596,8 +1596,8 @@ registerAction2( id: 'views.moveViewLeft', title: nls.localize('viewMoveLeft', "Move View Left"), keybinding: { - primary: KeyMod.Shift + KeyMod.Alt + KeyCode.LeftArrow, - weight: KeybindingWeight.WorkbenchContrib, + primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.LeftArrow), + weight: KeybindingWeight.WorkbenchContrib + 1, when: FocusedViewContext.notEqualsTo('') } }, -1); @@ -1612,8 +1612,8 @@ registerAction2( id: 'views.moveViewDown', title: nls.localize('viewMoveDown', "Move View Down"), keybinding: { - primary: KeyMod.Shift + KeyMod.Alt + KeyCode.DownArrow, - weight: KeybindingWeight.WorkbenchContrib, + primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.DownArrow), + weight: KeybindingWeight.WorkbenchContrib + 1, when: FocusedViewContext.notEqualsTo('') } }, 1); @@ -1628,8 +1628,8 @@ registerAction2( id: 'views.moveViewRight', title: nls.localize('viewMoveRight', "Move View Right"), keybinding: { - primary: KeyMod.Shift + KeyMod.Alt + KeyCode.RightArrow, - weight: KeybindingWeight.WorkbenchContrib, + primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.RightArrow), + weight: KeybindingWeight.WorkbenchContrib + 1, when: FocusedViewContext.notEqualsTo('') } }, 1); From 3eb6c1704ba358b7bb20201d9af2ca051ade2b68 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 26 May 2020 12:12:34 -0500 Subject: [PATCH 068/107] Disable notebook smoketests in web --- test/smoke/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 51c085de716..4f1565f1a96 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -316,7 +316,7 @@ describe(`VSCode Smoke Tests (${opts.web ? 'Web' : 'Electron'})`, () => { if (!opts.web) { setupDataLossTests(); } if (!opts.web) { setupDataPreferencesTests(); } setupDataSearchTests(); - setupDataNotebookTests(); + if (!opts.web) { setupDataNotebookTests(); } setupDataLanguagesTests(); setupDataEditorTests(); setupDataStatusbarTests(!!opts.web); From 56393440fbed29946cb38ba737302d9021f7ae57 Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 26 May 2020 10:12:48 -0700 Subject: [PATCH 069/107] add error messages for notebook workflow integration tests. --- extensions/vscode-notebook-tests/src/notebook.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extensions/vscode-notebook-tests/src/notebook.test.ts b/extensions/vscode-notebook-tests/src/notebook.test.ts index 19d9e97a2c4..ec6eab2d898 100644 --- a/extensions/vscode-notebook-tests/src/notebook.test.ts +++ b/extensions/vscode-notebook-tests/src/notebook.test.ts @@ -318,10 +318,14 @@ suite('notebook workflow', () => { // ---- move up and down ---- // await vscode.commands.executeCommand('notebook.cell.moveDown'); + assert.equal(vscode.notebook.activeNotebookEditor!.document.cells.indexOf(vscode.notebook.activeNotebookEditor!.selection!), 1, + `first move down, active cell ${vscode.notebook.activeNotebookEditor!.selection!.uri.toString()}, ${vscode.notebook.activeNotebookEditor!.selection!.source}`); + await vscode.commands.executeCommand('notebook.cell.moveDown'); activeCell = vscode.notebook.activeNotebookEditor!.selection; - assert.equal(vscode.notebook.activeNotebookEditor!.document.cells.indexOf(activeCell!), 2); + assert.equal(vscode.notebook.activeNotebookEditor!.document.cells.indexOf(activeCell!), 2, + `second move down, active cell ${vscode.notebook.activeNotebookEditor!.selection!.uri.toString()}, ${vscode.notebook.activeNotebookEditor!.selection!.source}`); assert.equal(vscode.notebook.activeNotebookEditor!.document.cells[0].source, 'test'); assert.equal(vscode.notebook.activeNotebookEditor!.document.cells[1].source, ''); assert.equal(vscode.notebook.activeNotebookEditor!.document.cells[2].source, 'test'); From acb038266d5eb25826ea7b081cb163b77cfb4aad Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Tue, 26 May 2020 10:15:44 -0700 Subject: [PATCH 070/107] fixes #98453 in case view pane is asked for title after deregistration --- .../browser/parts/views/viewPaneContainer.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index e7665253a05..ad62952a45e 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -49,7 +49,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { URI } from 'vs/base/common/uri'; -import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; +import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; export interface IPaneColors extends IColorMapping { @@ -377,10 +377,10 @@ export abstract class ViewPane extends Pane implements IView { private calculateTitle(title: string): string { const viewContainer = this.viewDescriptorService.getViewContainerByViewId(this.id)!; const model = this.viewDescriptorService.getViewContainerModel(viewContainer); - const viewDescriptor = this.viewDescriptorService.getViewDescriptorById(this.id)!; + const viewDescriptor = this.viewDescriptorService.getViewDescriptorById(this.id); const isDefault = this.viewDescriptorService.getDefaultContainerById(this.id) === viewContainer; - if (!isDefault && viewDescriptor.containerTitle && model.title !== viewDescriptor.containerTitle) { + if (!isDefault && viewDescriptor?.containerTitle && model.title !== viewDescriptor.containerTitle) { return `${viewDescriptor.containerTitle}: ${title}`; } @@ -1580,8 +1580,8 @@ registerAction2( id: 'views.moveViewUp', title: nls.localize('viewMoveUp', "Move View Up"), keybinding: { - primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.UpArrow), - weight: KeybindingWeight.WorkbenchContrib + 1, + primary: KeyMod.Shift + KeyMod.Alt + KeyCode.UpArrow, + weight: KeybindingWeight.WorkbenchContrib, when: FocusedViewContext.notEqualsTo('') } }, -1); @@ -1596,8 +1596,8 @@ registerAction2( id: 'views.moveViewLeft', title: nls.localize('viewMoveLeft', "Move View Left"), keybinding: { - primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.LeftArrow), - weight: KeybindingWeight.WorkbenchContrib + 1, + primary: KeyMod.Shift + KeyMod.Alt + KeyCode.LeftArrow, + weight: KeybindingWeight.WorkbenchContrib, when: FocusedViewContext.notEqualsTo('') } }, -1); @@ -1612,8 +1612,8 @@ registerAction2( id: 'views.moveViewDown', title: nls.localize('viewMoveDown', "Move View Down"), keybinding: { - primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.DownArrow), - weight: KeybindingWeight.WorkbenchContrib + 1, + primary: KeyMod.Shift + KeyMod.Alt + KeyCode.DownArrow, + weight: KeybindingWeight.WorkbenchContrib, when: FocusedViewContext.notEqualsTo('') } }, 1); @@ -1628,8 +1628,8 @@ registerAction2( id: 'views.moveViewRight', title: nls.localize('viewMoveRight', "Move View Right"), keybinding: { - primary: KeyChord(KeyMod.CtrlCmd + KeyCode.KEY_K, KeyCode.RightArrow), - weight: KeybindingWeight.WorkbenchContrib + 1, + primary: KeyMod.Shift + KeyMod.Alt + KeyCode.RightArrow, + weight: KeybindingWeight.WorkbenchContrib, when: FocusedViewContext.notEqualsTo('') } }, 1); From 5372d9c9623a445b82656048bc6308815bd44c64 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Tue, 26 May 2020 10:29:16 -0700 Subject: [PATCH 071/107] fixes #98456 --- src/vs/workbench/contrib/debug/browser/debug.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index 7aa24cd9522..b3df4f720d6 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -100,7 +100,7 @@ const VIEW_CONTAINER: ViewContainer = Registry.as(ViewE id: OpenDebugConsoleAction.ID, keybindings: openPanelKb }, - order: 3, + order: 2, hideIfEmpty: true }, ViewContainerLocation.Panel); From eb781a2e0a19511458337433ef9cc5b2efb032d5 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Tue, 26 May 2020 11:25:22 -0700 Subject: [PATCH 072/107] Fix #98602 --- extensions/theme-defaults/themes/light_plus.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/theme-defaults/themes/light_plus.json b/extensions/theme-defaults/themes/light_plus.json index 00c2a6cb470..63e97356983 100644 --- a/extensions/theme-defaults/themes/light_plus.json +++ b/extensions/theme-defaults/themes/light_plus.json @@ -169,7 +169,7 @@ "keyword.control.anchor.regexp" ], "settings": { - "foreground": "#ff0000" + "foreground": "#EE0000" } }, { @@ -181,7 +181,7 @@ { "scope": "constant.character.escape", "settings": { - "foreground": "#ff0000" + "foreground": "#EE0000" } }, { From 478ba180b3bb9cf9a677454a9ef95100308034aa Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 26 May 2020 13:02:00 -0500 Subject: [PATCH 073/107] Fix command links, http links, file links in markdown cells --- src/vs/base/browser/markdownRenderer.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index da658dd0d57..143ab78cb67 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -111,7 +111,10 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende } href = _href(href, false); if (options.baseUrl) { - href = resolvePath(options.baseUrl, href).toString(); + const hasScheme = /^\w[\w\d+.-]*:/.test(href); + if (!hasScheme) { + href = resolvePath(options.baseUrl, href).toString(); + } } title = removeMarkdownEscapes(title); href = removeMarkdownEscapes(href); From 766e520783df109b0f1ac1040ae702b00c4562de Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 26 May 2020 11:57:02 -0700 Subject: [PATCH 074/107] Allow TS Server to be started with --inspect-brk (#98340) --- .../typescript-language-features/src/tsServer/spawner.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/typescript-language-features/src/tsServer/spawner.ts b/extensions/typescript-language-features/src/tsServer/spawner.ts index 89e4261fb05..99318d9940d 100644 --- a/extensions/typescript-language-features/src/tsServer/spawner.ts +++ b/extensions/typescript-language-features/src/tsServer/spawner.ts @@ -110,9 +110,10 @@ export class TypeScriptServerSpawner { private getForkOptions(kind: ServerKind, configuration: TypeScriptServiceConfiguration) { const debugPort = TypeScriptServerSpawner.getDebugPort(kind); + const inspectFlag = process.env['TSS_DEBUG_BRK'] ? '--inspect-brk' : '--inspect'; const tsServerForkOptions: electron.ForkOptions = { execArgv: [ - ...(debugPort ? [`--inspect=${debugPort}`] : []), + ...(debugPort ? [`${inspectFlag}=${debugPort}`] : []), ...(configuration.maxTsServerMemory ? [`--max-old-space-size=${configuration.maxTsServerMemory}`] : []) ] }; @@ -200,7 +201,7 @@ export class TypeScriptServerSpawner { // We typically only want to debug the main semantic server return undefined; } - const value = process.env['TSS_DEBUG']; + const value = process.env['TSS_DEBUG_BRK'] || process.env['TSS_DEBUG']; if (value) { const port = parseInt(value); if (!isNaN(port)) { From b398b7ea1413050261d2168f5fa5d05a34508a2e Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Tue, 26 May 2020 19:59:28 +0100 Subject: [PATCH 075/107] Treat *.ts.map files as JSON (#98409) --- extensions/json/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/json/package.json b/extensions/json/package.json index 901584e1d90..af713956bfd 100644 --- a/extensions/json/package.json +++ b/extensions/json/package.json @@ -26,6 +26,7 @@ ".webmanifest", ".js.map", ".css.map", + ".ts.map", ".har", ".jslintrc", ".jsonld" From 48e4853d4c02a7acc9ee6249cc4b19b69a78cf28 Mon Sep 17 00:00:00 2001 From: Jackson Kearl Date: Tue, 26 May 2020 12:03:56 -0700 Subject: [PATCH 076/107] Bump actions --- .github/workflows/author-verified.yml | 2 +- .github/workflows/classifier-apply.yml | 2 +- .github/workflows/commands.yml | 2 +- .github/workflows/english-please.yml | 2 +- .github/workflows/feature-request.yml | 2 +- .github/workflows/locker.yml | 2 +- .github/workflows/needs-more-info-closer.yml | 2 +- .github/workflows/on-label.yml | 2 +- .github/workflows/on-open.yml | 2 +- .github/workflows/test-plan-item-validator.yml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/author-verified.yml b/.github/workflows/author-verified.yml index e78602ddd11..c4293b05d9d 100644 --- a/.github/workflows/author-verified.yml +++ b/.github/workflows/author-verified.yml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v16 + ref: v17 path: ./actions - name: Install Actions if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'author-verification-requested') diff --git a/.github/workflows/classifier-apply.yml b/.github/workflows/classifier-apply.yml index 38e0aabad7f..ff40df8247b 100644 --- a/.github/workflows/classifier-apply.yml +++ b/.github/workflows/classifier-apply.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v16 + ref: v17 path: ./actions - name: Install Actions run: npm install --production --prefix ./actions diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml index 127af00a002..6e216904893 100644 --- a/.github/workflows/commands.yml +++ b/.github/workflows/commands.yml @@ -13,7 +13,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v16 + ref: v17 - name: Install Actions run: npm install --production --prefix ./actions - name: Run Commands diff --git a/.github/workflows/english-please.yml b/.github/workflows/english-please.yml index 241fe7b413d..7b7b373be4e 100644 --- a/.github/workflows/english-please.yml +++ b/.github/workflows/english-please.yml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v16 + ref: v17 path: ./actions - name: Install Actions if: contains(github.event.issue.labels.*.name, '*english-please') diff --git a/.github/workflows/feature-request.yml b/.github/workflows/feature-request.yml index 3beed1f0e28..e97a6525a3c 100644 --- a/.github/workflows/feature-request.yml +++ b/.github/workflows/feature-request.yml @@ -17,7 +17,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v16 + ref: v17 - name: Install Actions if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'feature-request') run: npm install --production --prefix ./actions diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index e870f6bcb17..2b6f86882c0 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -13,7 +13,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v16 + ref: v17 - name: Install Actions run: npm install --production --prefix ./actions - name: Run Locker diff --git a/.github/workflows/needs-more-info-closer.yml b/.github/workflows/needs-more-info-closer.yml index d82efcf97de..630038cd865 100644 --- a/.github/workflows/needs-more-info-closer.yml +++ b/.github/workflows/needs-more-info-closer.yml @@ -13,7 +13,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v16 + ref: v17 - name: Install Actions run: npm install --production --prefix ./actions - name: Run Needs More Info Closer diff --git a/.github/workflows/on-label.yml b/.github/workflows/on-label.yml index 57fe3b3b988..9febd795f33 100644 --- a/.github/workflows/on-label.yml +++ b/.github/workflows/on-label.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v16 + ref: v17 path: ./actions - name: Install Actions run: npm install --production --prefix ./actions diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index a8f501c4656..233a334b471 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 with: repository: 'microsoft/vscode-github-triage-actions' - ref: v16 + ref: v17 path: ./actions - name: Install Actions run: npm install --production --prefix ./actions diff --git a/.github/workflows/test-plan-item-validator.yml b/.github/workflows/test-plan-item-validator.yml index be7d119fa3b..67b8519b2af 100644 --- a/.github/workflows/test-plan-item-validator.yml +++ b/.github/workflows/test-plan-item-validator.yml @@ -14,7 +14,7 @@ jobs: with: repository: 'microsoft/vscode-github-triage-actions' path: ./actions - ref: v16 + ref: v17 - name: Install Actions if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item') run: npm install --production --prefix ./actions From b314697b4d08e681227cf12f62acd07bd911c79d Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Tue, 26 May 2020 14:51:13 -0700 Subject: [PATCH 077/107] refs #96115 --- src/vs/workbench/common/views.ts | 5 +++++ .../services/views/browser/viewDescriptorService.ts | 6 +++--- .../services/views/common/viewContainerModel.ts | 11 ++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 0a7e94dc9f5..6a8dd33202f 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -237,6 +237,11 @@ export interface IAddedViewDescriptorRef extends IViewDescriptorRef { size?: number; } +export interface IAddedViewDescriptorState { + viewDescriptor: IViewDescriptor, + collapsed?: boolean; +} + export interface IViewContainerModel { readonly title: string; diff --git a/src/vs/workbench/services/views/browser/viewDescriptorService.ts b/src/vs/workbench/services/views/browser/viewDescriptorService.ts index 5436753128f..2ad2a87523c 100644 --- a/src/vs/workbench/services/views/browser/viewDescriptorService.ts +++ b/src/vs/workbench/services/views/browser/viewDescriptorService.ts @@ -337,7 +337,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor private moveViews(views: IViewDescriptor[], from: ViewContainer, to: ViewContainer, skipCacheUpdate?: boolean): void { this.removeViews(from, views); - this.addViews(to, views); + this.addViews(to, views, true); const oldLocation = this.getViewContainerLocation(from); const newLocation = this.getViewContainerLocation(to); @@ -676,14 +676,14 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor }); } - private addViews(container: ViewContainer, views: IViewDescriptor[]): void { + private addViews(container: ViewContainer, views: IViewDescriptor[], expandViews?: boolean): void { // Update in memory cache views.forEach(view => { this.cachedViewInfo.set(view.id, { containerId: container.id }); this.getOrCreateDefaultViewLocationContextKey(view).set(this.getDefaultContainerById(view.id) === container); }); - this.getViewContainerModel(container).add(views); + this.getViewContainerModel(container).add(views.map(view => { return { viewDescriptor: view, collapsed: expandViews ? false : undefined }; })); } private removeViews(container: ViewContainer, views: IViewDescriptor[]): void { diff --git a/src/vs/workbench/services/views/common/viewContainerModel.ts b/src/vs/workbench/services/views/common/viewContainerModel.ts index 22a0bee904a..5a2ff0d3508 100644 --- a/src/vs/workbench/services/views/common/viewContainerModel.ts +++ b/src/vs/workbench/services/views/common/viewContainerModel.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ViewContainer, IViewsRegistry, IViewDescriptor, Extensions as ViewExtensions, IViewContainerModel, IAddedViewDescriptorRef, IViewDescriptorRef } from 'vs/workbench/common/views'; +import { ViewContainer, IViewsRegistry, IViewDescriptor, Extensions as ViewExtensions, IViewContainerModel, IAddedViewDescriptorRef, IViewDescriptorRef, IAddedViewDescriptorState } from 'vs/workbench/common/views'; import { IContextKeyService, IReadableSet } from 'vs/platform/contextkey/common/contextkey'; import { IStorageService, StorageScope, IWorkspaceStorageChangeEvent } from 'vs/platform/storage/common/storage'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -461,12 +461,13 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode }); } - add(viewDescriptors: IViewDescriptor[]): void { + add(addedViewDescriptorStates: IAddedViewDescriptorState[]): void { const addedItems: IViewDescriptorItem[] = []; const addedActiveDescriptors: IViewDescriptor[] = []; const addedVisibleItems: { index: number, viewDescriptor: IViewDescriptor, size?: number, collapsed: boolean; }[] = []; - for (const viewDescriptor of viewDescriptors) { + for (const addedViewDescriptorState of addedViewDescriptorStates) { + const viewDescriptor = addedViewDescriptorState.viewDescriptor; if (viewDescriptor.when) { for (const key of viewDescriptor.when.keys()) { @@ -482,13 +483,13 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode } else { state.visibleGlobal = isUndefinedOrNull(state.visibleGlobal) ? !viewDescriptor.hideByDefault : state.visibleGlobal; } - state.collapsed = isUndefinedOrNull(state.collapsed) ? !!viewDescriptor.collapsed : state.collapsed; + state.collapsed = isUndefinedOrNull(addedViewDescriptorState.collapsed) ? (isUndefinedOrNull(state.collapsed) ? !!viewDescriptor.collapsed : state.collapsed) : addedViewDescriptorState.collapsed; } else { state = { active: false, visibleGlobal: !viewDescriptor.hideByDefault, visibleWorkspace: !viewDescriptor.hideByDefault, - collapsed: !!viewDescriptor.collapsed, + collapsed: isUndefinedOrNull(addedViewDescriptorState.collapsed) ? !!viewDescriptor.collapsed : addedViewDescriptorState.collapsed, }; } this.viewDescriptorsState.set(viewDescriptor.id, state); From 1d5d9558e60d509c52aa8ea95e55969c37f7f097 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 26 May 2020 16:53:07 -0500 Subject: [PATCH 078/107] Add string labels #98576 --- src/vs/workbench/contrib/preferences/browser/tocTree.ts | 6 +++++- .../workbench/contrib/search/browser/anythingQuickAccess.ts | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/tocTree.ts b/src/vs/workbench/contrib/preferences/browser/tocTree.ts index 70189937d1c..b8bc079ae71 100644 --- a/src/vs/workbench/contrib/preferences/browser/tocTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/tocTree.ts @@ -157,7 +157,11 @@ export function createTOCIterator(model: TOCTreeModel | SettingsTreeGroupElement class SettingsAccessibilityProvider implements IListAccessibilityProvider { getWidgetAriaLabel(): string { - return localize('settingsTOC', "Settings Table of Contents"); + return localize({ + key: 'settingsTOC', + comment: ['A label for the table of contents for the full settings list'] + }, + "Settings Table of Contents"); } getAriaLabel(element: SettingsTreeElement): string { diff --git a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts index 2ffee859696..468d6fe451c 100644 --- a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts +++ b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts @@ -869,7 +869,9 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider Date: Tue, 26 May 2020 15:27:56 -0700 Subject: [PATCH 079/107] fixes #97237 --- src/vs/base/browser/ui/menu/menu.ts | 3 ++- src/vs/base/browser/ui/menu/menubar.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/menu/menu.ts b/src/vs/base/browser/ui/menu/menu.ts index 8612b5b1b84..ed48038df11 100644 --- a/src/vs/base/browser/ui/menu/menu.ts +++ b/src/vs/base/browser/ui/menu/menu.ts @@ -41,6 +41,7 @@ export interface IMenuOptions { enableMnemonics?: boolean; anchorAlignment?: AnchorAlignment; expandDirection?: Direction; + useEventAsContext?: boolean; } export interface IMenuStyles { @@ -316,7 +317,7 @@ export class Menu extends ActionBar { return menuActionViewItem; } else { - const menuItemOptions: IMenuItemOptions = { enableMnemonics: options.enableMnemonics }; + const menuItemOptions: IMenuItemOptions = { enableMnemonics: options.enableMnemonics, useEventAsContext: options.useEventAsContext }; if (options.getKeyBinding) { const keybinding = options.getKeyBinding(action); if (keybinding) { diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 463073dc0a7..f4506d877b5 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -945,7 +945,8 @@ export class MenuBar extends Disposable { actionRunner: this.actionRunner, enableMnemonics: this.options.alwaysOnMnemonics || (this.mnemonicsInUse && this.options.enableMnemonics), ariaLabel: withNullAsUndefined(customMenu.buttonElement.getAttribute('aria-label')), - expandDirection: this.options.compactMode !== undefined ? this.options.compactMode : Direction.Right + expandDirection: this.options.compactMode !== undefined ? this.options.compactMode : Direction.Right, + useEventAsContext: true }; let menuWidget = this._register(new Menu(menuHolder, customMenu.actions, menuOptions)); From 0a466841237b1222c287f3a05ab0287abd099aad Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Tue, 26 May 2020 15:56:18 -0700 Subject: [PATCH 080/107] Remove consecutive blank lines from d.ts files --- src/vs/vscode.d.ts | 6 ------ src/vs/vscode.proposed.d.ts | 8 -------- 2 files changed, 14 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index c650293762e..559a5e485e4 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2645,7 +2645,6 @@ declare module 'vscode' { TypeParameter = 25 } - /** * Symbol tags are extra annotations that tweak the rendering of a symbol. */ @@ -3055,7 +3054,6 @@ declare module 'vscode' { */ renameFile(oldUri: Uri, newUri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; - /** * Get all text edits grouped by resource. * @@ -3964,7 +3962,6 @@ declare module 'vscode' { resolveCompletionItem?(item: T, token: CancellationToken): ProviderResult; } - /** * A document link is a range in a text document that links to an internal or external resource, like another * text document or a web site. @@ -5657,7 +5654,6 @@ declare module 'vscode' { private constructor(id: string, label: string); } - /** * A structure that defines a task kind in the system. * The value must be JSON-stringifyable. @@ -8957,7 +8953,6 @@ declare module 'vscode' { readonly files: ReadonlyArray<{ oldUri: Uri, newUri: Uri }>; } - /** * An event describing a change to the set of [workspace folders](#workspace.workspaceFolders). */ @@ -10641,7 +10636,6 @@ declare module 'vscode' { */ export let breakpoints: Breakpoint[]; - /** * An [event](#Event) which fires when the [active debug session](#debug.activeDebugSession) * has changed. *Note* that the event also fires when the active debug session changes diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index bb3a911e0f1..7a1302fecb1 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -78,7 +78,6 @@ declare module 'vscode' { readonly removed: string[]; } - /** * Options to be used when getting a session from an [AuthenticationProvider](#AuthenticationProvider). */ @@ -1018,8 +1017,6 @@ declare module 'vscode' { //#endregion - - //#region Terminal link handlers https://github.com/microsoft/vscode/issues/91606 export namespace window { @@ -1534,7 +1531,6 @@ declare module 'vscode' { export interface CustomTextEditorProvider { - /** * Handle when the underlying resource for a custom editor is renamed. * @@ -1552,7 +1548,6 @@ declare module 'vscode' { //#endregion - //#region allow QuickPicks to skip sorting: https://github.com/microsoft/vscode/issues/73904 export interface QuickPick extends QuickInput { @@ -1841,7 +1836,6 @@ declare module 'vscode' { preloads?: Uri[]; } - export interface NotebookCellsChangeData { readonly start: number; readonly deletedCount: number; @@ -2040,7 +2034,6 @@ declare module 'vscode' { //#endregion - //#region @eamodio - timeline: https://github.com/microsoft/vscode/issues/84297 export class TimelineItem { @@ -2273,7 +2266,6 @@ declare module 'vscode' { //#endregion - //#region https://github.com/microsoft/vscode/issues/91555 export enum StandardTokenType { From 040034f7aeaec1fea0e0c089724c86c47bcd2dc7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 26 May 2020 16:22:37 -0700 Subject: [PATCH 081/107] Update colorizer baselines --- .../bat/test/colorize-results/test_bat.json | 4 +-- .../test/colorize-results/test_coffee.json | 4 +-- .../test/colorize-results/test-78769_cpp.json | 26 +++++++++---------- .../cpp/test/colorize-results/test_cpp.json | 4 +-- .../json/test/colorize-results/test_json.json | 4 +-- .../make/test/colorize-results/makefile.json | 14 +++++----- .../perl/test/colorize-results/test2_pl.json | 8 +++--- .../perl/test/colorize-results/test_pl.json | 18 ++++++------- .../colorize-results/issue-28354_php.json | 4 +-- .../test-freeze-56377_py.json | 2 +- .../ruby/test/colorize-results/test_rb.json | 8 +++--- .../scss/test/colorize-results/test_scss.json | 8 +++--- 12 files changed, 52 insertions(+), 52 deletions(-) diff --git a/extensions/bat/test/colorize-results/test_bat.json b/extensions/bat/test/colorize-results/test_bat.json index 97155fafc8b..eb76b0e1d04 100644 --- a/extensions/bat/test/colorize-results/test_bat.json +++ b/extensions/bat/test/colorize-results/test_bat.json @@ -488,7 +488,7 @@ "t": "source.batchfile constant.character.escape.batchfile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -510,7 +510,7 @@ "t": "source.batchfile constant.character.escape.batchfile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" diff --git a/extensions/coffeescript/test/colorize-results/test_coffee.json b/extensions/coffeescript/test/colorize-results/test_coffee.json index 7c72176431d..9647307f073 100644 --- a/extensions/coffeescript/test/colorize-results/test_coffee.json +++ b/extensions/coffeescript/test/colorize-results/test_coffee.json @@ -1555,7 +1555,7 @@ "t": "source.coffee string.regexp.multiline.coffee keyword.control.anchor.regexp", "r": { "dark_plus": "keyword.control.anchor.regexp: #DCDCAA", - "light_plus": "keyword.control.anchor.regexp: #FF0000", + "light_plus": "keyword.control.anchor.regexp: #EE0000", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", "hc_black": "keyword.control: #C586C0" @@ -1605,4 +1605,4 @@ "hc_black": "string.regexp: #D16969" } } -] +] \ No newline at end of file diff --git a/extensions/cpp/test/colorize-results/test-78769_cpp.json b/extensions/cpp/test/colorize-results/test-78769_cpp.json index eb114a4f007..82846880603 100644 --- a/extensions/cpp/test/colorize-results/test-78769_cpp.json +++ b/extensions/cpp/test/colorize-results/test-78769_cpp.json @@ -191,7 +191,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -257,7 +257,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -389,7 +389,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp meta.block.struct.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -433,7 +433,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp meta.block.struct.cpp meta.body.struct.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -532,7 +532,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp meta.block.struct.cpp meta.body.struct.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -587,7 +587,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -719,7 +719,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -763,7 +763,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -862,7 +862,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp meta.function.definition.cpp meta.body.function.definition.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -906,7 +906,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -1027,7 +1027,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp meta.block.namespace.cpp meta.body.namespace.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -1071,7 +1071,7 @@ "t": "source.cpp meta.preprocessor.macro.cpp constant.character.escape.line-continuation.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", "hc_black": "constant.character: #569CD6" @@ -1187,4 +1187,4 @@ "hc_black": "meta.preprocessor: #569CD6" } } -] +] \ No newline at end of file diff --git a/extensions/cpp/test/colorize-results/test_cpp.json b/extensions/cpp/test/colorize-results/test_cpp.json index 108895f8f65..10f6041bb00 100644 --- a/extensions/cpp/test/colorize-results/test_cpp.json +++ b/extensions/cpp/test/colorize-results/test_cpp.json @@ -2314,7 +2314,7 @@ "t": "source.cpp meta.function.definition.cpp meta.body.function.definition.cpp string.quoted.double.cpp constant.character.escape.cpp", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -2430,4 +2430,4 @@ "hc_black": "default: #FFFFFF" } } -] +] \ No newline at end of file diff --git a/extensions/json/test/colorize-results/test_json.json b/extensions/json/test/colorize-results/test_json.json index fc3dec21721..6f94bec76e6 100644 --- a/extensions/json/test/colorize-results/test_json.json +++ b/extensions/json/test/colorize-results/test_json.json @@ -389,7 +389,7 @@ "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json constant.character.escape.json", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -1165,4 +1165,4 @@ "hc_black": "default: #FFFFFF" } } -] +] \ No newline at end of file diff --git a/extensions/make/test/colorize-results/makefile.json b/extensions/make/test/colorize-results/makefile.json index 616de8fb8e0..40adcc74122 100644 --- a/extensions/make/test/colorize-results/makefile.json +++ b/extensions/make/test/colorize-results/makefile.json @@ -136,7 +136,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -279,7 +279,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -323,7 +323,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile comment.line.number-sign.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "comment: #6A9955", "light_vs": "comment: #008000", "hc_black": "constant.character: #569CD6" @@ -378,7 +378,7 @@ "t": "source.makefile comment.line.number-sign.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "comment: #6A9955", "light_vs": "comment: #008000", "hc_black": "constant.character: #569CD6" @@ -554,7 +554,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -884,7 +884,7 @@ "t": "source.makefile meta.scope.recipe.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -3029,7 +3029,7 @@ "t": "source.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" diff --git a/extensions/perl/test/colorize-results/test2_pl.json b/extensions/perl/test/colorize-results/test2_pl.json index 99e22463982..6fc00b0b064 100644 --- a/extensions/perl/test/colorize-results/test2_pl.json +++ b/extensions/perl/test/colorize-results/test2_pl.json @@ -1302,7 +1302,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -1324,7 +1324,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -1346,7 +1346,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -1775,7 +1775,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" diff --git a/extensions/perl/test/colorize-results/test_pl.json b/extensions/perl/test/colorize-results/test_pl.json index ecfd9660ad8..e47c0f95e84 100644 --- a/extensions/perl/test/colorize-results/test_pl.json +++ b/extensions/perl/test/colorize-results/test_pl.json @@ -389,7 +389,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -411,7 +411,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -433,7 +433,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -455,7 +455,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -477,7 +477,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -675,7 +675,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -950,7 +950,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -1445,7 +1445,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -2281,7 +2281,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" diff --git a/extensions/php/test/colorize-results/issue-28354_php.json b/extensions/php/test/colorize-results/issue-28354_php.json index 27983076fa7..eb36ede3a4e 100644 --- a/extensions/php/test/colorize-results/issue-28354_php.json +++ b/extensions/php/test/colorize-results/issue-28354_php.json @@ -279,7 +279,7 @@ "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php string.quoted.single.php constant.character.escape.php", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -378,7 +378,7 @@ "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php string.quoted.single.php constant.character.escape.php", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" diff --git a/extensions/python/test/colorize-results/test-freeze-56377_py.json b/extensions/python/test/colorize-results/test-freeze-56377_py.json index 5038c289809..3eb0f85a2a1 100644 --- a/extensions/python/test/colorize-results/test-freeze-56377_py.json +++ b/extensions/python/test/colorize-results/test-freeze-56377_py.json @@ -565,7 +565,7 @@ "t": "source.python string.quoted.single.python constant.character.escape.python", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" diff --git a/extensions/ruby/test/colorize-results/test_rb.json b/extensions/ruby/test/colorize-results/test_rb.json index 8679ef23528..09380f91dce 100644 --- a/extensions/ruby/test/colorize-results/test_rb.json +++ b/extensions/ruby/test/colorize-results/test_rb.json @@ -2501,7 +2501,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -2523,7 +2523,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -2545,7 +2545,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -2578,7 +2578,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" diff --git a/extensions/scss/test/colorize-results/test_scss.json b/extensions/scss/test/colorize-results/test_scss.json index a95d72d9e16..5841c3b8e3f 100644 --- a/extensions/scss/test/colorize-results/test_scss.json +++ b/extensions/scss/test/colorize-results/test_scss.json @@ -20761,7 +20761,7 @@ "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss string.quoted.single.scss constant.character.escape.scss", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -20882,7 +20882,7 @@ "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss string.quoted.single.scss constant.character.escape.scss", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -20959,7 +20959,7 @@ "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss constant.character.escape.scss", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #FF0000", + "light_plus": "constant.character.escape: #EE0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -21020,4 +21020,4 @@ "hc_black": "comment: #7CA668" } } -] +] \ No newline at end of file From 876f2e70f9a2e1988887f8ca82294418afac15a2 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Tue, 26 May 2020 21:46:03 -0700 Subject: [PATCH 082/107] Revert "chore: bump electron@8.3.0 (#98266)" This reverts commit 820fd4048fd3c511aca57157af5c6b6f95d15695. --- .yarnrc | 2 +- build/builtin/main.js | 4 ++-- cgmanifest.json | 12 ++++++------ package.json | 2 +- .../parts/contextmenu/electron-main/contextmenu.ts | 3 +-- src/vs/code/electron-main/auth.ts | 3 +-- src/vs/code/electron-main/sharedProcess.ts | 1 - src/vs/code/electron-main/window.ts | 3 +-- .../platform/issue/electron-main/issueMainService.ts | 6 ++---- test/unit/electron/index.js | 3 +-- yarn.lock | 8 ++++---- 11 files changed, 20 insertions(+), 27 deletions(-) diff --git a/.yarnrc b/.yarnrc index 59837fea3fc..d86b284e83e 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "8.3.0" +target "7.2.4" runtime "electron" diff --git a/build/builtin/main.js b/build/builtin/main.js index 93cef8cbdad..b094a67cac5 100644 --- a/build/builtin/main.js +++ b/build/builtin/main.js @@ -10,11 +10,11 @@ const path = require('path'); let window = null; app.once('ready', () => { - window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true, enableWebSQL: false } }); + window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true } }); window.setMenuBarVisibility(false); window.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true })); // window.webContents.openDevTools(); window.once('closed', () => window = null); }); -app.on('window-all-closed', () => app.quit()); +app.on('window-all-closed', () => app.quit()); \ No newline at end of file diff --git a/cgmanifest.json b/cgmanifest.json index 78f421ca7e0..09478ca403e 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "chromium", "repositoryUrl": "https://chromium.googlesource.com/chromium/src", - "commitHash": "052d3b44972e6d94ef40054d46c150b7cdd7a5d8" + "commitHash": "e4745133a1d3745f066e068b8033c6a269b59caf" } }, "licenseDetail": [ @@ -40,7 +40,7 @@ "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ], "isOnlyProductionDependency": true, - "version": "80.0.3987.165" + "version": "78.0.3904.130" }, { "component": { @@ -48,11 +48,11 @@ "git": { "name": "nodejs", "repositoryUrl": "https://github.com/nodejs/node", - "commitHash": "42cce5a9d0fd905bf4ad7a2528c36572dfb8b5ad" + "commitHash": "787378879acfb212ed4ff824bf9f767a24a5cb43a" } }, "isOnlyProductionDependency": true, - "version": "12.13.0" + "version": "12.8.1" }, { "component": { @@ -60,12 +60,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "426d45cd8569fb7731f213159336cea019829ec5" + "commitHash": "0552e0d5de46ffa3b481d741f1db5c779e201565" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "8.3.0" + "version": "7.2.4" }, { "component": { diff --git a/package.json b/package.json index 51c7aa97e03..7d109b5c4cd 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "css-loader": "^3.2.0", "debounce": "^1.0.0", "deemon": "^1.4.0", - "electron": "8.3.0", + "electron": "7.2.4", "eslint": "6.8.0", "eslint-plugin-jsdoc": "^19.1.0", "event-stream": "3.3.4", diff --git a/src/vs/base/parts/contextmenu/electron-main/contextmenu.ts b/src/vs/base/parts/contextmenu/electron-main/contextmenu.ts index 7b43355ed6d..6222be78028 100644 --- a/src/vs/base/parts/contextmenu/electron-main/contextmenu.ts +++ b/src/vs/base/parts/contextmenu/electron-main/contextmenu.ts @@ -9,10 +9,9 @@ import { ISerializableContextMenuItem, CONTEXT_MENU_CLOSE_CHANNEL, CONTEXT_MENU_ export function registerContextMenuListener(): void { ipcMain.on(CONTEXT_MENU_CHANNEL, (event: IpcMainEvent, contextMenuId: number, items: ISerializableContextMenuItem[], onClickChannel: string, options?: IPopupOptions) => { const menu = createMenu(event, onClickChannel, items); - const window = BrowserWindow.fromWebContents(event.sender); menu.popup({ - window: window ? window : undefined, + window: BrowserWindow.fromWebContents(event.sender), x: options ? options.x : undefined, y: options ? options.y : undefined, positioningItem: options ? options.positioningItem : undefined, diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index 5e09e170c84..b74e1c4e9c1 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -59,8 +59,7 @@ export class ProxyAuthHandler extends Disposable { title: 'VS Code', webPreferences: { nodeIntegration: true, - webviewTag: true, - enableWebSQL: false + webviewTag: true } }; diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index f44b3d08713..782cb228ea4 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -44,7 +44,6 @@ export class SharedProcess implements ISharedProcess { images: false, nodeIntegration: true, webgl: false, - enableWebSQL: false, disableBlinkFeatures: 'Auxclick' // do NOT change, allows us to identify this window as shared-process in the process explorer } }); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 98a37e53ae7..2cdb6b90d6d 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -165,8 +165,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { webPreferences: { nodeIntegration: true, nodeIntegrationInWorker: RUN_TEXTMATE_IN_WORKER, - webviewTag: true, - enableWebSQL: false + webviewTag: true } }; diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 90e20854239..193ab70b12f 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -189,8 +189,7 @@ export class IssueMainService implements IIssueService { title: localize('issueReporter', "Issue Reporter"), backgroundColor: data.styles.backgroundColor || DEFAULT_BACKGROUND_COLOR, webPreferences: { - nodeIntegration: true, - enableWebSQL: false + nodeIntegration: true } }); @@ -239,8 +238,7 @@ export class IssueMainService implements IIssueService { backgroundColor: data.styles.backgroundColor, title: localize('processExplorer', "Process Explorer"), webPreferences: { - nodeIntegration: true, - enableWebSQL: false + nodeIntegration: true } }); diff --git a/test/unit/electron/index.js b/test/unit/electron/index.js index b72b59a91e9..2230b37df9f 100644 --- a/test/unit/electron/index.js +++ b/test/unit/electron/index.js @@ -115,8 +115,7 @@ app.on('ready', () => { backgroundThrottling: false, nodeIntegration: true, webSecurity: false, - webviewTag: true, - enableWebSQL: false + webviewTag: true } }); diff --git a/yarn.lock b/yarn.lock index 767b2e1edeb..e559825232d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2715,10 +2715,10 @@ electron-to-chromium@^1.2.7: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" integrity sha1-eOy4o5kGYYe7N07t412ccFZagD0= -electron@8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-8.3.0.tgz#c2b565a4c10d6d287d20164bcd5a478468b940a9" - integrity sha512-XRjiIJICZCgUr2vKSUI2PTkfP0gPFqCtqJUaTJSfCTuE3nTrxBKOUNeRMuCzEqspKkpFQU3SB3MdbMSHmZARlQ== +electron@7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/electron/-/electron-7.2.4.tgz#9fc0446dae23ead897af8742470cb18da55c6ce9" + integrity sha512-Z+R692uTzXgP8AHrabE+kkrMlQJ6pnAYoINenwj9QSqaD2YbO8IuXU9DMCcUY0+VpA91ee09wFZJNUKYPMnCKg== dependencies: "@electron/get" "^1.0.1" "@types/node" "^12.0.12" From aa1adb6225cfc30150566b33cab25a7ebf4b9d94 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 27 May 2020 07:10:13 +0200 Subject: [PATCH 083/107] sandbox - adopt types from electron 7 --- src/vs/base/parts/sandbox/common/electronTypes.ts | 5 ++--- .../platform/electron/electron-main/electronMainService.ts | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/vs/base/parts/sandbox/common/electronTypes.ts b/src/vs/base/parts/sandbox/common/electronTypes.ts index 043fb71b777..651a9d575ef 100644 --- a/src/vs/base/parts/sandbox/common/electronTypes.ts +++ b/src/vs/base/parts/sandbox/common/electronTypes.ts @@ -7,7 +7,7 @@ // ####################################################################### // ### ### // ### electron.d.ts types we need in a common layer for reuse ### -// ### (copied from Electron 8.3.0) ### +// ### (copied from Electron 7.x) ### // ### ### // ####################################################################### @@ -132,7 +132,6 @@ export interface SaveDialogOptions { * @platform darwin */ showsTagField?: boolean; - properties?: Array<'showHiddenFiles' | 'createDirectory' | 'treatPackageAsDirectory' | 'showOverwriteConfirmation' | 'dontAddToRecent'>; /** * Create a security scoped bookmark when packaged for the Mac App Store. If this * option is enabled and the file doesn't already exist a blank file will be @@ -156,7 +155,7 @@ export interface OpenDialogOptions { * Contains which features the dialog should use. The following values are * supported: */ - properties?: Array<'openFile' | 'openDirectory' | 'multiSelections' | 'showHiddenFiles' | 'createDirectory' | 'promptToCreate' | 'noResolveAliases' | 'treatPackageAsDirectory' | 'dontAddToRecent'>; + properties?: Array<'openFile' | 'openDirectory' | 'multiSelections' | 'showHiddenFiles' | 'createDirectory' | 'promptToCreate' | 'noResolveAliases' | 'treatPackageAsDirectory'>; /** * Message to display above input boxes. * diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index f9920a829a7..6772a1f6783 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -299,8 +299,8 @@ export class ElectronMainService implements IElectronMainService { } } - async moveItemToTrash(windowId: number | undefined, fullPath: string, deleteOnFail?: boolean): Promise { - return shell.moveItemToTrash(fullPath, deleteOnFail); + async moveItemToTrash(windowId: number | undefined, fullPath: string): Promise { + return shell.moveItemToTrash(fullPath); } //#endregion From 0359d4174ddc71c0726404cf8bf775fe5120c5fe Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 27 May 2020 08:17:45 +0200 Subject: [PATCH 084/107] sandbox - issue service is not common --- src/vs/code/electron-main/app.ts | 9 ++++----- src/vs/platform/issue/common/issue.ts | 6 +----- .../platform/issue/electron-main/issueMainService.ts | 9 +++++++-- src/vs/platform/issue/electron-sandbox/issue.ts | 11 +++++++++++ .../issue/electron-browser/issue.contribution.ts | 3 ++- .../contrib/issue/electron-browser/issueService.ts | 3 ++- .../services/issue/electron-sandbox/issueService.ts | 2 +- 7 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 src/vs/platform/issue/electron-sandbox/issue.ts diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index cf2cdf9b2ff..4d8f90aa2ba 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -44,8 +44,7 @@ import { getMachineId } from 'vs/base/node/id'; import { Win32UpdateService } from 'vs/platform/update/electron-main/updateService.win32'; import { LinuxUpdateService } from 'vs/platform/update/electron-main/updateService.linux'; import { DarwinUpdateService } from 'vs/platform/update/electron-main/updateService.darwin'; -import { IIssueService } from 'vs/platform/issue/common/issue'; -import { IssueMainService } from 'vs/platform/issue/electron-main/issueMainService'; +import { IssueMainService, IIssueMainService } from 'vs/platform/issue/electron-main/issueMainService'; import { LoggerChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler, onUnexpectedError } from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; @@ -470,7 +469,7 @@ export class CodeApplication extends Disposable { const diagnosticsChannel = getDelayedChannel(sharedProcessReady.then(client => client.getChannel('diagnostics'))); services.set(IDiagnosticsService, new SyncDescriptor(DiagnosticsService, [diagnosticsChannel])); - services.set(IIssueService, new SyncDescriptor(IssueMainService, [machineId, this.userEnv])); + services.set(IIssueMainService, new SyncDescriptor(IssueMainService, [machineId, this.userEnv])); services.set(IElectronMainService, new SyncDescriptor(ElectronMainService)); services.set(IWorkspacesService, new SyncDescriptor(WorkspacesService)); services.set(IMenubarMainService, new SyncDescriptor(MenubarMainService)); @@ -554,8 +553,8 @@ export class CodeApplication extends Disposable { const updateChannel = new UpdateChannel(updateService); electronIpcServer.registerChannel('update', updateChannel); - const issueService = accessor.get(IIssueService); - const issueChannel = createChannelReceiver(issueService); + const issueMainService = accessor.get(IIssueMainService); + const issueChannel = createChannelReceiver(issueMainService); electronIpcServer.registerChannel('issue', issueChannel); const electronMainService = accessor.get(IElectronMainService); diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 08a9c5d456f..17d3fe40830 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -3,10 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; - -export const IIssueService = createDecorator('issueService'); - // Since data sent through the service is serialized to JSON, functions will be lost, so Color objects // should not be sent as their 'toString' method will be stripped. Instead convert to strings before sending. export interface WindowStyles { @@ -91,7 +87,7 @@ export interface ProcessExplorerData extends WindowData { styles: ProcessExplorerStyles; } -export interface IIssueService { +export interface ICommonIssueService { _serviceBrand: undefined; openReporter(data: IssueReporterData): Promise; openProcessExplorer(data: ProcessExplorerData): Promise; diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 85e143af8d2..81a5be1fe4b 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import * as objects from 'vs/base/common/objects'; import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; -import { IIssueService, IssueReporterData, IssueReporterFeatures, ProcessExplorerData } from 'vs/platform/issue/common/issue'; +import { ICommonIssueService, IssueReporterData, IssueReporterFeatures, ProcessExplorerData } from 'vs/platform/issue/common/issue'; import { BrowserWindow, ipcMain, screen, IpcMainEvent, Display, shell } from 'electron'; import { ILaunchMainService } from 'vs/platform/launch/electron-main/launchMainService'; import { PerformanceInfo, isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnostics'; @@ -19,10 +19,15 @@ 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 { URI } from 'vs/base/common/uri'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; const DEFAULT_BACKGROUND_COLOR = '#1E1E1E'; -export class IssueMainService implements IIssueService { +export const IIssueMainService = createDecorator('issueMainService'); + +export interface IIssueMainService extends ICommonIssueService { } + +export class IssueMainService implements ICommonIssueService { _serviceBrand: undefined; _issueWindow: BrowserWindow | null = null; _issueParentWindow: BrowserWindow | null = null; diff --git a/src/vs/platform/issue/electron-sandbox/issue.ts b/src/vs/platform/issue/electron-sandbox/issue.ts new file mode 100644 index 00000000000..4e84d42806e --- /dev/null +++ b/src/vs/platform/issue/electron-sandbox/issue.ts @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { ICommonIssueService } from 'vs/platform/issue/common/issue'; + +export const IIssueService = createDecorator('issueService'); + +export interface IIssueService extends ICommonIssueService { } diff --git a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts index 7c4e6e51a35..8a206ec3501 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts @@ -13,7 +13,8 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue'; import { WorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issueService'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { IIssueService, IssueReporterData } from 'vs/platform/issue/common/issue'; +import { IssueReporterData } from 'vs/platform/issue/common/issue'; +import { IIssueService } from 'vs/platform/issue/electron-sandbox/issue'; import { OpenIssueReporterArgs, OpenIssueReporterActionId } from 'vs/workbench/contrib/issue/common/commands'; const helpCategory = { value: nls.localize('help', "Help"), original: 'Help' }; diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts index aca48cd6c5d..2aa3029feef 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IssueReporterStyles, IIssueService, IssueReporterData, ProcessExplorerData, IssueReporterExtensionData } from 'vs/platform/issue/common/issue'; +import { IssueReporterStyles, IssueReporterData, ProcessExplorerData, IssueReporterExtensionData } from 'vs/platform/issue/common/issue'; +import { IIssueService } from 'vs/platform/issue/electron-sandbox/issue'; import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; import { textLinkForeground, inputBackground, inputBorder, inputForeground, buttonBackground, buttonHoverBackground, buttonForeground, inputValidationErrorBorder, foreground, inputActiveOptionBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, editorBackground, editorForeground, listHoverBackground, listHoverForeground, listHighlightForeground, textLinkActiveForeground, inputValidationErrorBackground, inputValidationErrorForeground } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; diff --git a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts index c75ebf7dadf..615f2704d51 100644 --- a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IIssueService } from 'vs/platform/issue/common/issue'; +import { IIssueService } from 'vs/platform/issue/electron-sandbox/issue'; import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; From da872de01154a0422c431e8632d1257a6f1cb753 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 27 May 2020 08:58:24 +0200 Subject: [PATCH 085/107] call prepareRename on all providers until having result, start with provider that gave a result, #95361 --- src/vs/editor/contrib/rename/rename.ts | 64 +++++++++++------- .../api/extHostLanguageFeatures.test.ts | 66 +++++++++++++++++++ 2 files changed, 108 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/rename.ts index 865d05eccdf..ec9fa64d5cc 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/rename.ts @@ -28,7 +28,6 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IdleValue, raceCancellation } from 'vs/base/common/async'; -import { withNullAsUndefined } from 'vs/base/common/types'; import { ILogService } from 'vs/platform/log/common/log'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -38,6 +37,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/tex class RenameSkeleton { private readonly _providers: RenameProvider[]; + private _providerRenameIdx: number = 0; constructor( private readonly model: ITextModel, @@ -51,30 +51,45 @@ class RenameSkeleton { } async resolveRenameLocation(token: CancellationToken): Promise { - const firstProvider = this._providers[0]; - if (!firstProvider) { - return undefined; - } - let res: RenameLocation & Rejection | undefined; - if (firstProvider.resolveRenameLocation) { - res = withNullAsUndefined(await firstProvider.resolveRenameLocation(this.model, this.position, token)); - } + const rejects: string[] = []; - if (!res) { - const word = this.model.getWordAtPosition(this.position); - if (word) { - return { - range: new Range(this.position.lineNumber, word.startColumn, this.position.lineNumber, word.endColumn), - text: word.word - }; + for (this._providerRenameIdx = 0; this._providerRenameIdx < this._providers.length; this._providerRenameIdx++) { + const provider = this._providers[this._providerRenameIdx]; + if (!provider.resolveRenameLocation) { + break; } + let res = await provider.resolveRenameLocation(this.model, this.position, token); + if (!res) { + continue; + } + if (res.rejectReason) { + rejects.push(res.rejectReason); + continue; + } + return res; } - return res; + const word = this.model.getWordAtPosition(this.position); + if (!word) { + return { + range: Range.fromPositions(this.position), + text: '', + rejectReason: rejects.length > 0 ? rejects.join('\n') : undefined + }; + } + return { + range: new Range(this.position.lineNumber, word.startColumn, this.position.lineNumber, word.endColumn), + text: word.word, + rejectReason: rejects.length > 0 ? rejects.join('\n') : undefined + }; } - async provideRenameEdits(newName: string, i: number, rejects: string[], token: CancellationToken): Promise { + async provideRenameEdits(newName: string, token: CancellationToken): Promise { + return this._provideRenameEdits(newName, this._providerRenameIdx, [], token); + } + + private async _provideRenameEdits(newName: string, i: number, rejects: string[], token: CancellationToken): Promise { const provider = this._providers[i]; if (!provider) { return { @@ -85,16 +100,21 @@ class RenameSkeleton { const result = await provider.provideRenameEdits(this.model, this.position, newName, token); if (!result) { - return this.provideRenameEdits(newName, i + 1, rejects.concat(nls.localize('no result', "No result.")), token); + return this._provideRenameEdits(newName, i + 1, rejects.concat(nls.localize('no result', "No result.")), token); } else if (result.rejectReason) { - return this.provideRenameEdits(newName, i + 1, rejects.concat(result.rejectReason), token); + return this._provideRenameEdits(newName, i + 1, rejects.concat(result.rejectReason), token); } return result; } } export async function rename(model: ITextModel, position: Position, newName: string): Promise { - return new RenameSkeleton(model, position).provideRenameEdits(newName, 0, [], CancellationToken.None); + const skeleton = new RenameSkeleton(model, position); + const loc = await skeleton.resolveRenameLocation(CancellationToken.None); + if (loc?.rejectReason) { + return { edits: [], rejectReason: loc.rejectReason }; + } + return skeleton.provideRenameEdits(newName, CancellationToken.None); } // --- register actions and commands @@ -194,7 +214,7 @@ class RenameController implements IEditorContribution { this.editor.focus(); - const renameOperation = raceCancellation(skeleton.provideRenameEdits(inputFieldResult.newName, 0, [], this._cts.token), this._cts.token).then(async renameResult => { + const renameOperation = raceCancellation(skeleton.provideRenameEdits(inputFieldResult.newName, this._cts.token), this._cts.token).then(async renameResult => { if (!renameResult || !this.editor.hasModel()) { return; diff --git a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts index 39820a127b2..fb797b14dd5 100644 --- a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts @@ -762,6 +762,72 @@ suite('ExtHostLanguageFeatures', function () { assert.equal(value.edits.length, 2); }); + test('Multiple RenameProviders don\'t respect all possible PrepareRename handlers, #98352', async function () { + + let called = [false, false, false, false]; + + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider { + prepareRename(document: vscode.TextDocument, position: vscode.Position,): vscode.ProviderResult { + called[0] = true; + let range = document.getWordRangeAtPosition(position); + return range; + } + + provideRenameEdits(): vscode.ProviderResult { + called[1] = true; + return undefined; + } + })); + + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider { + prepareRename(document: vscode.TextDocument, position: vscode.Position,): vscode.ProviderResult { + called[2] = true; + return Promise.reject('Cannot rename this symbol2.'); + } + provideRenameEdits(): vscode.ProviderResult { + called[3] = true; + return undefined; + } + })); + + await rpcProtocol.sync(); + await rename(model, new EditorPosition(1, 1), 'newName'); + + assert.deepEqual(called, [true, true, true, false]); + }); + + test('Multiple RenameProviders don\'t respect all possible PrepareRename handlers, #98352', async function () { + + let called = [false, false, false]; + + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider { + prepareRename(document: vscode.TextDocument, position: vscode.Position,): vscode.ProviderResult { + called[0] = true; + let range = document.getWordRangeAtPosition(position); + return range; + } + + provideRenameEdits(): vscode.ProviderResult { + called[1] = true; + return undefined; + } + })); + + disposables.push(extHost.registerRenameProvider(defaultExtension, defaultSelector, new class implements vscode.RenameProvider { + + provideRenameEdits(document: vscode.TextDocument, position: vscode.Position, newName: string,): vscode.ProviderResult { + called[2] = true; + return new types.WorkspaceEdit(); + } + })); + + await rpcProtocol.sync(); + await rename(model, new EditorPosition(1, 1), 'newName'); + + // first provider has NO prepare which means it is taken by default + assert.deepEqual(called, [false, false, true]); + }); + // --- parameter hints test('Parameter Hints, order', async () => { From fb3dc8be662b22054148544a6ccd4e5e2af52531 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 27 May 2020 09:00:40 +0200 Subject: [PATCH 086/107] adjust jsdoc to old and new reality, https://github.com/microsoft/vscode/issues/95361 --- src/vs/vscode.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 559a5e485e4..1db8f073041 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -9740,8 +9740,8 @@ declare module 'vscode' { * Register a rename provider. * * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. + * by their [score](#languages.match) and asked in sequence. The first provider producing a result + * defines the result of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. * @param provider A rename provider. From 6377e748afccd76d8c3b8518968da0324356ed1d Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 27 May 2020 09:42:17 +0200 Subject: [PATCH 087/107] clarify error message for #98576 --- .../workbench/services/themes/common/colorExtensionPoint.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/themes/common/colorExtensionPoint.ts b/src/vs/workbench/services/themes/common/colorExtensionPoint.ts index 9ed134bb638..3ad28da9268 100644 --- a/src/vs/workbench/services/themes/common/colorExtensionPoint.ts +++ b/src/vs/workbench/services/themes/common/colorExtensionPoint.ts @@ -32,7 +32,7 @@ const configurationExtPoint = ExtensionsRegistry.registerExtensionPoint Date: Tue, 26 May 2020 09:45:09 +0200 Subject: [PATCH 088/107] Extract validation of workspace undo/redo to their own methods --- .../undoRedo/common/undoRedoService.ts | 75 ++++++++++++++----- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index 9858c9eb6af..232da9af352 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -376,27 +376,23 @@ export class UndoRedoService implements IUndoRedoService { } } - private _workspaceUndo(resource: URI, element: WorkspaceStackElement): Promise | void { + private _verifyWorkspaceUndo(element: WorkspaceStackElement): WorkspaceVerificationResult { if (element.removedResources) { - this._splitPastWorkspaceElement(element, element.removedResources); const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); - this._notificationService.info(message); - return this.undo(resource); + return new InvalidWorkspaceVerificationResult(message, element.removedResources); } if (element.invalidatedResources) { - this._splitPastWorkspaceElement(element, element.invalidatedResources); const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); - this._notificationService.info(message); - return this.undo(resource); + return new InvalidWorkspaceVerificationResult(message, element.invalidatedResources); } // this must be the last past element in all the impacted resources! - let affectedEditStacks: ResourceEditStack[] = []; + const affectedEditStacks: ResourceEditStack[] = []; for (const strResource of element.strResources) { affectedEditStacks.push(this._editStacks.get(strResource)!); } - let cannotUndoDueToResources: URI[] = []; + const cannotUndoDueToResources: URI[] = []; for (const editStack of affectedEditStacks) { if (editStack.past.length === 0 || editStack.past[editStack.past.length - 1] !== element) { cannotUndoDueToResources.push(editStack.resource); @@ -404,13 +400,28 @@ export class UndoRedoService implements IUndoRedoService { } if (cannotUndoDueToResources.length > 0) { - this._splitPastWorkspaceElement(element, null); const paths = cannotUndoDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); const message = nls.localize('cannotWorkspaceUndoDueToChanges', "Could not undo '{0}' across all files because changes were made to {1}", element.label, paths.join(', ')); - this._notificationService.info(message); + return new InvalidWorkspaceVerificationResult(message, null); + } + + return new ValidWorkspaceVerificationResult(affectedEditStacks); + } + + private _workspaceUndo(resource: URI, element: WorkspaceStackElement): Promise | void { + const verificationResult = this._verifyWorkspaceUndo(element); + if (verificationResult.type === WorkspaceVerificationResultType.Invalid) { + // cannot apply the workspace undo + this._splitPastWorkspaceElement(element, verificationResult.ignoreResources); + this._notificationService.info(verificationResult.message); return this.undo(resource); } + const affectedEditStacks = verificationResult.affectedEditStacks; + return this._confirmAndExecuteWorkspaceUndo(resource, element, affectedEditStacks); + } + + private async _confirmAndExecuteWorkspaceUndo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[]): Promise { return this._dialogService.show( Severity.Info, nls.localize('confirmWorkspace', "Would you like to undo '{0}' across all files?", element.label), @@ -479,18 +490,14 @@ export class UndoRedoService implements IUndoRedoService { return false; } - private _workspaceRedo(resource: URI, element: WorkspaceStackElement): Promise | void { + private _verifyWorkspaceRedo(element: WorkspaceStackElement): WorkspaceVerificationResult { if (element.removedResources) { - this._splitFutureWorkspaceElement(element, element.removedResources); const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); - this._notificationService.info(message); - return this.redo(resource); + return new InvalidWorkspaceVerificationResult(message, element.removedResources); } if (element.invalidatedResources) { - this._splitFutureWorkspaceElement(element, element.invalidatedResources); const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); - this._notificationService.info(message); - return this.redo(resource); + return new InvalidWorkspaceVerificationResult(message, element.invalidatedResources); } // this must be the last future element in all the impacted resources! @@ -507,13 +514,24 @@ export class UndoRedoService implements IUndoRedoService { } if (cannotRedoDueToResources.length > 0) { - this._splitFutureWorkspaceElement(element, null); const paths = cannotRedoDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); const message = nls.localize('cannotWorkspaceRedoDueToChanges', "Could not redo '{0}' across all files because changes were made to {1}", element.label, paths.join(', ')); - this._notificationService.info(message); + return new InvalidWorkspaceVerificationResult(message, null); + } + + return new ValidWorkspaceVerificationResult(affectedEditStacks); + } + + private _workspaceRedo(resource: URI, element: WorkspaceStackElement): Promise | void { + const verificationResult = this._verifyWorkspaceRedo(element); + if (verificationResult.type === WorkspaceVerificationResultType.Invalid) { + // cannot apply the workspace redo + this._splitFutureWorkspaceElement(element, verificationResult.ignoreResources); + this._notificationService.info(verificationResult.message); return this.redo(resource); } + const affectedEditStacks = verificationResult.affectedEditStacks; for (const editStack of affectedEditStacks) { editStack.future.pop(); editStack.past.push(element); @@ -553,4 +571,21 @@ export class UndoRedoService implements IUndoRedoService { } } +const enum WorkspaceVerificationResultType { + Invalid = 0, + Valid = 1 +} +class InvalidWorkspaceVerificationResult { + public readonly type = WorkspaceVerificationResultType.Invalid; + constructor( + public readonly message: string, + public readonly ignoreResources: RemovedResources | null + ) { } +} +class ValidWorkspaceVerificationResult { + public readonly type = WorkspaceVerificationResultType.Valid; + constructor(public readonly affectedEditStacks: ResourceEditStack[]) { } +} +type WorkspaceVerificationResult = InvalidWorkspaceVerificationResult | ValidWorkspaceVerificationResult; + registerSingleton(IUndoRedoService, UndoRedoService); From 4db079b8052595c918d32461e7002f71c238b62e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 26 May 2020 11:34:39 +0200 Subject: [PATCH 089/107] Validate workspace undo again after async prompt --- .../undoRedo/common/undoRedoService.ts | 136 +++++++++--------- 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index 232da9af352..08b97f68fb7 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -376,22 +376,29 @@ export class UndoRedoService implements IUndoRedoService { } } - private _verifyWorkspaceUndo(element: WorkspaceStackElement): WorkspaceVerificationResult { - if (element.removedResources) { - const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); - return new InvalidWorkspaceVerificationResult(message, element.removedResources); - } - if (element.invalidatedResources) { - const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); - return new InvalidWorkspaceVerificationResult(message, element.invalidatedResources); - } - - // this must be the last past element in all the impacted resources! + private _getAffectedEditStacks(element: WorkspaceStackElement): ResourceEditStack[] { const affectedEditStacks: ResourceEditStack[] = []; for (const strResource of element.strResources) { affectedEditStacks.push(this._editStacks.get(strResource)!); } + return affectedEditStacks; + } + private _checkWorkspaceUndo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[]): WorkspaceVerificationError | null { + if (element.removedResources) { + this._splitPastWorkspaceElement(element, element.removedResources); + const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.undo(resource)); + } + if (element.invalidatedResources) { + this._splitPastWorkspaceElement(element, element.invalidatedResources); + const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.undo(resource)); + } + + // this must be the last past element in all the impacted resources! const cannotUndoDueToResources: URI[] = []; for (const editStack of affectedEditStacks) { if (editStack.past.length === 0 || editStack.past[editStack.past.length - 1] !== element) { @@ -400,29 +407,27 @@ export class UndoRedoService implements IUndoRedoService { } if (cannotUndoDueToResources.length > 0) { + this._splitPastWorkspaceElement(element, null); const paths = cannotUndoDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); const message = nls.localize('cannotWorkspaceUndoDueToChanges', "Could not undo '{0}' across all files because changes were made to {1}", element.label, paths.join(', ')); - return new InvalidWorkspaceVerificationResult(message, null); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.undo(resource)); } - return new ValidWorkspaceVerificationResult(affectedEditStacks); + return null; } private _workspaceUndo(resource: URI, element: WorkspaceStackElement): Promise | void { - const verificationResult = this._verifyWorkspaceUndo(element); - if (verificationResult.type === WorkspaceVerificationResultType.Invalid) { - // cannot apply the workspace undo - this._splitPastWorkspaceElement(element, verificationResult.ignoreResources); - this._notificationService.info(verificationResult.message); - return this.undo(resource); + const affectedEditStacks = this._getAffectedEditStacks(element); + const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); + if (verificationError) { + return verificationError.returnValue; } - - const affectedEditStacks = verificationResult.affectedEditStacks; return this._confirmAndExecuteWorkspaceUndo(resource, element, affectedEditStacks); } private async _confirmAndExecuteWorkspaceUndo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[]): Promise { - return this._dialogService.show( + const result = await this._dialogService.show( Severity.Info, nls.localize('confirmWorkspace', "Would you like to undo '{0}' across all files?", element.label), [ @@ -433,21 +438,29 @@ export class UndoRedoService implements IUndoRedoService { { cancelId: 2 } - ).then((result) => { - if (result.choice === 2) { - // cancel - return; - } else if (result.choice === 0) { - for (const editStack of affectedEditStacks) { - editStack.past.pop(); - editStack.future.push(element); - } - return this._safeInvoke(element, () => element.actual.undo()); - } else { - this._splitPastWorkspaceElement(element, null); - return this.undo(resource); + ); + + // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) + const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); + if (verificationError) { + return verificationError.returnValue; + } + + if (result.choice === 2) { + // cancel + return; + } + + if (result.choice === 0) { + for (const editStack of affectedEditStacks) { + editStack.past.pop(); + editStack.future.push(element); } - }); + return this._safeInvoke(element, () => element.actual.undo()); + } else { + this._splitPastWorkspaceElement(element, null); + return this.undo(resource); + } } private _resourceUndo(editStack: ResourceEditStack, element: ResourceStackElement): Promise | void { @@ -490,23 +503,22 @@ export class UndoRedoService implements IUndoRedoService { return false; } - private _verifyWorkspaceRedo(element: WorkspaceStackElement): WorkspaceVerificationResult { + private _checkWorkspaceRedo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[]): WorkspaceVerificationError | null { if (element.removedResources) { + this._splitFutureWorkspaceElement(element, element.removedResources); const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); - return new InvalidWorkspaceVerificationResult(message, element.removedResources); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.redo(resource)); } if (element.invalidatedResources) { + this._splitFutureWorkspaceElement(element, element.invalidatedResources); const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); - return new InvalidWorkspaceVerificationResult(message, element.invalidatedResources); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.redo(resource)); } // this must be the last future element in all the impacted resources! - let affectedEditStacks: ResourceEditStack[] = []; - for (const strResource of element.strResources) { - affectedEditStacks.push(this._editStacks.get(strResource)!); - } - - let cannotRedoDueToResources: URI[] = []; + const cannotRedoDueToResources: URI[] = []; for (const editStack of affectedEditStacks) { if (editStack.future.length === 0 || editStack.future[editStack.future.length - 1] !== element) { cannotRedoDueToResources.push(editStack.resource); @@ -514,24 +526,23 @@ export class UndoRedoService implements IUndoRedoService { } if (cannotRedoDueToResources.length > 0) { + this._splitFutureWorkspaceElement(element, null); const paths = cannotRedoDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); const message = nls.localize('cannotWorkspaceRedoDueToChanges', "Could not redo '{0}' across all files because changes were made to {1}", element.label, paths.join(', ')); - return new InvalidWorkspaceVerificationResult(message, null); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.redo(resource)); } - return new ValidWorkspaceVerificationResult(affectedEditStacks); + return null; } private _workspaceRedo(resource: URI, element: WorkspaceStackElement): Promise | void { - const verificationResult = this._verifyWorkspaceRedo(element); - if (verificationResult.type === WorkspaceVerificationResultType.Invalid) { - // cannot apply the workspace redo - this._splitFutureWorkspaceElement(element, verificationResult.ignoreResources); - this._notificationService.info(verificationResult.message); - return this.redo(resource); + const affectedEditStacks = this._getAffectedEditStacks(element); + const verificationError = this._checkWorkspaceRedo(resource, element, affectedEditStacks); + if (verificationError) { + return verificationError.returnValue; } - const affectedEditStacks = verificationResult.affectedEditStacks; for (const editStack of affectedEditStacks) { editStack.future.pop(); editStack.past.push(element); @@ -571,21 +582,8 @@ export class UndoRedoService implements IUndoRedoService { } } -const enum WorkspaceVerificationResultType { - Invalid = 0, - Valid = 1 +class WorkspaceVerificationError { + constructor(public readonly returnValue: Promise | void) { } } -class InvalidWorkspaceVerificationResult { - public readonly type = WorkspaceVerificationResultType.Invalid; - constructor( - public readonly message: string, - public readonly ignoreResources: RemovedResources | null - ) { } -} -class ValidWorkspaceVerificationResult { - public readonly type = WorkspaceVerificationResultType.Valid; - constructor(public readonly affectedEditStacks: ResourceEditStack[]) { } -} -type WorkspaceVerificationResult = InvalidWorkspaceVerificationResult | ValidWorkspaceVerificationResult; registerSingleton(IUndoRedoService, UndoRedoService); From e6b16e8332b3aa8549043e5a8a59041f63d18153 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 26 May 2020 11:36:00 +0200 Subject: [PATCH 090/107] Only validate if a workspace undo is selected --- src/vs/platform/undoRedo/common/undoRedoService.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index 08b97f68fb7..ffac149dcc9 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -440,18 +440,17 @@ export class UndoRedoService implements IUndoRedoService { } ); - // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) - const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); - if (verificationError) { - return verificationError.returnValue; - } - if (result.choice === 2) { // cancel return; } if (result.choice === 0) { + // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) + const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); + if (verificationError) { + return verificationError.returnValue; + } for (const editStack of affectedEditStacks) { editStack.past.pop(); editStack.future.push(element); From f4c74bd003cda8cb751bf21b06505457f85da6dc Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 26 May 2020 13:30:02 +0200 Subject: [PATCH 091/107] Add locks to the edit stacks while undoing / redoing --- .../undoRedo/common/undoRedoService.ts | 116 +++++++++++++++--- 1 file changed, 97 insertions(+), 19 deletions(-) diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index ffac149dcc9..7441995c635 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -154,11 +154,13 @@ class ResourceEditStack { public resource: URI; public past: StackElement[]; public future: StackElement[]; + public locked: boolean; constructor(resource: URI) { this.resource = resource; this.past = []; this.future = []; + this.locked = false; } } @@ -363,16 +365,52 @@ export class UndoRedoService implements IUndoRedoService { this._notificationService.error(err); } - private _safeInvoke(element: StackElement, invoke: () => Promise | void): Promise | void { + private _acquireLocks(affectedEditStacks: ResourceEditStack[]): () => void { + // first, check if all locks can be acquired + for (const editStack of affectedEditStacks) { + if (editStack.locked) { + throw new Error('Cannot acquire edit stack lock'); + } + } + + // can acquire all locks + for (const editStack of affectedEditStacks) { + editStack.locked = true; + } + + return () => { + // release all locks + for (const editStack of affectedEditStacks) { + editStack.locked = false; + } + }; + } + + private _safeInvokeWithLocks(element: StackElement, invoke: () => Promise | void, affectedEditStacks: ResourceEditStack[]): Promise | void { + const releaseLocks = this._acquireLocks(affectedEditStacks); + let result: Promise | void; try { result = invoke(); } catch (err) { + releaseLocks(); return this._onError(err, element); } if (result) { - return result.then(undefined, (err) => this._onError(err, element)); + // result is Promise + return result.then( + () => { + releaseLocks(); + }, + (err) => { + releaseLocks(); + return this._onError(err, element); + } + ); + } else { + // result is void + releaseLocks(); } } @@ -405,7 +443,6 @@ export class UndoRedoService implements IUndoRedoService { cannotUndoDueToResources.push(editStack.resource); } } - if (cannotUndoDueToResources.length > 0) { this._splitPastWorkspaceElement(element, null); const paths = cannotUndoDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); @@ -414,6 +451,20 @@ export class UndoRedoService implements IUndoRedoService { return new WorkspaceVerificationError(this.undo(resource)); } + const cannotLockDueToResources: URI[] = []; + for (const editStack of affectedEditStacks) { + if (editStack.locked) { + cannotLockDueToResources.push(editStack.resource); + } + } + if (cannotLockDueToResources.length > 0) { + this._splitPastWorkspaceElement(element, null); + const paths = cannotLockDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); + const message = nls.localize('cannotWorkspaceUndoDueToInProgressUndoRedo', "Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, paths.join(', ')); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.undo(resource)); + } + return null; } @@ -445,21 +496,25 @@ export class UndoRedoService implements IUndoRedoService { return; } - if (result.choice === 0) { - // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) - const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); - if (verificationError) { - return verificationError.returnValue; - } - for (const editStack of affectedEditStacks) { - editStack.past.pop(); - editStack.future.push(element); - } - return this._safeInvoke(element, () => element.actual.undo()); - } else { + if (result.choice === 1) { + // undo this file this._splitPastWorkspaceElement(element, null); return this.undo(resource); } + + // undo in all files + // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) + const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); + if (verificationError) { + return verificationError.returnValue; + } + + for (const editStack of affectedEditStacks) { + editStack.past.pop(); + editStack.future.push(element); + } + + return this._safeInvokeWithLocks(element, () => element.actual.undo(), affectedEditStacks); } private _resourceUndo(editStack: ResourceEditStack, element: ResourceStackElement): Promise | void { @@ -469,9 +524,14 @@ export class UndoRedoService implements IUndoRedoService { editStack.future = []; return; } + if (editStack.locked) { + const message = nls.localize('cannotResourceUndoDueToInProgressUndoRedo', "Could not undo '{0}' because there is already an undo or redo operation running.", element.label); + this._notificationService.info(message); + return; + } editStack.past.pop(); editStack.future.push(element); - return this._safeInvoke(element, () => element.actual.undo()); + return this._safeInvokeWithLocks(element, () => element.actual.undo(), [editStack]); } public undo(resource: URI): Promise | void { @@ -523,7 +583,6 @@ export class UndoRedoService implements IUndoRedoService { cannotRedoDueToResources.push(editStack.resource); } } - if (cannotRedoDueToResources.length > 0) { this._splitFutureWorkspaceElement(element, null); const paths = cannotRedoDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); @@ -532,6 +591,20 @@ export class UndoRedoService implements IUndoRedoService { return new WorkspaceVerificationError(this.redo(resource)); } + const cannotLockDueToResources: URI[] = []; + for (const editStack of affectedEditStacks) { + if (editStack.locked) { + cannotLockDueToResources.push(editStack.resource); + } + } + if (cannotLockDueToResources.length > 0) { + this._splitFutureWorkspaceElement(element, null); + const paths = cannotLockDueToResources.map(r => r.scheme === Schemas.file ? r.fsPath : r.path); + const message = nls.localize('cannotWorkspaceRedoDueToInProgressUndoRedo', "Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}", element.label, paths.join(', ')); + this._notificationService.info(message); + return new WorkspaceVerificationError(this.redo(resource)); + } + return null; } @@ -546,7 +619,7 @@ export class UndoRedoService implements IUndoRedoService { editStack.future.pop(); editStack.past.push(element); } - return this._safeInvoke(element, () => element.actual.redo()); + return this._safeInvokeWithLocks(element, () => element.actual.redo(), affectedEditStacks); } private _resourceRedo(editStack: ResourceEditStack, element: ResourceStackElement): Promise | void { @@ -556,9 +629,14 @@ export class UndoRedoService implements IUndoRedoService { editStack.future = []; return; } + if (editStack.locked) { + const message = nls.localize('cannotResourceRedoDueToInProgressUndoRedo', "Could not redo '{0}' because there is already an undo or redo operation running.", element.label); + this._notificationService.info(message); + return; + } editStack.future.pop(); editStack.past.push(element); - return this._safeInvoke(element, () => element.actual.redo()); + return this._safeInvokeWithLocks(element, () => element.actual.redo(), [editStack]); } public redo(resource: URI): Promise | void { From 162874e926b62153f8eb4f0aec19dc9452a04187 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 27 May 2020 09:43:19 +0200 Subject: [PATCH 092/107] Load text models from disk when doing a cross file undo or redo (fixes #92272) --- src/vs/editor/common/model/editStack.ts | 28 +++++++ .../common/services/modelServiceImpl.ts | 4 +- .../services/modelUndoRedoParticipant.ts | 66 +++++++++++++++ .../standalone/browser/simpleServices.ts | 9 +- src/vs/platform/undoRedo/common/undoRedo.ts | 8 ++ .../undoRedo/common/undoRedoService.ts | 83 +++++++++++++++---- .../common/textModelResolverService.ts | 12 ++- 7 files changed, 183 insertions(+), 27 deletions(-) create mode 100644 src/vs/editor/common/services/modelUndoRedoParticipant.ts diff --git a/src/vs/editor/common/model/editStack.ts b/src/vs/editor/common/model/editStack.ts index 24c38f88141..8fc15ea71a0 100644 --- a/src/vs/editor/common/model/editStack.ts +++ b/src/vs/editor/common/model/editStack.ts @@ -12,6 +12,7 @@ import { IUndoRedoService, IResourceUndoRedoElement, UndoRedoElementType, IWorks import { URI } from 'vs/base/common/uri'; import { TextChange, compressConsecutiveTextChanges } from 'vs/editor/common/model/textChange'; import * as buffer from 'vs/base/common/buffer'; +import { IDisposable } from 'vs/base/common/lifecycle'; function uriGetComparisonKey(resource: URI): string { return resource.toString(); @@ -138,6 +139,10 @@ class SingleModelEditStackData { } } +export interface IUndoRedoDelegate { + prepareUndoRedo(element: MultiModelEditStackElement): Promise | IDisposable | void; +} + export class SingleModelEditStackElement implements IResourceUndoRedoElement { public model: ITextModel | URI; @@ -224,6 +229,8 @@ export class MultiModelEditStackElement implements IWorkspaceUndoRedoElement { private readonly _editStackElementsArr: SingleModelEditStackElement[]; private readonly _editStackElementsMap: Map; + private _delegate: IUndoRedoDelegate | null; + public get resources(): readonly URI[] { return this._editStackElementsArr.map(editStackElement => editStackElement.resource); } @@ -240,6 +247,27 @@ export class MultiModelEditStackElement implements IWorkspaceUndoRedoElement { const key = uriGetComparisonKey(editStackElement.resource); this._editStackElementsMap.set(key, editStackElement); } + this._delegate = null; + } + + public setDelegate(delegate: IUndoRedoDelegate): void { + this._delegate = delegate; + } + + public prepareUndoRedo(): Promise | IDisposable | void { + if (this._delegate) { + return this._delegate.prepareUndoRedo(this); + } + } + + public getMissingModels(): URI[] { + const result: URI[] = []; + for (const editStackElement of this._editStackElementsArr) { + if (URI.isUri(editStackElement.model)) { + result.push(editStackElement.model); + } + } + return result; } public setModel(model: ITextModel | URI): void { diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 9ab05132790..eab07c9ad48 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -113,12 +113,12 @@ interface IRawConfig { const DEFAULT_EOL = (platform.isLinux || platform.isMacintosh) ? DefaultEndOfLine.LF : DefaultEndOfLine.CRLF; -interface EditStackPastFutureElements { +export interface EditStackPastFutureElements { past: EditStackElement[]; future: EditStackElement[]; } -function isEditStackPastFutureElements(undoElements: IPastFutureElements): undoElements is EditStackPastFutureElements { +export function isEditStackPastFutureElements(undoElements: IPastFutureElements): undoElements is EditStackPastFutureElements { return (isEditStackElements(undoElements.past) && isEditStackElements(undoElements.future)); } diff --git a/src/vs/editor/common/services/modelUndoRedoParticipant.ts b/src/vs/editor/common/services/modelUndoRedoParticipant.ts new file mode 100644 index 00000000000..0862ccf8d6e --- /dev/null +++ b/src/vs/editor/common/services/modelUndoRedoParticipant.ts @@ -0,0 +1,66 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IModelService } from 'vs/editor/common/services/modelService'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IUndoRedoService, UndoRedoElementType } from 'vs/platform/undoRedo/common/undoRedo'; +import { isEditStackPastFutureElements } from 'vs/editor/common/services/modelServiceImpl'; +import { IUndoRedoDelegate, MultiModelEditStackElement } from 'vs/editor/common/model/editStack'; + +export class ModelUndoRedoParticipant extends Disposable implements IUndoRedoDelegate { + constructor( + @IModelService private readonly _modelService: IModelService, + @ITextModelService private readonly _textModelService: ITextModelService, + @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, + ) { + super(); + this._register(this._modelService.onModelRemoved((model) => { + // a model will get disposed, so let's check if the undo redo stack is maintained + const elements = this._undoRedoService.getElements(model.uri); + if (elements.past.length === 0 && elements.future.length === 0) { + return; + } + if (!isEditStackPastFutureElements(elements)) { + return; + } + for (const element of elements.past) { + if (element.type === UndoRedoElementType.Workspace) { + element.setDelegate(this); + } + } + for (const element of elements.future) { + if (element.type === UndoRedoElementType.Workspace) { + element.setDelegate(this); + } + } + })); + } + + public prepareUndoRedo(element: MultiModelEditStackElement): IDisposable | Promise { + // Load all the needed text models + const missingModels = element.getMissingModels(); + if (missingModels.length === 0) { + // All models are available! + return Disposable.None; + } + + const disposablesPromises = missingModels.map(async (uri) => { + try { + const reference = await this._textModelService.createModelReference(uri); + return reference; + } catch (err) { + // This model could not be loaded, maybe it was deleted in the meantime? + return Disposable.None; + } + }); + + return Promise.all(disposablesPromises).then(disposables => { + return { + dispose: () => dispose(disposables) + }; + }); + } +} diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 999ddcde452..c5a48fbeff3 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -108,12 +108,11 @@ function withTypedEditor(widget: IEditor, codeEditorCallback: (editor: ICodeE export class SimpleEditorModelResolverService implements ITextModelService { public _serviceBrand: undefined; - private readonly modelService: IModelService | undefined; private editor?: IEditor; - constructor(modelService: IModelService | undefined) { - this.modelService = modelService; - } + constructor( + @IModelService private readonly modelService: IModelService + ) { } public setEditor(editor: IEditor): void { this.editor = editor; @@ -146,7 +145,7 @@ export class SimpleEditorModelResolverService implements ITextModelService { } private findModel(editor: ICodeEditor, resource: URI): ITextModel | null { - let model = this.modelService ? this.modelService.getModel(resource) : editor.getModel(); + let model = this.modelService.getModel(resource); if (model && model.uri.toString() !== resource.toString()) { return null; } diff --git a/src/vs/platform/undoRedo/common/undoRedo.ts b/src/vs/platform/undoRedo/common/undoRedo.ts index 935e3ffcb22..3dc62c71af2 100644 --- a/src/vs/platform/undoRedo/common/undoRedo.ts +++ b/src/vs/platform/undoRedo/common/undoRedo.ts @@ -5,6 +5,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; +import { IDisposable } from 'vs/base/common/lifecycle'; export const IUndoRedoService = createDecorator('undoRedoService'); @@ -28,6 +29,13 @@ export interface IWorkspaceUndoRedoElement { undo(): Promise | void; redo(): Promise | void; split(): IResourceUndoRedoElement[]; + + /** + * If implemented, will be invoked before calling `undo()` or `redo()`. + * This is a good place to prepare everything such that the calls to `undo()` or `redo()` are synchronous. + * If a disposable is returned, it will be invoked to clean things up. + */ + prepareUndoRedo?(): Promise | IDisposable | void; } export type IUndoRedoElement = IResourceUndoRedoElement | IWorkspaceUndoRedoElement; diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index 7441995c635..ddb7b3e9336 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -12,6 +12,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import Severity from 'vs/base/common/severity'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; function uriGetComparisonKey(resource: URI): string { return resource.toString(); @@ -76,7 +77,7 @@ class RemovedResources { let messages: string[] = []; if (externalRemoval.length > 0) { - messages.push(nls.localize('externalRemoval', "The following files have been closed: {0}.", externalRemoval.join(', '))); + messages.push(nls.localize('externalRemoval', "The following files have been closed and modified on disk: {0}.", externalRemoval.join(', '))); } if (noParallelUniverses.length > 0) { messages.push(nls.localize('noParallelUniverses', "The following files have been modified in an incompatible way: {0}.", noParallelUniverses.join(', '))); @@ -386,7 +387,7 @@ export class UndoRedoService implements IUndoRedoService { }; } - private _safeInvokeWithLocks(element: StackElement, invoke: () => Promise | void, affectedEditStacks: ResourceEditStack[]): Promise | void { + private _safeInvokeWithLocks(element: StackElement, invoke: () => Promise | void, affectedEditStacks: ResourceEditStack[], cleanup: IDisposable = Disposable.None): Promise | void { const releaseLocks = this._acquireLocks(affectedEditStacks); let result: Promise | void; @@ -394,6 +395,7 @@ export class UndoRedoService implements IUndoRedoService { result = invoke(); } catch (err) { releaseLocks(); + cleanup.dispose(); return this._onError(err, element); } @@ -402,18 +404,32 @@ export class UndoRedoService implements IUndoRedoService { return result.then( () => { releaseLocks(); + cleanup.dispose(); }, (err) => { releaseLocks(); + cleanup.dispose(); return this._onError(err, element); } ); } else { // result is void releaseLocks(); + cleanup.dispose(); } } + private async _invokePrepare(element: WorkspaceStackElement): Promise { + if (typeof element.actual.prepareUndoRedo === 'undefined') { + return Disposable.None; + } + const result = element.actual.prepareUndoRedo(); + if (typeof result === 'undefined') { + return Disposable.None; + } + return result; + } + private _getAffectedEditStacks(element: WorkspaceStackElement): ResourceEditStack[] { const affectedEditStacks: ResourceEditStack[] = []; for (const strResource of element.strResources) { @@ -422,14 +438,14 @@ export class UndoRedoService implements IUndoRedoService { return affectedEditStacks; } - private _checkWorkspaceUndo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[]): WorkspaceVerificationError | null { + private _checkWorkspaceUndo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[], checkInvalidatedResources: boolean): WorkspaceVerificationError | null { if (element.removedResources) { this._splitPastWorkspaceElement(element, element.removedResources); const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); this._notificationService.info(message); return new WorkspaceVerificationError(this.undo(resource)); } - if (element.invalidatedResources) { + if (checkInvalidatedResources && element.invalidatedResources) { this._splitPastWorkspaceElement(element, element.invalidatedResources); const message = nls.localize('cannotWorkspaceUndo', "Could not undo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); this._notificationService.info(message); @@ -470,7 +486,7 @@ export class UndoRedoService implements IUndoRedoService { private _workspaceUndo(resource: URI, element: WorkspaceStackElement): Promise | void { const affectedEditStacks = this._getAffectedEditStacks(element); - const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); + const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks, /*invalidated resources will be checked after the prepare call*/false); if (verificationError) { return verificationError.returnValue; } @@ -492,29 +508,44 @@ export class UndoRedoService implements IUndoRedoService { ); if (result.choice === 2) { - // cancel + // choice: cancel return; } if (result.choice === 1) { - // undo this file + // choice: undo this file this._splitPastWorkspaceElement(element, null); return this.undo(resource); } - // undo in all files + // choice: undo in all files + // At this point, it is possible that the element has been made invalid in the meantime (due to the confirmation await) - const verificationError = this._checkWorkspaceUndo(resource, element, affectedEditStacks); - if (verificationError) { - return verificationError.returnValue; + const verificationError1 = this._checkWorkspaceUndo(resource, element, affectedEditStacks, /*invalidated resources will be checked after the prepare call*/false); + if (verificationError1) { + return verificationError1.returnValue; + } + + // prepare + let cleanup: IDisposable; + try { + cleanup = await this._invokePrepare(element); + } catch (err) { + return this._onError(err, element); + } + + // At this point, it is possible that the element has been made invalid in the meantime (due to the prepare await) + const verificationError2 = this._checkWorkspaceUndo(resource, element, affectedEditStacks, /*now also check that there are no more invalidated resources*/true); + if (verificationError2) { + cleanup.dispose(); + return verificationError2.returnValue; } for (const editStack of affectedEditStacks) { editStack.past.pop(); editStack.future.push(element); } - - return this._safeInvokeWithLocks(element, () => element.actual.undo(), affectedEditStacks); + return this._safeInvokeWithLocks(element, () => element.actual.undo(), affectedEditStacks, cleanup); } private _resourceUndo(editStack: ResourceEditStack, element: ResourceStackElement): Promise | void { @@ -562,14 +593,14 @@ export class UndoRedoService implements IUndoRedoService { return false; } - private _checkWorkspaceRedo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[]): WorkspaceVerificationError | null { + private _checkWorkspaceRedo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[], checkInvalidatedResources: boolean): WorkspaceVerificationError | null { if (element.removedResources) { this._splitFutureWorkspaceElement(element, element.removedResources); const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.removedResources.createMessage()); this._notificationService.info(message); return new WorkspaceVerificationError(this.redo(resource)); } - if (element.invalidatedResources) { + if (checkInvalidatedResources && element.invalidatedResources) { this._splitFutureWorkspaceElement(element, element.invalidatedResources); const message = nls.localize('cannotWorkspaceRedo', "Could not redo '{0}' across all files. {1}", element.label, element.invalidatedResources.createMessage()); this._notificationService.info(message); @@ -610,16 +641,34 @@ export class UndoRedoService implements IUndoRedoService { private _workspaceRedo(resource: URI, element: WorkspaceStackElement): Promise | void { const affectedEditStacks = this._getAffectedEditStacks(element); - const verificationError = this._checkWorkspaceRedo(resource, element, affectedEditStacks); + const verificationError = this._checkWorkspaceRedo(resource, element, affectedEditStacks, /*invalidated resources will be checked after the prepare call*/false); if (verificationError) { return verificationError.returnValue; } + return this._executeWorkspaceRedo(resource, element, affectedEditStacks); + } + + private async _executeWorkspaceRedo(resource: URI, element: WorkspaceStackElement, affectedEditStacks: ResourceEditStack[]): Promise { + // prepare + let cleanup: IDisposable; + try { + cleanup = await this._invokePrepare(element); + } catch (err) { + return this._onError(err, element); + } + + // At this point, it is possible that the element has been made invalid in the meantime (due to the prepare await) + const verificationError = this._checkWorkspaceRedo(resource, element, affectedEditStacks, /*now also check that there are no more invalidated resources*/true); + if (verificationError) { + cleanup.dispose(); + return verificationError.returnValue; + } for (const editStack of affectedEditStacks) { editStack.future.pop(); editStack.past.push(element); } - return this._safeInvokeWithLocks(element, () => element.actual.redo(), affectedEditStacks); + return this._safeInvokeWithLocks(element, () => element.actual.redo(), affectedEditStacks, cleanup); } private _resourceRedo(editStack: ResourceEditStack, element: ResourceStackElement): Promise | void { diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index b00bdc79286..9181a03692f 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -6,7 +6,7 @@ import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITextModel } from 'vs/editor/common/model'; -import { IDisposable, toDisposable, IReference, ReferenceCollection } from 'vs/base/common/lifecycle'; +import { IDisposable, toDisposable, IReference, ReferenceCollection, Disposable } from 'vs/base/common/lifecycle'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel'; import { ITextFileService, TextFileLoadReason } from 'vs/workbench/services/textfile/common/textfiles'; @@ -16,6 +16,8 @@ import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textF import { IFileService } from 'vs/platform/files/common/files'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; +import { ModelUndoRedoParticipant } from 'vs/editor/common/services/modelUndoRedoParticipant'; class ResourceModelCollection extends ReferenceCollection> { @@ -159,7 +161,7 @@ class ResourceModelCollection extends ReferenceCollection> { From d78d979141d956c4e6fded9775dbbd3a78d18325 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 27 May 2020 10:24:44 +0200 Subject: [PATCH 093/107] Problems: filter box: remove duplicated color def. For #98250 --- src/vs/workbench/contrib/markers/browser/media/markers.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/markers/browser/media/markers.css b/src/vs/workbench/contrib/markers/browser/media/markers.css index 6ccf3e40f3a..d87789106e6 100644 --- a/src/vs/workbench/contrib/markers/browser/media/markers.css +++ b/src/vs/workbench/contrib/markers/browser/media/markers.css @@ -22,7 +22,8 @@ .monaco-workbench.vs .monaco-action-bar .markers-panel-action-filter .monaco-inputbox { height: 25px; - border: 1px solid transparent; + border-width: 1px; + border-style: solid; } .markers-panel-action-filter > .markers-panel-filter-controls { From 42ae88fd51ff30a2c9fabd483ac75c8e884dcb20 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 27 May 2020 11:01:11 +0200 Subject: [PATCH 094/107] start crash reporter properly given directory argument (refs #98122) --- src/vs/workbench/electron-browser/window.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 6f9ab62f25e..734d652d3a7 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -432,16 +432,16 @@ export class NativeWindow extends Disposable { const companyName = product.crashReporter?.companyName || 'Microsoft'; const productName = product.crashReporter?.productName || product.nameShort; - // With appCenter enabled, crashes will be uploaded - if (product.appCenter) { - this.setupCrashReporter(companyName, productName, product.appCenter, undefined); - } - // With a provided crash reporter directory, crashes // will be stored only locally in that folder - else if (this.environmentService.crashReporterDirectory) { + if (this.environmentService.crashReporterDirectory) { this.setupCrashReporter(companyName, productName, undefined, this.environmentService.crashReporterDirectory); } + + // With appCenter enabled, crashes will be uploaded + else if (product.appCenter) { + this.setupCrashReporter(companyName, productName, product.appCenter, undefined); + } } } From da8f44cf08d658ef6f44efb995bc089a0e1998a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 27 May 2020 11:08:47 +0200 Subject: [PATCH 095/107] add list smooth scrolling fixes #98175 --- src/vs/base/browser/ui/list/listView.ts | 26 +++++++++++++------ src/vs/base/browser/ui/list/listWidget.ts | 9 +++---- .../browser/ui/scrollbar/scrollableElement.ts | 8 ++++++ src/vs/base/browser/ui/tree/abstractTree.ts | 4 ++- src/vs/platform/list/browser/listService.ts | 23 +++++++++++++--- 5 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index b7c858d1ed2..84978eab45d 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -9,8 +9,8 @@ import { Gesture, EventType as TouchEventType, GestureEvent } from 'vs/base/brow import * as DOM from 'vs/base/browser/dom'; import { Event, Emitter } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; -import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; -import { ScrollEvent, ScrollbarVisibility, INewScrollDimensions } from 'vs/base/common/scrollable'; +import { SmoothScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; +import { ScrollEvent, ScrollbarVisibility, INewScrollDimensions, Scrollable } from 'vs/base/common/scrollable'; import { RangeMap, shift } from './rangeMap'; import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListTouchEvent, IListGestureEvent, IListDragEvent, IListDragAndDrop, ListDragOverEffect } from './list'; import { RowCache, IRow } from './rowCache'; @@ -48,7 +48,12 @@ export interface IListViewAccessibilityProvider { isChecked?(element: T): boolean | undefined; } -export interface IListViewOptions { +export interface IListViewOptionsUpdate { + readonly additionalScrollHeight?: number; + readonly smoothScrolling?: boolean; +} + +export interface IListViewOptions extends IListViewOptionsUpdate { readonly dnd?: IListViewDragAndDrop; readonly useShadows?: boolean; readonly verticalScrollMode?: ScrollbarVisibility; @@ -58,7 +63,6 @@ export interface IListViewOptions { readonly mouseSupport?: boolean; readonly horizontalScrolling?: boolean; readonly accessibilityProvider?: IListViewAccessibilityProvider; - readonly additionalScrollHeight?: number; readonly transformOptimization?: boolean; } @@ -204,7 +208,8 @@ export class ListView implements ISpliceable, IDisposable { private lastRenderHeight: number; private renderWidth = 0; private rowsContainer: HTMLElement; - private scrollableElement: ScrollableElement; + private scrollable: Scrollable; + private scrollableElement: SmoothScrollableElement; private _scrollHeight: number = 0; private scrollableElementUpdateDisposable: IDisposable | null = null; private scrollableElementWidthDelayer = new Delayer(50); @@ -285,12 +290,13 @@ export class ListView implements ISpliceable, IDisposable { this.disposables.add(Gesture.addTarget(this.rowsContainer)); - this.scrollableElement = this.disposables.add(new ScrollableElement(this.rowsContainer, { + this.scrollable = new Scrollable(getOrDefault(options, o => o.smoothScrolling, false) ? 125 : 0, cb => DOM.scheduleAtNextAnimationFrame(cb)); + this.scrollableElement = this.disposables.add(new SmoothScrollableElement(this.rowsContainer, { alwaysConsumeMouseWheel: true, horizontal: this.horizontalScrolling ? ScrollbarVisibility.Auto : ScrollbarVisibility.Hidden, vertical: getOrDefault(options, o => o.verticalScrollMode, DefaultOptions.verticalScrollMode), - useShadows: getOrDefault(options, o => o.useShadows, DefaultOptions.useShadows) - })); + useShadows: getOrDefault(options, o => o.useShadows, DefaultOptions.useShadows), + }, this.scrollable)); this.domNode.appendChild(this.scrollableElement.getDomNode()); container.appendChild(this.domNode); @@ -320,6 +326,10 @@ export class ListView implements ISpliceable, IDisposable { if (options.additionalScrollHeight !== undefined) { this.additionalScrollHeight = options.additionalScrollHeight; } + + if (options.smoothScrolling !== undefined) { + this.scrollable.setSmoothScrollDuration(options.smoothScrolling ? 125 : 0); + } } triggerScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent) { diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 856b97f1a6a..ca09bbf018a 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -16,7 +16,7 @@ import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardE import { Event, Emitter, EventBufferer } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IIdentityProvider, IKeyboardNavigationLabelProvider, IListDragAndDrop, IListDragOverReaction, ListError, IKeyboardNavigationDelegate } from './list'; -import { ListView, IListViewOptions, IListViewDragAndDrop, IListViewAccessibilityProvider } from './listView'; +import { ListView, IListViewOptions, IListViewDragAndDrop, IListViewAccessibilityProvider, IListViewOptionsUpdate } from './listView'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; import { ScrollbarVisibility, ScrollEvent } from 'vs/base/common/scrollable'; @@ -1107,10 +1107,9 @@ class ListViewDragAndDrop implements IListViewDragAndDrop { } } -export interface IListOptionsUpdate { +export interface IListOptionsUpdate extends IListViewOptionsUpdate { readonly enableKeyboardNavigation?: boolean; readonly automaticKeyboardNavigation?: boolean; - readonly additionalScrollHeight?: number; } export class List implements ISpliceable, IDisposable { @@ -1288,9 +1287,7 @@ export class List implements ISpliceable, IDisposable { this.typeLabelController.updateOptions(this._options); } - if (optionsUpdate.additionalScrollHeight !== undefined) { - this.view.updateOptions(optionsUpdate); - } + this.view.updateOptions(optionsUpdate); } get options(): IListOptions { diff --git a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts index da2f2b6cee8..933af1512ed 100644 --- a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +++ b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts @@ -533,6 +533,14 @@ export class SmoothScrollableElement extends AbstractScrollableElement { super(element, options, scrollable); } + public setScrollPosition(update: INewScrollPosition): void { + this._scrollable.setScrollPositionNow(update); + } + + public getScrollPosition(): IScrollPosition { + return this._scrollable.getCurrentScrollPosition(); + } + } export class DomScrollableElement extends ScrollableElement { diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index a71e4d6ae48..f19a1cc4cad 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -962,6 +962,7 @@ export interface IAbstractTreeOptionsUpdate extends ITreeRendererOptions { readonly simpleKeyboardNavigation?: boolean; readonly filterOnType?: boolean; readonly openOnSingleClick?: boolean; + readonly smoothScrolling?: boolean; } export interface IAbstractTreeOptions extends IAbstractTreeOptionsUpdate, IListOptions { @@ -1360,7 +1361,8 @@ export abstract class AbstractTree implements IDisposable this.view.updateOptions({ enableKeyboardNavigation: this._options.simpleKeyboardNavigation, - automaticKeyboardNavigation: this._options.automaticKeyboardNavigation + automaticKeyboardNavigation: this._options.automaticKeyboardNavigation, + smoothScrolling: this._options.smoothScrolling }); if (this.typeFilterController) { diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index f81f8534749..235c3a7e78c 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -124,6 +124,7 @@ export const keyboardNavigationSettingKey = 'workbench.list.keyboardNavigation'; export const automaticKeyboardNavigationSettingKey = 'workbench.list.automaticKeyboardNavigation'; const treeIndentKey = 'workbench.tree.indent'; const treeRenderIndentGuidesKey = 'workbench.tree.renderIndentGuides'; +const listSmoothScrolling = 'workbench.list.smoothScrolling'; function getHorizontalScrollingSetting(configurationService: IConfigurationService): boolean { return getMigratedSettingValue(configurationService, horizontalScrollingKey, 'workbench.tree.horizontalScrolling'); @@ -823,6 +824,7 @@ function workbenchTreeDataPreamble(treeIndentKey), renderIndentGuides: configurationService.getValue(treeRenderIndentGuidesKey), + smoothScrolling: configurationService.getValue(listSmoothScrolling), automaticKeyboardNavigation: getAutomaticKeyboardNavigation(), simpleKeyboardNavigation: keyboardNavigation === 'simple', filterOnType: keyboardNavigation === 'filter', @@ -898,25 +900,33 @@ class WorkbenchTreeInternals { this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); }), configurationService.onDidChangeConfiguration(e => { + let options: any = {}; if (e.affectsConfiguration(openModeSettingKey)) { - tree.updateOptions({ openOnSingleClick: useSingleClickToOpen(configurationService) }); + options = { ...options, openOnSingleClick: useSingleClickToOpen(configurationService) }; } if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); } if (e.affectsConfiguration(treeIndentKey)) { const indent = configurationService.getValue(treeIndentKey); - tree.updateOptions({ indent }); + options = { ...options, indent }; } if (e.affectsConfiguration(treeRenderIndentGuidesKey)) { const renderIndentGuides = configurationService.getValue(treeRenderIndentGuidesKey); - tree.updateOptions({ renderIndentGuides }); + options = { ...options, renderIndentGuides }; + } + if (e.affectsConfiguration(listSmoothScrolling)) { + const smoothScrolling = configurationService.getValue(listSmoothScrolling); + options = { ...options, smoothScrolling }; } if (e.affectsConfiguration(keyboardNavigationSettingKey)) { updateKeyboardNavigation(); } if (e.affectsConfiguration(automaticKeyboardNavigationSettingKey)) { - tree.updateOptions({ automaticKeyboardNavigation: getAutomaticKeyboardNavigation() }); + options = { ...options, automaticKeyboardNavigation: getAutomaticKeyboardNavigation() }; + } + if (Object.keys(options).length > 0) { + tree.updateOptions(options); } }), this.contextKeyService.onDidChangeContext(e => { @@ -1001,6 +1011,11 @@ configurationRegistry.registerConfiguration({ default: 'onHover', description: localize('render tree indent guides', "Controls whether the tree should render indent guides.") }, + [listSmoothScrolling]: { + type: 'boolean', + default: false, + description: localize('list smoothScrolling setting', "Controls whether lists and trees have smooth scrolling."), + }, [keyboardNavigationSettingKey]: { 'type': 'string', 'enum': ['simple', 'highlight', 'filter'], From 582557a55f2606d9cf8f84a90e426dfa9e63b281 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 27 May 2020 11:11:52 +0200 Subject: [PATCH 096/107] :lipstick: --- .../platform/userDataSync/common/userDataSyncStoreService.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts index 344d98aa553..3778148041d 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts @@ -19,7 +19,6 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { assign } from 'vs/base/common/objects'; import { generateUuid } from 'vs/base/common/uuid'; import { isWeb } from 'vs/base/common/platform'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; const USER_SESSION_ID_KEY = 'sync.user-session-id'; const MACHINE_SESSION_ID_KEY = 'sync.machine-session-id'; @@ -43,7 +42,6 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, @IStorageService private readonly storageService: IStorageService, - @ITelemetryService telemetryService: ITelemetryService, ) { super(); this.userDataSyncStore = getUserDataSyncStore(productService, configurationService); @@ -314,7 +312,6 @@ export class RequestsSession { } if (this.count >= this.limit) { - throw new UserDataSyncStoreError(`Too many requests. Allowed only ${this.limit} requests in ${this.interval / (1000 * 60)} minutes.`, UserDataSyncErrorCode.LocalTooManyRequests); } From bdf2e8dc00d8221a9f9d2ed9bcd9c93ba7282b56 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 27 May 2020 11:54:44 +0200 Subject: [PATCH 097/107] fix #98250 --- src/vs/workbench/contrib/markers/browser/media/markers.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/contrib/markers/browser/media/markers.css b/src/vs/workbench/contrib/markers/browser/media/markers.css index d87789106e6..b5570494b91 100644 --- a/src/vs/workbench/contrib/markers/browser/media/markers.css +++ b/src/vs/workbench/contrib/markers/browser/media/markers.css @@ -22,8 +22,6 @@ .monaco-workbench.vs .monaco-action-bar .markers-panel-action-filter .monaco-inputbox { height: 25px; - border-width: 1px; - border-style: solid; } .markers-panel-action-filter > .markers-panel-filter-controls { From a73cc731a4806299b1891248ce63ab561848124b Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 27 May 2020 11:58:30 +0200 Subject: [PATCH 098/107] statusBar: do not focus editor when executing commands fixes #97513 --- src/vs/workbench/browser/parts/statusbar/statusbarPart.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index dde922f9908..6f17fd71773 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -9,7 +9,6 @@ import { toErrorMessage } from 'vs/base/common/errorMessage'; import { dispose, IDisposable, Disposable, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { CodiconLabel } from 'vs/base/browser/ui/codicons/codiconLabel'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Part } from 'vs/workbench/browser/part'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -726,7 +725,6 @@ class StatusbarEntryItem extends Disposable { @ICommandService private readonly commandService: ICommandService, @INotificationService private readonly notificationService: INotificationService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IEditorService private readonly editorService: IEditorService, @IThemeService private readonly themeService: IThemeService ) { super(); @@ -829,12 +827,6 @@ class StatusbarEntryItem extends Disposable { const id = typeof command === 'string' ? command : command.id; const args = typeof command === 'string' ? [] : command.arguments ?? []; - // Maintain old behaviour of always focusing the editor here - const activeTextEditorControl = this.editorService.activeTextEditorControl; - if (activeTextEditorControl) { - activeTextEditorControl.focus(); - } - this.telemetryService.publicLog2('workbenchActionExecuted', { id, from: 'status bar' }); try { await this.commandService.executeCommand(id, ...args); From 9f83b385d4e7e7398cc78876214216e4e0f68e51 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 27 May 2020 12:16:15 +0200 Subject: [PATCH 099/107] remove telemetry, update jsdoc, https://github.com/microsoft/vscode/issues/96779 --- src/vs/vscode.d.ts | 10 ++- .../api/common/extHostLanguageFeatures.ts | 77 +------------------ 2 files changed, 8 insertions(+), 79 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 1db8f073041..8bf4f02140c 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3950,9 +3950,13 @@ declare module 'vscode' { * * The editor will only resolve a completion item once. * - * *Note* that accepting a completion item will not wait for it to be resolved. Because of that [`insertText`](#CompletionItem.insertText), - * [`additionalTextEdits`](#CompletionItem.additionalTextEdits), and [`command`](#CompletionItem.command) should not - * be changed when resolving an item. + * *Note* that this function is called when completion items are already showing in the UI or when an item has been + * selected for insertion. Because of that, no property that changes the presentation (label, sorting, filtering etc) + * or the (primary) insert behaviour ([insertText](#CompletionItem.insertText)) can be changed. + * + * This function may fill in [additionalTextEdits](#CompletionItem.additionalTextEdits). However, that means an item might be + * inserted *before* resolving is done and in that case the editor will do a best effort to still apply those additional + * text edits. * * @param item A completion item currently active in the UI. * @param token A cancellation token. diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 13697b1e1ed..a114726c453 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -857,16 +857,11 @@ class SuggestAdapter { private _cache = new Cache('CompletionItem'); private _disposables = new Map(); - private _didWarnMust: boolean = false; - private _didWarnShould: boolean = false; - constructor( private readonly _documents: ExtHostDocuments, private readonly _commands: CommandsConverter, private readonly _provider: vscode.CompletionItemProvider, - private readonly _logService: ILogService, private readonly _apiDeprecation: IExtHostApiDeprecationService, - private readonly _telemetry: extHostProtocol.MainThreadTelemetryShape, private readonly _extension: IExtensionDescription, ) { } @@ -930,41 +925,12 @@ class SuggestAdapter { return undefined; } - const _mustNotChange = SuggestAdapter._mustNotChangeHash(item); - const _mayNotChange = SuggestAdapter._mayNotChangeHash(item); - const resolvedItem = await asPromise(() => this._provider.resolveCompletionItem!(item, token)); if (!resolvedItem) { return undefined; } - type BlameExtension = { - extensionId: string; - kind: string; - index: string; - }; - - type BlameExtensionMeta = { - extensionId: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - kind: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - index: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - }; - - let _mustNotChangeIndex = !this._didWarnMust && SuggestAdapter._mustNotChangeDiff(_mustNotChange, resolvedItem); - if (typeof _mustNotChangeIndex === 'string') { - this._logService.warn(`[${this._extension.identifier.value}] INVALID result from 'resolveCompletionItem', extension MUST NOT change any of: label, sortText, filterText, insertText, or textEdit`); - this._telemetry.$publicLog2('badresolvecompletion', { extensionId: this._extension.identifier.value, kind: 'must', index: _mustNotChangeIndex }); - this._didWarnMust = true; - } - - let _mayNotChangeIndex = !this._didWarnShould && SuggestAdapter._mayNotChangeDiff(_mayNotChange, resolvedItem); - if (typeof _mayNotChangeIndex === 'string') { - this._logService.info(`[${this._extension.identifier.value}] UNSAVE result from 'resolveCompletionItem', extension SHOULD NOT change any of: additionalTextEdits, or command`); - this._telemetry.$publicLog2('badresolvecompletion', { extensionId: this._extension.identifier.value, kind: 'should', index: _mayNotChangeIndex }); - this._didWarnShould = true; - } - return this._convertCompletionItem(resolvedItem, id); } @@ -1035,45 +1001,6 @@ class SuggestAdapter { return result; } - - private static _mustNotChangeHash(item: vscode.CompletionItem) { - const res = JSON.stringify([item.label, item.sortText, item.filterText, item.insertText, item.range]); - return res; - } - - private static _mustNotChangeDiff(hash: string, item: vscode.CompletionItem): string | void { - const thisArr = [item.label, item.sortText, item.filterText, item.insertText, item.range]; - const thisHash = JSON.stringify(thisArr); - if (hash === thisHash) { - return; - } - const arr = JSON.parse(hash); - for (let i = 0; i < 6; i++) { - if (JSON.stringify(arr[i] !== JSON.stringify(thisArr[i]))) { - return i.toString(); - } - } - return 'unknown'; - } - - private static _mayNotChangeHash(item: vscode.CompletionItem) { - return JSON.stringify([item.additionalTextEdits, item.command]); - } - - private static _mayNotChangeDiff(hash: string, item: vscode.CompletionItem): string | void { - const thisArr = [item.additionalTextEdits, item.command]; - const thisHash = JSON.stringify(thisArr); - if (hash === thisHash) { - return; - } - const arr = JSON.parse(hash); - for (let i = 0; i < 6; i++) { - if (JSON.stringify(arr[i] !== JSON.stringify(thisArr[i]))) { - return i.toString(); - } - } - return 'unknown'; - } } class SignatureHelpAdapter { @@ -1392,7 +1319,6 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF private readonly _uriTransformer: IURITransformer | null; private readonly _proxy: extHostProtocol.MainThreadLanguageFeaturesShape; - private readonly _telemetryShape: extHostProtocol.MainThreadTelemetryShape; private _documents: ExtHostDocuments; private _commands: ExtHostCommands; private _diagnostics: ExtHostDiagnostics; @@ -1411,7 +1337,6 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF ) { this._uriTransformer = uriTransformer; this._proxy = mainContext.getProxy(extHostProtocol.MainContext.MainThreadLanguageFeatures); - this._telemetryShape = mainContext.getProxy(extHostProtocol.MainContext.MainThreadTelemetry); this._documents = documents; this._commands = commands; this._diagnostics = diagnostics; @@ -1780,7 +1705,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF // --- suggestion registerCompletionItemProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, triggerCharacters: string[]): vscode.Disposable { - const handle = this._addNewAdapter(new SuggestAdapter(this._documents, this._commands.converter, provider, this._logService, this._apiDeprecation, this._telemetryShape, extension), extension); + const handle = this._addNewAdapter(new SuggestAdapter(this._documents, this._commands.converter, provider, this._apiDeprecation, extension), extension); this._proxy.$registerSuggestSupport(handle, this._transformDocumentSelector(selector), triggerCharacters, SuggestAdapter.supportsResolving(provider), extension.identifier); return this._createDisposable(handle); } From e8c1a1e76ea41ac53ad3f7c19de237a706b284e9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 27 May 2020 12:56:33 +0200 Subject: [PATCH 100/107] add logging --- src/vs/platform/userDataSync/common/userDataAutoSyncService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts index 20d27834d3f..fe39994eb00 100644 --- a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts @@ -53,7 +53,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto } } else { if (this.autoSync.value !== undefined) { - this.logService.trace('Auto Sync: Disabled because', reason); + this.logService.info('Auto Sync: Disabled because', reason); this.autoSync.clear(); } } @@ -173,6 +173,7 @@ class AutoSync extends Disposable { try { await this.userDataSyncService.sync(); } catch (e) { + this.logService.error(e); error = e; } this._onDidFinishSync.fire(error); From e4ce4ade9d1df898f338a00740675cf26107c9e3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 27 May 2020 13:28:22 +0200 Subject: [PATCH 101/107] Encapsulate operations on ResourceEditStack --- .../undoRedo/common/undoRedoService.ts | 270 +++++++++++------- 1 file changed, 163 insertions(+), 107 deletions(-) diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index ddb7b3e9336..16e1921703a 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -152,17 +152,148 @@ class WorkspaceStackElement { type StackElement = ResourceStackElement | WorkspaceStackElement; class ResourceEditStack { - public resource: URI; - public past: StackElement[]; - public future: StackElement[]; + public readonly resource: URI; + private readonly strResource: string; + private _past: StackElement[]; + private _future: StackElement[]; public locked: boolean; - constructor(resource: URI) { + constructor(resource: URI, strResource: string) { this.resource = resource; - this.past = []; - this.future = []; + this.strResource = strResource; + this._past = []; + this._future = []; this.locked = false; } + + public dispose(): void { + for (const element of this._past) { + if (element.type === UndoRedoElementType.Workspace) { + element.removeResource(this.resource, this.strResource, RemovedResourceReason.ExternalRemoval); + } + } + for (const element of this._future) { + if (element.type === UndoRedoElementType.Workspace) { + element.removeResource(this.resource, this.strResource, RemovedResourceReason.ExternalRemoval); + } + } + } + + public flushAllElements(): void { + this._past = []; + this._future = []; + } + + public setElementsIsValid(isValid: boolean): void { + for (const element of this._past) { + if (element.type === UndoRedoElementType.Workspace) { + element.setValid(this.resource, this.strResource, isValid); + } else { + element.setValid(isValid); + } + } + for (const element of this._future) { + if (element.type === UndoRedoElementType.Workspace) { + element.setValid(this.resource, this.strResource, isValid); + } else { + element.setValid(isValid); + } + } + } + + public pushElement(element: StackElement): void { + // remove the future + for (const futureElement of this._future) { + if (futureElement.type === UndoRedoElementType.Workspace) { + futureElement.removeResource(this.resource, this.strResource, RemovedResourceReason.NoParallelUniverses); + } + } + this._future = []; + if (this._past.length > 0) { + const lastElement = this._past[this._past.length - 1]; + if (lastElement.type === UndoRedoElementType.Resource && !lastElement.isValid) { + // clear undo stack + this._past = []; + } + } + this._past.push(element); + } + + public getElements(): IPastFutureElements { + const past: IUndoRedoElement[] = []; + const future: IUndoRedoElement[] = []; + + for (const element of this._past) { + past.push(element.actual); + } + for (const element of this._future) { + future.push(element.actual); + } + + return { past, future }; + } + + public getClosestPastElement(): StackElement | null { + if (this._past.length === 0) { + return null; + } + return this._past[this._past.length - 1]; + } + + public getClosestFutureElement(): StackElement | null { + if (this._future.length === 0) { + return null; + } + return this._future[this._future.length - 1]; + } + + public hasPastElements(): boolean { + return (this._past.length > 0); + } + + public hasFutureElements(): boolean { + return (this._future.length > 0); + } + + public splitPastWorkspaceElement(toRemove: WorkspaceStackElement, individualMap: Map): void { + for (let j = this._past.length - 1; j >= 0; j--) { + if (this._past[j] === toRemove) { + if (individualMap.has(this.strResource)) { + // gets replaced + this._past[j] = individualMap.get(this.strResource)!; + } else { + // gets deleted + this._past.splice(j, 1); + } + break; + } + } + } + + public splitFutureWorkspaceElement(toRemove: WorkspaceStackElement, individualMap: Map): void { + for (let j = this._future.length - 1; j >= 0; j--) { + if (this._future[j] === toRemove) { + if (individualMap.has(this.strResource)) { + // gets replaced + this._future[j] = individualMap.get(this.strResource)!; + } else { + // gets deleted + this._future.splice(j, 1); + } + break; + } + } + } + + public moveBackward(element: StackElement): void { + this._past.pop(); + this._future.push(element); + } + + public moveForward(element: StackElement): void { + this._future.pop(); + this._past.push(element); + } } export class UndoRedoService implements IUndoRedoService { @@ -187,25 +318,11 @@ export class UndoRedoService implements IUndoRedoService { if (this._editStacks.has(strResource)) { editStack = this._editStacks.get(strResource)!; } else { - editStack = new ResourceEditStack(resource); + editStack = new ResourceEditStack(resource, strResource); this._editStacks.set(strResource, editStack); } - // remove the future - for (const futureElement of editStack.future) { - if (futureElement.type === UndoRedoElementType.Workspace) { - futureElement.removeResource(resource, strResource, RemovedResourceReason.NoParallelUniverses); - } - } - editStack.future = []; - if (editStack.past.length > 0) { - const lastElement = editStack.past[editStack.past.length - 1]; - if (lastElement.type === UndoRedoElementType.Resource && !lastElement.isValid) { - // clear undo stack - editStack.past = []; - } - } - editStack.past.push(element); + editStack.pushElement(element); } } @@ -213,13 +330,11 @@ export class UndoRedoService implements IUndoRedoService { const strResource = uriGetComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; - if (editStack.future.length > 0) { + if (editStack.hasFutureElements()) { return null; } - if (editStack.past.length === 0) { - return null; - } - return editStack.past[editStack.past.length - 1].actual; + const closestPastElement = editStack.getClosestPastElement(); + return closestPastElement ? closestPastElement.actual : null; } return null; } @@ -237,18 +352,7 @@ export class UndoRedoService implements IUndoRedoService { continue; } const editStack = this._editStacks.get(strResource)!; - for (let j = editStack.past.length - 1; j >= 0; j--) { - if (editStack.past[j] === toRemove) { - if (individualMap.has(strResource)) { - // gets replaced - editStack.past[j] = individualMap.get(strResource)!; - } else { - // gets deleted - editStack.past.splice(j, 1); - } - break; - } - } + editStack.splitPastWorkspaceElement(toRemove, individualMap); } } @@ -265,18 +369,7 @@ export class UndoRedoService implements IUndoRedoService { continue; } const editStack = this._editStacks.get(strResource)!; - for (let j = editStack.future.length - 1; j >= 0; j--) { - if (editStack.future[j] === toRemove) { - if (individualMap.has(strResource)) { - // gets replaced - editStack.future[j] = individualMap.get(strResource)!; - } else { - // gets deleted - editStack.future.splice(j, 1); - } - break; - } - } + editStack.splitFutureWorkspaceElement(toRemove, individualMap); } } @@ -284,16 +377,7 @@ export class UndoRedoService implements IUndoRedoService { const strResource = uriGetComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; - for (const element of editStack.past) { - if (element.type === UndoRedoElementType.Workspace) { - element.removeResource(resource, strResource, RemovedResourceReason.ExternalRemoval); - } - } - for (const element of editStack.future) { - if (element.type === UndoRedoElementType.Workspace) { - element.removeResource(resource, strResource, RemovedResourceReason.ExternalRemoval); - } - } + editStack.dispose(); this._editStacks.delete(strResource); } } @@ -302,20 +386,7 @@ export class UndoRedoService implements IUndoRedoService { const strResource = uriGetComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; - for (const element of editStack.past) { - if (element.type === UndoRedoElementType.Workspace) { - element.setValid(resource, strResource, isValid); - } else { - element.setValid(isValid); - } - } - for (const element of editStack.future) { - if (element.type === UndoRedoElementType.Workspace) { - element.setValid(resource, strResource, isValid); - } else { - element.setValid(isValid); - } - } + editStack.setElementsIsValid(isValid); } } @@ -325,34 +396,25 @@ export class UndoRedoService implements IUndoRedoService { const strResource = uriGetComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; - return (editStack.past.length > 0 || editStack.future.length > 0); + return (editStack.hasPastElements() || editStack.hasFutureElements()); } return false; } public getElements(resource: URI): IPastFutureElements { - const past: IUndoRedoElement[] = []; - const future: IUndoRedoElement[] = []; - const strResource = uriGetComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; - for (const element of editStack.past) { - past.push(element.actual); - } - for (const element of editStack.future) { - future.push(element.actual); - } + return editStack.getElements(); } - - return { past, future }; + return { past: [], future: [] }; } public canUndo(resource: URI): boolean { const strResource = uriGetComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; - return (editStack.past.length > 0); + return editStack.hasPastElements(); } return false; } @@ -455,7 +517,7 @@ export class UndoRedoService implements IUndoRedoService { // this must be the last past element in all the impacted resources! const cannotUndoDueToResources: URI[] = []; for (const editStack of affectedEditStacks) { - if (editStack.past.length === 0 || editStack.past[editStack.past.length - 1] !== element) { + if (editStack.getClosestPastElement() !== element) { cannotUndoDueToResources.push(editStack.resource); } } @@ -542,8 +604,7 @@ export class UndoRedoService implements IUndoRedoService { } for (const editStack of affectedEditStacks) { - editStack.past.pop(); - editStack.future.push(element); + editStack.moveBackward(element); } return this._safeInvokeWithLocks(element, () => element.actual.undo(), affectedEditStacks, cleanup); } @@ -551,8 +612,7 @@ export class UndoRedoService implements IUndoRedoService { private _resourceUndo(editStack: ResourceEditStack, element: ResourceStackElement): Promise | void { if (!element.isValid) { // invalid element => immediately flush edit stack! - editStack.past = []; - editStack.future = []; + editStack.flushAllElements(); return; } if (editStack.locked) { @@ -560,8 +620,7 @@ export class UndoRedoService implements IUndoRedoService { this._notificationService.info(message); return; } - editStack.past.pop(); - editStack.future.push(element); + editStack.moveBackward(element); return this._safeInvokeWithLocks(element, () => element.actual.undo(), [editStack]); } @@ -572,11 +631,11 @@ export class UndoRedoService implements IUndoRedoService { } const editStack = this._editStacks.get(strResource)!; - if (editStack.past.length === 0) { + const element = editStack.getClosestPastElement(); + if (!element) { return; } - const element = editStack.past[editStack.past.length - 1]; if (element.type === UndoRedoElementType.Workspace) { return this._workspaceUndo(resource, element); } else { @@ -588,7 +647,7 @@ export class UndoRedoService implements IUndoRedoService { const strResource = uriGetComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; - return (editStack.future.length > 0); + return editStack.hasFutureElements(); } return false; } @@ -610,7 +669,7 @@ export class UndoRedoService implements IUndoRedoService { // this must be the last future element in all the impacted resources! const cannotRedoDueToResources: URI[] = []; for (const editStack of affectedEditStacks) { - if (editStack.future.length === 0 || editStack.future[editStack.future.length - 1] !== element) { + if (editStack.getClosestFutureElement() !== element) { cannotRedoDueToResources.push(editStack.resource); } } @@ -665,8 +724,7 @@ export class UndoRedoService implements IUndoRedoService { } for (const editStack of affectedEditStacks) { - editStack.future.pop(); - editStack.past.push(element); + editStack.moveForward(element); } return this._safeInvokeWithLocks(element, () => element.actual.redo(), affectedEditStacks, cleanup); } @@ -674,8 +732,7 @@ export class UndoRedoService implements IUndoRedoService { private _resourceRedo(editStack: ResourceEditStack, element: ResourceStackElement): Promise | void { if (!element.isValid) { // invalid element => immediately flush edit stack! - editStack.past = []; - editStack.future = []; + editStack.flushAllElements(); return; } if (editStack.locked) { @@ -683,8 +740,7 @@ export class UndoRedoService implements IUndoRedoService { this._notificationService.info(message); return; } - editStack.future.pop(); - editStack.past.push(element); + editStack.moveForward(element); return this._safeInvokeWithLocks(element, () => element.actual.redo(), [editStack]); } @@ -695,11 +751,11 @@ export class UndoRedoService implements IUndoRedoService { } const editStack = this._editStacks.get(strResource)!; - if (editStack.future.length === 0) { + const element = editStack.getClosestFutureElement(); + if (!element) { return; } - const element = editStack.future[editStack.future.length - 1]; if (element.type === UndoRedoElementType.Workspace) { return this._workspaceRedo(resource, element); } else { From 571b747c28bfc3382e4339020c95f45a6279afe7 Mon Sep 17 00:00:00 2001 From: Rick van Galen <1130569+DCKcode@users.noreply.github.com> Date: Wed, 27 May 2020 14:47:27 +0200 Subject: [PATCH 102/107] Containerfile support (#93184) * Apply Dockerfile highlighting to Containerfile * Recognize Containerfile in Search Editor highlighting * Register opening Containerfile files on macOS * Register opening Containerfile files on Windows --- build/lib/electron.ts | 2 +- build/win32/code.iss | 7 +++++++ extensions/docker/package.json | 6 +++--- extensions/search-result/syntaxes/generateTMLanguage.js | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/build/lib/electron.ts b/build/lib/electron.ts index 82e9cc5f358..e0beca78079 100644 --- a/build/lib/electron.ts +++ b/build/lib/electron.ts @@ -69,7 +69,7 @@ export const config = { darwinBundleDocumentType(["vue"], 'resources/darwin/vue.icns'), darwinBundleDocumentType(["ascx", "csproj", "dtd", "wxi", "wxl", "wxs", "xml", "xaml"], 'resources/darwin/xml.icns'), darwinBundleDocumentType(["eyaml", "eyml", "yaml", "yml"], 'resources/darwin/yaml.icns'), - darwinBundleDocumentType(["clj", "cljs", "cljx", "clojure", "code-workspace", "coffee", "ctp", "dockerfile", "dot", "edn", "fs", "fsi", "fsscript", "fsx", "handlebars", "hbs", "lua", "m", "makefile", "ml", "mli", "pl", "pl6", "pm", "pm6", "pod", "pp", "properties", "psgi", "pug", "r", "rs", "rt", "svg", "svgz", "t", "txt", "vb", "xcodeproj", "xcworkspace"], 'resources/darwin/default.icns') + darwinBundleDocumentType(["clj", "cljs", "cljx", "clojure", "code-workspace", "coffee", "containerfile", "ctp", "dockerfile", "dot", "edn", "fs", "fsi", "fsscript", "fsx", "handlebars", "hbs", "lua", "m", "makefile", "ml", "mli", "pl", "pl6", "pm", "pm6", "pod", "pp", "properties", "psgi", "pug", "r", "rs", "rt", "svg", "svgz", "t", "txt", "vb", "xcodeproj", "xcworkspace"], 'resources/darwin/default.icns') ], darwinBundleURLTypes: [{ role: 'Viewer', diff --git a/build/win32/code.iss b/build/win32/code.iss index 15293a0c5cf..2e6db0faaf4 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -238,6 +238,13 @@ Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.confi Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.config\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\config.ico"; Tasks: associatewithfiles Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.config\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1"""; Tasks: associatewithfiles +Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\.containerfile\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\.containerfile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.containerfile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.containerfile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Containerfile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.containerfile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.containerfile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\default.ico"; Tasks: associatewithfiles +Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.containerfile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1"""; Tasks: associatewithfiles + Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\.cpp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\.cpp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cpp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.cpp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles diff --git a/extensions/docker/package.json b/extensions/docker/package.json index aa4ef1c294b..c1b91dc283d 100644 --- a/extensions/docker/package.json +++ b/extensions/docker/package.json @@ -12,9 +12,9 @@ "contributes": { "languages": [{ "id": "dockerfile", - "extensions": [ ".dockerfile" ], - "filenames": [ "Dockerfile" ], - "aliases": [ "Dockerfile" ], + "extensions": [ ".dockerfile", ".containerfile" ], + "filenames": [ "Dockerfile", "Containerfile" ], + "aliases": [ "Dockerfile", "Containerfile" ], "configuration": "./language-configuration.json" }], "grammars": [{ diff --git a/extensions/search-result/syntaxes/generateTMLanguage.js b/extensions/search-result/syntaxes/generateTMLanguage.js index 23e0615a718..eac084ddbc1 100644 --- a/extensions/search-result/syntaxes/generateTMLanguage.js +++ b/extensions/search-result/syntaxes/generateTMLanguage.js @@ -12,7 +12,7 @@ const mappings = [ ['css', 'source.css'], ['dart', 'source.dart'], ['diff', 'source.diff'], - ['dockerfile', 'source.dockerfile', '(?:dockerfile|Dockerfile)'], + ['dockerfile', 'source.dockerfile', '(?:dockerfile|Dockerfile|containerfile|Containerfile)'], ['fs', 'source.fsharp'], ['go', 'source.go'], ['groovy', 'source.groovy'], From d2b1c7a7e71fe27d7ac72d9509a09c126c8e1210 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 27 May 2020 15:23:56 +0200 Subject: [PATCH 103/107] #98584 clarify --- src/vs/platform/userDataSync/common/abstractSynchronizer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts index 433461b6c7e..d8d5d0dd876 100644 --- a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts +++ b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts @@ -238,7 +238,7 @@ export abstract class AbstractSynchroniser extends Disposable { if (remoteUserData.syncData && remoteUserData.syncData.version > this.version) { // current version is not compatible with cloud version this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/incompatible', { source: this.resource }); - throw new UserDataSyncError(localize('incompatible', "Cannot sync {0} as its version {1} is not compatible with cloud {2}", this.resource, this.version, remoteUserData.syncData.version), UserDataSyncErrorCode.Incompatible, this.resource); + throw new UserDataSyncError(localize({ key: 'incompatible', comment: ['This is an error while syncing a resource that its local version is not compatible with its remote version.'] }, "Cannot sync {0} as its local version {1} is not compatible with its remote version {2}", this.resource, this.version, remoteUserData.syncData.version), UserDataSyncErrorCode.Incompatible, this.resource); } try { const status = await this.performSync(remoteUserData, lastSyncUserData); From 8cce062aaff3ba8f5a9594fc86d245b025eb9efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 27 May 2020 15:27:13 +0200 Subject: [PATCH 104/107] :lipstick: --- extensions/git/src/git.ts | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index c38fdea0718..66d91da4d7a 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1223,15 +1223,12 @@ export class Repository { args.push('-A'); } - args.push('--'); - if (paths && paths.length) { for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) { - await this.run([...args, ...chunk]); + await this.run([...args, '--', ...chunk]); } } else { - args.push('.'); - await this.run(args); + await this.run([...args, '--', '.']); } } @@ -1441,10 +1438,11 @@ export class Repository { const limiter = new Limiter(5); const promises: Promise[] = []; + const args = ['clean', '-f', '-q']; for (const paths of groups) { for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) { - promises.push(limiter.queue(() => this.run(['clean', '-f', '-q', '--', ...chunk]))); + promises.push(limiter.queue(() => this.run([...args, '--', ...chunk]))); } } @@ -1476,19 +1474,18 @@ export class Repository { // In case there are no branches, we must use rm --cached if (!result.stdout) { - args = ['rm', '--cached', '-r', '--']; + args = ['rm', '--cached', '-r']; } else { - args = ['reset', '-q', treeish, '--']; + args = ['reset', '-q', treeish]; } try { if (paths && paths.length > 0) { for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) { - await this.run([...args, ...chunk]); + await this.run([...args, '--', ...chunk]); } } else { - args.push('.'); - await this.run(args); + await this.run([...args, '--', '.']); } } catch (err) { // In case there are merge conflicts to be resolved, git reset will output @@ -1977,10 +1974,10 @@ export class Repository { } async updateSubmodules(paths: string[]): Promise { - const args = ['submodule', 'update', '--']; + const args = ['submodule', 'update']; for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) { - await this.run([...args, ...chunk]); + await this.run([...args, '--', ...chunk]); } } From 3de76f6b2c3c919b4a8be8bceb39f9d4fe92f372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 27 May 2020 15:27:42 +0200 Subject: [PATCH 105/107] missing compilation --- build/lib/electron.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/lib/electron.js b/build/lib/electron.js index c459adb6075..bb71f14c12d 100644 --- a/build/lib/electron.js +++ b/build/lib/electron.js @@ -64,7 +64,7 @@ exports.config = { darwinBundleDocumentType(["vue"], 'resources/darwin/vue.icns'), darwinBundleDocumentType(["ascx", "csproj", "dtd", "wxi", "wxl", "wxs", "xml", "xaml"], 'resources/darwin/xml.icns'), darwinBundleDocumentType(["eyaml", "eyml", "yaml", "yml"], 'resources/darwin/yaml.icns'), - darwinBundleDocumentType(["clj", "cljs", "cljx", "clojure", "code-workspace", "coffee", "ctp", "dockerfile", "dot", "edn", "fs", "fsi", "fsscript", "fsx", "handlebars", "hbs", "lua", "m", "makefile", "ml", "mli", "pl", "pl6", "pm", "pm6", "pod", "pp", "properties", "psgi", "pug", "r", "rs", "rt", "svg", "svgz", "t", "txt", "vb", "xcodeproj", "xcworkspace"], 'resources/darwin/default.icns') + darwinBundleDocumentType(["clj", "cljs", "cljx", "clojure", "code-workspace", "coffee", "containerfile", "ctp", "dockerfile", "dot", "edn", "fs", "fsi", "fsscript", "fsx", "handlebars", "hbs", "lua", "m", "makefile", "ml", "mli", "pl", "pl6", "pm", "pm6", "pod", "pp", "properties", "psgi", "pug", "r", "rs", "rt", "svg", "svgz", "t", "txt", "vb", "xcodeproj", "xcworkspace"], 'resources/darwin/default.icns') ], darwinBundleURLTypes: [{ role: 'Viewer', From 96aa3bc139af4d92229a5b8febc3600e6ff370c2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 27 May 2020 15:28:03 +0200 Subject: [PATCH 106/107] #98576 clarify --- .../contrib/extensions/browser/remoteExtensionsInstaller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller.ts b/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller.ts index 84c47be3064..3ce9d79e586 100644 --- a/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller.ts +++ b/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller.ts @@ -30,7 +30,7 @@ export class RemoteExtensionsInstaller extends Disposable implements IWorkbenchC disposable = MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: 'workbench.extensions.installLocalExtensions', - category: localize('remote', "Remote"), + category: localize({ key: 'remote', comment: ['Remote as in remote machine'] }, "Remote"), title: installLocalExtensionsInRemoteAction.label } }); From e0046cbd1dab6713a2cc93324f0e8b29374a0994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 27 May 2020 15:35:08 +0200 Subject: [PATCH 107/107] :lipstick: --- extensions/git/package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 29a049860ce..d33bafbad5f 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -847,11 +847,6 @@ "group": "5_stage", "when": "scmProvider == git" }, - { - "command": "git.stageAllMerge", - "group": "5_stage", - "when": "scmProvider == git" - }, { "command": "git.unstageAll", "group": "5_stage",