feat(rpc): introduce JSON type in the protocol for arbitrary blobs (#3367)

This commit is contained in:
Dmitry Gozman 2020-08-10 11:20:32 -07:00 committed by GitHub
parent 6f3f608d5b
commit ef76f5b922
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 30 additions and 37 deletions

View File

@ -180,7 +180,7 @@ export type BrowserTypeLaunchParams = {
password?: string, password?: string,
}, },
downloadsPath?: string, downloadsPath?: string,
firefoxUserPrefs?: SerializedValue, firefoxUserPrefs?: any,
chromiumSandbox?: boolean, chromiumSandbox?: boolean,
slowMo?: number, slowMo?: number,
}; };
@ -206,7 +206,7 @@ export type BrowserTypeLaunchOptions = {
password?: string, password?: string,
}, },
downloadsPath?: string, downloadsPath?: string,
firefoxUserPrefs?: SerializedValue, firefoxUserPrefs?: any,
chromiumSandbox?: boolean, chromiumSandbox?: boolean,
slowMo?: number, slowMo?: number,
}; };
@ -235,7 +235,7 @@ export type BrowserTypeLaunchServerParams = {
password?: string, password?: string,
}, },
downloadsPath?: string, downloadsPath?: string,
firefoxUserPrefs?: SerializedValue, firefoxUserPrefs?: any,
chromiumSandbox?: boolean, chromiumSandbox?: boolean,
port?: number, port?: number,
}; };
@ -261,7 +261,7 @@ export type BrowserTypeLaunchServerOptions = {
password?: string, password?: string,
}, },
downloadsPath?: string, downloadsPath?: string,
firefoxUserPrefs?: SerializedValue, firefoxUserPrefs?: any,
chromiumSandbox?: boolean, chromiumSandbox?: boolean,
port?: number, port?: number,
}; };
@ -2228,17 +2228,17 @@ export interface CDPSessionChannel extends Channel {
} }
export type CDPSessionEventEvent = { export type CDPSessionEventEvent = {
method: string, method: string,
params?: SerializedValue, params?: any,
}; };
export type CDPSessionSendParams = { export type CDPSessionSendParams = {
method: string, method: string,
params?: SerializedValue, params?: any,
}; };
export type CDPSessionSendOptions = { export type CDPSessionSendOptions = {
params?: SerializedValue, params?: any,
}; };
export type CDPSessionSendResult = { export type CDPSessionSendResult = {
result: SerializedValue, result: any,
}; };
export type CDPSessionDetachParams = {}; export type CDPSessionDetachParams = {};
export type CDPSessionDetachOptions = {}; export type CDPSessionDetachOptions = {};

View File

@ -20,7 +20,6 @@ import { BrowserContext } from './browserContext';
import { ChannelOwner } from './channelOwner'; import { ChannelOwner } from './channelOwner';
import { BrowserServer } from './browserServer'; import { BrowserServer } from './browserServer';
import { headersObjectToArray, envObjectToArray } from '../../converters'; import { headersObjectToArray, envObjectToArray } from '../../converters';
import { serializeArgument } from './jsHandle';
import { assert } from '../../helper'; import { assert } from '../../helper';
import { LaunchOptions, LaunchServerOptions, ConnectOptions, LaunchPersistentContextOptions } from './types'; import { LaunchOptions, LaunchServerOptions, ConnectOptions, LaunchPersistentContextOptions } from './types';
@ -53,7 +52,6 @@ export class BrowserType extends ChannelOwner<BrowserTypeChannel, BrowserTypeIni
ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined, ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined,
ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs), ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
env: options.env ? envObjectToArray(options.env) : undefined, env: options.env ? envObjectToArray(options.env) : undefined,
firefoxUserPrefs: options.firefoxUserPrefs ? serializeArgument(options.firefoxUserPrefs).value : undefined,
}; };
const browser = Browser.from((await this._channel.launch(launchOptions)).browser); const browser = Browser.from((await this._channel.launch(launchOptions)).browser);
browser._logger = logger; browser._logger = logger;
@ -70,7 +68,6 @@ export class BrowserType extends ChannelOwner<BrowserTypeChannel, BrowserTypeIni
ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined, ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined,
ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs), ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
env: options.env ? envObjectToArray(options.env) : undefined, env: options.env ? envObjectToArray(options.env) : undefined,
firefoxUserPrefs: options.firefoxUserPrefs ? serializeArgument(options.firefoxUserPrefs).value : undefined,
}; };
return BrowserServer.from((await this._channel.launchServer(launchServerOptions)).server); return BrowserServer.from((await this._channel.launchServer(launchServerOptions)).server);
}, logger); }, logger);

