From 45552c0a2d406917e153734bdb0c7b423f5c4a55 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 26 May 2020 08:12:09 +0200 Subject: [PATCH] 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 } });