diff --git a/packages/playwright-core/src/client/channelOwner.ts b/packages/playwright-core/src/client/channelOwner.ts index 34c7ab7b04..c9399a3d0e 100644 --- a/packages/playwright-core/src/client/channelOwner.ts +++ b/packages/playwright-core/src/client/channelOwner.ts @@ -16,8 +16,7 @@ import { EventEmitter } from 'events'; import type * as channels from '../protocol/channels'; -import type { Validator } from '../protocol/validator'; -import { createScheme, ValidationError } from '../protocol/validator'; +import { maybeFindValidator, ValidationError, type ValidatorContext } from '../protocol/validator'; import { debugLogger } from '../common/debugLogger'; import type { ParsedStackTrace } from '../utils/stackTrace'; import { captureRawStack, captureStackTrace } from '../utils/stackTrace'; @@ -81,10 +80,8 @@ export abstract class ChannelOwner { - if (prop === 'debugScopeState') - return (params: any) => this._connection.sendMessageToServer(this, prop, params, null); if (typeof prop === 'string') { - const validator = scheme[paramsName(this._type, prop)]; + const validator = maybeFindValidator(this._type, prop, 'Params'); if (validator) { return (params: any) => { return this._wrapApiCall(apiZone => { @@ -92,7 +89,7 @@ export abstract class ChannelOwner { - return (arg: any, path: string) => { - if (arg._object instanceof ChannelOwner && (name === '*' || arg._object._type === name)) - return { guid: arg._object._guid }; - throw new ValidationError(`${path}: expected ${name}`); - }; -}; - -const scheme = createScheme(tChannel); +function tChannelImplToWire(names: '*' | string[], arg: any, path: string, context: ValidatorContext) { + if (arg._object instanceof ChannelOwner && (names === '*' || names.includes(arg._object._type))) + return { guid: arg._object._guid }; + throw new ValidationError(`${path}: expected channel ${names.toString()}`); +} type ApiZone = { stackTrace: ParsedStackTrace; diff --git a/packages/playwright-core/src/client/connection.ts b/packages/playwright-core/src/client/connection.ts index 50d62c4293..bf45cadda2 100644 --- a/packages/playwright-core/src/client/connection.ts +++ b/packages/playwright-core/src/client/connection.ts @@ -43,6 +43,7 @@ import { JsonPipe } from './jsonPipe'; import { APIRequestContext } from './fetch'; import { LocalUtils } from './localUtils'; import { Tracing } from './tracing'; +import { findValidator, ValidationError, type ValidatorContext } from '../protocol/validator'; class Root extends ChannelOwner { constructor(connection: Connection) { @@ -63,7 +64,7 @@ export class Connection extends EventEmitter { readonly _objects = new Map(); onmessage = (message: object): void => {}; private _lastId = 0; - private _callbacks = new Map void, reject: (a: Error) => void, stackTrace: ParsedStackTrace | null }>(); + private _callbacks = new Map void, reject: (a: Error) => void, stackTrace: ParsedStackTrace | null, type: string, method: string }>(); private _rootObject: Root; private _closedErrorMessage: string | undefined; private _isRemote = false; @@ -101,7 +102,7 @@ export class Connection extends EventEmitter { return this._objects.get(guid)!; } - async sendMessageToServer(object: ChannelOwner, method: string, params: any, stackTrace: ParsedStackTrace | null): Promise { + async sendMessageToServer(object: ChannelOwner, type: string, method: string, params: any, stackTrace: ParsedStackTrace | null): Promise { if (this._closedErrorMessage) throw new Error(this._closedErrorMessage); @@ -114,11 +115,7 @@ export class Connection extends EventEmitter { const metadata: channels.Metadata = { stack: frames, apiName, internal: !apiName }; this.onmessage({ ...converted, metadata }); - return await new Promise((resolve, reject) => this._callbacks.set(id, { resolve, reject, stackTrace })); - } - - _debugScopeState(): any { - return this._rootObject._debugScopeState(); + return await new Promise((resolve, reject) => this._callbacks.set(id, { resolve, reject, stackTrace, type, method })); } dispatch(message: object) { @@ -132,10 +129,12 @@ export class Connection extends EventEmitter { if (!callback) throw new Error(`Cannot find command to respond: ${id}`); this._callbacks.delete(id); - if (error && !result) + if (error && !result) { callback.reject(parseError(error)); - else - callback.resolve(this._replaceGuidsWithChannels(result)); + } else { + const validator = findValidator(callback.type, callback.method, 'Result'); + callback.resolve(validator(result, '', { tChannelImpl: this._tChannelImplFromWire.bind(this) })); + } return; } @@ -154,7 +153,8 @@ export class Connection extends EventEmitter { const object = this._objects.get(guid); if (!object) throw new Error(`Cannot find object to emit "${method}": ${guid}`); - (object._channel as any).emit(method, object._type === 'JsonPipe' ? params : this._replaceGuidsWithChannels(params)); + const validator = findValidator(object._type, method, 'Event'); + (object._channel as any).emit(method, validator(params, '', { tChannelImpl: this._tChannelImplFromWire.bind(this) })); } close(errorMessage: string = 'Connection closed') { @@ -165,20 +165,14 @@ export class Connection extends EventEmitter { this.emit('close'); } - private _replaceGuidsWithChannels(payload: any): any { - if (!payload) - return payload; - if (Array.isArray(payload)) - return payload.map(p => this._replaceGuidsWithChannels(p)); - if (payload.guid && this._objects.has(payload.guid)) - return this._objects.get(payload.guid)!._channel; - if (typeof payload === 'object') { - const result: any = {}; - for (const key of Object.keys(payload)) - result[key] = this._replaceGuidsWithChannels(payload[key]); - return result; + private _tChannelImplFromWire(names: '*' | string[], arg: any, path: string, context: ValidatorContext) { + if (arg && typeof arg === 'object' && typeof arg.guid === 'string' && this._objects.has(arg.guid)) { + const object = this._objects.get(arg.guid)!; + if (names !== '*' && !names.includes(object._type)) + throw new ValidationError(`${path}: expected channel ${names.toString()}`); + return object._channel; } - return payload; + throw new ValidationError(`${path}: expected channel ${names.toString()}`); } private _createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any): any { @@ -186,7 +180,8 @@ export class Connection extends EventEmitter { if (!parent) throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`); let result: ChannelOwner; - initializer = this._replaceGuidsWithChannels(initializer); + const validator = findValidator(type, '', 'Initializer'); + initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplFromWire.bind(this) }); switch (type) { case 'Android': result = new Android(parent, type, guid, initializer); diff --git a/packages/playwright-core/src/inProcessFactory.ts b/packages/playwright-core/src/inProcessFactory.ts index 2abf2e6fac..01ba2c2f6d 100644 --- a/packages/playwright-core/src/inProcessFactory.ts +++ b/packages/playwright-core/src/inProcessFactory.ts @@ -42,7 +42,7 @@ export function createInProcessPlaywright(): PlaywrightAPI { dispatcherConnection.onmessage = message => setImmediate(() => clientConnection.dispatch(message)); clientConnection.onmessage = message => setImmediate(() => dispatcherConnection.dispatch(message)); - clientConnection.toImpl = (x: any) => dispatcherConnection._dispatchers.get(x._guid)!._object; + clientConnection.toImpl = (x: any) => x ? dispatcherConnection._dispatchers.get(x._guid)!._object : dispatcherConnection._dispatchers.get(''); (playwrightAPI as any)._toImpl = clientConnection.toImpl; return playwrightAPI; } diff --git a/packages/playwright-core/src/protocol/protocol.yml b/packages/playwright-core/src/protocol/protocol.yml index 310b58a062..77cc6bb87a 100644 --- a/packages/playwright-core/src/protocol/protocol.yml +++ b/packages/playwright-core/src/protocol/protocol.yml @@ -289,7 +289,7 @@ APIRequestContext: parameters: fetchUid: string returns: - binary?: binary + binary: binary? fetchLog: parameters: diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index c817833fe1..4ae6a8e805 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -16,600 +16,855 @@ // This file is generated by generate_channels.js, do not edit manually. -import type { Validator } from './validatorPrimitives'; -import { ValidationError, tOptional, tObject, tBoolean, tNumber, tString, tAny, tEnum, tArray, tBinary } from './validatorPrimitives'; -export type { Validator } from './validatorPrimitives'; -export { ValidationError } from './validatorPrimitives'; +import { scheme, tOptional, tObject, tBoolean, tNumber, tString, tAny, tEnum, tArray, tBinary, tChannel, tType } from './validatorPrimitives'; +export type { Validator, ValidatorContext } from './validatorPrimitives'; +export { ValidationError, findValidator, maybeFindValidator, createMetadataValidator } from './validatorPrimitives'; -type Scheme = { [key: string]: Validator }; - -export function createScheme(tChannel: (name: string) => Validator): Scheme { - const scheme: Scheme = {}; - - const tType = (name: string): Validator => { - return (arg: any, path: string) => { - const v = scheme[name]; - if (!v) - throw new ValidationError(path + ': unknown type "' + name + '"'); - return v(arg, path); - }; - }; - - scheme.StackFrame = tObject({ - file: tString, - line: tOptional(tNumber), - column: tOptional(tNumber), - function: tOptional(tString), - }); - scheme.Metadata = tObject({ - stack: tOptional(tArray(tType('StackFrame'))), - apiName: tOptional(tString), - internal: tOptional(tBoolean), - }); - scheme.Point = tObject({ - x: tNumber, - y: tNumber, - }); - scheme.Rect = tObject({ - x: tNumber, - y: tNumber, +scheme.StackFrame = tObject({ + file: tString, + line: tOptional(tNumber), + column: tOptional(tNumber), + function: tOptional(tString), +}); +scheme.Metadata = tObject({ + stack: tOptional(tArray(tType('StackFrame'))), + apiName: tOptional(tString), + internal: tOptional(tBoolean), +}); +scheme.Point = tObject({ + x: tNumber, + y: tNumber, +}); +scheme.Rect = tObject({ + x: tNumber, + y: tNumber, + width: tNumber, + height: tNumber, +}); +scheme.SerializedValue = tObject({ + n: tOptional(tNumber), + b: tOptional(tBoolean), + s: tOptional(tString), + v: tOptional(tEnum(['null', 'undefined', 'NaN', 'Infinity', '-Infinity', '-0'])), + d: tOptional(tString), + r: tOptional(tObject({ + p: tString, + f: tString, + })), + a: tOptional(tArray(tType('SerializedValue'))), + o: tOptional(tArray(tObject({ + k: tString, + v: tType('SerializedValue'), + }))), + h: tOptional(tNumber), + id: tOptional(tNumber), + ref: tOptional(tNumber), +}); +scheme.SerializedArgument = tObject({ + value: tType('SerializedValue'), + handles: tArray(tChannel('*')), +}); +scheme.ExpectedTextValue = tObject({ + string: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + matchSubstring: tOptional(tBoolean), + ignoreCase: tOptional(tBoolean), + normalizeWhiteSpace: tOptional(tBoolean), +}); +scheme.AXNode = tObject({ + role: tString, + name: tString, + valueString: tOptional(tString), + valueNumber: tOptional(tNumber), + description: tOptional(tString), + keyshortcuts: tOptional(tString), + roledescription: tOptional(tString), + valuetext: tOptional(tString), + disabled: tOptional(tBoolean), + expanded: tOptional(tBoolean), + focused: tOptional(tBoolean), + modal: tOptional(tBoolean), + multiline: tOptional(tBoolean), + multiselectable: tOptional(tBoolean), + readonly: tOptional(tBoolean), + required: tOptional(tBoolean), + selected: tOptional(tBoolean), + checked: tOptional(tEnum(['checked', 'unchecked', 'mixed'])), + pressed: tOptional(tEnum(['pressed', 'released', 'mixed'])), + level: tOptional(tNumber), + valuemin: tOptional(tNumber), + valuemax: tOptional(tNumber), + autocomplete: tOptional(tString), + haspopup: tOptional(tString), + invalid: tOptional(tString), + orientation: tOptional(tString), + children: tOptional(tArray(tType('AXNode'))), +}); +scheme.SetNetworkCookie = tObject({ + name: tString, + value: tString, + url: tOptional(tString), + domain: tOptional(tString), + path: tOptional(tString), + expires: tOptional(tNumber), + httpOnly: tOptional(tBoolean), + secure: tOptional(tBoolean), + sameSite: tOptional(tEnum(['Strict', 'Lax', 'None'])), +}); +scheme.NetworkCookie = tObject({ + name: tString, + value: tString, + domain: tString, + path: tString, + expires: tNumber, + httpOnly: tBoolean, + secure: tBoolean, + sameSite: tEnum(['Strict', 'Lax', 'None']), +}); +scheme.NameValue = tObject({ + name: tString, + value: tString, +}); +scheme.OriginStorage = tObject({ + origin: tString, + localStorage: tArray(tType('NameValue')), +}); +scheme.SerializedError = tObject({ + error: tOptional(tObject({ + message: tString, + name: tString, + stack: tOptional(tString), + })), + value: tOptional(tType('SerializedValue')), +}); +scheme.RecordHarOptions = tObject({ + path: tString, + content: tOptional(tEnum(['embed', 'attach', 'omit'])), + mode: tOptional(tEnum(['full', 'minimal'])), + urlGlob: tOptional(tString), + urlRegexSource: tOptional(tString), + urlRegexFlags: tOptional(tString), +}); +scheme.FormField = tObject({ + name: tString, + value: tOptional(tString), + file: tOptional(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary, + })), +}); +scheme.APIRequestContextInitializer = tObject({ + tracing: tChannel(['Tracing']), +}); +scheme.APIRequestContextFetchParams = tObject({ + url: tString, + params: tOptional(tArray(tType('NameValue'))), + method: tOptional(tString), + headers: tOptional(tArray(tType('NameValue'))), + postData: tOptional(tBinary), + jsonData: tOptional(tAny), + formData: tOptional(tArray(tType('NameValue'))), + multipartData: tOptional(tArray(tType('FormField'))), + timeout: tOptional(tNumber), + failOnStatusCode: tOptional(tBoolean), + ignoreHTTPSErrors: tOptional(tBoolean), +}); +scheme.APIRequestContextFetchResult = tObject({ + response: tType('APIResponse'), +}); +scheme.APIRequestContextFetchResponseBodyParams = tObject({ + fetchUid: tString, +}); +scheme.APIRequestContextFetchResponseBodyResult = tObject({ + binary: tOptional(tBinary), +}); +scheme.APIRequestContextFetchLogParams = tObject({ + fetchUid: tString, +}); +scheme.APIRequestContextFetchLogResult = tObject({ + log: tArray(tString), +}); +scheme.APIRequestContextStorageStateParams = tOptional(tObject({})); +scheme.APIRequestContextStorageStateResult = tObject({ + cookies: tArray(tType('NetworkCookie')), + origins: tArray(tType('OriginStorage')), +}); +scheme.APIRequestContextDisposeAPIResponseParams = tObject({ + fetchUid: tString, +}); +scheme.APIRequestContextDisposeAPIResponseResult = tOptional(tObject({})); +scheme.APIRequestContextDisposeParams = tOptional(tObject({})); +scheme.APIRequestContextDisposeResult = tOptional(tObject({})); +scheme.APIResponse = tObject({ + fetchUid: tString, + url: tString, + status: tNumber, + statusText: tString, + headers: tArray(tType('NameValue')), +}); +scheme.LifecycleEvent = tEnum(['load', 'domcontentloaded', 'networkidle', 'commit']); +scheme.LocalUtilsInitializer = tOptional(tObject({})); +scheme.LocalUtilsZipParams = tObject({ + zipFile: tString, + entries: tArray(tType('NameValue')), +}); +scheme.LocalUtilsZipResult = tOptional(tObject({})); +scheme.LocalUtilsHarOpenParams = tObject({ + file: tString, +}); +scheme.LocalUtilsHarOpenResult = tObject({ + harId: tOptional(tString), + error: tOptional(tString), +}); +scheme.LocalUtilsHarLookupParams = tObject({ + harId: tString, + url: tString, + method: tString, + headers: tArray(tType('NameValue')), + postData: tOptional(tString), + isNavigationRequest: tBoolean, +}); +scheme.LocalUtilsHarLookupResult = tObject({ + action: tEnum(['error', 'redirect', 'fulfill', 'noentry']), + message: tOptional(tString), + redirectURL: tOptional(tString), + status: tOptional(tNumber), + headers: tOptional(tArray(tType('NameValue'))), + body: tOptional(tString), +}); +scheme.LocalUtilsHarCloseParams = tObject({ + harId: tString, +}); +scheme.LocalUtilsHarCloseResult = tOptional(tObject({})); +scheme.LocalUtilsHarUnzipParams = tObject({ + zipFile: tString, + harFile: tString, +}); +scheme.LocalUtilsHarUnzipResult = tOptional(tObject({})); +scheme.RootInitializer = tOptional(tObject({})); +scheme.RootInitializeParams = tObject({ + sdkLanguage: tString, +}); +scheme.RootInitializeResult = tObject({ + playwright: tChannel(['Playwright']), +}); +scheme.PlaywrightInitializer = tObject({ + chromium: tChannel(['BrowserType']), + firefox: tChannel(['BrowserType']), + webkit: tChannel(['BrowserType']), + android: tChannel(['Android']), + electron: tChannel(['Electron']), + utils: tChannel(['LocalUtils']), + deviceDescriptors: tArray(tObject({ + name: tString, + descriptor: tObject({ + userAgent: tString, + viewport: tObject({ + width: tNumber, + height: tNumber, + }), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + deviceScaleFactor: tNumber, + isMobile: tBoolean, + hasTouch: tBoolean, + defaultBrowserType: tEnum(['chromium', 'firefox', 'webkit']), + }), + })), + selectors: tChannel(['Selectors']), + preLaunchedBrowser: tOptional(tChannel(['Browser'])), + socksSupport: tOptional(tChannel(['SocksSupport'])), +}); +scheme.PlaywrightNewRequestParams = tObject({ + baseURL: tOptional(tString), + userAgent: tOptional(tString), + ignoreHTTPSErrors: tOptional(tBoolean), + extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + })), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString), + })), + timeout: tOptional(tNumber), + storageState: tOptional(tObject({ + cookies: tArray(tType('NetworkCookie')), + origins: tArray(tType('OriginStorage')), + })), + tracesDir: tOptional(tString), +}); +scheme.PlaywrightNewRequestResult = tObject({ + request: tChannel(['APIRequestContext']), +}); +scheme.PlaywrightHideHighlightParams = tOptional(tObject({})); +scheme.PlaywrightHideHighlightResult = tOptional(tObject({})); +scheme.SocksSupportInitializer = tOptional(tObject({})); +scheme.SocksSupportSocksRequestedEvent = tObject({ + uid: tString, + host: tString, + port: tNumber, +}); +scheme.SocksSupportSocksDataEvent = tObject({ + uid: tString, + data: tBinary, +}); +scheme.SocksSupportSocksClosedEvent = tObject({ + uid: tString, +}); +scheme.SocksSupportSocksConnectedParams = tObject({ + uid: tString, + host: tString, + port: tNumber, +}); +scheme.SocksSupportSocksConnectedResult = tOptional(tObject({})); +scheme.SocksSupportSocksFailedParams = tObject({ + uid: tString, + errorCode: tString, +}); +scheme.SocksSupportSocksFailedResult = tOptional(tObject({})); +scheme.SocksSupportSocksDataParams = tObject({ + uid: tString, + data: tBinary, +}); +scheme.SocksSupportSocksDataResult = tOptional(tObject({})); +scheme.SocksSupportSocksErrorParams = tObject({ + uid: tString, + error: tString, +}); +scheme.SocksSupportSocksErrorResult = tOptional(tObject({})); +scheme.SocksSupportSocksEndParams = tObject({ + uid: tString, +}); +scheme.SocksSupportSocksEndResult = tOptional(tObject({})); +scheme.SelectorsInitializer = tOptional(tObject({})); +scheme.SelectorsRegisterParams = tObject({ + name: tString, + source: tString, + contentScript: tOptional(tBoolean), +}); +scheme.SelectorsRegisterResult = tOptional(tObject({})); +scheme.BrowserTypeInitializer = tObject({ + executablePath: tString, + name: tString, +}); +scheme.BrowserTypeConnectParams = tObject({ + wsEndpoint: tString, + headers: tOptional(tAny), + slowMo: tOptional(tNumber), + timeout: tOptional(tNumber), + socksProxyRedirectPortForTest: tOptional(tNumber), +}); +scheme.BrowserTypeConnectResult = tObject({ + pipe: tChannel(['JsonPipe']), +}); +scheme.BrowserTypeLaunchParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + timeout: tOptional(tNumber), + env: tOptional(tArray(tType('NameValue'))), + headless: tOptional(tBoolean), + devtools: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString), + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + firefoxUserPrefs: tOptional(tAny), + slowMo: tOptional(tNumber), +}); +scheme.BrowserTypeLaunchResult = tObject({ + browser: tChannel(['Browser']), +}); +scheme.BrowserTypeLaunchPersistentContextParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + timeout: tOptional(tNumber), + env: tOptional(tArray(tType('NameValue'))), + headless: tOptional(tBoolean), + devtools: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString), + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ width: tNumber, height: tNumber, - }); - scheme.SerializedValue = tObject({ - n: tOptional(tNumber), - b: tOptional(tBoolean), - s: tOptional(tString), - v: tOptional(tEnum(['null', 'undefined', 'NaN', 'Infinity', '-Infinity', '-0'])), - d: tOptional(tString), - r: tOptional(tObject({ - p: tString, - f: tString, - })), - a: tOptional(tArray(tType('SerializedValue'))), - o: tOptional(tArray(tObject({ - k: tString, - v: tType('SerializedValue'), - }))), - h: tOptional(tNumber), - id: tOptional(tNumber), - ref: tOptional(tNumber), - }); - scheme.SerializedArgument = tObject({ - value: tType('SerializedValue'), - handles: tArray(tChannel('*')), - }); - scheme.ExpectedTextValue = tObject({ - string: tOptional(tString), - regexSource: tOptional(tString), - regexFlags: tOptional(tString), - matchSubstring: tOptional(tBoolean), - ignoreCase: tOptional(tBoolean), - normalizeWhiteSpace: tOptional(tBoolean), - }); - scheme.AXNode = tObject({ - role: tString, - name: tString, - valueString: tOptional(tString), - valueNumber: tOptional(tNumber), - description: tOptional(tString), - keyshortcuts: tOptional(tString), - roledescription: tOptional(tString), - valuetext: tOptional(tString), - disabled: tOptional(tBoolean), - expanded: tOptional(tBoolean), - focused: tOptional(tBoolean), - modal: tOptional(tBoolean), - multiline: tOptional(tBoolean), - multiselectable: tOptional(tBoolean), - readonly: tOptional(tBoolean), - required: tOptional(tBoolean), - selected: tOptional(tBoolean), - checked: tOptional(tEnum(['checked', 'unchecked', 'mixed'])), - pressed: tOptional(tEnum(['pressed', 'released', 'mixed'])), - level: tOptional(tNumber), - valuemin: tOptional(tNumber), - valuemax: tOptional(tNumber), - autocomplete: tOptional(tString), - haspopup: tOptional(tString), - invalid: tOptional(tString), - orientation: tOptional(tString), - children: tOptional(tArray(tType('AXNode'))), - }); - scheme.SetNetworkCookie = tObject({ - name: tString, - value: tString, - url: tOptional(tString), - domain: tOptional(tString), - path: tOptional(tString), - expires: tOptional(tNumber), - httpOnly: tOptional(tBoolean), - secure: tOptional(tBoolean), - sameSite: tOptional(tEnum(['Strict', 'Lax', 'None'])), - }); - scheme.NetworkCookie = tObject({ - name: tString, - value: tString, - domain: tString, - path: tString, - expires: tNumber, - httpOnly: tBoolean, - secure: tBoolean, - sameSite: tEnum(['Strict', 'Lax', 'None']), - }); - scheme.NameValue = tObject({ - name: tString, - value: tString, - }); - scheme.OriginStorage = tObject({ - origin: tString, - localStorage: tArray(tType('NameValue')), - }); - scheme.SerializedError = tObject({ - error: tOptional(tObject({ - message: tString, - name: tString, - stack: tOptional(tString), - })), - value: tOptional(tType('SerializedValue')), - }); - scheme.RecordHarOptions = tObject({ - path: tString, - content: tOptional(tEnum(['embed', 'attach', 'omit'])), - mode: tOptional(tEnum(['full', 'minimal'])), - urlGlob: tOptional(tString), - urlRegexSource: tOptional(tString), - urlRegexFlags: tOptional(tString), - }); - scheme.FormField = tObject({ - name: tString, - value: tOptional(tString), - file: tOptional(tObject({ - name: tString, - mimeType: tOptional(tString), - buffer: tBinary, - })), - }); - scheme.APIRequestContextFetchParams = tObject({ - url: tString, - params: tOptional(tArray(tType('NameValue'))), - method: tOptional(tString), - headers: tOptional(tArray(tType('NameValue'))), - postData: tOptional(tBinary), - jsonData: tOptional(tAny), - formData: tOptional(tArray(tType('NameValue'))), - multipartData: tOptional(tArray(tType('FormField'))), - timeout: tOptional(tNumber), - failOnStatusCode: tOptional(tBoolean), - ignoreHTTPSErrors: tOptional(tBoolean), - }); - scheme.APIRequestContextFetchResponseBodyParams = tObject({ - fetchUid: tString, - }); - scheme.APIRequestContextFetchLogParams = tObject({ - fetchUid: tString, - }); - scheme.APIRequestContextStorageStateParams = tOptional(tObject({})); - scheme.APIRequestContextDisposeAPIResponseParams = tObject({ - fetchUid: tString, - }); - scheme.APIRequestContextDisposeParams = tOptional(tObject({})); - scheme.APIResponse = tObject({ - fetchUid: tString, - url: tString, - status: tNumber, - statusText: tString, - headers: tArray(tType('NameValue')), - }); - scheme.LifecycleEvent = tEnum(['load', 'domcontentloaded', 'networkidle', 'commit']); - scheme.LocalUtilsZipParams = tObject({ - zipFile: tString, - entries: tArray(tType('NameValue')), - }); - scheme.LocalUtilsHarOpenParams = tObject({ - file: tString, - }); - scheme.LocalUtilsHarLookupParams = tObject({ - harId: tString, - url: tString, - method: tString, - headers: tArray(tType('NameValue')), - postData: tOptional(tString), - isNavigationRequest: tBoolean, - }); - scheme.LocalUtilsHarCloseParams = tObject({ - harId: tString, - }); - scheme.LocalUtilsHarUnzipParams = tObject({ - zipFile: tString, - harFile: tString, - }); - scheme.RootInitializeParams = tObject({ - sdkLanguage: tString, - }); - scheme.PlaywrightNewRequestParams = tObject({ - baseURL: tOptional(tString), - userAgent: tOptional(tString), - ignoreHTTPSErrors: tOptional(tBoolean), - extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), - httpCredentials: tOptional(tObject({ - username: tString, - password: tString, - })), - proxy: tOptional(tObject({ - server: tString, - bypass: tOptional(tString), - username: tOptional(tString), - password: tOptional(tString), - })), - timeout: tOptional(tNumber), - storageState: tOptional(tObject({ - cookies: tArray(tType('NetworkCookie')), - origins: tArray(tType('OriginStorage')), - })), - tracesDir: tOptional(tString), - }); - scheme.PlaywrightHideHighlightParams = tOptional(tObject({})); - scheme.SocksSupportSocksConnectedParams = tObject({ - uid: tString, - host: tString, - port: tNumber, - }); - scheme.SocksSupportSocksFailedParams = tObject({ - uid: tString, - errorCode: tString, - }); - scheme.SocksSupportSocksDataParams = tObject({ - uid: tString, - data: tBinary, - }); - scheme.SocksSupportSocksErrorParams = tObject({ - uid: tString, - error: tString, - }); - scheme.SocksSupportSocksEndParams = tObject({ - uid: tString, - }); - scheme.SelectorsRegisterParams = tObject({ - name: tString, - source: tString, - contentScript: tOptional(tBoolean), - }); - scheme.BrowserTypeConnectParams = tObject({ - wsEndpoint: tString, - headers: tOptional(tAny), - slowMo: tOptional(tNumber), - timeout: tOptional(tNumber), - socksProxyRedirectPortForTest: tOptional(tNumber), - }); - scheme.BrowserTypeLaunchParams = tObject({ - channel: tOptional(tString), - executablePath: tOptional(tString), - args: tOptional(tArray(tString)), - ignoreAllDefaultArgs: tOptional(tBoolean), - ignoreDefaultArgs: tOptional(tArray(tString)), - handleSIGINT: tOptional(tBoolean), - handleSIGTERM: tOptional(tBoolean), - handleSIGHUP: tOptional(tBoolean), - timeout: tOptional(tNumber), - env: tOptional(tArray(tType('NameValue'))), - headless: tOptional(tBoolean), - devtools: tOptional(tBoolean), - proxy: tOptional(tObject({ - server: tString, - bypass: tOptional(tString), - username: tOptional(tString), - password: tOptional(tString), - })), - downloadsPath: tOptional(tString), - tracesDir: tOptional(tString), - chromiumSandbox: tOptional(tBoolean), - firefoxUserPrefs: tOptional(tAny), - slowMo: tOptional(tNumber), - }); - scheme.BrowserTypeLaunchPersistentContextParams = tObject({ - channel: tOptional(tString), - executablePath: tOptional(tString), - args: tOptional(tArray(tString)), - ignoreAllDefaultArgs: tOptional(tBoolean), - ignoreDefaultArgs: tOptional(tArray(tString)), - handleSIGINT: tOptional(tBoolean), - handleSIGTERM: tOptional(tBoolean), - handleSIGHUP: tOptional(tBoolean), - timeout: tOptional(tNumber), - env: tOptional(tArray(tType('NameValue'))), - headless: tOptional(tBoolean), - devtools: tOptional(tBoolean), - proxy: tOptional(tObject({ - server: tString, - bypass: tOptional(tString), - username: tOptional(tString), - password: tOptional(tString), - })), - downloadsPath: tOptional(tString), - tracesDir: tOptional(tString), - chromiumSandbox: tOptional(tBoolean), - noDefaultViewport: tOptional(tBoolean), - viewport: tOptional(tObject({ + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + ignoreHTTPSErrors: tOptional(tBoolean), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber), + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), + reducedMotion: tOptional(tEnum(['reduce', 'no-preference'])), + forcedColors: tOptional(tEnum(['active', 'none'])), + acceptDownloads: tOptional(tBoolean), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ width: tNumber, height: tNumber, })), - screen: tOptional(tObject({ + })), + recordHar: tOptional(tType('RecordHarOptions')), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(['allow', 'block'])), + userDataDir: tString, + slowMo: tOptional(tNumber), +}); +scheme.BrowserTypeLaunchPersistentContextResult = tObject({ + context: tChannel(['BrowserContext']), +}); +scheme.BrowserTypeConnectOverCDPParams = tObject({ + endpointURL: tString, + headers: tOptional(tArray(tType('NameValue'))), + slowMo: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.BrowserTypeConnectOverCDPResult = tObject({ + browser: tChannel(['Browser']), + defaultContext: tOptional(tChannel(['BrowserContext'])), +}); +scheme.BrowserInitializer = tObject({ + version: tString, + name: tString, +}); +scheme.BrowserCloseEvent = tOptional(tObject({})); +scheme.BrowserCloseParams = tOptional(tObject({})); +scheme.BrowserCloseResult = tOptional(tObject({})); +scheme.BrowserKillForTestsParams = tOptional(tObject({})); +scheme.BrowserKillForTestsResult = tOptional(tObject({})); +scheme.BrowserNewContextParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + ignoreHTTPSErrors: tOptional(tBoolean), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber), + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), + reducedMotion: tOptional(tEnum(['reduce', 'no-preference'])), + forcedColors: tOptional(tEnum(['active', 'none'])), + acceptDownloads: tOptional(tBoolean), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ width: tNumber, height: tNumber, })), - ignoreHTTPSErrors: tOptional(tBoolean), - javaScriptEnabled: tOptional(tBoolean), - bypassCSP: tOptional(tBoolean), - userAgent: tOptional(tString), - locale: tOptional(tString), - timezoneId: tOptional(tString), - geolocation: tOptional(tObject({ - longitude: tNumber, - latitude: tNumber, - accuracy: tOptional(tNumber), - })), - permissions: tOptional(tArray(tString)), - extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), - offline: tOptional(tBoolean), - httpCredentials: tOptional(tObject({ - username: tString, - password: tString, - })), - deviceScaleFactor: tOptional(tNumber), - isMobile: tOptional(tBoolean), - hasTouch: tOptional(tBoolean), - colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), - reducedMotion: tOptional(tEnum(['reduce', 'no-preference'])), - forcedColors: tOptional(tEnum(['active', 'none'])), - acceptDownloads: tOptional(tBoolean), - baseURL: tOptional(tString), - recordVideo: tOptional(tObject({ - dir: tString, - size: tOptional(tObject({ - width: tNumber, - height: tNumber, - })), - })), - recordHar: tOptional(tType('RecordHarOptions')), - strictSelectors: tOptional(tBoolean), - serviceWorkers: tOptional(tEnum(['allow', 'block'])), - userDataDir: tString, - slowMo: tOptional(tNumber), - }); - scheme.BrowserTypeConnectOverCDPParams = tObject({ - endpointURL: tString, - headers: tOptional(tArray(tType('NameValue'))), - slowMo: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.BrowserCloseParams = tOptional(tObject({})); - scheme.BrowserKillForTestsParams = tOptional(tObject({})); - scheme.BrowserNewContextParams = tObject({ - noDefaultViewport: tOptional(tBoolean), - viewport: tOptional(tObject({ - width: tNumber, - height: tNumber, - })), - screen: tOptional(tObject({ - width: tNumber, - height: tNumber, - })), - ignoreHTTPSErrors: tOptional(tBoolean), - javaScriptEnabled: tOptional(tBoolean), - bypassCSP: tOptional(tBoolean), - userAgent: tOptional(tString), - locale: tOptional(tString), - timezoneId: tOptional(tString), - geolocation: tOptional(tObject({ - longitude: tNumber, - latitude: tNumber, - accuracy: tOptional(tNumber), - })), - permissions: tOptional(tArray(tString)), - extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), - offline: tOptional(tBoolean), - httpCredentials: tOptional(tObject({ - username: tString, - password: tString, - })), - deviceScaleFactor: tOptional(tNumber), - isMobile: tOptional(tBoolean), - hasTouch: tOptional(tBoolean), - colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), - reducedMotion: tOptional(tEnum(['reduce', 'no-preference'])), - forcedColors: tOptional(tEnum(['active', 'none'])), - acceptDownloads: tOptional(tBoolean), - baseURL: tOptional(tString), - recordVideo: tOptional(tObject({ - dir: tString, - size: tOptional(tObject({ - width: tNumber, - height: tNumber, - })), - })), - recordHar: tOptional(tType('RecordHarOptions')), - strictSelectors: tOptional(tBoolean), - serviceWorkers: tOptional(tEnum(['allow', 'block'])), - proxy: tOptional(tObject({ - server: tString, - bypass: tOptional(tString), - username: tOptional(tString), - password: tOptional(tString), - })), - storageState: tOptional(tObject({ - cookies: tOptional(tArray(tType('SetNetworkCookie'))), - origins: tOptional(tArray(tType('OriginStorage'))), - })), - }); - scheme.BrowserNewBrowserCDPSessionParams = tOptional(tObject({})); - scheme.BrowserStartTracingParams = tObject({ - page: tOptional(tChannel('Page')), - path: tOptional(tString), - screenshots: tOptional(tBoolean), - categories: tOptional(tArray(tString)), - }); - scheme.BrowserStopTracingParams = tOptional(tObject({})); - scheme.EventTargetWaitForEventInfoParams = tObject({ - info: tObject({ - waitId: tString, - phase: tEnum(['before', 'after', 'log']), - event: tOptional(tString), - message: tOptional(tString), - error: tOptional(tString), - }), - }); - scheme.BrowserContextWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); - scheme.PageWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); - scheme.WebSocketWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); - scheme.ElectronApplicationWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); - scheme.AndroidDeviceWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); - scheme.BrowserContextAddCookiesParams = tObject({ - cookies: tArray(tType('SetNetworkCookie')), - }); - scheme.BrowserContextAddInitScriptParams = tObject({ - source: tString, - }); - scheme.BrowserContextRemoveInitScriptsParams = tOptional(tObject({})); - scheme.BrowserContextClearCookiesParams = tOptional(tObject({})); - scheme.BrowserContextClearPermissionsParams = tOptional(tObject({})); - scheme.BrowserContextCloseParams = tOptional(tObject({})); - scheme.BrowserContextCookiesParams = tObject({ - urls: tArray(tString), - }); - scheme.BrowserContextExposeBindingParams = tObject({ - name: tString, - needsHandle: tOptional(tBoolean), - }); - scheme.BrowserContextRemoveExposedBindingsParams = tOptional(tObject({})); - scheme.BrowserContextGrantPermissionsParams = tObject({ - permissions: tArray(tString), - origin: tOptional(tString), - }); - scheme.BrowserContextNewPageParams = tOptional(tObject({})); - scheme.BrowserContextSetDefaultNavigationTimeoutNoReplyParams = tObject({ - timeout: tOptional(tNumber), - }); - scheme.BrowserContextSetDefaultTimeoutNoReplyParams = tObject({ - timeout: tOptional(tNumber), - }); - scheme.BrowserContextSetExtraHTTPHeadersParams = tObject({ - headers: tArray(tType('NameValue')), - }); - scheme.BrowserContextSetGeolocationParams = tObject({ - geolocation: tOptional(tObject({ - longitude: tNumber, - latitude: tNumber, - accuracy: tOptional(tNumber), - })), - }); - scheme.BrowserContextSetHTTPCredentialsParams = tObject({ - httpCredentials: tOptional(tObject({ - username: tString, - password: tString, - })), - }); - scheme.BrowserContextSetNetworkInterceptionEnabledParams = tObject({ - enabled: tBoolean, - }); - scheme.BrowserContextSetOfflineParams = tObject({ - offline: tBoolean, - }); - scheme.BrowserContextStorageStateParams = tOptional(tObject({})); - scheme.BrowserContextPauseParams = tOptional(tObject({})); - scheme.BrowserContextRecorderSupplementEnableParams = tObject({ - language: tOptional(tString), - startRecording: tOptional(tBoolean), - pauseOnNextStatement: tOptional(tBoolean), - launchOptions: tOptional(tAny), - contextOptions: tOptional(tAny), - device: tOptional(tString), - saveStorage: tOptional(tString), - outputFile: tOptional(tString), - }); - scheme.BrowserContextNewCDPSessionParams = tObject({ - page: tOptional(tChannel('Page')), - frame: tOptional(tChannel('Frame')), - }); - scheme.BrowserContextHarStartParams = tObject({ - page: tOptional(tChannel('Page')), - options: tType('RecordHarOptions'), - }); - scheme.BrowserContextHarExportParams = tObject({ - harId: tOptional(tString), - }); - scheme.BrowserContextCreateTempFileParams = tObject({ - name: tString, - }); - scheme.PageSetDefaultNavigationTimeoutNoReplyParams = tObject({ - timeout: tOptional(tNumber), - }); - scheme.PageSetDefaultTimeoutNoReplyParams = tObject({ - timeout: tOptional(tNumber), - }); - scheme.PageSetFileChooserInterceptedNoReplyParams = tObject({ - intercepted: tBoolean, - }); - scheme.PageAddInitScriptParams = tObject({ - source: tString, - }); - scheme.PageRemoveInitScriptsParams = tOptional(tObject({})); - scheme.PageCloseParams = tObject({ - runBeforeUnload: tOptional(tBoolean), - }); - scheme.PageEmulateMediaParams = tObject({ - media: tOptional(tEnum(['screen', 'print', 'null'])), - colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference', 'null'])), - reducedMotion: tOptional(tEnum(['reduce', 'no-preference', 'null'])), - forcedColors: tOptional(tEnum(['active', 'none', 'null'])), - }); - scheme.PageExposeBindingParams = tObject({ - name: tString, - needsHandle: tOptional(tBoolean), - }); - scheme.PageRemoveExposedBindingsParams = tOptional(tObject({})); - scheme.PageGoBackParams = tObject({ - timeout: tOptional(tNumber), - waitUntil: tOptional(tType('LifecycleEvent')), - }); - scheme.PageGoForwardParams = tObject({ - timeout: tOptional(tNumber), - waitUntil: tOptional(tType('LifecycleEvent')), - }); - scheme.PageReloadParams = tObject({ - timeout: tOptional(tNumber), - waitUntil: tOptional(tType('LifecycleEvent')), - }); - scheme.PageExpectScreenshotParams = tObject({ - expected: tOptional(tBinary), - timeout: tOptional(tNumber), - isNot: tBoolean, - locator: tOptional(tObject({ - frame: tChannel('Frame'), - selector: tString, - })), - comparatorOptions: tOptional(tObject({ - maxDiffPixels: tOptional(tNumber), - maxDiffPixelRatio: tOptional(tNumber), - threshold: tOptional(tNumber), - })), - screenshotOptions: tOptional(tObject({ - fullPage: tOptional(tBoolean), - clip: tOptional(tType('Rect')), - omitBackground: tOptional(tBoolean), - caret: tOptional(tEnum(['hide', 'initial'])), - animations: tOptional(tEnum(['disabled', 'allow'])), - scale: tOptional(tEnum(['css', 'device'])), - mask: tOptional(tArray(tObject({ - frame: tChannel('Frame'), - selector: tString, - }))), - })), - }); - scheme.PageScreenshotParams = tObject({ - timeout: tOptional(tNumber), - type: tOptional(tEnum(['png', 'jpeg'])), - quality: tOptional(tNumber), + })), + recordHar: tOptional(tType('RecordHarOptions')), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(['allow', 'block'])), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString), + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType('SetNetworkCookie'))), + origins: tOptional(tArray(tType('OriginStorage'))), + })), +}); +scheme.BrowserNewContextResult = tObject({ + context: tChannel(['BrowserContext']), +}); +scheme.BrowserNewBrowserCDPSessionParams = tOptional(tObject({})); +scheme.BrowserNewBrowserCDPSessionResult = tObject({ + session: tChannel(['CDPSession']), +}); +scheme.BrowserStartTracingParams = tObject({ + page: tOptional(tChannel(['Page'])), + path: tOptional(tString), + screenshots: tOptional(tBoolean), + categories: tOptional(tArray(tString)), +}); +scheme.BrowserStartTracingResult = tOptional(tObject({})); +scheme.BrowserStopTracingParams = tOptional(tObject({})); +scheme.BrowserStopTracingResult = tObject({ + binary: tBinary, +}); +scheme.EventTargetInitializer = tOptional(tObject({})); +scheme.EventTargetWaitForEventInfoParams = tObject({ + info: tObject({ + waitId: tString, + phase: tEnum(['before', 'after', 'log']), + event: tOptional(tString), + message: tOptional(tString), + error: tOptional(tString), + }), +}); +scheme.BrowserContextWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); +scheme.PageWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); +scheme.WebSocketWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); +scheme.ElectronApplicationWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); +scheme.AndroidDeviceWaitForEventInfoParams = tType('EventTargetWaitForEventInfoParams'); +scheme.EventTargetWaitForEventInfoResult = tOptional(tObject({})); +scheme.BrowserContextWaitForEventInfoResult = tType('EventTargetWaitForEventInfoResult'); +scheme.PageWaitForEventInfoResult = tType('EventTargetWaitForEventInfoResult'); +scheme.WebSocketWaitForEventInfoResult = tType('EventTargetWaitForEventInfoResult'); +scheme.ElectronApplicationWaitForEventInfoResult = tType('EventTargetWaitForEventInfoResult'); +scheme.AndroidDeviceWaitForEventInfoResult = tType('EventTargetWaitForEventInfoResult'); +scheme.BrowserContextInitializer = tObject({ + isChromium: tBoolean, + APIRequestContext: tChannel(['APIRequestContext']), + tracing: tChannel(['Tracing']), +}); +scheme.BrowserContextBindingCallEvent = tObject({ + binding: tChannel(['BindingCall']), +}); +scheme.BrowserContextCloseEvent = tOptional(tObject({})); +scheme.BrowserContextPageEvent = tObject({ + page: tChannel(['Page']), +}); +scheme.BrowserContextRouteEvent = tObject({ + route: tChannel(['Route']), + request: tChannel(['Request']), +}); +scheme.BrowserContextVideoEvent = tObject({ + artifact: tChannel(['Artifact']), +}); +scheme.BrowserContextBackgroundPageEvent = tObject({ + page: tChannel(['Page']), +}); +scheme.BrowserContextServiceWorkerEvent = tObject({ + worker: tChannel(['Worker']), +}); +scheme.BrowserContextRequestEvent = tObject({ + request: tChannel(['Request']), + page: tOptional(tChannel(['Page'])), +}); +scheme.BrowserContextRequestFailedEvent = tObject({ + request: tChannel(['Request']), + failureText: tOptional(tString), + responseEndTiming: tNumber, + page: tOptional(tChannel(['Page'])), +}); +scheme.BrowserContextRequestFinishedEvent = tObject({ + request: tChannel(['Request']), + response: tOptional(tChannel(['Response'])), + responseEndTiming: tNumber, + page: tOptional(tChannel(['Page'])), +}); +scheme.BrowserContextResponseEvent = tObject({ + response: tChannel(['Response']), + page: tOptional(tChannel(['Page'])), +}); +scheme.BrowserContextAddCookiesParams = tObject({ + cookies: tArray(tType('SetNetworkCookie')), +}); +scheme.BrowserContextAddCookiesResult = tOptional(tObject({})); +scheme.BrowserContextAddInitScriptParams = tObject({ + source: tString, +}); +scheme.BrowserContextAddInitScriptResult = tOptional(tObject({})); +scheme.BrowserContextRemoveInitScriptsParams = tOptional(tObject({})); +scheme.BrowserContextRemoveInitScriptsResult = tOptional(tObject({})); +scheme.BrowserContextClearCookiesParams = tOptional(tObject({})); +scheme.BrowserContextClearCookiesResult = tOptional(tObject({})); +scheme.BrowserContextClearPermissionsParams = tOptional(tObject({})); +scheme.BrowserContextClearPermissionsResult = tOptional(tObject({})); +scheme.BrowserContextCloseParams = tOptional(tObject({})); +scheme.BrowserContextCloseResult = tOptional(tObject({})); +scheme.BrowserContextCookiesParams = tObject({ + urls: tArray(tString), +}); +scheme.BrowserContextCookiesResult = tObject({ + cookies: tArray(tType('NetworkCookie')), +}); +scheme.BrowserContextExposeBindingParams = tObject({ + name: tString, + needsHandle: tOptional(tBoolean), +}); +scheme.BrowserContextExposeBindingResult = tOptional(tObject({})); +scheme.BrowserContextRemoveExposedBindingsParams = tOptional(tObject({})); +scheme.BrowserContextRemoveExposedBindingsResult = tOptional(tObject({})); +scheme.BrowserContextGrantPermissionsParams = tObject({ + permissions: tArray(tString), + origin: tOptional(tString), +}); +scheme.BrowserContextGrantPermissionsResult = tOptional(tObject({})); +scheme.BrowserContextNewPageParams = tOptional(tObject({})); +scheme.BrowserContextNewPageResult = tObject({ + page: tChannel(['Page']), +}); +scheme.BrowserContextSetDefaultNavigationTimeoutNoReplyParams = tObject({ + timeout: tOptional(tNumber), +}); +scheme.BrowserContextSetDefaultNavigationTimeoutNoReplyResult = tOptional(tObject({})); +scheme.BrowserContextSetDefaultTimeoutNoReplyParams = tObject({ + timeout: tOptional(tNumber), +}); +scheme.BrowserContextSetDefaultTimeoutNoReplyResult = tOptional(tObject({})); +scheme.BrowserContextSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType('NameValue')), +}); +scheme.BrowserContextSetExtraHTTPHeadersResult = tOptional(tObject({})); +scheme.BrowserContextSetGeolocationParams = tObject({ + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber), + })), +}); +scheme.BrowserContextSetGeolocationResult = tOptional(tObject({})); +scheme.BrowserContextSetHTTPCredentialsParams = tObject({ + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + })), +}); +scheme.BrowserContextSetHTTPCredentialsResult = tOptional(tObject({})); +scheme.BrowserContextSetNetworkInterceptionEnabledParams = tObject({ + enabled: tBoolean, +}); +scheme.BrowserContextSetNetworkInterceptionEnabledResult = tOptional(tObject({})); +scheme.BrowserContextSetOfflineParams = tObject({ + offline: tBoolean, +}); +scheme.BrowserContextSetOfflineResult = tOptional(tObject({})); +scheme.BrowserContextStorageStateParams = tOptional(tObject({})); +scheme.BrowserContextStorageStateResult = tObject({ + cookies: tArray(tType('NetworkCookie')), + origins: tArray(tType('OriginStorage')), +}); +scheme.BrowserContextPauseParams = tOptional(tObject({})); +scheme.BrowserContextPauseResult = tOptional(tObject({})); +scheme.BrowserContextRecorderSupplementEnableParams = tObject({ + language: tOptional(tString), + startRecording: tOptional(tBoolean), + pauseOnNextStatement: tOptional(tBoolean), + launchOptions: tOptional(tAny), + contextOptions: tOptional(tAny), + device: tOptional(tString), + saveStorage: tOptional(tString), + outputFile: tOptional(tString), +}); +scheme.BrowserContextRecorderSupplementEnableResult = tOptional(tObject({})); +scheme.BrowserContextNewCDPSessionParams = tObject({ + page: tOptional(tChannel(['Page'])), + frame: tOptional(tChannel(['Frame'])), +}); +scheme.BrowserContextNewCDPSessionResult = tObject({ + session: tChannel(['CDPSession']), +}); +scheme.BrowserContextHarStartParams = tObject({ + page: tOptional(tChannel(['Page'])), + options: tType('RecordHarOptions'), +}); +scheme.BrowserContextHarStartResult = tObject({ + harId: tString, +}); +scheme.BrowserContextHarExportParams = tObject({ + harId: tOptional(tString), +}); +scheme.BrowserContextHarExportResult = tObject({ + artifact: tChannel(['Artifact']), +}); +scheme.BrowserContextCreateTempFileParams = tObject({ + name: tString, +}); +scheme.BrowserContextCreateTempFileResult = tObject({ + writableStream: tChannel(['WritableStream']), +}); +scheme.PageInitializer = tObject({ + mainFrame: tChannel(['Frame']), + viewportSize: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + isClosed: tBoolean, + opener: tOptional(tChannel(['Page'])), +}); +scheme.PageBindingCallEvent = tObject({ + binding: tChannel(['BindingCall']), +}); +scheme.PageCloseEvent = tOptional(tObject({})); +scheme.PageConsoleEvent = tObject({ + message: tChannel(['ConsoleMessage']), +}); +scheme.PageCrashEvent = tOptional(tObject({})); +scheme.PageDialogEvent = tObject({ + dialog: tChannel(['Dialog']), +}); +scheme.PageDownloadEvent = tObject({ + url: tString, + suggestedFilename: tString, + artifact: tChannel(['Artifact']), +}); +scheme.PageFileChooserEvent = tObject({ + element: tChannel(['ElementHandle']), + isMultiple: tBoolean, +}); +scheme.PageFrameAttachedEvent = tObject({ + frame: tChannel(['Frame']), +}); +scheme.PageFrameDetachedEvent = tObject({ + frame: tChannel(['Frame']), +}); +scheme.PagePageErrorEvent = tObject({ + error: tType('SerializedError'), +}); +scheme.PageRouteEvent = tObject({ + route: tChannel(['Route']), + request: tChannel(['Request']), +}); +scheme.PageVideoEvent = tObject({ + artifact: tChannel(['Artifact']), +}); +scheme.PageWebSocketEvent = tObject({ + webSocket: tChannel(['WebSocket']), +}); +scheme.PageWorkerEvent = tObject({ + worker: tChannel(['Worker']), +}); +scheme.PageSetDefaultNavigationTimeoutNoReplyParams = tObject({ + timeout: tOptional(tNumber), +}); +scheme.PageSetDefaultNavigationTimeoutNoReplyResult = tOptional(tObject({})); +scheme.PageSetDefaultTimeoutNoReplyParams = tObject({ + timeout: tOptional(tNumber), +}); +scheme.PageSetDefaultTimeoutNoReplyResult = tOptional(tObject({})); +scheme.PageSetFileChooserInterceptedNoReplyParams = tObject({ + intercepted: tBoolean, +}); +scheme.PageSetFileChooserInterceptedNoReplyResult = tOptional(tObject({})); +scheme.PageAddInitScriptParams = tObject({ + source: tString, +}); +scheme.PageAddInitScriptResult = tOptional(tObject({})); +scheme.PageRemoveInitScriptsParams = tOptional(tObject({})); +scheme.PageRemoveInitScriptsResult = tOptional(tObject({})); +scheme.PageCloseParams = tObject({ + runBeforeUnload: tOptional(tBoolean), +}); +scheme.PageCloseResult = tOptional(tObject({})); +scheme.PageEmulateMediaParams = tObject({ + media: tOptional(tEnum(['screen', 'print', 'null'])), + colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference', 'null'])), + reducedMotion: tOptional(tEnum(['reduce', 'no-preference', 'null'])), + forcedColors: tOptional(tEnum(['active', 'none', 'null'])), +}); +scheme.PageEmulateMediaResult = tOptional(tObject({})); +scheme.PageExposeBindingParams = tObject({ + name: tString, + needsHandle: tOptional(tBoolean), +}); +scheme.PageExposeBindingResult = tOptional(tObject({})); +scheme.PageRemoveExposedBindingsParams = tOptional(tObject({})); +scheme.PageRemoveExposedBindingsResult = tOptional(tObject({})); +scheme.PageGoBackParams = tObject({ + timeout: tOptional(tNumber), + waitUntil: tOptional(tType('LifecycleEvent')), +}); +scheme.PageGoBackResult = tObject({ + response: tOptional(tChannel(['Response'])), +}); +scheme.PageGoForwardParams = tObject({ + timeout: tOptional(tNumber), + waitUntil: tOptional(tType('LifecycleEvent')), +}); +scheme.PageGoForwardResult = tObject({ + response: tOptional(tChannel(['Response'])), +}); +scheme.PageReloadParams = tObject({ + timeout: tOptional(tNumber), + waitUntil: tOptional(tType('LifecycleEvent')), +}); +scheme.PageReloadResult = tObject({ + response: tOptional(tChannel(['Response'])), +}); +scheme.PageExpectScreenshotParams = tObject({ + expected: tOptional(tBinary), + timeout: tOptional(tNumber), + isNot: tBoolean, + locator: tOptional(tObject({ + frame: tChannel(['Frame']), + selector: tString, + })), + comparatorOptions: tOptional(tObject({ + maxDiffPixels: tOptional(tNumber), + maxDiffPixelRatio: tOptional(tNumber), + threshold: tOptional(tNumber), + })), + screenshotOptions: tOptional(tObject({ fullPage: tOptional(tBoolean), clip: tOptional(tType('Rect')), omitBackground: tOptional(tBoolean), @@ -617,942 +872,1476 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme { animations: tOptional(tEnum(['disabled', 'allow'])), scale: tOptional(tEnum(['css', 'device'])), mask: tOptional(tArray(tObject({ - frame: tChannel('Frame'), + frame: tChannel(['Frame']), selector: tString, }))), - }); - scheme.PageSetExtraHTTPHeadersParams = tObject({ - headers: tArray(tType('NameValue')), - }); - scheme.PageSetNetworkInterceptionEnabledParams = tObject({ - enabled: tBoolean, - }); - scheme.PageSetViewportSizeParams = tObject({ - viewportSize: tObject({ - width: tNumber, - height: tNumber, - }), - }); - scheme.PageKeyboardDownParams = tObject({ - key: tString, - }); - scheme.PageKeyboardUpParams = tObject({ - key: tString, - }); - scheme.PageKeyboardInsertTextParams = tObject({ - text: tString, - }); - scheme.PageKeyboardTypeParams = tObject({ - text: tString, - delay: tOptional(tNumber), - }); - scheme.PageKeyboardPressParams = tObject({ - key: tString, - delay: tOptional(tNumber), - }); - scheme.PageMouseMoveParams = tObject({ - x: tNumber, - y: tNumber, - steps: tOptional(tNumber), - }); - scheme.PageMouseDownParams = tObject({ - button: tOptional(tEnum(['left', 'right', 'middle'])), - clickCount: tOptional(tNumber), - }); - scheme.PageMouseUpParams = tObject({ - button: tOptional(tEnum(['left', 'right', 'middle'])), - clickCount: tOptional(tNumber), - }); - scheme.PageMouseClickParams = tObject({ - x: tNumber, - y: tNumber, - delay: tOptional(tNumber), - button: tOptional(tEnum(['left', 'right', 'middle'])), - clickCount: tOptional(tNumber), - }); - scheme.PageMouseWheelParams = tObject({ - deltaX: tNumber, - deltaY: tNumber, - }); - scheme.PageTouchscreenTapParams = tObject({ - x: tNumber, - y: tNumber, - }); - scheme.PageAccessibilitySnapshotParams = tObject({ - interestingOnly: tOptional(tBoolean), - root: tOptional(tChannel('ElementHandle')), - }); - scheme.PagePdfParams = tObject({ - scale: tOptional(tNumber), - displayHeaderFooter: tOptional(tBoolean), - headerTemplate: tOptional(tString), - footerTemplate: tOptional(tString), - printBackground: tOptional(tBoolean), - landscape: tOptional(tBoolean), - pageRanges: tOptional(tString), - format: tOptional(tString), - width: tOptional(tString), - height: tOptional(tString), - preferCSSPageSize: tOptional(tBoolean), - margin: tOptional(tObject({ - top: tOptional(tString), - bottom: tOptional(tString), - left: tOptional(tString), - right: tOptional(tString), - })), - }); - scheme.PageStartJSCoverageParams = tObject({ - resetOnNavigation: tOptional(tBoolean), - reportAnonymousScripts: tOptional(tBoolean), - }); - scheme.PageStopJSCoverageParams = tOptional(tObject({})); - scheme.PageStartCSSCoverageParams = tObject({ - resetOnNavigation: tOptional(tBoolean), - }); - scheme.PageStopCSSCoverageParams = tOptional(tObject({})); - scheme.PageBringToFrontParams = tOptional(tObject({})); - scheme.FrameEvalOnSelectorParams = tObject({ + })), +}); +scheme.PageExpectScreenshotResult = tObject({ + diff: tOptional(tBinary), + errorMessage: tOptional(tString), + actual: tOptional(tBinary), + previous: tOptional(tBinary), + log: tOptional(tArray(tString)), +}); +scheme.PageScreenshotParams = tObject({ + timeout: tOptional(tNumber), + type: tOptional(tEnum(['png', 'jpeg'])), + quality: tOptional(tNumber), + fullPage: tOptional(tBoolean), + clip: tOptional(tType('Rect')), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(['hide', 'initial'])), + animations: tOptional(tEnum(['disabled', 'allow'])), + scale: tOptional(tEnum(['css', 'device'])), + mask: tOptional(tArray(tObject({ + frame: tChannel(['Frame']), selector: tString, - strict: tOptional(tBoolean), - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.FrameEvalOnSelectorAllParams = tObject({ - selector: tString, - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.FrameAddScriptTagParams = tObject({ - url: tOptional(tString), - content: tOptional(tString), - type: tOptional(tString), - }); - scheme.FrameAddStyleTagParams = tObject({ - url: tOptional(tString), - content: tOptional(tString), - }); - scheme.FrameCheckParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.FrameClickParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - delay: tOptional(tNumber), - button: tOptional(tEnum(['left', 'right', 'middle'])), - clickCount: tOptional(tNumber), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.FrameContentParams = tOptional(tObject({})); - scheme.FrameDragAndDropParams = tObject({ - source: tString, - target: tString, - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - sourcePosition: tOptional(tType('Point')), - targetPosition: tOptional(tType('Point')), - strict: tOptional(tBoolean), - }); - scheme.FrameDblclickParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - delay: tOptional(tNumber), - button: tOptional(tEnum(['left', 'right', 'middle'])), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.FrameDispatchEventParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - type: tString, - eventInit: tType('SerializedArgument'), - timeout: tOptional(tNumber), - }); - scheme.FrameEvaluateExpressionParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.FrameEvaluateExpressionHandleParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.FrameFillParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - value: tString, - force: tOptional(tBoolean), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.FrameFocusParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameFrameElementParams = tOptional(tObject({})); - scheme.FrameHighlightParams = tObject({ - selector: tString, - }); - scheme.FrameGetAttributeParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - name: tString, - timeout: tOptional(tNumber), - }); - scheme.FrameGotoParams = tObject({ + }))), +}); +scheme.PageScreenshotResult = tObject({ + binary: tBinary, +}); +scheme.PageSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType('NameValue')), +}); +scheme.PageSetExtraHTTPHeadersResult = tOptional(tObject({})); +scheme.PageSetNetworkInterceptionEnabledParams = tObject({ + enabled: tBoolean, +}); +scheme.PageSetNetworkInterceptionEnabledResult = tOptional(tObject({})); +scheme.PageSetViewportSizeParams = tObject({ + viewportSize: tObject({ + width: tNumber, + height: tNumber, + }), +}); +scheme.PageSetViewportSizeResult = tOptional(tObject({})); +scheme.PageKeyboardDownParams = tObject({ + key: tString, +}); +scheme.PageKeyboardDownResult = tOptional(tObject({})); +scheme.PageKeyboardUpParams = tObject({ + key: tString, +}); +scheme.PageKeyboardUpResult = tOptional(tObject({})); +scheme.PageKeyboardInsertTextParams = tObject({ + text: tString, +}); +scheme.PageKeyboardInsertTextResult = tOptional(tObject({})); +scheme.PageKeyboardTypeParams = tObject({ + text: tString, + delay: tOptional(tNumber), +}); +scheme.PageKeyboardTypeResult = tOptional(tObject({})); +scheme.PageKeyboardPressParams = tObject({ + key: tString, + delay: tOptional(tNumber), +}); +scheme.PageKeyboardPressResult = tOptional(tObject({})); +scheme.PageMouseMoveParams = tObject({ + x: tNumber, + y: tNumber, + steps: tOptional(tNumber), +}); +scheme.PageMouseMoveResult = tOptional(tObject({})); +scheme.PageMouseDownParams = tObject({ + button: tOptional(tEnum(['left', 'right', 'middle'])), + clickCount: tOptional(tNumber), +}); +scheme.PageMouseDownResult = tOptional(tObject({})); +scheme.PageMouseUpParams = tObject({ + button: tOptional(tEnum(['left', 'right', 'middle'])), + clickCount: tOptional(tNumber), +}); +scheme.PageMouseUpResult = tOptional(tObject({})); +scheme.PageMouseClickParams = tObject({ + x: tNumber, + y: tNumber, + delay: tOptional(tNumber), + button: tOptional(tEnum(['left', 'right', 'middle'])), + clickCount: tOptional(tNumber), +}); +scheme.PageMouseClickResult = tOptional(tObject({})); +scheme.PageMouseWheelParams = tObject({ + deltaX: tNumber, + deltaY: tNumber, +}); +scheme.PageMouseWheelResult = tOptional(tObject({})); +scheme.PageTouchscreenTapParams = tObject({ + x: tNumber, + y: tNumber, +}); +scheme.PageTouchscreenTapResult = tOptional(tObject({})); +scheme.PageAccessibilitySnapshotParams = tObject({ + interestingOnly: tOptional(tBoolean), + root: tOptional(tChannel(['ElementHandle'])), +}); +scheme.PageAccessibilitySnapshotResult = tObject({ + rootAXNode: tOptional(tType('AXNode')), +}); +scheme.PagePdfParams = tObject({ + scale: tOptional(tNumber), + displayHeaderFooter: tOptional(tBoolean), + headerTemplate: tOptional(tString), + footerTemplate: tOptional(tString), + printBackground: tOptional(tBoolean), + landscape: tOptional(tBoolean), + pageRanges: tOptional(tString), + format: tOptional(tString), + width: tOptional(tString), + height: tOptional(tString), + preferCSSPageSize: tOptional(tBoolean), + margin: tOptional(tObject({ + top: tOptional(tString), + bottom: tOptional(tString), + left: tOptional(tString), + right: tOptional(tString), + })), +}); +scheme.PagePdfResult = tObject({ + pdf: tBinary, +}); +scheme.PageStartJSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean), + reportAnonymousScripts: tOptional(tBoolean), +}); +scheme.PageStartJSCoverageResult = tOptional(tObject({})); +scheme.PageStopJSCoverageParams = tOptional(tObject({})); +scheme.PageStopJSCoverageResult = tObject({ + entries: tArray(tObject({ url: tString, - timeout: tOptional(tNumber), - waitUntil: tOptional(tType('LifecycleEvent')), - referer: tOptional(tString), - }); - scheme.FrameHoverParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - force: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.FrameInnerHTMLParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameInnerTextParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameInputValueParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameIsCheckedParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameIsDisabledParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameIsEnabledParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameIsHiddenParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - }); - scheme.FrameIsVisibleParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - }); - scheme.FrameIsEditableParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FramePressParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - key: tString, - delay: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameQuerySelectorParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - }); - scheme.FrameQuerySelectorAllParams = tObject({ - selector: tString, - }); - scheme.FrameQueryCountParams = tObject({ - selector: tString, - }); - scheme.FrameSelectOptionParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - elements: tOptional(tArray(tChannel('ElementHandle'))), - options: tOptional(tArray(tObject({ - value: tOptional(tString), - label: tOptional(tString), - index: tOptional(tNumber), - }))), - force: tOptional(tBoolean), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.FrameSetContentParams = tObject({ - html: tString, - timeout: tOptional(tNumber), - waitUntil: tOptional(tType('LifecycleEvent')), - }); - scheme.FrameSetInputFilesParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - files: tArray(tObject({ - name: tString, - mimeType: tOptional(tString), - buffer: tBinary, - })), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.FrameSetInputFilePathsParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - localPaths: tOptional(tArray(tString)), - streams: tOptional(tArray(tChannel('WritableStream'))), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.FrameTapParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.FrameTextContentParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameTitleParams = tOptional(tObject({})); - scheme.FrameTypeParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - text: tString, - delay: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.FrameUncheckParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.FrameWaitForTimeoutParams = tObject({ - timeout: tNumber, - }); - scheme.FrameWaitForFunctionParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - timeout: tOptional(tNumber), - pollingInterval: tOptional(tNumber), - }); - scheme.FrameWaitForSelectorParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - state: tOptional(tEnum(['attached', 'detached', 'visible', 'hidden'])), - omitReturnValue: tOptional(tBoolean), - }); - scheme.FrameExpectParams = tObject({ - selector: tString, - expression: tString, - expressionArg: tOptional(tAny), - expectedText: tOptional(tArray(tType('ExpectedTextValue'))), - expectedNumber: tOptional(tNumber), - expectedValue: tOptional(tType('SerializedArgument')), - useInnerText: tOptional(tBoolean), - isNot: tBoolean, - timeout: tOptional(tNumber), - }); - scheme.WorkerEvaluateExpressionParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.WorkerEvaluateExpressionHandleParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.JSHandleDisposeParams = tOptional(tObject({})); - scheme.ElementHandleDisposeParams = tType('JSHandleDisposeParams'); - scheme.JSHandleEvaluateExpressionParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.ElementHandleEvaluateExpressionParams = tType('JSHandleEvaluateExpressionParams'); - scheme.JSHandleEvaluateExpressionHandleParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.ElementHandleEvaluateExpressionHandleParams = tType('JSHandleEvaluateExpressionHandleParams'); - scheme.JSHandleGetPropertyListParams = tOptional(tObject({})); - scheme.ElementHandleGetPropertyListParams = tType('JSHandleGetPropertyListParams'); - scheme.JSHandleGetPropertyParams = tObject({ - name: tString, - }); - scheme.ElementHandleGetPropertyParams = tType('JSHandleGetPropertyParams'); - scheme.JSHandleJsonValueParams = tOptional(tObject({})); - scheme.ElementHandleJsonValueParams = tType('JSHandleJsonValueParams'); - scheme.ElementHandleEvalOnSelectorParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.ElementHandleEvalOnSelectorAllParams = tObject({ - selector: tString, - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.ElementHandleBoundingBoxParams = tOptional(tObject({})); - scheme.ElementHandleCheckParams = tObject({ - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.ElementHandleClickParams = tObject({ - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - delay: tOptional(tNumber), - button: tOptional(tEnum(['left', 'right', 'middle'])), - clickCount: tOptional(tNumber), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.ElementHandleContentFrameParams = tOptional(tObject({})); - scheme.ElementHandleDblclickParams = tObject({ - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - delay: tOptional(tNumber), - button: tOptional(tEnum(['left', 'right', 'middle'])), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.ElementHandleDispatchEventParams = tObject({ - type: tString, - eventInit: tType('SerializedArgument'), - }); - scheme.ElementHandleFillParams = tObject({ - value: tString, - force: tOptional(tBoolean), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.ElementHandleFocusParams = tOptional(tObject({})); - scheme.ElementHandleGetAttributeParams = tObject({ - name: tString, - }); - scheme.ElementHandleHoverParams = tObject({ - force: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.ElementHandleInnerHTMLParams = tOptional(tObject({})); - scheme.ElementHandleInnerTextParams = tOptional(tObject({})); - scheme.ElementHandleInputValueParams = tOptional(tObject({})); - scheme.ElementHandleIsCheckedParams = tOptional(tObject({})); - scheme.ElementHandleIsDisabledParams = tOptional(tObject({})); - scheme.ElementHandleIsEditableParams = tOptional(tObject({})); - scheme.ElementHandleIsEnabledParams = tOptional(tObject({})); - scheme.ElementHandleIsHiddenParams = tOptional(tObject({})); - scheme.ElementHandleIsVisibleParams = tOptional(tObject({})); - scheme.ElementHandleOwnerFrameParams = tOptional(tObject({})); - scheme.ElementHandlePressParams = tObject({ - key: tString, - delay: tOptional(tNumber), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.ElementHandleQuerySelectorParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - }); - scheme.ElementHandleQuerySelectorAllParams = tObject({ - selector: tString, - }); - scheme.ElementHandleScreenshotParams = tObject({ - timeout: tOptional(tNumber), - type: tOptional(tEnum(['png', 'jpeg'])), - quality: tOptional(tNumber), - omitBackground: tOptional(tBoolean), - caret: tOptional(tEnum(['hide', 'initial'])), - animations: tOptional(tEnum(['disabled', 'allow'])), - scale: tOptional(tEnum(['css', 'device'])), - mask: tOptional(tArray(tObject({ - frame: tChannel('Frame'), - selector: tString, - }))), - }); - scheme.ElementHandleScrollIntoViewIfNeededParams = tObject({ - timeout: tOptional(tNumber), - }); - scheme.ElementHandleSelectOptionParams = tObject({ - elements: tOptional(tArray(tChannel('ElementHandle'))), - options: tOptional(tArray(tObject({ - value: tOptional(tString), - label: tOptional(tString), - index: tOptional(tNumber), - }))), - force: tOptional(tBoolean), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.ElementHandleSelectTextParams = tObject({ - force: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.ElementHandleSetInputFilesParams = tObject({ - files: tArray(tObject({ - name: tString, - mimeType: tOptional(tString), - buffer: tBinary, - })), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.ElementHandleSetInputFilePathsParams = tObject({ - localPaths: tOptional(tArray(tString)), - streams: tOptional(tArray(tChannel('WritableStream'))), - timeout: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - }); - scheme.ElementHandleTapParams = tObject({ - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.ElementHandleTextContentParams = tOptional(tObject({})); - scheme.ElementHandleTypeParams = tObject({ - text: tString, - delay: tOptional(tNumber), - noWaitAfter: tOptional(tBoolean), - timeout: tOptional(tNumber), - }); - scheme.ElementHandleUncheckParams = tObject({ - force: tOptional(tBoolean), - noWaitAfter: tOptional(tBoolean), - position: tOptional(tType('Point')), - timeout: tOptional(tNumber), - trial: tOptional(tBoolean), - }); - scheme.ElementHandleWaitForElementStateParams = tObject({ - state: tEnum(['visible', 'hidden', 'stable', 'enabled', 'disabled', 'editable']), - timeout: tOptional(tNumber), - }); - scheme.ElementHandleWaitForSelectorParams = tObject({ - selector: tString, - strict: tOptional(tBoolean), - timeout: tOptional(tNumber), - state: tOptional(tEnum(['attached', 'detached', 'visible', 'hidden'])), - }); - scheme.RequestResponseParams = tOptional(tObject({})); - scheme.RequestRawRequestHeadersParams = tOptional(tObject({})); - scheme.RouteRedirectNavigationRequestParams = tObject({ - url: tString, - }); - scheme.RouteAbortParams = tObject({ - errorCode: tOptional(tString), - }); - scheme.RouteContinueParams = tObject({ - url: tOptional(tString), - method: tOptional(tString), - headers: tOptional(tArray(tType('NameValue'))), - postData: tOptional(tBinary), - }); - scheme.RouteFulfillParams = tObject({ - status: tOptional(tNumber), - headers: tOptional(tArray(tType('NameValue'))), - body: tOptional(tString), - isBase64: tOptional(tBoolean), - fetchResponseUid: tOptional(tString), - }); - scheme.ResourceTiming = tObject({ - startTime: tNumber, - domainLookupStart: tNumber, - domainLookupEnd: tNumber, - connectStart: tNumber, - secureConnectionStart: tNumber, - connectEnd: tNumber, - requestStart: tNumber, - responseStart: tNumber, - }); - scheme.ResponseBodyParams = tOptional(tObject({})); - scheme.ResponseSecurityDetailsParams = tOptional(tObject({})); - scheme.ResponseServerAddrParams = tOptional(tObject({})); - scheme.ResponseRawResponseHeadersParams = tOptional(tObject({})); - scheme.ResponseSizesParams = tOptional(tObject({})); - scheme.SecurityDetails = tObject({ - issuer: tOptional(tString), - protocol: tOptional(tString), - subjectName: tOptional(tString), - validFrom: tOptional(tNumber), - validTo: tOptional(tNumber), - }); - scheme.RequestSizes = tObject({ - requestBodySize: tNumber, - requestHeadersSize: tNumber, - responseBodySize: tNumber, - responseHeadersSize: tNumber, - }); - scheme.RemoteAddr = tObject({ - ipAddress: tString, - port: tNumber, - }); - scheme.BindingCallRejectParams = tObject({ - error: tType('SerializedError'), - }); - scheme.BindingCallResolveParams = tObject({ - result: tType('SerializedArgument'), - }); - scheme.DialogAcceptParams = tObject({ - promptText: tOptional(tString), - }); - scheme.DialogDismissParams = tOptional(tObject({})); - scheme.TracingTracingStartParams = tObject({ - name: tOptional(tString), - snapshots: tOptional(tBoolean), - screenshots: tOptional(tBoolean), - sources: tOptional(tBoolean), - }); - scheme.TracingTracingStartChunkParams = tObject({ - title: tOptional(tString), - }); - scheme.TracingTracingStopChunkParams = tObject({ - mode: tEnum(['doNotSave', 'compressTrace', 'compressTraceAndSources']), - }); - scheme.TracingTracingStopParams = tOptional(tObject({})); - scheme.ArtifactPathAfterFinishedParams = tOptional(tObject({})); - scheme.ArtifactSaveAsParams = tObject({ - path: tString, - }); - scheme.ArtifactSaveAsStreamParams = tOptional(tObject({})); - scheme.ArtifactFailureParams = tOptional(tObject({})); - scheme.ArtifactStreamParams = tOptional(tObject({})); - scheme.ArtifactCancelParams = tOptional(tObject({})); - scheme.ArtifactDeleteParams = tOptional(tObject({})); - scheme.StreamReadParams = tObject({ - size: tOptional(tNumber), - }); - scheme.StreamCloseParams = tOptional(tObject({})); - scheme.WritableStreamWriteParams = tObject({ - binary: tBinary, - }); - scheme.WritableStreamCloseParams = tOptional(tObject({})); - scheme.CDPSessionSendParams = tObject({ - method: tString, - params: tOptional(tAny), - }); - scheme.CDPSessionDetachParams = tOptional(tObject({})); - scheme.ElectronLaunchParams = tObject({ - executablePath: tOptional(tString), - args: tOptional(tArray(tString)), - cwd: tOptional(tString), - env: tOptional(tArray(tType('NameValue'))), - timeout: tOptional(tNumber), - acceptDownloads: tOptional(tBoolean), - bypassCSP: tOptional(tBoolean), - colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), - extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), - geolocation: tOptional(tObject({ - longitude: tNumber, - latitude: tNumber, - accuracy: tOptional(tNumber), - })), - httpCredentials: tOptional(tObject({ - username: tString, - password: tString, - })), - ignoreHTTPSErrors: tOptional(tBoolean), - locale: tOptional(tString), - offline: tOptional(tBoolean), - recordHar: tOptional(tType('RecordHarOptions')), - recordVideo: tOptional(tObject({ - dir: tString, - size: tOptional(tObject({ - width: tNumber, - height: tNumber, + scriptId: tString, + source: tOptional(tString), + functions: tArray(tObject({ + functionName: tString, + isBlockCoverage: tBoolean, + ranges: tArray(tObject({ + startOffset: tNumber, + endOffset: tNumber, + count: tNumber, })), })), - strictSelectors: tOptional(tBoolean), - timezoneId: tOptional(tString), - }); - scheme.ElectronApplicationBrowserWindowParams = tObject({ - page: tChannel('Page'), - }); - scheme.ElectronApplicationEvaluateExpressionParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.ElectronApplicationEvaluateExpressionHandleParams = tObject({ - expression: tString, - isFunction: tOptional(tBoolean), - arg: tType('SerializedArgument'), - }); - scheme.ElectronApplicationCloseParams = tOptional(tObject({})); - scheme.AndroidDevicesParams = tObject({ - host: tOptional(tString), - port: tOptional(tNumber), - omitDriverInstall: tOptional(tBoolean), - }); - scheme.AndroidSetDefaultTimeoutNoReplyParams = tObject({ - timeout: tNumber, - }); - scheme.AndroidSocketWriteParams = tObject({ - data: tBinary, - }); - scheme.AndroidSocketCloseParams = tOptional(tObject({})); - scheme.AndroidDeviceWaitParams = tObject({ - selector: tType('AndroidSelector'), - state: tOptional(tEnum(['gone'])), - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceFillParams = tObject({ - selector: tType('AndroidSelector'), - text: tString, - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceTapParams = tObject({ - selector: tType('AndroidSelector'), - duration: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceDragParams = tObject({ - selector: tType('AndroidSelector'), - dest: tType('Point'), - speed: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceFlingParams = tObject({ - selector: tType('AndroidSelector'), - direction: tEnum(['up', 'down', 'left', 'right']), - speed: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceLongTapParams = tObject({ - selector: tType('AndroidSelector'), - timeout: tOptional(tNumber), - }); - scheme.AndroidDevicePinchCloseParams = tObject({ - selector: tType('AndroidSelector'), - percent: tNumber, - speed: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.AndroidDevicePinchOpenParams = tObject({ - selector: tType('AndroidSelector'), - percent: tNumber, - speed: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceScrollParams = tObject({ - selector: tType('AndroidSelector'), - direction: tEnum(['up', 'down', 'left', 'right']), - percent: tNumber, - speed: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceSwipeParams = tObject({ - selector: tType('AndroidSelector'), - direction: tEnum(['up', 'down', 'left', 'right']), - percent: tNumber, - speed: tOptional(tNumber), - timeout: tOptional(tNumber), - }); - scheme.AndroidDeviceInfoParams = tObject({ - selector: tType('AndroidSelector'), - }); - scheme.AndroidDeviceScreenshotParams = tOptional(tObject({})); - scheme.AndroidDeviceInputTypeParams = tObject({ - text: tString, - }); - scheme.AndroidDeviceInputPressParams = tObject({ - key: tString, - }); - scheme.AndroidDeviceInputTapParams = tObject({ - point: tType('Point'), - }); - scheme.AndroidDeviceInputSwipeParams = tObject({ - segments: tArray(tType('Point')), - steps: tNumber, - }); - scheme.AndroidDeviceInputDragParams = tObject({ - from: tType('Point'), - to: tType('Point'), - steps: tNumber, - }); - scheme.AndroidDeviceLaunchBrowserParams = tObject({ - noDefaultViewport: tOptional(tBoolean), - viewport: tOptional(tObject({ - width: tNumber, - height: tNumber, - })), - screen: tOptional(tObject({ - width: tNumber, - height: tNumber, - })), - ignoreHTTPSErrors: tOptional(tBoolean), - javaScriptEnabled: tOptional(tBoolean), - bypassCSP: tOptional(tBoolean), - userAgent: tOptional(tString), - locale: tOptional(tString), - timezoneId: tOptional(tString), - geolocation: tOptional(tObject({ - longitude: tNumber, - latitude: tNumber, - accuracy: tOptional(tNumber), - })), - permissions: tOptional(tArray(tString)), - extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), - offline: tOptional(tBoolean), - httpCredentials: tOptional(tObject({ - username: tString, - password: tString, - })), - deviceScaleFactor: tOptional(tNumber), - isMobile: tOptional(tBoolean), - hasTouch: tOptional(tBoolean), - colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), - reducedMotion: tOptional(tEnum(['reduce', 'no-preference'])), - forcedColors: tOptional(tEnum(['active', 'none'])), - acceptDownloads: tOptional(tBoolean), - baseURL: tOptional(tString), - recordVideo: tOptional(tObject({ - dir: tString, - size: tOptional(tObject({ - width: tNumber, - height: tNumber, - })), - })), - recordHar: tOptional(tType('RecordHarOptions')), - strictSelectors: tOptional(tBoolean), - serviceWorkers: tOptional(tEnum(['allow', 'block'])), - pkg: tOptional(tString), - proxy: tOptional(tObject({ - server: tString, - bypass: tOptional(tString), - username: tOptional(tString), - password: tOptional(tString), - })), - }); - scheme.AndroidDeviceOpenParams = tObject({ - command: tString, - }); - scheme.AndroidDeviceShellParams = tObject({ - command: tString, - }); - scheme.AndroidDeviceInstallApkParams = tObject({ - file: tBinary, - args: tOptional(tArray(tString)), - }); - scheme.AndroidDevicePushParams = tObject({ - file: tBinary, - path: tString, - mode: tOptional(tNumber), - }); - scheme.AndroidDeviceSetDefaultTimeoutNoReplyParams = tObject({ - timeout: tNumber, - }); - scheme.AndroidDeviceConnectToWebViewParams = tObject({ - socketName: tString, - }); - scheme.AndroidDeviceCloseParams = tOptional(tObject({})); - scheme.AndroidWebView = tObject({ - pid: tNumber, - pkg: tString, - socketName: tString, - }); - scheme.AndroidSelector = tObject({ - checkable: tOptional(tBoolean), - checked: tOptional(tBoolean), - clazz: tOptional(tString), - clickable: tOptional(tBoolean), - depth: tOptional(tNumber), - desc: tOptional(tString), - enabled: tOptional(tBoolean), - focusable: tOptional(tBoolean), - focused: tOptional(tBoolean), - hasChild: tOptional(tObject({ - selector: tType('AndroidSelector'), - })), - hasDescendant: tOptional(tObject({ - selector: tType('AndroidSelector'), - maxDepth: tOptional(tNumber), - })), - longClickable: tOptional(tBoolean), - pkg: tOptional(tString), - res: tOptional(tString), - scrollable: tOptional(tBoolean), - selected: tOptional(tBoolean), + })), +}); +scheme.PageStartCSSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean), +}); +scheme.PageStartCSSCoverageResult = tOptional(tObject({})); +scheme.PageStopCSSCoverageParams = tOptional(tObject({})); +scheme.PageStopCSSCoverageResult = tObject({ + entries: tArray(tObject({ + url: tString, text: tOptional(tString), - }); - scheme.AndroidElementInfo = tObject({ - children: tOptional(tArray(tType('AndroidElementInfo'))), - clazz: tString, - desc: tString, - res: tString, - pkg: tString, - text: tString, - bounds: tType('Rect'), - checkable: tBoolean, - checked: tBoolean, - clickable: tBoolean, - enabled: tBoolean, - focusable: tBoolean, - focused: tBoolean, - longClickable: tBoolean, - scrollable: tBoolean, - selected: tBoolean, - }); - scheme.JsonPipeSendParams = tObject({ - message: tAny, - }); - scheme.JsonPipeCloseParams = tOptional(tObject({})); - - return scheme; -} + ranges: tArray(tObject({ + start: tNumber, + end: tNumber, + })), + })), +}); +scheme.PageBringToFrontParams = tOptional(tObject({})); +scheme.PageBringToFrontResult = tOptional(tObject({})); +scheme.FrameInitializer = tObject({ + url: tString, + name: tString, + parentFrame: tOptional(tChannel(['Frame'])), + loadStates: tArray(tType('LifecycleEvent')), +}); +scheme.FrameLoadstateEvent = tObject({ + add: tOptional(tType('LifecycleEvent')), + remove: tOptional(tType('LifecycleEvent')), +}); +scheme.FrameNavigatedEvent = tObject({ + url: tString, + name: tString, + newDocument: tOptional(tObject({ + request: tOptional(tChannel(['Request'])), + })), + error: tOptional(tString), +}); +scheme.FrameEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.FrameEvalOnSelectorResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.FrameEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.FrameEvalOnSelectorAllResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.FrameAddScriptTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString), + type: tOptional(tString), +}); +scheme.FrameAddScriptTagResult = tObject({ + element: tChannel(['ElementHandle']), +}); +scheme.FrameAddStyleTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString), +}); +scheme.FrameAddStyleTagResult = tObject({ + element: tChannel(['ElementHandle']), +}); +scheme.FrameCheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.FrameCheckResult = tOptional(tObject({})); +scheme.FrameClickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + delay: tOptional(tNumber), + button: tOptional(tEnum(['left', 'right', 'middle'])), + clickCount: tOptional(tNumber), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.FrameClickResult = tOptional(tObject({})); +scheme.FrameContentParams = tOptional(tObject({})); +scheme.FrameContentResult = tObject({ + value: tString, +}); +scheme.FrameDragAndDropParams = tObject({ + source: tString, + target: tString, + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), + sourcePosition: tOptional(tType('Point')), + targetPosition: tOptional(tType('Point')), + strict: tOptional(tBoolean), +}); +scheme.FrameDragAndDropResult = tOptional(tObject({})); +scheme.FrameDblclickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + delay: tOptional(tNumber), + button: tOptional(tEnum(['left', 'right', 'middle'])), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.FrameDblclickResult = tOptional(tObject({})); +scheme.FrameDispatchEventParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + type: tString, + eventInit: tType('SerializedArgument'), + timeout: tOptional(tNumber), +}); +scheme.FrameDispatchEventResult = tOptional(tObject({})); +scheme.FrameEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.FrameEvaluateExpressionResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.FrameEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.FrameEvaluateExpressionHandleResult = tObject({ + handle: tChannel(['ElementHandle', 'JSHandle']), +}); +scheme.FrameFillParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + value: tString, + force: tOptional(tBoolean), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.FrameFillResult = tOptional(tObject({})); +scheme.FrameFocusParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameFocusResult = tOptional(tObject({})); +scheme.FrameFrameElementParams = tOptional(tObject({})); +scheme.FrameFrameElementResult = tObject({ + element: tChannel(['ElementHandle']), +}); +scheme.FrameHighlightParams = tObject({ + selector: tString, +}); +scheme.FrameHighlightResult = tOptional(tObject({})); +scheme.FrameGetAttributeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + name: tString, + timeout: tOptional(tNumber), +}); +scheme.FrameGetAttributeResult = tObject({ + value: tOptional(tString), +}); +scheme.FrameGotoParams = tObject({ + url: tString, + timeout: tOptional(tNumber), + waitUntil: tOptional(tType('LifecycleEvent')), + referer: tOptional(tString), +}); +scheme.FrameGotoResult = tObject({ + response: tOptional(tChannel(['Response'])), +}); +scheme.FrameHoverParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.FrameHoverResult = tOptional(tObject({})); +scheme.FrameInnerHTMLParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameInnerHTMLResult = tObject({ + value: tString, +}); +scheme.FrameInnerTextParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameInnerTextResult = tObject({ + value: tString, +}); +scheme.FrameInputValueParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameInputValueResult = tObject({ + value: tString, +}); +scheme.FrameIsCheckedParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameIsCheckedResult = tObject({ + value: tBoolean, +}); +scheme.FrameIsDisabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameIsDisabledResult = tObject({ + value: tBoolean, +}); +scheme.FrameIsEnabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameIsEnabledResult = tObject({ + value: tBoolean, +}); +scheme.FrameIsHiddenParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), +}); +scheme.FrameIsHiddenResult = tObject({ + value: tBoolean, +}); +scheme.FrameIsVisibleParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), +}); +scheme.FrameIsVisibleResult = tObject({ + value: tBoolean, +}); +scheme.FrameIsEditableParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameIsEditableResult = tObject({ + value: tBoolean, +}); +scheme.FramePressParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + key: tString, + delay: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FramePressResult = tOptional(tObject({})); +scheme.FrameQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), +}); +scheme.FrameQuerySelectorResult = tObject({ + element: tOptional(tChannel(['ElementHandle'])), +}); +scheme.FrameQuerySelectorAllParams = tObject({ + selector: tString, +}); +scheme.FrameQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(['ElementHandle'])), +}); +scheme.FrameQueryCountParams = tObject({ + selector: tString, +}); +scheme.FrameQueryCountResult = tObject({ + value: tNumber, +}); +scheme.FrameSelectOptionParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + elements: tOptional(tArray(tChannel(['ElementHandle']))), + options: tOptional(tArray(tObject({ + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tNumber), + }))), + force: tOptional(tBoolean), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.FrameSelectOptionResult = tObject({ + values: tArray(tString), +}); +scheme.FrameSetContentParams = tObject({ + html: tString, + timeout: tOptional(tNumber), + waitUntil: tOptional(tType('LifecycleEvent')), +}); +scheme.FrameSetContentResult = tOptional(tObject({})); +scheme.FrameSetInputFilesParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + files: tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary, + })), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.FrameSetInputFilesResult = tOptional(tObject({})); +scheme.FrameSetInputFilePathsParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(['WritableStream']))), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.FrameSetInputFilePathsResult = tOptional(tObject({})); +scheme.FrameTapParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.FrameTapResult = tOptional(tObject({})); +scheme.FrameTextContentParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameTextContentResult = tObject({ + value: tOptional(tString), +}); +scheme.FrameTitleParams = tOptional(tObject({})); +scheme.FrameTitleResult = tObject({ + value: tString, +}); +scheme.FrameTypeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + text: tString, + delay: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.FrameTypeResult = tOptional(tObject({})); +scheme.FrameUncheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.FrameUncheckResult = tOptional(tObject({})); +scheme.FrameWaitForTimeoutParams = tObject({ + timeout: tNumber, +}); +scheme.FrameWaitForTimeoutResult = tOptional(tObject({})); +scheme.FrameWaitForFunctionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), + timeout: tOptional(tNumber), + pollingInterval: tOptional(tNumber), +}); +scheme.FrameWaitForFunctionResult = tObject({ + handle: tChannel(['ElementHandle', 'JSHandle']), +}); +scheme.FrameWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), + state: tOptional(tEnum(['attached', 'detached', 'visible', 'hidden'])), + omitReturnValue: tOptional(tBoolean), +}); +scheme.FrameWaitForSelectorResult = tObject({ + element: tOptional(tChannel(['ElementHandle'])), +}); +scheme.FrameExpectParams = tObject({ + selector: tString, + expression: tString, + expressionArg: tOptional(tAny), + expectedText: tOptional(tArray(tType('ExpectedTextValue'))), + expectedNumber: tOptional(tNumber), + expectedValue: tOptional(tType('SerializedArgument')), + useInnerText: tOptional(tBoolean), + isNot: tBoolean, + timeout: tOptional(tNumber), +}); +scheme.FrameExpectResult = tObject({ + matches: tBoolean, + received: tOptional(tType('SerializedValue')), + log: tOptional(tArray(tString)), +}); +scheme.WorkerInitializer = tObject({ + url: tString, +}); +scheme.WorkerCloseEvent = tOptional(tObject({})); +scheme.WorkerEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.WorkerEvaluateExpressionResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.WorkerEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.WorkerEvaluateExpressionHandleResult = tObject({ + handle: tChannel(['ElementHandle', 'JSHandle']), +}); +scheme.JSHandleInitializer = tObject({ + preview: tString, +}); +scheme.JSHandlePreviewUpdatedEvent = tObject({ + preview: tString, +}); +scheme.ElementHandlePreviewUpdatedEvent = tType('JSHandlePreviewUpdatedEvent'); +scheme.JSHandleDisposeParams = tOptional(tObject({})); +scheme.ElementHandleDisposeParams = tType('JSHandleDisposeParams'); +scheme.JSHandleDisposeResult = tOptional(tObject({})); +scheme.ElementHandleDisposeResult = tType('JSHandleDisposeResult'); +scheme.JSHandleEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.ElementHandleEvaluateExpressionParams = tType('JSHandleEvaluateExpressionParams'); +scheme.JSHandleEvaluateExpressionResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.ElementHandleEvaluateExpressionResult = tType('JSHandleEvaluateExpressionResult'); +scheme.JSHandleEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.ElementHandleEvaluateExpressionHandleParams = tType('JSHandleEvaluateExpressionHandleParams'); +scheme.JSHandleEvaluateExpressionHandleResult = tObject({ + handle: tChannel(['ElementHandle', 'JSHandle']), +}); +scheme.ElementHandleEvaluateExpressionHandleResult = tType('JSHandleEvaluateExpressionHandleResult'); +scheme.JSHandleGetPropertyListParams = tOptional(tObject({})); +scheme.ElementHandleGetPropertyListParams = tType('JSHandleGetPropertyListParams'); +scheme.JSHandleGetPropertyListResult = tObject({ + properties: tArray(tObject({ + name: tString, + value: tChannel(['ElementHandle', 'JSHandle']), + })), +}); +scheme.ElementHandleGetPropertyListResult = tType('JSHandleGetPropertyListResult'); +scheme.JSHandleGetPropertyParams = tObject({ + name: tString, +}); +scheme.ElementHandleGetPropertyParams = tType('JSHandleGetPropertyParams'); +scheme.JSHandleGetPropertyResult = tObject({ + handle: tChannel(['ElementHandle', 'JSHandle']), +}); +scheme.ElementHandleGetPropertyResult = tType('JSHandleGetPropertyResult'); +scheme.JSHandleJsonValueParams = tOptional(tObject({})); +scheme.ElementHandleJsonValueParams = tType('JSHandleJsonValueParams'); +scheme.JSHandleJsonValueResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.ElementHandleJsonValueResult = tType('JSHandleJsonValueResult'); +scheme.ElementHandleInitializer = tObject({ + preview: tString, +}); +scheme.ElementHandleEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.ElementHandleEvalOnSelectorResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.ElementHandleEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.ElementHandleEvalOnSelectorAllResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.ElementHandleBoundingBoxParams = tOptional(tObject({})); +scheme.ElementHandleBoundingBoxResult = tObject({ + value: tOptional(tType('Rect')), +}); +scheme.ElementHandleCheckParams = tObject({ + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.ElementHandleCheckResult = tOptional(tObject({})); +scheme.ElementHandleClickParams = tObject({ + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + delay: tOptional(tNumber), + button: tOptional(tEnum(['left', 'right', 'middle'])), + clickCount: tOptional(tNumber), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.ElementHandleClickResult = tOptional(tObject({})); +scheme.ElementHandleContentFrameParams = tOptional(tObject({})); +scheme.ElementHandleContentFrameResult = tObject({ + frame: tOptional(tChannel(['Frame'])), +}); +scheme.ElementHandleDblclickParams = tObject({ + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + delay: tOptional(tNumber), + button: tOptional(tEnum(['left', 'right', 'middle'])), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.ElementHandleDblclickResult = tOptional(tObject({})); +scheme.ElementHandleDispatchEventParams = tObject({ + type: tString, + eventInit: tType('SerializedArgument'), +}); +scheme.ElementHandleDispatchEventResult = tOptional(tObject({})); +scheme.ElementHandleFillParams = tObject({ + value: tString, + force: tOptional(tBoolean), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.ElementHandleFillResult = tOptional(tObject({})); +scheme.ElementHandleFocusParams = tOptional(tObject({})); +scheme.ElementHandleFocusResult = tOptional(tObject({})); +scheme.ElementHandleGetAttributeParams = tObject({ + name: tString, +}); +scheme.ElementHandleGetAttributeResult = tObject({ + value: tOptional(tString), +}); +scheme.ElementHandleHoverParams = tObject({ + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.ElementHandleHoverResult = tOptional(tObject({})); +scheme.ElementHandleInnerHTMLParams = tOptional(tObject({})); +scheme.ElementHandleInnerHTMLResult = tObject({ + value: tString, +}); +scheme.ElementHandleInnerTextParams = tOptional(tObject({})); +scheme.ElementHandleInnerTextResult = tObject({ + value: tString, +}); +scheme.ElementHandleInputValueParams = tOptional(tObject({})); +scheme.ElementHandleInputValueResult = tObject({ + value: tString, +}); +scheme.ElementHandleIsCheckedParams = tOptional(tObject({})); +scheme.ElementHandleIsCheckedResult = tObject({ + value: tBoolean, +}); +scheme.ElementHandleIsDisabledParams = tOptional(tObject({})); +scheme.ElementHandleIsDisabledResult = tObject({ + value: tBoolean, +}); +scheme.ElementHandleIsEditableParams = tOptional(tObject({})); +scheme.ElementHandleIsEditableResult = tObject({ + value: tBoolean, +}); +scheme.ElementHandleIsEnabledParams = tOptional(tObject({})); +scheme.ElementHandleIsEnabledResult = tObject({ + value: tBoolean, +}); +scheme.ElementHandleIsHiddenParams = tOptional(tObject({})); +scheme.ElementHandleIsHiddenResult = tObject({ + value: tBoolean, +}); +scheme.ElementHandleIsVisibleParams = tOptional(tObject({})); +scheme.ElementHandleIsVisibleResult = tObject({ + value: tBoolean, +}); +scheme.ElementHandleOwnerFrameParams = tOptional(tObject({})); +scheme.ElementHandleOwnerFrameResult = tObject({ + frame: tOptional(tChannel(['Frame'])), +}); +scheme.ElementHandlePressParams = tObject({ + key: tString, + delay: tOptional(tNumber), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.ElementHandlePressResult = tOptional(tObject({})); +scheme.ElementHandleQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), +}); +scheme.ElementHandleQuerySelectorResult = tObject({ + element: tOptional(tChannel(['ElementHandle'])), +}); +scheme.ElementHandleQuerySelectorAllParams = tObject({ + selector: tString, +}); +scheme.ElementHandleQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(['ElementHandle'])), +}); +scheme.ElementHandleScreenshotParams = tObject({ + timeout: tOptional(tNumber), + type: tOptional(tEnum(['png', 'jpeg'])), + quality: tOptional(tNumber), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(['hide', 'initial'])), + animations: tOptional(tEnum(['disabled', 'allow'])), + scale: tOptional(tEnum(['css', 'device'])), + mask: tOptional(tArray(tObject({ + frame: tChannel(['Frame']), + selector: tString, + }))), +}); +scheme.ElementHandleScreenshotResult = tObject({ + binary: tBinary, +}); +scheme.ElementHandleScrollIntoViewIfNeededParams = tObject({ + timeout: tOptional(tNumber), +}); +scheme.ElementHandleScrollIntoViewIfNeededResult = tOptional(tObject({})); +scheme.ElementHandleSelectOptionParams = tObject({ + elements: tOptional(tArray(tChannel(['ElementHandle']))), + options: tOptional(tArray(tObject({ + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tNumber), + }))), + force: tOptional(tBoolean), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.ElementHandleSelectOptionResult = tObject({ + values: tArray(tString), +}); +scheme.ElementHandleSelectTextParams = tObject({ + force: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.ElementHandleSelectTextResult = tOptional(tObject({})); +scheme.ElementHandleSetInputFilesParams = tObject({ + files: tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary, + })), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.ElementHandleSetInputFilesResult = tOptional(tObject({})); +scheme.ElementHandleSetInputFilePathsParams = tObject({ + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(['WritableStream']))), + timeout: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), +}); +scheme.ElementHandleSetInputFilePathsResult = tOptional(tObject({})); +scheme.ElementHandleTapParams = tObject({ + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(['Alt', 'Control', 'Meta', 'Shift']))), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.ElementHandleTapResult = tOptional(tObject({})); +scheme.ElementHandleTextContentParams = tOptional(tObject({})); +scheme.ElementHandleTextContentResult = tObject({ + value: tOptional(tString), +}); +scheme.ElementHandleTypeParams = tObject({ + text: tString, + delay: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), + timeout: tOptional(tNumber), +}); +scheme.ElementHandleTypeResult = tOptional(tObject({})); +scheme.ElementHandleUncheckParams = tObject({ + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + position: tOptional(tType('Point')), + timeout: tOptional(tNumber), + trial: tOptional(tBoolean), +}); +scheme.ElementHandleUncheckResult = tOptional(tObject({})); +scheme.ElementHandleWaitForElementStateParams = tObject({ + state: tEnum(['visible', 'hidden', 'stable', 'enabled', 'disabled', 'editable']), + timeout: tOptional(tNumber), +}); +scheme.ElementHandleWaitForElementStateResult = tOptional(tObject({})); +scheme.ElementHandleWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tOptional(tNumber), + state: tOptional(tEnum(['attached', 'detached', 'visible', 'hidden'])), +}); +scheme.ElementHandleWaitForSelectorResult = tObject({ + element: tOptional(tChannel(['ElementHandle'])), +}); +scheme.RequestInitializer = tObject({ + frame: tChannel(['Frame']), + url: tString, + resourceType: tString, + method: tString, + postData: tOptional(tBinary), + headers: tArray(tType('NameValue')), + isNavigationRequest: tBoolean, + redirectedFrom: tOptional(tChannel(['Request'])), +}); +scheme.RequestResponseParams = tOptional(tObject({})); +scheme.RequestResponseResult = tObject({ + response: tOptional(tChannel(['Response'])), +}); +scheme.RequestRawRequestHeadersParams = tOptional(tObject({})); +scheme.RequestRawRequestHeadersResult = tObject({ + headers: tArray(tType('NameValue')), +}); +scheme.RouteInitializer = tObject({ + request: tChannel(['Request']), +}); +scheme.RouteRedirectNavigationRequestParams = tObject({ + url: tString, +}); +scheme.RouteRedirectNavigationRequestResult = tOptional(tObject({})); +scheme.RouteAbortParams = tObject({ + errorCode: tOptional(tString), +}); +scheme.RouteAbortResult = tOptional(tObject({})); +scheme.RouteContinueParams = tObject({ + url: tOptional(tString), + method: tOptional(tString), + headers: tOptional(tArray(tType('NameValue'))), + postData: tOptional(tBinary), +}); +scheme.RouteContinueResult = tOptional(tObject({})); +scheme.RouteFulfillParams = tObject({ + status: tOptional(tNumber), + headers: tOptional(tArray(tType('NameValue'))), + body: tOptional(tString), + isBase64: tOptional(tBoolean), + fetchResponseUid: tOptional(tString), +}); +scheme.RouteFulfillResult = tOptional(tObject({})); +scheme.ResourceTiming = tObject({ + startTime: tNumber, + domainLookupStart: tNumber, + domainLookupEnd: tNumber, + connectStart: tNumber, + secureConnectionStart: tNumber, + connectEnd: tNumber, + requestStart: tNumber, + responseStart: tNumber, +}); +scheme.ResponseInitializer = tObject({ + request: tChannel(['Request']), + url: tString, + status: tNumber, + statusText: tString, + headers: tArray(tType('NameValue')), + timing: tType('ResourceTiming'), + fromServiceWorker: tBoolean, +}); +scheme.ResponseBodyParams = tOptional(tObject({})); +scheme.ResponseBodyResult = tObject({ + binary: tBinary, +}); +scheme.ResponseSecurityDetailsParams = tOptional(tObject({})); +scheme.ResponseSecurityDetailsResult = tObject({ + value: tOptional(tType('SecurityDetails')), +}); +scheme.ResponseServerAddrParams = tOptional(tObject({})); +scheme.ResponseServerAddrResult = tObject({ + value: tOptional(tType('RemoteAddr')), +}); +scheme.ResponseRawResponseHeadersParams = tOptional(tObject({})); +scheme.ResponseRawResponseHeadersResult = tObject({ + headers: tArray(tType('NameValue')), +}); +scheme.ResponseSizesParams = tOptional(tObject({})); +scheme.ResponseSizesResult = tObject({ + sizes: tType('RequestSizes'), +}); +scheme.SecurityDetails = tObject({ + issuer: tOptional(tString), + protocol: tOptional(tString), + subjectName: tOptional(tString), + validFrom: tOptional(tNumber), + validTo: tOptional(tNumber), +}); +scheme.RequestSizes = tObject({ + requestBodySize: tNumber, + requestHeadersSize: tNumber, + responseBodySize: tNumber, + responseHeadersSize: tNumber, +}); +scheme.RemoteAddr = tObject({ + ipAddress: tString, + port: tNumber, +}); +scheme.WebSocketInitializer = tObject({ + url: tString, +}); +scheme.WebSocketOpenEvent = tOptional(tObject({})); +scheme.WebSocketFrameSentEvent = tObject({ + opcode: tNumber, + data: tString, +}); +scheme.WebSocketFrameReceivedEvent = tObject({ + opcode: tNumber, + data: tString, +}); +scheme.WebSocketSocketErrorEvent = tObject({ + error: tString, +}); +scheme.WebSocketCloseEvent = tOptional(tObject({})); +scheme.ConsoleMessageInitializer = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(['ElementHandle', 'JSHandle'])), + location: tObject({ + url: tString, + lineNumber: tNumber, + columnNumber: tNumber, + }), +}); +scheme.BindingCallInitializer = tObject({ + frame: tChannel(['Frame']), + name: tString, + args: tOptional(tArray(tType('SerializedValue'))), + handle: tOptional(tChannel(['ElementHandle', 'JSHandle'])), +}); +scheme.BindingCallRejectParams = tObject({ + error: tType('SerializedError'), +}); +scheme.BindingCallRejectResult = tOptional(tObject({})); +scheme.BindingCallResolveParams = tObject({ + result: tType('SerializedArgument'), +}); +scheme.BindingCallResolveResult = tOptional(tObject({})); +scheme.DialogInitializer = tObject({ + type: tString, + message: tString, + defaultValue: tString, +}); +scheme.DialogAcceptParams = tObject({ + promptText: tOptional(tString), +}); +scheme.DialogAcceptResult = tOptional(tObject({})); +scheme.DialogDismissParams = tOptional(tObject({})); +scheme.DialogDismissResult = tOptional(tObject({})); +scheme.TracingInitializer = tOptional(tObject({})); +scheme.TracingTracingStartParams = tObject({ + name: tOptional(tString), + snapshots: tOptional(tBoolean), + screenshots: tOptional(tBoolean), + sources: tOptional(tBoolean), +}); +scheme.TracingTracingStartResult = tOptional(tObject({})); +scheme.TracingTracingStartChunkParams = tObject({ + title: tOptional(tString), +}); +scheme.TracingTracingStartChunkResult = tOptional(tObject({})); +scheme.TracingTracingStopChunkParams = tObject({ + mode: tEnum(['doNotSave', 'compressTrace', 'compressTraceAndSources']), +}); +scheme.TracingTracingStopChunkResult = tObject({ + artifact: tOptional(tChannel(['Artifact'])), + sourceEntries: tOptional(tArray(tType('NameValue'))), +}); +scheme.TracingTracingStopParams = tOptional(tObject({})); +scheme.TracingTracingStopResult = tOptional(tObject({})); +scheme.ArtifactInitializer = tObject({ + absolutePath: tString, +}); +scheme.ArtifactPathAfterFinishedParams = tOptional(tObject({})); +scheme.ArtifactPathAfterFinishedResult = tObject({ + value: tOptional(tString), +}); +scheme.ArtifactSaveAsParams = tObject({ + path: tString, +}); +scheme.ArtifactSaveAsResult = tOptional(tObject({})); +scheme.ArtifactSaveAsStreamParams = tOptional(tObject({})); +scheme.ArtifactSaveAsStreamResult = tObject({ + stream: tChannel(['Stream']), +}); +scheme.ArtifactFailureParams = tOptional(tObject({})); +scheme.ArtifactFailureResult = tObject({ + error: tOptional(tString), +}); +scheme.ArtifactStreamParams = tOptional(tObject({})); +scheme.ArtifactStreamResult = tObject({ + stream: tOptional(tChannel(['Stream'])), +}); +scheme.ArtifactCancelParams = tOptional(tObject({})); +scheme.ArtifactCancelResult = tOptional(tObject({})); +scheme.ArtifactDeleteParams = tOptional(tObject({})); +scheme.ArtifactDeleteResult = tOptional(tObject({})); +scheme.StreamInitializer = tOptional(tObject({})); +scheme.StreamReadParams = tObject({ + size: tOptional(tNumber), +}); +scheme.StreamReadResult = tObject({ + binary: tBinary, +}); +scheme.StreamCloseParams = tOptional(tObject({})); +scheme.StreamCloseResult = tOptional(tObject({})); +scheme.WritableStreamInitializer = tOptional(tObject({})); +scheme.WritableStreamWriteParams = tObject({ + binary: tBinary, +}); +scheme.WritableStreamWriteResult = tOptional(tObject({})); +scheme.WritableStreamCloseParams = tOptional(tObject({})); +scheme.WritableStreamCloseResult = tOptional(tObject({})); +scheme.CDPSessionInitializer = tOptional(tObject({})); +scheme.CDPSessionEventEvent = tObject({ + method: tString, + params: tOptional(tAny), +}); +scheme.CDPSessionSendParams = tObject({ + method: tString, + params: tOptional(tAny), +}); +scheme.CDPSessionSendResult = tObject({ + result: tAny, +}); +scheme.CDPSessionDetachParams = tOptional(tObject({})); +scheme.CDPSessionDetachResult = tOptional(tObject({})); +scheme.ElectronInitializer = tOptional(tObject({})); +scheme.ElectronLaunchParams = tObject({ + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + cwd: tOptional(tString), + env: tOptional(tArray(tType('NameValue'))), + timeout: tOptional(tNumber), + acceptDownloads: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), + extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber), + })), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + })), + ignoreHTTPSErrors: tOptional(tBoolean), + locale: tOptional(tString), + offline: tOptional(tBoolean), + recordHar: tOptional(tType('RecordHarOptions')), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + })), + strictSelectors: tOptional(tBoolean), + timezoneId: tOptional(tString), +}); +scheme.ElectronLaunchResult = tObject({ + electronApplication: tChannel(['ElectronApplication']), +}); +scheme.ElectronApplicationInitializer = tObject({ + context: tChannel(['BrowserContext']), +}); +scheme.ElectronApplicationCloseEvent = tOptional(tObject({})); +scheme.ElectronApplicationBrowserWindowParams = tObject({ + page: tChannel(['Page']), +}); +scheme.ElectronApplicationBrowserWindowResult = tObject({ + handle: tChannel(['ElementHandle', 'JSHandle']), +}); +scheme.ElectronApplicationEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.ElectronApplicationEvaluateExpressionResult = tObject({ + value: tType('SerializedValue'), +}); +scheme.ElectronApplicationEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType('SerializedArgument'), +}); +scheme.ElectronApplicationEvaluateExpressionHandleResult = tObject({ + handle: tChannel(['ElementHandle', 'JSHandle']), +}); +scheme.ElectronApplicationCloseParams = tOptional(tObject({})); +scheme.ElectronApplicationCloseResult = tOptional(tObject({})); +scheme.AndroidInitializer = tOptional(tObject({})); +scheme.AndroidDevicesParams = tObject({ + host: tOptional(tString), + port: tOptional(tNumber), + omitDriverInstall: tOptional(tBoolean), +}); +scheme.AndroidDevicesResult = tObject({ + devices: tArray(tChannel(['AndroidDevice'])), +}); +scheme.AndroidSetDefaultTimeoutNoReplyParams = tObject({ + timeout: tNumber, +}); +scheme.AndroidSetDefaultTimeoutNoReplyResult = tOptional(tObject({})); +scheme.AndroidSocketInitializer = tOptional(tObject({})); +scheme.AndroidSocketDataEvent = tObject({ + data: tBinary, +}); +scheme.AndroidSocketCloseEvent = tOptional(tObject({})); +scheme.AndroidSocketWriteParams = tObject({ + data: tBinary, +}); +scheme.AndroidSocketWriteResult = tOptional(tObject({})); +scheme.AndroidSocketCloseParams = tOptional(tObject({})); +scheme.AndroidSocketCloseResult = tOptional(tObject({})); +scheme.AndroidDeviceInitializer = tObject({ + model: tString, + serial: tString, +}); +scheme.AndroidDeviceWebViewAddedEvent = tObject({ + webView: tType('AndroidWebView'), +}); +scheme.AndroidDeviceWebViewRemovedEvent = tObject({ + socketName: tString, +}); +scheme.AndroidDeviceWaitParams = tObject({ + selector: tType('AndroidSelector'), + state: tOptional(tEnum(['gone'])), + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceWaitResult = tOptional(tObject({})); +scheme.AndroidDeviceFillParams = tObject({ + selector: tType('AndroidSelector'), + text: tString, + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceFillResult = tOptional(tObject({})); +scheme.AndroidDeviceTapParams = tObject({ + selector: tType('AndroidSelector'), + duration: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceTapResult = tOptional(tObject({})); +scheme.AndroidDeviceDragParams = tObject({ + selector: tType('AndroidSelector'), + dest: tType('Point'), + speed: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceDragResult = tOptional(tObject({})); +scheme.AndroidDeviceFlingParams = tObject({ + selector: tType('AndroidSelector'), + direction: tEnum(['up', 'down', 'left', 'right']), + speed: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceFlingResult = tOptional(tObject({})); +scheme.AndroidDeviceLongTapParams = tObject({ + selector: tType('AndroidSelector'), + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceLongTapResult = tOptional(tObject({})); +scheme.AndroidDevicePinchCloseParams = tObject({ + selector: tType('AndroidSelector'), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.AndroidDevicePinchCloseResult = tOptional(tObject({})); +scheme.AndroidDevicePinchOpenParams = tObject({ + selector: tType('AndroidSelector'), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.AndroidDevicePinchOpenResult = tOptional(tObject({})); +scheme.AndroidDeviceScrollParams = tObject({ + selector: tType('AndroidSelector'), + direction: tEnum(['up', 'down', 'left', 'right']), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceScrollResult = tOptional(tObject({})); +scheme.AndroidDeviceSwipeParams = tObject({ + selector: tType('AndroidSelector'), + direction: tEnum(['up', 'down', 'left', 'right']), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tOptional(tNumber), +}); +scheme.AndroidDeviceSwipeResult = tOptional(tObject({})); +scheme.AndroidDeviceInfoParams = tObject({ + selector: tType('AndroidSelector'), +}); +scheme.AndroidDeviceInfoResult = tObject({ + info: tType('AndroidElementInfo'), +}); +scheme.AndroidDeviceScreenshotParams = tOptional(tObject({})); +scheme.AndroidDeviceScreenshotResult = tObject({ + binary: tBinary, +}); +scheme.AndroidDeviceInputTypeParams = tObject({ + text: tString, +}); +scheme.AndroidDeviceInputTypeResult = tOptional(tObject({})); +scheme.AndroidDeviceInputPressParams = tObject({ + key: tString, +}); +scheme.AndroidDeviceInputPressResult = tOptional(tObject({})); +scheme.AndroidDeviceInputTapParams = tObject({ + point: tType('Point'), +}); +scheme.AndroidDeviceInputTapResult = tOptional(tObject({})); +scheme.AndroidDeviceInputSwipeParams = tObject({ + segments: tArray(tType('Point')), + steps: tNumber, +}); +scheme.AndroidDeviceInputSwipeResult = tOptional(tObject({})); +scheme.AndroidDeviceInputDragParams = tObject({ + from: tType('Point'), + to: tType('Point'), + steps: tNumber, +}); +scheme.AndroidDeviceInputDragResult = tOptional(tObject({})); +scheme.AndroidDeviceLaunchBrowserParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + ignoreHTTPSErrors: tOptional(tBoolean), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber), + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType('NameValue'))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference'])), + reducedMotion: tOptional(tEnum(['reduce', 'no-preference'])), + forcedColors: tOptional(tEnum(['active', 'none'])), + acceptDownloads: tOptional(tBoolean), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber, + })), + })), + recordHar: tOptional(tType('RecordHarOptions')), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(['allow', 'block'])), + pkg: tOptional(tString), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString), + })), +}); +scheme.AndroidDeviceLaunchBrowserResult = tObject({ + context: tChannel(['BrowserContext']), +}); +scheme.AndroidDeviceOpenParams = tObject({ + command: tString, +}); +scheme.AndroidDeviceOpenResult = tObject({ + socket: tChannel(['AndroidSocket']), +}); +scheme.AndroidDeviceShellParams = tObject({ + command: tString, +}); +scheme.AndroidDeviceShellResult = tObject({ + result: tBinary, +}); +scheme.AndroidDeviceInstallApkParams = tObject({ + file: tBinary, + args: tOptional(tArray(tString)), +}); +scheme.AndroidDeviceInstallApkResult = tOptional(tObject({})); +scheme.AndroidDevicePushParams = tObject({ + file: tBinary, + path: tString, + mode: tOptional(tNumber), +}); +scheme.AndroidDevicePushResult = tOptional(tObject({})); +scheme.AndroidDeviceSetDefaultTimeoutNoReplyParams = tObject({ + timeout: tNumber, +}); +scheme.AndroidDeviceSetDefaultTimeoutNoReplyResult = tOptional(tObject({})); +scheme.AndroidDeviceConnectToWebViewParams = tObject({ + socketName: tString, +}); +scheme.AndroidDeviceConnectToWebViewResult = tObject({ + context: tChannel(['BrowserContext']), +}); +scheme.AndroidDeviceCloseParams = tOptional(tObject({})); +scheme.AndroidDeviceCloseResult = tOptional(tObject({})); +scheme.AndroidWebView = tObject({ + pid: tNumber, + pkg: tString, + socketName: tString, +}); +scheme.AndroidSelector = tObject({ + checkable: tOptional(tBoolean), + checked: tOptional(tBoolean), + clazz: tOptional(tString), + clickable: tOptional(tBoolean), + depth: tOptional(tNumber), + desc: tOptional(tString), + enabled: tOptional(tBoolean), + focusable: tOptional(tBoolean), + focused: tOptional(tBoolean), + hasChild: tOptional(tObject({ + selector: tType('AndroidSelector'), + })), + hasDescendant: tOptional(tObject({ + selector: tType('AndroidSelector'), + maxDepth: tOptional(tNumber), + })), + longClickable: tOptional(tBoolean), + pkg: tOptional(tString), + res: tOptional(tString), + scrollable: tOptional(tBoolean), + selected: tOptional(tBoolean), + text: tOptional(tString), +}); +scheme.AndroidElementInfo = tObject({ + children: tOptional(tArray(tType('AndroidElementInfo'))), + clazz: tString, + desc: tString, + res: tString, + pkg: tString, + text: tString, + bounds: tType('Rect'), + checkable: tBoolean, + checked: tBoolean, + clickable: tBoolean, + enabled: tBoolean, + focusable: tBoolean, + focused: tBoolean, + longClickable: tBoolean, + scrollable: tBoolean, + selected: tBoolean, +}); +scheme.JsonPipeInitializer = tOptional(tObject({})); +scheme.JsonPipeMessageEvent = tObject({ + message: tAny, +}); +scheme.JsonPipeClosedEvent = tObject({ + error: tOptional(tType('SerializedError')), +}); +scheme.JsonPipeSendParams = tObject({ + message: tAny, +}); +scheme.JsonPipeSendResult = tOptional(tObject({})); +scheme.JsonPipeCloseParams = tOptional(tObject({})); +scheme.JsonPipeCloseResult = tOptional(tObject({})); \ No newline at end of file diff --git a/packages/playwright-core/src/protocol/validatorPrimitives.ts b/packages/playwright-core/src/protocol/validatorPrimitives.ts index 86c1b54d54..25b8e8db9d 100644 --- a/packages/playwright-core/src/protocol/validatorPrimitives.ts +++ b/packages/playwright-core/src/protocol/validatorPrimitives.ts @@ -17,67 +17,85 @@ import { isUnderTest } from '../utils'; export class ValidationError extends Error {} -export type Validator = (arg: any, path: string) => any; +export type Validator = (arg: any, path: string, context: ValidatorContext) => any; +export type ValidatorContext = { + tChannelImpl: (names: '*' | string[], arg: any, path: string, context: ValidatorContext) => any, +}; +export const scheme: { [key: string]: Validator } = {}; -export const tNumber: Validator = (arg: any, path: string) => { +export function findValidator(type: string, method: string, kind: 'Initializer' | 'Event' | 'Params' | 'Result'): Validator { + const validator = maybeFindValidator(type, method, kind); + if (!validator) + throw new ValidationError(`Unknown scheme for ${kind}: ${type}.${method}`); + return validator; +} +export function maybeFindValidator(type: string, method: string, kind: 'Initializer' | 'Event' | 'Params' | 'Result'): Validator | undefined { + const schemeName = type + (kind === 'Initializer' ? '' : method[0].toUpperCase() + method.substring(1)) + kind; + return scheme[schemeName]; +} +export function createMetadataValidator(): Validator { + return tOptional(scheme['Metadata']); +} + +export const tNumber: Validator = (arg: any, path: string, context: ValidatorContext) => { if (arg instanceof Number) return arg.valueOf(); if (typeof arg === 'number') return arg; throw new ValidationError(`${path}: expected number, got ${typeof arg}`); }; -export const tBoolean: Validator = (arg: any, path: string) => { +export const tBoolean: Validator = (arg: any, path: string, context: ValidatorContext) => { if (arg instanceof Boolean) return arg.valueOf(); if (typeof arg === 'boolean') return arg; throw new ValidationError(`${path}: expected boolean, got ${typeof arg}`); }; -export const tString: Validator = (arg: any, path: string) => { +export const tString: Validator = (arg: any, path: string, context: ValidatorContext) => { if (arg instanceof String) return arg.valueOf(); if (typeof arg === 'string') return arg; throw new ValidationError(`${path}: expected string, got ${typeof arg}`); }; -export const tBinary: Validator = (arg: any, path: string) => { +export const tBinary: Validator = (arg: any, path: string, context: ValidatorContext) => { if (arg instanceof String) return arg.valueOf(); if (typeof arg === 'string') return arg; throw new ValidationError(`${path}: expected base64-encoded buffer, got ${typeof arg}`); }; -export const tUndefined: Validator = (arg: any, path: string) => { +export const tUndefined: Validator = (arg: any, path: string, context: ValidatorContext) => { if (Object.is(arg, undefined)) return arg; throw new ValidationError(`${path}: expected undefined, got ${typeof arg}`); }; -export const tAny: Validator = (arg: any, path: string) => { +export const tAny: Validator = (arg: any, path: string, context: ValidatorContext) => { return arg; }; export const tOptional = (v: Validator): Validator => { - return (arg: any, path: string) => { + return (arg: any, path: string, context: ValidatorContext) => { if (Object.is(arg, undefined)) return arg; - return v(arg, path); + return v(arg, path, context); }; }; export const tArray = (v: Validator): Validator => { - return (arg: any, path: string) => { + return (arg: any, path: string, context: ValidatorContext) => { if (!Array.isArray(arg)) throw new ValidationError(`${path}: expected array, got ${typeof arg}`); - return arg.map((x, index) => v(x, path + '[' + index + ']')); + return arg.map((x, index) => v(x, path + '[' + index + ']', context)); }; }; export const tObject = (s: { [key: string]: Validator }): Validator => { - return (arg: any, path: string) => { + return (arg: any, path: string, context: ValidatorContext) => { if (Object.is(arg, null)) throw new ValidationError(`${path}: expected object, got null`); if (typeof arg !== 'object') throw new ValidationError(`${path}: expected object, got ${typeof arg}`); const result: any = {}; for (const [key, v] of Object.entries(s)) { - const value = v(arg[key], path ? path + '.' + key : key); + const value = v(arg[key], path ? path + '.' + key : key, context); if (!Object.is(value, undefined)) result[key] = value; } @@ -91,9 +109,22 @@ export const tObject = (s: { [key: string]: Validator }): Validator => { }; }; export const tEnum = (e: string[]): Validator => { - return (arg: any, path: string) => { + return (arg: any, path: string, context: ValidatorContext) => { if (!e.includes(arg)) throw new ValidationError(`${path}: expected one of (${e.join('|')})`); return arg; }; }; +export const tChannel = (names: '*' | string[]): Validator => { + return (arg: any, path: string, context: ValidatorContext) => { + return context.tChannelImpl(names, arg, path, context); + }; +}; +export const tType = (name: string): Validator => { + return (arg: any, path: string, context: ValidatorContext) => { + const v = scheme[name]; + if (!v) + throw new ValidationError(path + ': unknown type "' + name + '"'); + return v(arg, path, context); + }; +}; diff --git a/packages/playwright-core/src/server/dispatchers/dispatcher.ts b/packages/playwright-core/src/server/dispatchers/dispatcher.ts index 43fb35841b..b77143eb65 100644 --- a/packages/playwright-core/src/server/dispatchers/dispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/dispatcher.ts @@ -17,10 +17,8 @@ import { EventEmitter } from 'events'; import type * as channels from '../../protocol/channels'; import { serializeError } from '../../protocol/serializers'; -import type { Validator } from '../../protocol/validator'; -import { createScheme, ValidationError } from '../../protocol/validator'; +import { findValidator, ValidationError, createMetadataValidator, type ValidatorContext } from '../../protocol/validator'; import { assert, debugAssert, isUnderTest, monotonicTime } from '../../utils'; -import { tOptional } from '../../protocol/validatorPrimitives'; import { kBrowserOrContextClosedError } from '../../common/errors'; import type { CallMetadata } from '../instrumentation'; import { SdkObject } from '../instrumentation'; @@ -28,6 +26,7 @@ import { rewriteErrorMessage } from '../../utils/stackTrace'; import type { PlaywrightDispatcher } from './playwrightDispatcher'; export const dispatcherSymbol = Symbol('dispatcher'); +const metadataValidator = createMetadataValidator(); export function lookupDispatcher(object: any): DispatcherType { const result = object[dispatcherSymbol]; @@ -79,7 +78,7 @@ export class Dispatcher extends Even (object as any)[dispatcherSymbol] = this; if (this._parent) - this._connection.sendMessageToClient(this._parent._guid, type, '__create__', { type, initializer, guid }, this._parent._object); + this._connection.sendCreate(this._parent, type, guid, initializer, this._parent._object); } _dispatchEvent>(method: T, params?: channels.EventsTraits[T]) { @@ -90,7 +89,7 @@ export class Dispatcher extends Even return; } const sdkObject = this._object instanceof SdkObject ? this._object : undefined; - this._connection.sendMessageToClient(this._guid, this._type, method as string, params, sdkObject); + this._connection.sendEvent(this, method as string, params, sdkObject); } protected _dispose() { @@ -108,7 +107,7 @@ export class Dispatcher extends Even this._dispatchers.clear(); if (this._isScope) - this._connection.sendMessageToClient(this._guid, this._type, '__dispose__', {}); + this._connection.sendDispose(this); } _debugScopeState(): any { @@ -144,12 +143,25 @@ export class Root extends Dispatcher<{ guid: '' }, any> { export class DispatcherConnection { readonly _dispatchers = new Map>(); onmessage = (message: object) => {}; - private _validateParams: (type: string, method: string, params: any) => any; - private _validateMetadata: (metadata: any) => { stack?: channels.StackFrame[] }; private _waitOperations = new Map(); - sendMessageToClient(guid: string, type: string, method: string, params: any, sdkObject?: SdkObject) { - params = this._replaceDispatchersWithGuids(params); + sendEvent(dispatcher: Dispatcher, event: string, params: any, sdkObject?: SdkObject) { + const validator = findValidator(dispatcher._type, event, 'Event'); + params = validator(params, '', { tChannelImpl: this._tChannelImplToWire.bind(this) }); + this._sendMessageToClient(dispatcher._guid, dispatcher._type, event, params, sdkObject); + } + + sendCreate(parent: Dispatcher, type: string, guid: string, initializer: any, sdkObject?: SdkObject) { + const validator = findValidator(type, '', 'Initializer'); + initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this) }); + this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject); + } + + sendDispose(dispatcher: Dispatcher) { + this._sendMessageToClient(dispatcher._guid, dispatcher._type, '__dispose__', {}); + } + + private _sendMessageToClient(guid: string, type: string, method: string, params: any, sdkObject?: SdkObject) { if (sdkObject) { const eventMetadata: CallMetadata = { id: `event@${++lastEventId}`, @@ -170,31 +182,26 @@ export class DispatcherConnection { this.onmessage({ guid, method, params }); } - constructor() { - const tChannel = (name: string): Validator => { - return (arg: any, path: string) => { - if (arg && typeof arg === 'object' && typeof arg.guid === 'string') { - const guid = arg.guid; - const dispatcher = this._dispatchers.get(guid); - if (!dispatcher) - throw new ValidationError(`${path}: no object with guid ${guid}`); - if (name !== '*' && dispatcher._type !== name) - throw new ValidationError(`${path}: object with guid ${guid} has type ${dispatcher._type}, expected ${name}`); - return dispatcher; - } - throw new ValidationError(`${path}: expected ${name}`); - }; - }; - const scheme = createScheme(tChannel); - this._validateParams = (type: string, method: string, params: any): any => { - const name = type + method[0].toUpperCase() + method.substring(1) + 'Params'; - if (!scheme[name]) - throw new ValidationError(`Unknown scheme for ${type}.${method}`); - return scheme[name](params, ''); - }; - this._validateMetadata = (metadata: any): any => { - return tOptional(scheme['Metadata'])(metadata, ''); - }; + private _tChannelImplFromWire(names: '*' | string[], arg: any, path: string, context: ValidatorContext): any { + if (arg && typeof arg === 'object' && typeof arg.guid === 'string') { + const guid = arg.guid; + const dispatcher = this._dispatchers.get(guid); + if (!dispatcher) + throw new ValidationError(`${path}: no object with guid ${guid}`); + if (names !== '*' && !names.includes(dispatcher._type)) + throw new ValidationError(`${path}: object with guid ${guid} has type ${dispatcher._type}, expected ${names.toString()}`); + return dispatcher; + } + throw new ValidationError(`${path}: expected guid for ${names.toString()}`); + } + + private _tChannelImplToWire(names: '*' | string[], arg: any, path: string, context: ValidatorContext): any { + if (arg instanceof Dispatcher) { + if (names !== '*' && !names.includes(arg._type)) + throw new ValidationError(`${path}: dispatcher with guid ${arg._guid} has type ${arg._type}, expected ${names.toString()}`); + return { guid: arg._guid }; + } + throw new ValidationError(`${path}: expected dispatcher ${names.toString()}`); } async dispatch(message: object) { @@ -204,17 +211,13 @@ export class DispatcherConnection { this.onmessage({ id, error: serializeError(new Error(kBrowserOrContextClosedError)) }); return; } - if (method === 'debugScopeState') { - const rootDispatcher = this._dispatchers.get('')!; - this.onmessage({ id, result: rootDispatcher._debugScopeState() }); - return; - } let validParams: any; let validMetadata: channels.Metadata; try { - validParams = this._validateParams(dispatcher._type, method, params); - validMetadata = this._validateMetadata(metadata); + const validator = findValidator(dispatcher._type, method, 'Params'); + validParams = validator(params, '', { tChannelImpl: this._tChannelImplFromWire.bind(this) }); + validMetadata = metadataValidator(metadata, '', { tChannelImpl: this._tChannelImplFromWire.bind(this) }); if (typeof (dispatcher as any)[method] !== 'function') throw new Error(`Mismatching dispatcher: "${dispatcher._type}" does not implement "${method}"`); } catch (e) { @@ -273,7 +276,8 @@ export class DispatcherConnection { await sdkObject?.instrumentation.onBeforeCall(sdkObject, callMetadata); try { const result = await (dispatcher as any)[method](validParams, callMetadata); - callMetadata.result = this._replaceDispatchersWithGuids(result); + const validator = findValidator(dispatcher._type, method, 'Result'); + callMetadata.result = validator(result, '', { tChannelImpl: this._tChannelImplToWire.bind(this) }); } catch (e) { // Dispatching error // We want original, unmodified error in metadata. @@ -293,22 +297,6 @@ export class DispatcherConnection { response.error = error; this.onmessage(response); } - - private _replaceDispatchersWithGuids(payload: any): any { - if (!payload) - return payload; - if (payload instanceof Dispatcher) - return { guid: payload._guid }; - if (Array.isArray(payload)) - return payload.map(p => this._replaceDispatchersWithGuids(p)); - if (typeof payload === 'object') { - const result: any = {}; - for (const key of Object.keys(payload)) - result[key] = this._replaceDispatchersWithGuids(payload[key]); - return result; - } - return payload; - } } function formatLogRecording(log: string[]): string { diff --git a/tests/config/testModeFixtures.ts b/tests/config/testModeFixtures.ts index 6e8561a0b1..7231548e8b 100644 --- a/tests/config/testModeFixtures.ts +++ b/tests/config/testModeFixtures.ts @@ -24,7 +24,7 @@ export type TestModeWorkerOptions = { export type TestModeWorkerFixtures = { playwright: typeof import('@playwright/test'); - toImpl: (rpcObject: any) => any; + toImpl: (rpcObject?: any) => any; }; export const testModeTest = test.extend<{}, TestModeWorkerOptions & TestModeWorkerFixtures>({ diff --git a/tests/library/channels.spec.ts b/tests/library/channels.spec.ts index 00ac430ae4..7dec7d4b80 100644 --- a/tests/library/channels.spec.ts +++ b/tests/library/channels.spec.ts @@ -16,19 +16,27 @@ */ import domain from 'domain'; -import { playwrightTest as it, expect } from '../config/browserTest'; +import { playwrightTest, expect } from '../config/browserTest'; -// Use something worker-scoped (e.g. launch args) to force a new worker for this file. +// Use something worker-scoped (e.g. expectScopeState) forces a new worker for this file. // Otherwise, a browser launched for other tests in this worker will affect the expectations. -it.use({ - launchOptions: async ({ launchOptions }, use) => { - await use({ ...launchOptions, args: [] }); - } +const it = playwrightTest.extend<{}, { expectScopeState: (object: any, golden: any) => void }>({ + expectScopeState: [ async ({ toImpl }, use) => { + await use((object, golden) => { + golden = trimGuids(golden); + const remoteRoot = toImpl(); + const remoteState = trimGuids(remoteRoot._debugScopeState()); + const localRoot = object._connection._rootObject; + const localState = trimGuids(localRoot._debugScopeState()); + expect(localState).toEqual(golden); + expect(remoteState).toEqual(golden); + }); + }, { scope: 'worker' }], }); it.skip(({ mode }) => mode === 'service'); -it('should scope context handles', async ({ browserType, server }) => { +it('should scope context handles', async ({ browserType, server, expectScopeState }) => { const browser = await browserType.launch(); const GOLDEN_PRECONDITION = { _guid: '', @@ -82,7 +90,7 @@ it('should scope context handles', async ({ browserType, server }) => { await browser.close(); }); -it('should scope CDPSession handles', async ({ browserType, browserName }) => { +it('should scope CDPSession handles', async ({ browserType, browserName, expectScopeState }) => { it.skip(browserName !== 'chromium'); const browser = await browserType.launch(); @@ -128,7 +136,7 @@ it('should scope CDPSession handles', async ({ browserType, browserName }) => { await browser.close(); }); -it('should scope browser handles', async ({ browserType }) => { +it('should scope browser handles', async ({ browserType, expectScopeState }) => { const GOLDEN_PRECONDITION = { _guid: '', objects: [ @@ -204,14 +212,6 @@ it('should work with the domain module', async ({ browserType, server, browserNa throw err; }); -async function expectScopeState(object, golden) { - golden = trimGuids(golden); - const remoteState = trimGuids(await object._channel.debugScopeState()); - const localState = trimGuids(object._connection._debugScopeState()); - expect(localState).toEqual(golden); - expect(remoteState).toEqual(golden); -} - function compareObjects(a, b) { if (a._guid !== b._guid) return a._guid.localeCompare(b._guid); diff --git a/utils/generate_channels.js b/utils/generate_channels.js index 667f23feb0..8124d65d0b 100755 --- a/utils/generate_channels.js +++ b/utils/generate_channels.js @@ -22,8 +22,7 @@ const os = require('os'); const path = require('path'); const yaml = require('yaml'); -const channels = new Set(); -const inherits = new Map(); +const channels = new Map(); const mixins = new Map(); function raise(item) { @@ -45,8 +44,11 @@ function inlineType(type, indent, wrapEnums = false) { return { ts: 'any', scheme: 'tAny', optional }; if (['string', 'boolean', 'number', 'undefined'].includes(type)) return { ts: type, scheme: `t${titleCase(type)}`, optional }; - if (channels.has(type)) - return { ts: `${type}Channel`, scheme: `tChannel('${type}')` , optional }; + if (channels.has(type)) { + let derived = derivedClasses.get(type) || []; + derived = [...derived, type]; + return { ts: `${type}Channel`, scheme: `tChannel([${derived.map(c => `'${c}'`).join(', ')}])` , optional }; + } if (type === 'Channel') return { ts: `Channel`, scheme: `tChannel('*')`, optional }; return { ts: type, scheme: `tType('${type}')`, optional }; @@ -149,24 +151,9 @@ const validator_ts = [ // This file is generated by ${path.basename(__filename)}, do not edit manually. -import type { Validator } from './validatorPrimitives'; -import { ValidationError, tOptional, tObject, tBoolean, tNumber, tString, tAny, tEnum, tArray, tBinary } from './validatorPrimitives'; -export type { Validator } from './validatorPrimitives'; -export { ValidationError } from './validatorPrimitives'; - -type Scheme = { [key: string]: Validator }; - -export function createScheme(tChannel: (name: string) => Validator): Scheme { - const scheme: Scheme = {}; - - const tType = (name: string): Validator => { - return (arg: any, path: string) => { - const v = scheme[name]; - if (!v) - throw new ValidationError(path + ': unknown type "' + name + '"'); - return v(arg, path); - }; - }; +import { scheme, tOptional, tObject, tBoolean, tNumber, tString, tAny, tEnum, tArray, tBinary, tChannel, tType } from './validatorPrimitives'; +export type { Validator, ValidatorContext } from './validatorPrimitives'; +export { ValidationError, findValidator, maybeFindValidator, createMetadataValidator } from './validatorPrimitives'; `]; const tracingSnapshots = []; @@ -176,16 +163,12 @@ const yml = fs.readFileSync(path.join(__dirname, '..', 'packages', 'playwright-c const protocol = yaml.parse(yml); function addScheme(name, s) { - const lines = `scheme.${name} = ${s};`.split('\n'); - validator_ts.push(...lines.map(line => ' ' + line)); + validator_ts.push(`scheme.${name} = ${s};`); } for (const [name, value] of Object.entries(protocol)) { - if (value.type === 'interface') { - channels.add(name); - if (value.extends) - inherits.set(name, value.extends); - } + if (value.type === 'interface') + channels.set(name, value); if (value.type === 'mixin') mixins.set(name, value); } @@ -239,6 +222,16 @@ for (const [name, item] of Object.entries(protocol)) { const initializerName = channelName + 'Initializer'; channels_ts.push(`export type ${initializerName} = ${init.ts};`); + let ancestorInit = init; + let ancestor = item; + while (!ancestor.initializer) { + if (!ancestor.extends) + break; + ancestor = channels.get(ancestor.extends); + ancestorInit = objectType(ancestor.initializer || {}, ''); + } + addScheme(`${channelName}Initializer`, ancestor.initializer ? ancestorInit.scheme : `tOptional(tObject({}))`); + channels_ts.push(`export interface ${channelName}EventTarget {`); const ts_types = new Map(); @@ -252,6 +245,9 @@ for (const [name, item] of Object.entries(protocol)) { ts_types.set(paramsName, parameters.ts); channels_ts.push(` on(event: '${eventName}', callback: (params: ${paramsName}) => void): this;`); eventTypes.push({eventName, eventType: paramsName}); + addScheme(paramsName, event.parameters ? parameters.scheme : `tOptional(tObject({}))`); + for (const derived of derivedClasses.get(channelName) || []) + addScheme(`${derived}${titleCase(eventName)}Event`, `tType('${paramsName}')`); } channels_ts.push(`}`); @@ -276,14 +272,15 @@ for (const [name, item] of Object.entries(protocol)) { ts_types.set(paramsName, parameters.ts); ts_types.set(optionsName, objectType(method.parameters || {}, '', true).ts); addScheme(paramsName, method.parameters ? parameters.scheme : `tOptional(tObject({}))`); - for (const key of inherits.keys()) { - if (inherits.get(key) === channelName) - addScheme(`${key}${titleCase(methodName)}Params`, `tType('${paramsName}')`); - } + for (const derived of derivedClasses.get(channelName) || []) + addScheme(`${derived}${titleCase(methodName)}Params`, `tType('${paramsName}')`); const resultName = `${channelName}${titleCase(methodName)}Result`; const returns = objectType(method.returns || {}, ''); ts_types.set(resultName, method.returns ? returns.ts : 'void'); + addScheme(resultName, method.returns ? returns.scheme : `tOptional(tObject({}))`); + for (const derived of derivedClasses.get(channelName) || []) + addScheme(`${derived}${titleCase(methodName)}Result`, `tType('${resultName}')`); channels_ts.push(` ${methodName}(params${method.parameters ? '' : '?'}: ${paramsName}, metadata?: Metadata): Promise<${resultName}>;`); } @@ -318,11 +315,6 @@ channels_ts.push(`export const pausesBeforeInputActions = new Set([ '${pausesBeforeInputActions.join(`',\n '`)}' ]);`); -validator_ts.push(` - return scheme; -} -`); - let hasChanges = false; function writeFile(filePath, content) {