diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 6d0693d7657..a570fa16b49 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -303,7 +303,7 @@ export class IssueReporter extends Disposable { const loggerClient = new LoggerChannelClient(mainProcessService.getChannel('logger')); this.logService = new FollowerLogService(loggerClient, logService); - const sharedProcess = (serviceCollection.get(IWindowsService)).whenSharedProcessReady() + const sharedProcess = mainProcessService.getChannel('sharedProcess').call('whenSharedProcessReady') .then(() => connectNet(this.environmentService.sharedIPCHandle, `window:${configuration.windowId}`)); const instantiationService = new InstantiationService(serviceCollection, true); diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index ca463cecefe..a817dbcb157 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -77,6 +77,7 @@ import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemPro import { ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; import { IElectronService } from 'vs/platform/electron/node/electron'; import { ElectronMainService } from 'vs/platform/electron/electron-main/electronMainService'; +import { ISharedProcessMainService, SharedProcessMainService } from 'vs/platform/ipc/electron-main/sharedProcessMainService'; export class CodeApplication extends Disposable { @@ -448,7 +449,8 @@ export class CodeApplication extends Disposable { } services.set(IWindowsMainService, new SyncDescriptor(WindowsManager, [machineId, this.userEnv])); - services.set(IWindowsService, new SyncDescriptor(LegacyWindowsMainService, [sharedProcess])); + services.set(ISharedProcessMainService, new SyncDescriptor(SharedProcessMainService, [sharedProcess])); + services.set(IWindowsService, new SyncDescriptor(LegacyWindowsMainService)); services.set(ILaunchMainService, new SyncDescriptor(LaunchMainService)); const diagnosticsChannel = getDelayedChannel(sharedProcessClient.then(client => client.getChannel('diagnostics'))); @@ -545,6 +547,10 @@ export class CodeApplication extends Disposable { const electronChannel = new SimpleServiceProxyChannel(electronService); electronIpcServer.registerChannel('electron', electronChannel); + const sharedProcessMainService = accessor.get(ISharedProcessMainService); + const sharedProcessChannel = new SimpleServiceProxyChannel(sharedProcessMainService); + electronIpcServer.registerChannel('sharedProcess', sharedProcessChannel); + const workspacesMainService = accessor.get(IWorkspacesMainService); const workspacesChannel = new WorkspacesChannel(workspacesMainService); electronIpcServer.registerChannel('workspaces', workspacesChannel); diff --git a/src/vs/platform/ipc/electron-browser/sharedProcessService.ts b/src/vs/platform/ipc/electron-browser/sharedProcessService.ts index dc78e224701..bfeaf0ac653 100644 --- a/src/vs/platform/ipc/electron-browser/sharedProcessService.ts +++ b/src/vs/platform/ipc/electron-browser/sharedProcessService.ts @@ -6,9 +6,10 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Client } from 'vs/base/parts/ipc/common/ipc.net'; import { connect } from 'vs/base/parts/ipc/node/ipc.net'; -import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowService } from 'vs/platform/windows/common/windows'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IChannel, IServerChannel, getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; export const ISharedProcessService = createDecorator('sharedProcessService'); @@ -17,8 +18,10 @@ export interface ISharedProcessService { _serviceBrand: undefined; getChannel(channelName: string): IChannel; - registerChannel(channelName: string, channel: IServerChannel): void; + + whenSharedProcessReady(): Promise; + toggleSharedProcessWindow(): Promise; } export class SharedProcessService implements ISharedProcessService { @@ -26,16 +29,23 @@ export class SharedProcessService implements ISharedProcessService { _serviceBrand: undefined; private withSharedProcessConnection: Promise>; + private sharedProcessMainChannel: IChannel; constructor( - @IWindowsService windowsService: IWindowsService, + @IMainProcessService mainProcessService: IMainProcessService, @IWindowService windowService: IWindowService, @IEnvironmentService environmentService: IEnvironmentService ) { - this.withSharedProcessConnection = windowsService.whenSharedProcessReady() + this.sharedProcessMainChannel = mainProcessService.getChannel('sharedProcess'); + + this.withSharedProcessConnection = this.whenSharedProcessReady() .then(() => connect(environmentService.sharedIPCHandle, `window:${windowService.windowId}`)); } + whenSharedProcessReady(): Promise { + return this.sharedProcessMainChannel.call('whenSharedProcessReady'); + } + getChannel(channelName: string): IChannel { return getDelayedChannel(this.withSharedProcessConnection.then(connection => connection.getChannel(channelName))); } @@ -43,4 +53,8 @@ export class SharedProcessService implements ISharedProcessService { registerChannel(channelName: string, channel: IServerChannel): void { this.withSharedProcessConnection.then(connection => connection.registerChannel(channelName, channel)); } + + toggleSharedProcessWindow(): Promise { + return this.sharedProcessMainChannel.call('toggleSharedProcessWindow'); + } } diff --git a/src/vs/platform/ipc/electron-main/sharedProcessMainService.ts b/src/vs/platform/ipc/electron-main/sharedProcessMainService.ts new file mode 100644 index 00000000000..bab9a00f90d --- /dev/null +++ b/src/vs/platform/ipc/electron-main/sharedProcessMainService.ts @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * 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 { ISharedProcess } from 'vs/platform/windows/electron-main/windows'; + +export const ISharedProcessMainService = createDecorator('sharedProcessMainService'); + +export interface ISharedProcessMainService { + + _serviceBrand: undefined; + + whenSharedProcessReady(): Promise; + toggleSharedProcessWindow(): Promise; +} +export class SharedProcessMainService implements ISharedProcessMainService { + + _serviceBrand: undefined; + + constructor(private sharedProcess: ISharedProcess) { } + + whenSharedProcessReady(): Promise { + return this.sharedProcess.whenReady(); + } + + async toggleSharedProcessWindow(): Promise { + return this.sharedProcess.toggle(); + } +} diff --git a/src/vs/platform/ipc/node/simpleIpcProxy.ts b/src/vs/platform/ipc/node/simpleIpcProxy.ts index ebc3b351366..774edaad7a7 100644 --- a/src/vs/platform/ipc/node/simpleIpcProxy.ts +++ b/src/vs/platform/ipc/node/simpleIpcProxy.ts @@ -44,12 +44,14 @@ export class SimpleServiceProxyChannel implements IServerChannel { throw new Error(`Events are currently unsupported by SimpleServiceProxyChannel: ${event}`); } - call(_: unknown, command: string, args: any[]): Promise { + call(_: unknown, command: string, args?: any[]): Promise { const target = this.service[command]; if (typeof target === 'function') { - const context = deserializeContext(args[0]); - if (context) { - args[0] = context; + if (Array.isArray(args)) { + const context = deserializeContext(args[0]); + if (context) { + args[0] = context; + } } return target.apply(this.service, args); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index cc25f00dd68..12e6b08df3e 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -95,10 +95,6 @@ export interface IWindowsService { unmaximizeWindow(windowId: number): Promise; minimizeWindow(windowId: number): Promise; - // Shared process - whenSharedProcessReady(): Promise; - toggleSharedProcess(): Promise; - // Global methods openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise; openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise; diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index 1951fd3e655..c13ab6011b3 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -81,8 +81,6 @@ export class WindowsChannel implements IServerChannel { } case 'openExtensionDevelopmentHostWindow': return this.service.openExtensionDevelopmentHostWindow(arg[0], arg[1]); case 'getWindows': return this.service.getWindows(); - case 'whenSharedProcessReady': return this.service.whenSharedProcessReady(); - case 'toggleSharedProcess': return this.service.toggleSharedProcess(); case 'getActiveWindowId': return this.service.getActiveWindowId(); } diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index b358634220d..767684f248c 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -87,14 +87,6 @@ export class WindowsService implements IWindowsService { return this.channel.call('minimizeWindow', windowId); } - whenSharedProcessReady(): Promise { - return this.channel.call('whenSharedProcessReady'); - } - - toggleSharedProcess(): Promise { - return this.channel.call('toggleSharedProcess'); - } - openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise { return this.channel.call('openWindow', [windowId, uris, options]); } diff --git a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts index 0f106dc1b2e..34039fbcbd4 100644 --- a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts +++ b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts @@ -11,7 +11,7 @@ import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/ import { app, MessageBoxReturnValue, SaveDialogReturnValue, OpenDialogReturnValue, BrowserWindow, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions } from 'electron'; import { Event } from 'vs/base/common/event'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; -import { IWindowsMainService, ISharedProcess, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; +import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; import { IHistoryMainService } from 'vs/platform/history/electron-main/historyMainService'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; @@ -40,7 +40,6 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ readonly onRecentlyOpenedChange: Event = this.historyMainService.onRecentlyOpenedChange; constructor( - private sharedProcess: ISharedProcess, @IWindowsMainService private readonly windowsMainService: IWindowsMainService, @IEnvironmentService private readonly environmentService: IEnvironmentService, @IURLService urlService: IURLService, @@ -207,19 +206,6 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ return this._activeWindowId; } - async whenSharedProcessReady(): Promise { - this.logService.trace('windowsService#whenSharedProcessReady'); - - return this.sharedProcess.whenReady(); - } - - async toggleSharedProcess(): Promise { - this.logService.trace('windowsService#toggleSharedProcess'); - - this.sharedProcess.toggle(); - - } - async handleURL(uri: URI): Promise { // Catch file URLs diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 264456b3aa9..b5115f25fc2 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -272,14 +272,6 @@ export class SimpleWindowsService implements IWindowsService { return Promise.resolve(); } - whenSharedProcessReady(): Promise { - return Promise.resolve(); - } - - toggleSharedProcess(): Promise { - return Promise.resolve(); - } - // Global methods openWindow(_windowId: number, _uris: IURIToOpen[], _options: IOpenSettings): Promise { return Promise.resolve(); diff --git a/src/vs/workbench/electron-browser/actions/developerActions.ts b/src/vs/workbench/electron-browser/actions/developerActions.ts index 996a7e141d1..d9b50a3f494 100644 --- a/src/vs/workbench/electron-browser/actions/developerActions.ts +++ b/src/vs/workbench/electron-browser/actions/developerActions.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { Action } from 'vs/base/common/actions'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; import * as nls from 'vs/nls'; import { IElectronService } from 'vs/platform/electron/node/electron'; +import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; export class ToggleDevToolsAction extends Action { @@ -27,11 +27,11 @@ export class ToggleSharedProcessAction extends Action { static readonly ID = 'workbench.action.toggleSharedProcess'; static LABEL = nls.localize('toggleSharedProcess', "Toggle Shared Process"); - constructor(id: string, label: string, @IWindowsService private readonly windowsService: IWindowsService) { + constructor(id: string, label: string, @ISharedProcessService private readonly sharedProcessService: ISharedProcessService) { super(id, label); } run(): Promise { - return this.windowsService.toggleSharedProcess(); + return this.sharedProcessService.toggleSharedProcessWindow(); } } diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index ec0c65c2c15..f534c8d75af 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1341,14 +1341,6 @@ export class TestWindowsService implements IWindowsService { return Promise.resolve(); } - whenSharedProcessReady(): Promise { - return Promise.resolve(); - } - - toggleSharedProcess(): Promise { - return Promise.resolve(); - } - // Global methods openWindow(_windowId: number, _uris: IURIToOpen[], _options: IOpenSettings): Promise { return Promise.resolve(); @@ -1415,6 +1407,9 @@ export class TestSharedProcessService implements ISharedProcessService { } registerChannel(channelName: string, channel: any): void { } + + async toggleSharedProcessWindow(): Promise { } + async whenSharedProcessReady(): Promise { } } export class RemoteFileSystemProvider implements IFileSystemProvider {