From 65dc238b3231daffeb9deacce8282e92de401d47 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Mon, 30 Aug 2021 18:43:18 +0200 Subject: [PATCH] chore(channels): generate dispatcher event types (#8540) --- src/browserServerImpl.ts | 2 +- src/dispatchers/androidDispatcher.ts | 6 +- src/dispatchers/artifactDispatcher.ts | 2 +- src/dispatchers/browserContextDispatcher.ts | 4 +- src/dispatchers/browserDispatcher.ts | 2 +- src/dispatchers/browserTypeDispatcher.ts | 2 +- src/dispatchers/cdpSessionDispatcher.ts | 2 +- src/dispatchers/consoleMessageDispatcher.ts | 2 +- src/dispatchers/dialogDispatcher.ts | 2 +- src/dispatchers/dispatcher.ts | 20 +-- src/dispatchers/electronDispatcher.ts | 4 +- src/dispatchers/frameDispatcher.ts | 2 +- src/dispatchers/jsHandleDispatcher.ts | 2 +- src/dispatchers/networkDispatchers.ts | 8 +- src/dispatchers/pageDispatcher.ts | 6 +- src/dispatchers/playwrightDispatcher.ts | 2 +- src/dispatchers/selectorsDispatcher.ts | 2 +- src/dispatchers/streamDispatcher.ts | 2 +- src/protocol/channels.ts | 127 ++++++++++++++++++++ utils/generate_channels.js | 11 ++ 20 files changed, 174 insertions(+), 36 deletions(-) diff --git a/src/browserServerImpl.ts b/src/browserServerImpl.ts index 77c427e282..6db6a5608b 100644 --- a/src/browserServerImpl.ts +++ b/src/browserServerImpl.ts @@ -100,7 +100,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher { } // This class implements multiplexing browser dispatchers over a single Browser instance. -class ConnectedBrowserDispatcher extends Dispatcher implements channels.BrowserChannel { +class ConnectedBrowserDispatcher extends Dispatcher implements channels.BrowserChannel { private _contexts = new Set(); private _selectors: Selectors; diff --git a/src/dispatchers/androidDispatcher.ts b/src/dispatchers/androidDispatcher.ts index 54ca7c6594..5a8aa41e19 100644 --- a/src/dispatchers/androidDispatcher.ts +++ b/src/dispatchers/androidDispatcher.ts @@ -20,7 +20,7 @@ import * as channels from '../protocol/channels'; import { BrowserContextDispatcher } from './browserContextDispatcher'; import { CallMetadata } from '../server/instrumentation'; -export class AndroidDispatcher extends Dispatcher implements channels.AndroidChannel { +export class AndroidDispatcher extends Dispatcher implements channels.AndroidChannel { constructor(scope: DispatcherScope, android: Android) { super(scope, android, 'Android', {}, true); } @@ -37,7 +37,7 @@ export class AndroidDispatcher extends Dispatcher implements channels.AndroidDeviceChannel { +export class AndroidDeviceDispatcher extends Dispatcher implements channels.AndroidDeviceChannel { static from(scope: DispatcherScope, device: AndroidDevice): AndroidDeviceDispatcher { const result = existingDispatcher(device); @@ -169,7 +169,7 @@ export class AndroidDeviceDispatcher extends Dispatcher implements channels.AndroidSocketChannel { +export class AndroidSocketDispatcher extends Dispatcher implements channels.AndroidSocketChannel { constructor(scope: DispatcherScope, socket: SocketBackend) { super(scope, socket, 'AndroidSocket', {}, true); socket.on('data', (data: Buffer) => this._dispatchEvent('data', { data: data.toString('base64') })); diff --git a/src/dispatchers/artifactDispatcher.ts b/src/dispatchers/artifactDispatcher.ts index ebd5e915b1..07bb103986 100644 --- a/src/dispatchers/artifactDispatcher.ts +++ b/src/dispatchers/artifactDispatcher.ts @@ -21,7 +21,7 @@ import fs from 'fs'; import { mkdirIfNeeded } from '../utils/utils'; import { Artifact } from '../server/artifact'; -export class ArtifactDispatcher extends Dispatcher implements channels.ArtifactChannel { +export class ArtifactDispatcher extends Dispatcher implements channels.ArtifactChannel { constructor(scope: DispatcherScope, artifact: Artifact) { super(scope, artifact, 'Artifact', { absolutePath: artifact.localPath(), diff --git a/src/dispatchers/browserContextDispatcher.ts b/src/dispatchers/browserContextDispatcher.ts index 91aac46f03..647b59d8ab 100644 --- a/src/dispatchers/browserContextDispatcher.ts +++ b/src/dispatchers/browserContextDispatcher.ts @@ -30,7 +30,7 @@ import { Artifact } from '../server/artifact'; import { Request, Response } from '../server/network'; import { headersArrayToObject } from '../utils/utils'; -export class BrowserContextDispatcher extends Dispatcher implements channels.BrowserContextChannel { +export class BrowserContextDispatcher extends Dispatcher implements channels.BrowserContextChannel { private _context: BrowserContext; constructor(scope: DispatcherScope, context: BrowserContext) { @@ -79,7 +79,7 @@ export class BrowserContextDispatcher extends Dispatcher this._dispatchEvent('requestFailed', { request: RequestDispatcher.from(this._scope, request), - failureText: request._failureText, + failureText: request._failureText || undefined, responseEndTiming: request._responseEndTiming, page: PageDispatcher.fromNullable(this._scope, request.frame()._page.initializedOrUndefined()) })); diff --git a/src/dispatchers/browserDispatcher.ts b/src/dispatchers/browserDispatcher.ts index e791e79918..a744f1b1af 100644 --- a/src/dispatchers/browserDispatcher.ts +++ b/src/dispatchers/browserDispatcher.ts @@ -23,7 +23,7 @@ import { CRBrowser } from '../server/chromium/crBrowser'; import { PageDispatcher } from './pageDispatcher'; import { CallMetadata } from '../server/instrumentation'; -export class BrowserDispatcher extends Dispatcher implements channels.BrowserChannel { +export class BrowserDispatcher extends Dispatcher implements channels.BrowserChannel { constructor(scope: DispatcherScope, browser: Browser) { super(scope, browser, 'Browser', { version: browser.version(), name: browser.options.name }, true); browser.on(Browser.Events.Disconnected, () => this._didClose()); diff --git a/src/dispatchers/browserTypeDispatcher.ts b/src/dispatchers/browserTypeDispatcher.ts index 9988703364..ad83fcaa23 100644 --- a/src/dispatchers/browserTypeDispatcher.ts +++ b/src/dispatchers/browserTypeDispatcher.ts @@ -21,7 +21,7 @@ import { Dispatcher, DispatcherScope } from './dispatcher'; import { BrowserContextDispatcher } from './browserContextDispatcher'; import { CallMetadata } from '../server/instrumentation'; -export class BrowserTypeDispatcher extends Dispatcher implements channels.BrowserTypeChannel { +export class BrowserTypeDispatcher extends Dispatcher implements channels.BrowserTypeChannel { constructor(scope: DispatcherScope, browserType: BrowserType) { super(scope, browserType, 'BrowserType', { executablePath: browserType.executablePath(), diff --git a/src/dispatchers/cdpSessionDispatcher.ts b/src/dispatchers/cdpSessionDispatcher.ts index 59d3ee1782..a443a8aad3 100644 --- a/src/dispatchers/cdpSessionDispatcher.ts +++ b/src/dispatchers/cdpSessionDispatcher.ts @@ -18,7 +18,7 @@ import { CRSession, CRSessionEvents } from '../server/chromium/crConnection'; import * as channels from '../protocol/channels'; import { Dispatcher, DispatcherScope } from './dispatcher'; -export class CDPSessionDispatcher extends Dispatcher implements channels.CDPSessionChannel { +export class CDPSessionDispatcher extends Dispatcher implements channels.CDPSessionChannel { constructor(scope: DispatcherScope, crSession: CRSession) { super(scope, crSession, 'CDPSession', {}, true); crSession._eventListener = (method, params) => { diff --git a/src/dispatchers/consoleMessageDispatcher.ts b/src/dispatchers/consoleMessageDispatcher.ts index ee18aab305..7782eccf15 100644 --- a/src/dispatchers/consoleMessageDispatcher.ts +++ b/src/dispatchers/consoleMessageDispatcher.ts @@ -19,7 +19,7 @@ import * as channels from '../protocol/channels'; import { Dispatcher, DispatcherScope } from './dispatcher'; import { ElementHandleDispatcher } from './elementHandlerDispatcher'; -export class ConsoleMessageDispatcher extends Dispatcher implements channels.ConsoleMessageChannel { +export class ConsoleMessageDispatcher extends Dispatcher implements channels.ConsoleMessageChannel { constructor(scope: DispatcherScope, message: ConsoleMessage) { super(scope, message, 'ConsoleMessage', { type: message.type(), diff --git a/src/dispatchers/dialogDispatcher.ts b/src/dispatchers/dialogDispatcher.ts index 1e6e4006c4..093fa53c67 100644 --- a/src/dispatchers/dialogDispatcher.ts +++ b/src/dispatchers/dialogDispatcher.ts @@ -18,7 +18,7 @@ import { Dialog } from '../server/dialog'; import * as channels from '../protocol/channels'; import { Dispatcher, DispatcherScope } from './dispatcher'; -export class DialogDispatcher extends Dispatcher implements channels.DialogChannel { +export class DialogDispatcher extends Dispatcher implements channels.DialogChannel { constructor(scope: DispatcherScope, dialog: Dialog) { super(scope, dialog, 'Dialog', { type: dialog.type(), diff --git a/src/dispatchers/dispatcher.ts b/src/dispatchers/dispatcher.ts index 5be5dca39e..973dc00033 100644 --- a/src/dispatchers/dispatcher.ts +++ b/src/dispatchers/dispatcher.ts @@ -41,21 +41,21 @@ export function lookupNullableDispatcher(object: any | null): Di return object ? lookupDispatcher(object) : undefined; } -export class Dispatcher extends EventEmitter implements channels.Channel { +export class Dispatcher extends EventEmitter implements channels.Channel { private _connection: DispatcherConnection; private _isScope: boolean; // Parent is always "isScope". - private _parent: Dispatcher | undefined; + private _parent: Dispatcher | undefined; // Only "isScope" channel owners have registered dispatchers inside. - private _dispatchers = new Map>(); + private _dispatchers = new Map>(); private _disposed = false; readonly _guid: string; readonly _type: string; - readonly _scope: Dispatcher; + readonly _scope: Dispatcher; _object: Type; - constructor(parent: Dispatcher | DispatcherConnection, object: Type, type: string, initializer: Initializer, isScope?: boolean) { + constructor(parent: Dispatcher | DispatcherConnection, object: Type, type: string, initializer: Initializer, isScope?: boolean) { super(); this._connection = parent instanceof DispatcherConnection ? parent : parent._connection; @@ -80,7 +80,7 @@ export class Dispatcher extends Even this._connection.sendMessageToClient(this._parent._guid, type, '__create__', { type, initializer, guid }, this._parent._object); } - _dispatchEvent(method: string, params: Dispatcher | any = {}) { + _dispatchEvent(method: T, params?: Events[T]) { if (this._disposed) { if (isUnderTest()) throw new Error(`${this._guid} is sending "${method}" event after being disposed`); @@ -88,7 +88,7 @@ export class Dispatcher extends Even return; } const sdkObject = this._object instanceof SdkObject ? this._object : undefined; - this._connection.sendMessageToClient(this._guid, this._type, method, params, sdkObject); + this._connection.sendMessageToClient(this._guid, this._type, method as string, params, sdkObject); } _dispose() { @@ -121,8 +121,8 @@ export class Dispatcher extends Even } } -export type DispatcherScope = Dispatcher; -export class Root extends Dispatcher<{ guid: '' }, {}> { +export type DispatcherScope = Dispatcher; +export class Root extends Dispatcher<{ guid: '' }, {}, {}> { private _initialized = false; constructor(connection: DispatcherConnection, private readonly createPlaywright?: (scope: DispatcherScope, options: channels.RootInitializeParams) => Promise) { @@ -140,7 +140,7 @@ export class Root extends Dispatcher<{ guid: '' }, {}> { } export class DispatcherConnection { - readonly _dispatchers = new Map>(); + readonly _dispatchers = new Map>(); onmessage = (message: object) => {}; private _validateParams: (type: string, method: string, params: any) => any; private _validateMetadata: (metadata: any) => { stack?: channels.StackFrame[] }; diff --git a/src/dispatchers/electronDispatcher.ts b/src/dispatchers/electronDispatcher.ts index 9ef87084dc..4a6a39296a 100644 --- a/src/dispatchers/electronDispatcher.ts +++ b/src/dispatchers/electronDispatcher.ts @@ -22,7 +22,7 @@ import { PageDispatcher } from './pageDispatcher'; import { parseArgument, serializeResult } from './jsHandleDispatcher'; import { ElementHandleDispatcher } from './elementHandlerDispatcher'; -export class ElectronDispatcher extends Dispatcher implements channels.ElectronChannel { +export class ElectronDispatcher extends Dispatcher implements channels.ElectronChannel { constructor(scope: DispatcherScope, electron: Electron) { super(scope, electron, 'Electron', {}, true); } @@ -33,7 +33,7 @@ export class ElectronDispatcher extends Dispatcher implements channels.ElectronApplicationChannel { +export class ElectronApplicationDispatcher extends Dispatcher implements channels.ElectronApplicationChannel { constructor(scope: DispatcherScope, electronApplication: ElectronApplication) { super(scope, electronApplication, 'ElectronApplication', { context: new BrowserContextDispatcher(scope, electronApplication.context()) diff --git a/src/dispatchers/frameDispatcher.ts b/src/dispatchers/frameDispatcher.ts index 2dc50201dd..1c2d42d381 100644 --- a/src/dispatchers/frameDispatcher.ts +++ b/src/dispatchers/frameDispatcher.ts @@ -22,7 +22,7 @@ import { parseArgument, serializeResult } from './jsHandleDispatcher'; import { ResponseDispatcher, RequestDispatcher } from './networkDispatchers'; import { CallMetadata } from '../server/instrumentation'; -export class FrameDispatcher extends Dispatcher implements channels.FrameChannel { +export class FrameDispatcher extends Dispatcher implements channels.FrameChannel { private _frame: Frame; static from(scope: DispatcherScope, frame: Frame): FrameDispatcher { diff --git a/src/dispatchers/jsHandleDispatcher.ts b/src/dispatchers/jsHandleDispatcher.ts index 81724369c9..f58f6182c8 100644 --- a/src/dispatchers/jsHandleDispatcher.ts +++ b/src/dispatchers/jsHandleDispatcher.ts @@ -20,7 +20,7 @@ import { Dispatcher, DispatcherScope } from './dispatcher'; import { ElementHandleDispatcher } from './elementHandlerDispatcher'; import { parseSerializedValue, serializeValue } from '../protocol/serializers'; -export class JSHandleDispatcher extends Dispatcher implements channels.JSHandleChannel { +export class JSHandleDispatcher extends Dispatcher implements channels.JSHandleChannel { protected constructor(scope: DispatcherScope, jsHandle: js.JSHandle) { // Do not call this directly, use createHandle() instead. diff --git a/src/dispatchers/networkDispatchers.ts b/src/dispatchers/networkDispatchers.ts index ad526c93d2..84bb502d70 100644 --- a/src/dispatchers/networkDispatchers.ts +++ b/src/dispatchers/networkDispatchers.ts @@ -19,7 +19,7 @@ import * as channels from '../protocol/channels'; import { Dispatcher, DispatcherScope, lookupNullableDispatcher, existingDispatcher } from './dispatcher'; import { FrameDispatcher } from './frameDispatcher'; -export class RequestDispatcher extends Dispatcher implements channels.RequestChannel { +export class RequestDispatcher extends Dispatcher implements channels.RequestChannel { static from(scope: DispatcherScope, request: Request): RequestDispatcher { const result = existingDispatcher(request); @@ -49,7 +49,7 @@ export class RequestDispatcher extends Dispatcher implements channels.ResponseChannel { +export class ResponseDispatcher extends Dispatcher implements channels.ResponseChannel { static from(scope: DispatcherScope, response: Response): ResponseDispatcher { const result = existingDispatcher(response); @@ -90,7 +90,7 @@ export class ResponseDispatcher extends Dispatcher implements channels.RouteChannel { +export class RouteDispatcher extends Dispatcher implements channels.RouteChannel { static from(scope: DispatcherScope, route: Route): RouteDispatcher { const result = existingDispatcher(route); @@ -137,7 +137,7 @@ export class RouteDispatcher extends Dispatcher implements channels.WebSocketChannel { +export class WebSocketDispatcher extends Dispatcher implements channels.WebSocketChannel { constructor(scope: DispatcherScope, webSocket: WebSocket) { super(scope, webSocket, 'WebSocket', { url: webSocket.url(), diff --git a/src/dispatchers/pageDispatcher.ts b/src/dispatchers/pageDispatcher.ts index 150fa49326..5f0af71b0f 100644 --- a/src/dispatchers/pageDispatcher.ts +++ b/src/dispatchers/pageDispatcher.ts @@ -35,7 +35,7 @@ import { ArtifactDispatcher } from './artifactDispatcher'; import { Download } from '../server/download'; import { createGuid } from '../utils/utils'; -export class PageDispatcher extends Dispatcher implements channels.PageChannel { +export class PageDispatcher extends Dispatcher implements channels.PageChannel { private _page: Page; static fromNullable(scope: DispatcherScope, page: Page | undefined): PageDispatcher | undefined { @@ -244,7 +244,7 @@ export class PageDispatcher extends Dispatcher i } -export class WorkerDispatcher extends Dispatcher implements channels.WorkerChannel { +export class WorkerDispatcher extends Dispatcher implements channels.WorkerChannel { constructor(scope: DispatcherScope, worker: Worker) { super(scope, worker, 'Worker', { url: worker.url() @@ -261,7 +261,7 @@ export class WorkerDispatcher extends Dispatcher implements channels.BindingCallChannel { +export class BindingCallDispatcher extends Dispatcher<{ guid: string }, channels.BindingCallInitializer, channels.BindingCallEvents> implements channels.BindingCallChannel { private _resolve: ((arg: any) => void) | undefined; private _reject: ((error: any) => void) | undefined; private _promise: Promise; diff --git a/src/dispatchers/playwrightDispatcher.ts b/src/dispatchers/playwrightDispatcher.ts index 25b2001834..c075ba7457 100644 --- a/src/dispatchers/playwrightDispatcher.ts +++ b/src/dispatchers/playwrightDispatcher.ts @@ -27,7 +27,7 @@ import { SocksConnection, SocksConnectionClient } from '../utils/socksProxy'; import { createGuid } from '../utils/utils'; import { debugLogger } from '../utils/debugLogger'; -export class PlaywrightDispatcher extends Dispatcher implements channels.PlaywrightChannel { +export class PlaywrightDispatcher extends Dispatcher implements channels.PlaywrightChannel { private _socksProxy: SocksProxy | undefined; constructor(scope: DispatcherScope, playwright: Playwright, customSelectors?: channels.SelectorsChannel, preLaunchedBrowser?: channels.BrowserChannel) { diff --git a/src/dispatchers/selectorsDispatcher.ts b/src/dispatchers/selectorsDispatcher.ts index 894f85b64f..89f488aa2b 100644 --- a/src/dispatchers/selectorsDispatcher.ts +++ b/src/dispatchers/selectorsDispatcher.ts @@ -18,7 +18,7 @@ import { Dispatcher, DispatcherScope } from './dispatcher'; import * as channels from '../protocol/channels'; import { Selectors } from '../server/selectors'; -export class SelectorsDispatcher extends Dispatcher implements channels.SelectorsChannel { +export class SelectorsDispatcher extends Dispatcher implements channels.SelectorsChannel { constructor(scope: DispatcherScope, selectors: Selectors) { super(scope, selectors, 'Selectors', {}); } diff --git a/src/dispatchers/streamDispatcher.ts b/src/dispatchers/streamDispatcher.ts index 6ab7c1d62e..17eadd093e 100644 --- a/src/dispatchers/streamDispatcher.ts +++ b/src/dispatchers/streamDispatcher.ts @@ -19,7 +19,7 @@ import { Dispatcher, DispatcherScope } from './dispatcher'; import * as stream from 'stream'; import { createGuid } from '../utils/utils'; -export class StreamDispatcher extends Dispatcher<{ guid: string, stream: stream.Readable }, channels.StreamInitializer> implements channels.StreamChannel { +export class StreamDispatcher extends Dispatcher<{ guid: string, stream: stream.Readable }, channels.StreamInitializer, channels.StreamEvents> implements channels.StreamChannel { private _ended: boolean = false; constructor(scope: DispatcherScope, stream: stream.Readable) { super(scope, { guid: createGuid(), stream }, 'Stream', {}); diff --git a/src/protocol/channels.ts b/src/protocol/channels.ts index 6a8feb2982..6dc91d051e 100644 --- a/src/protocol/channels.ts +++ b/src/protocol/channels.ts @@ -175,6 +175,9 @@ export type RootInitializeResult = { playwright: PlaywrightChannel, }; +export interface RootEvents { +} + // ----------- Playwright ----------- export type PlaywrightInitializer = { chromium: BrowserTypeChannel, @@ -266,6 +269,12 @@ export type PlaywrightSocksEndOptions = { }; export type PlaywrightSocksEndResult = void; +export interface PlaywrightEvents { + 'socksRequested': PlaywrightSocksRequestedEvent; + 'socksData': PlaywrightSocksDataEvent; + 'socksClosed': PlaywrightSocksClosedEvent; +} + // ----------- Selectors ----------- export type SelectorsInitializer = {}; export interface SelectorsChannel extends Channel { @@ -281,6 +290,9 @@ export type SelectorsRegisterOptions = { }; export type SelectorsRegisterResult = void; +export interface SelectorsEvents { +} + // ----------- BrowserType ----------- export type BrowserTypeInitializer = { executablePath: string, @@ -506,6 +518,9 @@ export type BrowserTypeConnectOverCDPResult = { defaultContext?: BrowserContextChannel, }; +export interface BrowserTypeEvents { +} + // ----------- Browser ----------- export type BrowserInitializer = { version: string, @@ -672,6 +687,10 @@ export type BrowserStopTracingResult = { binary: Binary, }; +export interface BrowserEvents { + 'close': BrowserCloseEvent; +} + // ----------- EventTarget ----------- export type EventTargetInitializer = {}; export interface EventTargetChannel extends Channel { @@ -691,6 +710,9 @@ export type EventTargetWaitForEventInfoOptions = { }; export type EventTargetWaitForEventInfoResult = void; +export interface EventTargetEvents { +} + // ----------- BrowserContext ----------- export type BrowserContextInitializer = { isChromium: boolean, @@ -970,6 +992,20 @@ export type BrowserContextHarExportResult = { artifact: ArtifactChannel, }; +export interface BrowserContextEvents { + 'bindingCall': BrowserContextBindingCallEvent; + 'close': BrowserContextCloseEvent; + 'page': BrowserContextPageEvent; + 'route': BrowserContextRouteEvent; + 'video': BrowserContextVideoEvent; + 'backgroundPage': BrowserContextBackgroundPageEvent; + 'serviceWorker': BrowserContextServiceWorkerEvent; + 'request': BrowserContextRequestEvent; + 'requestFailed': BrowserContextRequestFailedEvent; + 'requestFinished': BrowserContextRequestFinishedEvent; + 'response': BrowserContextResponseEvent; +} + // ----------- Page ----------- export type PageInitializer = { mainFrame: FrameChannel, @@ -1390,6 +1426,25 @@ export type PageBringToFrontParams = {}; export type PageBringToFrontOptions = {}; export type PageBringToFrontResult = void; +export interface PageEvents { + 'bindingCall': PageBindingCallEvent; + 'close': PageCloseEvent; + 'console': PageConsoleEvent; + 'crash': PageCrashEvent; + 'dialog': PageDialogEvent; + 'download': PageDownloadEvent; + 'domcontentloaded': PageDomcontentloadedEvent; + 'fileChooser': PageFileChooserEvent; + 'frameAttached': PageFrameAttachedEvent; + 'frameDetached': PageFrameDetachedEvent; + 'load': PageLoadEvent; + 'pageError': PagePageErrorEvent; + 'route': PageRouteEvent; + 'video': PageVideoEvent; + 'webSocket': PageWebSocketEvent; + 'worker': PageWorkerEvent; +} + // ----------- Frame ----------- export type FrameInitializer = { url: string, @@ -1997,6 +2052,11 @@ export type FrameWaitForSelectorResult = { element?: ElementHandleChannel, }; +export interface FrameEvents { + 'loadstate': FrameLoadstateEvent; + 'navigated': FrameNavigatedEvent; +} + // ----------- Worker ----------- export type WorkerInitializer = { url: string, @@ -2030,6 +2090,10 @@ export type WorkerEvaluateExpressionHandleResult = { handle: JSHandleChannel, }; +export interface WorkerEvents { + 'close': WorkerCloseEvent; +} + // ----------- JSHandle ----------- export type JSHandleInitializer = { preview: string, @@ -2094,6 +2158,10 @@ export type JSHandleJsonValueResult = { value: SerializedValue, }; +export interface JSHandleEvents { + 'previewUpdated': JSHandlePreviewUpdatedEvent; +} + // ----------- ElementHandle ----------- export type ElementHandleInitializer = {}; export interface ElementHandleChannel extends JSHandleChannel { @@ -2499,6 +2567,9 @@ export type ElementHandleWaitForSelectorResult = { element?: ElementHandleChannel, }; +export interface ElementHandleEvents { +} + // ----------- Request ----------- export type RequestInitializer = { frame: FrameChannel, @@ -2522,6 +2593,9 @@ export type RequestResponseResult = { response?: ResponseChannel, }; +export interface RequestEvents { +} + // ----------- Route ----------- export type RouteInitializer = { request: RequestChannel, @@ -2577,6 +2651,9 @@ export type RouteResponseBodyResult = { binary: Binary, }; +export interface RouteEvents { +} + export type ResourceTiming = { startTime: number, domainLookupStart: number, @@ -2631,6 +2708,9 @@ export type ResponseServerAddrResult = { value?: RemoteAddr, }; +export interface ResponseEvents { +} + export type SecurityDetails = { issuer?: string, protocol?: string, @@ -2677,6 +2757,14 @@ export type WebSocketSocketErrorEvent = { }; export type WebSocketCloseEvent = {}; +export interface WebSocketEvents { + 'open': WebSocketOpenEvent; + 'frameSent': WebSocketFrameSentEvent; + 'frameReceived': WebSocketFrameReceivedEvent; + 'socketError': WebSocketSocketErrorEvent; + 'close': WebSocketCloseEvent; +} + // ----------- ConsoleMessage ----------- export type ConsoleMessageInitializer = { type: string, @@ -2691,6 +2779,9 @@ export type ConsoleMessageInitializer = { export interface ConsoleMessageChannel extends Channel { } +export interface ConsoleMessageEvents { +} + // ----------- BindingCall ----------- export type BindingCallInitializer = { frame: FrameChannel, @@ -2717,6 +2808,9 @@ export type BindingCallResolveOptions = { }; export type BindingCallResolveResult = void; +export interface BindingCallEvents { +} + // ----------- Dialog ----------- export type DialogInitializer = { type: string, @@ -2738,6 +2832,9 @@ export type DialogDismissParams = {}; export type DialogDismissOptions = {}; export type DialogDismissResult = void; +export interface DialogEvents { +} + // ----------- Artifact ----------- export type ArtifactInitializer = { absolutePath: string, @@ -2785,6 +2882,9 @@ export type ArtifactDeleteParams = {}; export type ArtifactDeleteOptions = {}; export type ArtifactDeleteResult = void; +export interface ArtifactEvents { +} + // ----------- Stream ----------- export type StreamInitializer = {}; export interface StreamChannel extends Channel { @@ -2804,6 +2904,9 @@ export type StreamCloseParams = {}; export type StreamCloseOptions = {}; export type StreamCloseResult = void; +export interface StreamEvents { +} + // ----------- CDPSession ----------- export type CDPSessionInitializer = {}; export interface CDPSessionChannel extends Channel { @@ -2829,6 +2932,10 @@ export type CDPSessionDetachParams = {}; export type CDPSessionDetachOptions = {}; export type CDPSessionDetachResult = void; +export interface CDPSessionEvents { + 'event': CDPSessionEventEvent; +} + // ----------- Electron ----------- export type ElectronInitializer = {}; export interface ElectronChannel extends Channel { @@ -2910,6 +3017,9 @@ export type ElectronLaunchResult = { electronApplication: ElectronApplicationChannel, }; +export interface ElectronEvents { +} + // ----------- ElectronApplication ----------- export type ElectronApplicationInitializer = { context: BrowserContextChannel, @@ -2957,6 +3067,10 @@ export type ElectronApplicationCloseParams = {}; export type ElectronApplicationCloseOptions = {}; export type ElectronApplicationCloseResult = void; +export interface ElectronApplicationEvents { + 'close': ElectronApplicationCloseEvent; +} + // ----------- Android ----------- export type AndroidInitializer = {}; export interface AndroidChannel extends Channel { @@ -2976,6 +3090,9 @@ export type AndroidSetDefaultTimeoutNoReplyOptions = { }; export type AndroidSetDefaultTimeoutNoReplyResult = void; +export interface AndroidEvents { +} + // ----------- AndroidSocket ----------- export type AndroidSocketInitializer = {}; export interface AndroidSocketChannel extends Channel { @@ -2999,6 +3116,11 @@ export type AndroidSocketCloseParams = {}; export type AndroidSocketCloseOptions = {}; export type AndroidSocketCloseResult = void; +export interface AndroidSocketEvents { + 'data': AndroidSocketDataEvent; + 'close': AndroidSocketCloseEvent; +} + // ----------- AndroidDevice ----------- export type AndroidDeviceInitializer = { model: string, @@ -3346,6 +3468,11 @@ export type AndroidDeviceCloseParams = {}; export type AndroidDeviceCloseOptions = {}; export type AndroidDeviceCloseResult = void; +export interface AndroidDeviceEvents { + 'webViewAdded': AndroidDeviceWebViewAddedEvent; + 'webViewRemoved': AndroidDeviceWebViewRemovedEvent; +} + export type AndroidWebView = { pid: number, pkg: string, diff --git a/utils/generate_channels.js b/utils/generate_channels.js index 04c442fac2..057adc8530 100755 --- a/utils/generate_channels.js +++ b/utils/generate_channels.js @@ -15,6 +15,8 @@ * limitations under the License. */ +// @ts-check + const fs = require('fs'); const os = require('os'); const path = require('path'); @@ -210,6 +212,8 @@ for (const [name, item] of Object.entries(protocol)) { channels_ts.push(`export interface ${channelName}Channel extends ${(item.extends || '') + 'Channel'} {`); const ts_types = new Map(); + /** @type{{eventName: string, eventType: string}[]} */ + const eventTypes = []; for (let [eventName, event] of Object.entries(item.events || {})) { if (event === null) event = {}; @@ -217,6 +221,7 @@ for (const [name, item] of Object.entries(protocol)) { const paramsName = `${channelName}${titleCase(eventName)}Event`; ts_types.set(paramsName, parameters.ts); channels_ts.push(` on(event: '${eventName}', callback: (params: ${paramsName}) => void): this;`); + eventTypes.push({eventName, eventType: paramsName}); } for (let [methodName, method] of Object.entries(item.commands || {})) { @@ -249,6 +254,12 @@ for (const [name, item] of Object.entries(protocol)) { for (const [typeName, typeValue] of ts_types) channels_ts.push(`export type ${typeName} = ${typeValue};`); channels_ts.push(``); + + channels_ts.push(`export interface ${channelName}Events {`); + for (const {eventName, eventType} of eventTypes) + channels_ts.push(` '${eventName}': ${eventType};`); + channels_ts.push(`}\n`); + } else if (item.type === 'object') { const inner = objectType(item.properties, ''); channels_ts.push(`export type ${name} = ${inner.ts};`);