/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; export const ID = 'driverService'; export const IDriver = createDecorator(ID); // !! Do not remove the following START and END markers, they are parsed by the smoketest build //*START export interface IElement { tagName: string; className: string; textContent: string; attributes: { [name: string]: string; }; children: IElement[]; } export interface IDriver { _serviceBrand: any; getWindowIds(): TPromise; capturePage(windowId: number): TPromise; reloadWindow(windowId: number): TPromise; dispatchKeybinding(windowId: number, keybinding: string): TPromise; click(windowId: number, selector: string, xoffset?: number | undefined, yoffset?: number | undefined): TPromise; doubleClick(windowId: number, selector: string): TPromise; move(windowId: number, selector: string): TPromise; setValue(windowId: number, selector: string, text: string): TPromise; getTitle(windowId: number): TPromise; isActiveElement(windowId: number, selector: string): TPromise; getElements(windowId: number, selector: string, recursive?: boolean): TPromise; typeInEditor(windowId: number, selector: string, text: string): TPromise; getTerminalBuffer(windowId: number, selector: string): TPromise; writeInTerminal(windowId: number, selector: string, text: string): TPromise; } //*END export interface IDriverChannel extends IChannel { call(command: 'getWindowIds'): TPromise; call(command: 'capturePage'): TPromise; call(command: 'reloadWindow', arg: number): TPromise; call(command: 'dispatchKeybinding', arg: [number, string]): TPromise; call(command: 'click', arg: [number, string, number | undefined, number | undefined]): TPromise; call(command: 'doubleClick', arg: [number, string]): TPromise; call(command: 'move', arg: [number, string]): TPromise; call(command: 'setValue', arg: [number, string, string]): TPromise; call(command: 'getTitle', arg: [number]): TPromise; call(command: 'isActiveElement', arg: [number, string]): TPromise; call(command: 'getElements', arg: [number, string, boolean]): TPromise; call(command: 'typeInEditor', arg: [number, string, string]): TPromise; call(command: 'getTerminalBuffer', arg: [number, string]): TPromise; call(command: 'writeInTerminal', arg: [number, string, string]): TPromise; call(command: string, arg: any): TPromise; } export class DriverChannel implements IDriverChannel { constructor(private driver: IDriver) { } call(command: string, arg?: any): TPromise { switch (command) { case 'getWindowIds': return this.driver.getWindowIds(); case 'capturePage': return this.driver.capturePage(arg); case 'reloadWindow': return this.driver.reloadWindow(arg); case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg[0], arg[1]); case 'click': return this.driver.click(arg[0], arg[1], arg[2], arg[3]); case 'doubleClick': return this.driver.doubleClick(arg[0], arg[1]); case 'move': return this.driver.move(arg[0], arg[1]); case 'setValue': return this.driver.setValue(arg[0], arg[1], arg[2]); case 'getTitle': return this.driver.getTitle(arg[0]); case 'isActiveElement': return this.driver.isActiveElement(arg[0], arg[1]); case 'getElements': return this.driver.getElements(arg[0], arg[1], arg[2]); case 'typeInEditor': return this.driver.typeInEditor(arg[0], arg[1], arg[2]); case 'getTerminalBuffer': return this.driver.getTerminalBuffer(arg[0], arg[1]); case 'writeInTerminal': return this.driver.writeInTerminal(arg[0], arg[1], arg[2]); } return undefined; } } export class DriverChannelClient implements IDriver { _serviceBrand: any; constructor(private channel: IDriverChannel) { } getWindowIds(): TPromise { return this.channel.call('getWindowIds'); } capturePage(windowId: number): TPromise { return this.channel.call('capturePage', windowId); } reloadWindow(windowId: number): TPromise { return this.channel.call('reloadWindow', windowId); } dispatchKeybinding(windowId: number, keybinding: string): TPromise { return this.channel.call('dispatchKeybinding', [windowId, keybinding]); } click(windowId: number, selector: string, xoffset: number | undefined, yoffset: number | undefined): TPromise { return this.channel.call('click', [windowId, selector, xoffset, yoffset]); } doubleClick(windowId: number, selector: string): TPromise { return this.channel.call('doubleClick', [windowId, selector]); } move(windowId: number, selector: string): TPromise { return this.channel.call('move', [windowId, selector]); } setValue(windowId: number, selector: string, text: string): TPromise { return this.channel.call('setValue', [windowId, selector, text]); } getTitle(windowId: number): TPromise { return this.channel.call('getTitle', [windowId]); } isActiveElement(windowId: number, selector: string): TPromise { return this.channel.call('isActiveElement', [windowId, selector]); } getElements(windowId: number, selector: string, recursive: boolean): TPromise { return this.channel.call('getElements', [windowId, selector, recursive]); } typeInEditor(windowId: number, selector: string, text: string): TPromise { return this.channel.call('typeInEditor', [windowId, selector, text]); } getTerminalBuffer(windowId: number, selector: string): TPromise { return this.channel.call('getTerminalBuffer', [windowId, selector]); } writeInTerminal(windowId: number, selector: string, text: string): TPromise { return this.channel.call('writeInTerminal', [windowId, selector, text]); } } export interface IDriverOptions { verbose: boolean; } export interface IWindowDriverRegistry { registerWindowDriver(windowId: number): TPromise; reloadWindowDriver(windowId: number): TPromise; } export interface IWindowDriverRegistryChannel extends IChannel { call(command: 'registerWindowDriver', arg: number): TPromise; call(command: 'reloadWindowDriver', arg: number): TPromise; call(command: string, arg: any): TPromise; } export class WindowDriverRegistryChannel implements IWindowDriverRegistryChannel { constructor(private registry: IWindowDriverRegistry) { } call(command: string, arg?: any): TPromise { switch (command) { case 'registerWindowDriver': return this.registry.registerWindowDriver(arg); case 'reloadWindowDriver': return this.registry.reloadWindowDriver(arg); } return undefined; } } export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry { _serviceBrand: any; constructor(private channel: IWindowDriverRegistryChannel) { } registerWindowDriver(windowId: number): TPromise { return this.channel.call('registerWindowDriver', windowId); } reloadWindowDriver(windowId: number): TPromise { return this.channel.call('reloadWindowDriver', windowId); } } export interface IWindowDriver { click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): TPromise; doubleClick(selector: string): TPromise; move(selector: string): TPromise; setValue(selector: string, text: string): TPromise; getTitle(): TPromise; isActiveElement(selector: string): TPromise; getElements(selector: string, recursive: boolean): TPromise; typeInEditor(selector: string, text: string): TPromise; getTerminalBuffer(selector: string): TPromise; writeInTerminal(selector: string, text: string): TPromise; } export interface IWindowDriverChannel extends IChannel { call(command: 'click', arg: [string, number | undefined, number | undefined]): TPromise; call(command: 'doubleClick', arg: string): TPromise; call(command: 'move', arg: string): TPromise; call(command: 'setValue', arg: [string, string]): TPromise; call(command: 'getTitle'): TPromise; call(command: 'isActiveElement', arg: string): TPromise; call(command: 'getElements', arg: [string, boolean]): TPromise; call(command: 'typeInEditor', arg: [string, string]): TPromise; call(command: 'getTerminalBuffer', arg: string): TPromise; call(command: 'writeInTerminal', arg: [string, string]): TPromise; call(command: string, arg: any): TPromise; } export class WindowDriverChannel implements IWindowDriverChannel { constructor(private driver: IWindowDriver) { } call(command: string, arg?: any): TPromise { switch (command) { case 'click': return this.driver.click(arg[0], arg[1], arg[2]); case 'doubleClick': return this.driver.doubleClick(arg); case 'move': return this.driver.move(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 '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]); } return undefined; } } export class WindowDriverChannelClient implements IWindowDriver { _serviceBrand: any; constructor(private channel: IWindowDriverChannel) { } click(selector: string, xoffset?: number, yoffset?: number): TPromise { return this.channel.call('click', [selector, xoffset, yoffset]); } doubleClick(selector: string): TPromise { return this.channel.call('doubleClick', selector); } move(selector: string): TPromise { return this.channel.call('move', selector); } setValue(selector: string, text: string): TPromise { return this.channel.call('setValue', [selector, text]); } getTitle(): TPromise { return this.channel.call('getTitle'); } isActiveElement(selector: string): TPromise { return this.channel.call('isActiveElement', selector); } getElements(selector: string, recursive: boolean): TPromise { return this.channel.call('getElements', [selector, recursive]); } typeInEditor(selector: string, text: string): TPromise { return this.channel.call('typeInEditor', [selector, text]); } getTerminalBuffer(selector: string): TPromise { return this.channel.call('getTerminalBuffer', selector); } writeInTerminal(selector: string, text: string): TPromise { return this.channel.call('writeInTerminal', [selector, text]); } }