View File

@ -17,7 +17,6 @@
import { CDPSessionChannel, CDPSessionInitializer } from '../channels'; import { CDPSessionChannel, CDPSessionInitializer } from '../channels';
import { ChannelOwner } from './channelOwner'; import { ChannelOwner } from './channelOwner';
import { Protocol } from '../../chromium/protocol'; import { Protocol } from '../../chromium/protocol';
import { parseResult, serializeArgument } from './jsHandle';
export class CDPSession extends ChannelOwner<CDPSessionChannel, CDPSessionInitializer> { export class CDPSession extends ChannelOwner<CDPSessionChannel, CDPSessionInitializer> {
static from(cdpSession: CDPSessionChannel): CDPSession { static from(cdpSession: CDPSessionChannel): CDPSession {
@ -34,8 +33,7 @@ export class CDPSession extends ChannelOwner<CDPSessionChannel, CDPSessionInitia
super(parent, type, guid, initializer); super(parent, type, guid, initializer);
this._channel.on('event', ({ method, params }) => { this._channel.on('event', ({ method, params }) => {
const cdpParams = params ? parseResult(params) : undefined; this.emit(method, params);
this.emit(method, cdpParams);
}); });
this.on = super.on; this.on = super.on;
@ -50,9 +48,8 @@ export class CDPSession extends ChannelOwner<CDPSessionChannel, CDPSessionInitia
params?: Protocol.CommandParameters[T] params?: Protocol.CommandParameters[T]
): Promise<Protocol.CommandReturnValues[T]> { ): Promise<Protocol.CommandReturnValues[T]> {
return this._wrapApiCall('cdpSession.send', async () => { return this._wrapApiCall('cdpSession.send', async () => {
const protocolParams = params ? serializeArgument(params).value : undefined; const result = await this._channel.send({ method, params });
const result = await this._channel.send({ method, params: protocolParams }); return result.result as Protocol.CommandReturnValues[T];
return parseResult(result.result) as Protocol.CommandReturnValues[T];
}); });
} }

View File

@ -215,7 +215,7 @@ BrowserType:
username: string? username: string?
password: string? password: string?
downloadsPath: string? downloadsPath: string?
firefoxUserPrefs: SerializedValue? firefoxUserPrefs: json?
chromiumSandbox: boolean? chromiumSandbox: boolean?
slowMo: number? slowMo: number?
returns: returns:
@ -252,7 +252,7 @@ BrowserType:
username: string? username: string?
password: string? password: string?
downloadsPath: string? downloadsPath: string?
firefoxUserPrefs: SerializedValue? firefoxUserPrefs: json?
chromiumSandbox: boolean? chromiumSandbox: boolean?
port: number? port: number?
returns: returns:
@ -1849,9 +1849,9 @@ CDPSession:
send: send:
parameters: parameters:
method: string method: string
params: SerializedValue? params: json?
returns: returns:
result: SerializedValue result: json
detach: detach:
@ -1860,7 +1860,7 @@ CDPSession:
event: event:
parameters: parameters:
method: string method: string
params: SerializedValue? params: json?

View File

@ -24,7 +24,6 @@ import { BrowserContextBase } from '../../browserContext';
import { BrowserContextDispatcher } from './browserContextDispatcher'; import { BrowserContextDispatcher } from './browserContextDispatcher';
import { BrowserServerDispatcher } from './browserServerDispatcher'; import { BrowserServerDispatcher } from './browserServerDispatcher';
import { headersArrayToObject, envArrayToObject } from '../../converters'; import { headersArrayToObject, envArrayToObject } from '../../converters';
import { parseValue } from './jsHandleDispatcher';
export class BrowserTypeDispatcher extends Dispatcher<BrowserType, BrowserTypeInitializer> implements BrowserTypeChannel { export class BrowserTypeDispatcher extends Dispatcher<BrowserType, BrowserTypeInitializer> implements BrowserTypeChannel {
constructor(scope: DispatcherScope, browserType: BrowserTypeBase) { constructor(scope: DispatcherScope, browserType: BrowserTypeBase) {
@ -39,7 +38,6 @@ export class BrowserTypeDispatcher extends Dispatcher<BrowserType, BrowserTypeIn
...params, ...params,
ignoreDefaultArgs: params.ignoreAllDefaultArgs ? true : params.ignoreDefaultArgs, ignoreDefaultArgs: params.ignoreAllDefaultArgs ? true : params.ignoreDefaultArgs,
env: params.env ? envArrayToObject(params.env) : undefined, env: params.env ? envArrayToObject(params.env) : undefined,
firefoxUserPrefs: params.firefoxUserPrefs ? parseValue(params.firefoxUserPrefs) : undefined,
}; };
const browser = await this._object.launch(options); const browser = await this._object.launch(options);
return { browser: new BrowserDispatcher(this._scope, browser as BrowserBase) }; return { browser: new BrowserDispatcher(this._scope, browser as BrowserBase) };
@ -61,7 +59,6 @@ export class BrowserTypeDispatcher extends Dispatcher<BrowserType, BrowserTypeIn
const options = { const options = {
...params, ...params,
ignoreDefaultArgs: params.ignoreAllDefaultArgs ? true : params.ignoreDefaultArgs, ignoreDefaultArgs: params.ignoreAllDefaultArgs ? true : params.ignoreDefaultArgs,
firefoxUserPrefs: params.firefoxUserPrefs ? parseValue(params.firefoxUserPrefs) : undefined,
env: params.env ? envArrayToObject(params.env) : undefined, env: params.env ? envArrayToObject(params.env) : undefined,
}; };
return { server: new BrowserServerDispatcher(this._scope, await this._object.launchServer(options)) }; return { server: new BrowserServerDispatcher(this._scope, await this._object.launchServer(options)) };

View File

@ -15,23 +15,20 @@
*/ */
import { CRSession, CRSessionEvents } from '../../chromium/crConnection'; import { CRSession, CRSessionEvents } from '../../chromium/crConnection';
import { CDPSessionChannel, CDPSessionInitializer, SerializedValue } from '../channels'; import { CDPSessionChannel, CDPSessionInitializer } from '../channels';
import { Dispatcher, DispatcherScope } from './dispatcher'; import { Dispatcher, DispatcherScope } from './dispatcher';
import { serializeResult, parseValue } from './jsHandleDispatcher';
export class CDPSessionDispatcher extends Dispatcher<CRSession, CDPSessionInitializer> implements CDPSessionChannel { export class CDPSessionDispatcher extends Dispatcher<CRSession, CDPSessionInitializer> implements CDPSessionChannel {
constructor(scope: DispatcherScope, crSession: CRSession) { constructor(scope: DispatcherScope, crSession: CRSession) {
super(scope, crSession, 'CDPSession', {}, true); super(scope, crSession, 'CDPSession', {}, true);
crSession._eventListener = (method, cdpParams) => { crSession._eventListener = (method, params) => {
const params = cdpParams ? serializeResult(cdpParams) : undefined;
this._dispatchEvent('event', { method, params }); this._dispatchEvent('event', { method, params });
}; };
crSession.on(CRSessionEvents.Disconnected, () => this._dispose()); crSession.on(CRSessionEvents.Disconnected, () => this._dispose());
} }
async send(params: { method: string, params?: SerializedValue }): Promise<{ result: SerializedValue }> { async send(params: { method: string, params?: any }): Promise<{ result: any }> {
const cdpParams = params.params ? parseValue(params.params) : undefined; return { result: await this._object.send(params.method as any, params.params) };
return { result: serializeResult(await this._object.send(params.method as any, cdpParams)) };
} }
async detach(): Promise<void> { async detach(): Promise<void> {

View File

@ -16,7 +16,7 @@
// This file is generated by generate_channels.js, do not edit manually. // This file is generated by generate_channels.js, do not edit manually.
import { Validator, ValidationError, tOptional, tObject, tBoolean, tNumber, tString, tEnum, tArray, tBinary } from './validatorPrimitives'; import { Validator, ValidationError, tOptional, tObject, tBoolean, tNumber, tString, tAny, tEnum, tArray, tBinary } from './validatorPrimitives';
export { Validator, ValidationError } from './validatorPrimitives'; export { Validator, ValidationError } from './validatorPrimitives';
type Scheme = { [key: string]: Validator }; type Scheme = { [key: string]: Validator };
@ -127,7 +127,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
password: tOptional(tString), password: tOptional(tString),
})), })),
downloadsPath: tOptional(tString), downloadsPath: tOptional(tString),
firefoxUserPrefs: tOptional(tType('SerializedValue')), firefoxUserPrefs: tOptional(tAny),
chromiumSandbox: tOptional(tBoolean), chromiumSandbox: tOptional(tBoolean),
slowMo: tOptional(tNumber), slowMo: tOptional(tNumber),
}); });
@ -153,7 +153,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
password: tOptional(tString), password: tOptional(tString),
})), })),
downloadsPath: tOptional(tString), downloadsPath: tOptional(tString),
firefoxUserPrefs: tOptional(tType('SerializedValue')), firefoxUserPrefs: tOptional(tAny),
chromiumSandbox: tOptional(tBoolean), chromiumSandbox: tOptional(tBoolean),
port: tOptional(tNumber), port: tOptional(tNumber),
}); });
@ -837,7 +837,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
}); });
scheme.CDPSessionSendParams = tObject({ scheme.CDPSessionSendParams = tObject({
method: tString, method: tString,
params: tOptional(tType('SerializedValue')), params: tOptional(tAny),
}); });
scheme.CDPSessionDetachParams = tOptional(tObject({})); scheme.CDPSessionDetachParams = tOptional(tObject({}));
scheme.ElectronLaunchParams = tObject({ scheme.ElectronLaunchParams = tObject({

View File

@ -52,6 +52,9 @@ export const tUndefined: Validator = (arg: any, path: string) => {
return arg; return arg;
throw new ValidationError(`${path}: expected undefined, got ${typeof arg}`); throw new ValidationError(`${path}: expected undefined, got ${typeof arg}`);
}; };
export const tAny: Validator = (arg: any, path: string) => {
return arg;
};
export const tOptional = (v: Validator): Validator => { export const tOptional = (v: Validator): Validator => {
return (arg: any, path: string) => { return (arg: any, path: string) => {
if (Object.is(arg, undefined)) if (Object.is(arg, undefined))

View File

@ -36,6 +36,8 @@ function inlineType(type, indent, wrapEnums = false) {
type = type.substring(0, type.length - 1); type = type.substring(0, type.length - 1);
if (type === 'binary') if (type === 'binary')
return { ts: 'Binary', scheme: 'tBinary', optional }; return { ts: 'Binary', scheme: 'tBinary', optional };
if (type === 'json')
return { ts: 'any', scheme: 'tAny', optional };
if (['string', 'boolean', 'number', 'undefined'].includes(type)) if (['string', 'boolean', 'number', 'undefined'].includes(type))
return { ts: type, scheme: `t${titleCase(type)}`, optional }; return { ts: type, scheme: `t${titleCase(type)}`, optional };
if (channels.has(type)) if (channels.has(type))
@ -137,7 +139,7 @@ const validator_ts = [
// This file is generated by ${path.basename(__filename)}, do not edit manually. // This file is generated by ${path.basename(__filename)}, do not edit manually.
import { Validator, ValidationError, tOptional, tObject, tBoolean, tNumber, tString, tEnum, tArray, tBinary } from './validatorPrimitives'; import { Validator, ValidationError, tOptional, tObject, tBoolean, tNumber, tString, tAny, tEnum, tArray, tBinary } from './validatorPrimitives';
export { Validator, ValidationError } from './validatorPrimitives'; export { Validator, ValidationError } from './validatorPrimitives';
type Scheme = { [key: string]: Validator }; type Scheme = { [key: string]: Validator };