diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index bae76735466..b444cb31e03 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -54,3 +54,12 @@ export interface IWindowDriver { getTerminalBuffer(selector: string): Promise; writeInTerminal(selector: string, text: string): Promise; } + +export interface IDriverOptions { + verbose: boolean; +} + +export interface IWindowDriverRegistry { + registerWindowDriver(windowId: number): Promise; + reloadWindowDriver(windowId: number): Promise; +} diff --git a/src/vs/platform/driver/common/driverIpc.ts b/src/vs/platform/driver/common/driverIpc.ts new file mode 100644 index 00000000000..f492817c1d3 --- /dev/null +++ b/src/vs/platform/driver/common/driverIpc.ts @@ -0,0 +1,96 @@ +/*--------------------------------------------------------------------------------------------- + * 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 { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IDriverOptions, IElement, IWindowDriver, IWindowDriverRegistry } from 'vs/platform/driver/common/driver'; + +export class WindowDriverChannel implements IServerChannel { + + constructor(private driver: IWindowDriver) { } + + listen(_: unknown, event: string): Event { + throw new Error(`No event found: ${event}`); + } + + call(_: unknown, command: string, arg?: any): Promise { + switch (command) { + case 'click': return this.driver.click(arg[0], arg[1], arg[2]); + case 'doubleClick': return this.driver.doubleClick(arg); + case 'setValue': return this.driver.setValue(arg[0], arg[1]); + case 'getTitle': return this.driver.getTitle(); + case 'isActiveElement': return this.driver.isActiveElement(arg); + case 'getElements': return this.driver.getElements(arg[0], arg[1]); + case 'getElementXY': return this.driver.getElementXY(arg[0], arg[1], arg[2]); + case 'typeInEditor': return this.driver.typeInEditor(arg[0], arg[1]); + case 'getTerminalBuffer': return this.driver.getTerminalBuffer(arg); + case 'writeInTerminal': return this.driver.writeInTerminal(arg[0], arg[1]); + } + + throw new Error(`Call not found: ${command}`); + } +} + +export class WindowDriverChannelClient implements IWindowDriver { + + declare readonly _serviceBrand: undefined; + + constructor(private channel: IChannel) { } + + click(selector: string, xoffset?: number, yoffset?: number): Promise { + return this.channel.call('click', [selector, xoffset, yoffset]); + } + + doubleClick(selector: string): Promise { + return this.channel.call('doubleClick', selector); + } + + setValue(selector: string, text: string): Promise { + return this.channel.call('setValue', [selector, text]); + } + + getTitle(): Promise { + return this.channel.call('getTitle'); + } + + isActiveElement(selector: string): Promise { + return this.channel.call('isActiveElement', selector); + } + + getElements(selector: string, recursive: boolean): Promise { + return this.channel.call('getElements', [selector, recursive]); + } + + getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number, y: number }> { + return this.channel.call('getElementXY', [selector, xoffset, yoffset]); + } + + typeInEditor(selector: string, text: string): Promise { + return this.channel.call('typeInEditor', [selector, text]); + } + + getTerminalBuffer(selector: string): Promise { + return this.channel.call('getTerminalBuffer', selector); + } + + writeInTerminal(selector: string, text: string): Promise { + return this.channel.call('writeInTerminal', [selector, text]); + } +} + +export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry { + + declare readonly _serviceBrand: undefined; + + constructor(private channel: IChannel) { } + + registerWindowDriver(windowId: number): Promise { + return this.channel.call('registerWindowDriver', windowId); + } + + reloadWindowDriver(windowId: number): Promise { + return this.channel.call('reloadWindowDriver', windowId); + } +} diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index f2f76df80c3..f33718e8f7d 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DriverChannel, WindowDriverChannelClient, IWindowDriverRegistry, WindowDriverRegistryChannel, IDriverOptions } from 'vs/platform/driver/node/driver'; +import { DriverChannel, WindowDriverRegistryChannel } from 'vs/platform/driver/node/driver'; +import { WindowDriverChannelClient } from 'vs/platform/driver/common/driverIpc'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; import { serve as serveNet } from 'vs/base/parts/ipc/node/ipc.net'; import { combinedDisposable, IDisposable } from 'vs/base/common/lifecycle'; @@ -17,7 +18,7 @@ import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/e import { ScanCodeBinding } from 'vs/base/common/scanCode'; import { KeybindingParser } from 'vs/base/common/keybindingParser'; import { timeout } from 'vs/base/common/async'; -import { IDriver, IElement, IWindowDriver } from 'vs/platform/driver/common/driver'; +import { IDriver, IDriverOptions, IElement, IWindowDriver, IWindowDriverRegistry } from 'vs/platform/driver/common/driver'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { INativeHostMainService } from 'vs/platform/native/electron-main/nativeHostMainService'; diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-sandbox/driver.ts similarity index 98% rename from src/vs/platform/driver/electron-browser/driver.ts rename to src/vs/platform/driver/electron-sandbox/driver.ts index 169d7365701..9bcf61b1fcb 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-sandbox/driver.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/node/driver'; +import { WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/common/driverIpc'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/services'; import { timeout } from 'vs/base/common/async'; diff --git a/src/vs/platform/driver/node/driver.ts b/src/vs/platform/driver/node/driver.ts index 185100ef2b9..ba435b01de2 100644 --- a/src/vs/platform/driver/node/driver.ts +++ b/src/vs/platform/driver/node/driver.ts @@ -7,7 +7,7 @@ import { Client } from 'vs/base/parts/ipc/common/ipc.net'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event } from 'vs/base/common/event'; -import { IDriver, IElement, IWindowDriver } from 'vs/platform/driver/common/driver'; +import { IDriver, IElement, IWindowDriverRegistry } from 'vs/platform/driver/common/driver'; export class DriverChannel implements IServerChannel { @@ -107,15 +107,6 @@ export class DriverChannelClient implements IDriver { } } -export interface IDriverOptions { - verbose: boolean; -} - -export interface IWindowDriverRegistry { - registerWindowDriver(windowId: number): Promise; - reloadWindowDriver(windowId: number): Promise; -} - export class WindowDriverRegistryChannel implements IServerChannel { constructor(private registry: IWindowDriverRegistry) { } @@ -134,94 +125,6 @@ export class WindowDriverRegistryChannel implements IServerChannel { } } -export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry { - - declare readonly _serviceBrand: undefined; - - constructor(private channel: IChannel) { } - - registerWindowDriver(windowId: number): Promise { - return this.channel.call('registerWindowDriver', windowId); - } - - reloadWindowDriver(windowId: number): Promise { - return this.channel.call('reloadWindowDriver', windowId); - } -} - -export class WindowDriverChannel implements IServerChannel { - - constructor(private driver: IWindowDriver) { } - - listen(_: unknown, event: string): Event { - throw new Error(`No event found: ${event}`); - } - - call(_: unknown, command: string, arg?: any): Promise { - switch (command) { - case 'click': return this.driver.click(arg[0], arg[1], arg[2]); - case 'doubleClick': return this.driver.doubleClick(arg); - case 'setValue': return this.driver.setValue(arg[0], arg[1]); - case 'getTitle': return this.driver.getTitle(); - case 'isActiveElement': return this.driver.isActiveElement(arg); - case 'getElements': return this.driver.getElements(arg[0], arg[1]); - case 'getElementXY': return this.driver.getElementXY(arg[0], arg[1], arg[2]); - case 'typeInEditor': return this.driver.typeInEditor(arg[0], arg[1]); - case 'getTerminalBuffer': return this.driver.getTerminalBuffer(arg); - case 'writeInTerminal': return this.driver.writeInTerminal(arg[0], arg[1]); - } - - throw new Error(`Call not found: ${command}`); - } -} - -export class WindowDriverChannelClient implements IWindowDriver { - - declare readonly _serviceBrand: undefined; - - constructor(private channel: IChannel) { } - - click(selector: string, xoffset?: number, yoffset?: number): Promise { - return this.channel.call('click', [selector, xoffset, yoffset]); - } - - doubleClick(selector: string): Promise { - return this.channel.call('doubleClick', selector); - } - - setValue(selector: string, text: string): Promise { - return this.channel.call('setValue', [selector, text]); - } - - getTitle(): Promise { - return this.channel.call('getTitle'); - } - - isActiveElement(selector: string): Promise { - return this.channel.call('isActiveElement', selector); - } - - getElements(selector: string, recursive: boolean): Promise { - return this.channel.call('getElements', [selector, recursive]); - } - - getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number, y: number }> { - return this.channel.call('getElementXY', [selector, xoffset, yoffset]); - } - - typeInEditor(selector: string, text: string): Promise { - return this.channel.call('typeInEditor', [selector, text]); - } - - getTerminalBuffer(selector: string): Promise { - return this.channel.call('getTerminalBuffer', selector); - } - - writeInTerminal(selector: string, text: string): Promise { - return this.channel.call('writeInTerminal', [selector, text]); - } -} - export async function connect(handle: string): Promise<{ client: Client, driver: IDriver }> { const client = await connectNet(handle, 'driverClient'); const channel = client.getChannel('driver'); diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 6530c427e8c..3a805673796 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -13,8 +13,6 @@ import { DiskFileSystemProvider } from 'vs/platform/files/electron-browser/diskF import { FileUserDataProvider } from 'vs/workbench/services/userData/common/fileUserDataProvider'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { SharedDesktopMain } from 'vs/workbench/electron-sandbox/shared.desktop.main'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; class DesktopMain extends SharedDesktopMain { @@ -25,14 +23,6 @@ class DesktopMain extends SharedDesktopMain { gracefulify(fs); } - protected override joinOpen(instantiationService: IInstantiationService): void { - - // Driver - if (this.configuration.driver) { - instantiationService.invokeFunction(async accessor => this._register(await registerWindowDriver(accessor, this.configuration.windowId))); - } - } - protected registerFileSystemProviders(environmentService: INativeWorkbenchEnvironmentService, fileService: IFileService, logService: ILogService, nativeHostService: INativeHostService): void { // Local Files diff --git a/src/vs/workbench/electron-sandbox/shared.desktop.main.ts b/src/vs/workbench/electron-sandbox/shared.desktop.main.ts index 8480a1b3b19..fa857a32a3d 100644 --- a/src/vs/workbench/electron-sandbox/shared.desktop.main.ts +++ b/src/vs/workbench/electron-sandbox/shared.desktop.main.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import product from 'vs/platform/product/common/product'; import { zoomLevelToZoomFactor } from 'vs/platform/windows/common/windows'; import { Workbench } from 'vs/workbench/browser/workbench'; import { NativeWindow } from 'vs/workbench/electron-sandbox/window'; @@ -42,11 +43,10 @@ import { IKeyboardLayoutService } from 'vs/platform/keyboardLayout/common/keyboa import { ElectronIPCMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { LoggerChannelClient, LogLevelChannelClient } from 'vs/platform/log/common/logIpc'; import { ProxyChannel } from 'vs/base/parts/ipc/common/ipc'; -import product from 'vs/platform/product/common/product'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { NativeLogService } from 'vs/workbench/services/log/electron-sandbox/logService'; import { WorkspaceTrustManagementService } from 'vs/workbench/services/workspaces/common/workspaceTrust'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; +import { registerWindowDriver } from 'vs/platform/driver/electron-sandbox/driver'; export abstract class SharedDesktopMain extends Disposable { @@ -116,8 +116,10 @@ export abstract class SharedDesktopMain extends Disposable { // Logging services.logService.trace('workbench configuration', JSON.stringify(this.configuration)); - // Allow subclass to participate - this.joinOpen(instantiationService); + // Driver + if (this.configuration.driver) { + instantiationService.invokeFunction(async accessor => this._register(await registerWindowDriver(accessor, this.configuration.windowId))); + } } private registerListeners(workbench: Workbench, storageService: NativeStorageService): void { @@ -128,7 +130,6 @@ export abstract class SharedDesktopMain extends Disposable { } protected abstract registerFileSystemProviders(environmentService: INativeWorkbenchEnvironmentService, fileService: IFileService, logService: ILogService, nativeHostService: INativeHostService): void | Promise; - protected joinOpen(instantiationService: IInstantiationService): void { } private async initServices(): Promise<{ serviceCollection: ServiceCollection, logService: ILogService, storageService: NativeStorageService }> { const serviceCollection = new ServiceCollection();