From 903afc3715cd0c2b0cf1b3b02e646f599d4e88bf Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Tue, 13 Jun 2023 10:17:23 +0200 Subject: [PATCH] chore: implement acceptInsecureCerts and version for BiDi (#10365) --- docs/api/puppeteer.browser.version.md | 2 +- packages/puppeteer-core/src/api/Browser.ts | 6 ++- .../puppeteer-core/src/common/bidi/Browser.ts | 40 +++++++++++++++++-- .../src/common/bidi/Connection.ts | 38 +++++++++++++++++- .../src/node/ProductLauncher.ts | 6 +++ test/TestExpectations.json | 6 +++ test/src/bidi/Connection.spec.ts | 6 +-- test/src/browser.spec.ts | 8 ++-- 8 files changed, 94 insertions(+), 18 deletions(-) diff --git a/docs/api/puppeteer.browser.version.md b/docs/api/puppeteer.browser.version.md index a24cbc2f..ed6b027b 100644 --- a/docs/api/puppeteer.browser.version.md +++ b/docs/api/puppeteer.browser.version.md @@ -20,6 +20,6 @@ Promise<string> ## Remarks -For headless browser, this is similar to `HeadlessChrome/61.0.3153.0`. For non-headless, this is similar to `Chrome/61.0.3153.0`. +For headless browser, this is similar to `HeadlessChrome/61.0.3153.0`. For non-headless or new-headless, this is similar to `Chrome/61.0.3153.0`. For Firefox, it is similar to `Firefox/116.0a1`. The format of browser.version() might change with future releases of browsers. diff --git a/packages/puppeteer-core/src/api/Browser.ts b/packages/puppeteer-core/src/api/Browser.ts index 5a08f6ec..3ff78585 100644 --- a/packages/puppeteer-core/src/api/Browser.ts +++ b/packages/puppeteer-core/src/api/Browser.ts @@ -405,9 +405,11 @@ export class Browser extends EventEmitter { * @remarks * * For headless browser, this is similar to `HeadlessChrome/61.0.3153.0`. For - * non-headless, this is similar to `Chrome/61.0.3153.0`. + * non-headless or new-headless, this is similar to `Chrome/61.0.3153.0`. For + * Firefox, it is similar to `Firefox/116.0a1`. * - * The format of browser.version() might change with future releases of browsers. + * The format of browser.version() might change with future releases of + * browsers. */ version(): Promise { throw new Error('Not implemented'); diff --git a/packages/puppeteer-core/src/common/bidi/Browser.ts b/packages/puppeteer-core/src/common/bidi/Browser.ts index edd376b1..71306d1f 100644 --- a/packages/puppeteer-core/src/common/bidi/Browser.ts +++ b/packages/puppeteer-core/src/common/bidi/Browser.ts @@ -29,24 +29,44 @@ import {Viewport} from '../PuppeteerViewport.js'; import {BrowserContext} from './BrowserContext.js'; import {Connection} from './Connection.js'; +import {debugError} from './utils.js'; /** * @internal */ export class Browser extends BrowserBase { static readonly subscribeModules = ['browsingContext', 'network', 'log']; + #browserName = ''; + #browserVersion = ''; static async create(opts: Options): Promise { + let browserName = ''; + let browserVersion = ''; + // TODO: await until the connection is established. try { - await opts.connection.send('session.new', {capabilities: {}}); - } catch {} + const {result} = await opts.connection.send('session.new', { + capabilities: { + alwaysMatch: { + acceptInsecureCerts: opts.ignoreHTTPSErrors, + }, + }, + }); + browserName = result.capabilities.browserName ?? ''; + browserVersion = result.capabilities.browserVersion ?? ''; + } catch (err) { + debugError(err); + } await opts.connection.send('session.subscribe', { events: Browser.subscribeModules as Bidi.Message.EventNames[], }); - return new Browser(opts); + return new Browser({ + ...opts, + browserName, + browserVersion, + }); } #process?: ChildProcess; @@ -54,12 +74,19 @@ export class Browser extends BrowserBase { #connection: Connection; #defaultViewport: Viewport | null; - constructor(opts: Options) { + constructor( + opts: Options & { + browserName: string; + browserVersion: string; + } + ) { super(); this.#process = opts.process; this.#closeCallback = opts.closeCallback; this.#connection = opts.connection; this.#defaultViewport = opts.defaultViewport; + this.#browserName = opts.browserName; + this.#browserVersion = opts.browserVersion; this.#process?.on('close', () => { return this.emit(BrowserEmittedEvents.Disconnected); @@ -90,6 +117,10 @@ export class Browser extends BrowserBase { defaultViewport: this.#defaultViewport, }); } + + override async version(): Promise { + return `${this.#browserName}/${this.#browserVersion}`; + } } interface Options { @@ -97,4 +128,5 @@ interface Options { closeCallback?: BrowserCloseCallback; connection: Connection; defaultViewport: Viewport | null; + ignoreHTTPSErrors?: boolean; } diff --git a/packages/puppeteer-core/src/common/bidi/Connection.ts b/packages/puppeteer-core/src/common/bidi/Connection.ts index d1b2f7cf..127d576c 100644 --- a/packages/puppeteer-core/src/common/bidi/Connection.ts +++ b/packages/puppeteer-core/src/common/bidi/Connection.ts @@ -26,6 +26,29 @@ import {BrowsingContext} from './BrowsingContext.js'; const debugProtocolSend = debug('puppeteer:webDriverBiDi:SEND ►'); const debugProtocolReceive = debug('puppeteer:webDriverBiDi:RECV ◀'); +type Capability = { + // session.CapabilityRequest = { + // ? acceptInsecureCerts: bool, + // ? browserName: text, + // ? browserVersion: text, + // ? platformName: text, + // ? proxy: { + // ? proxyType: "pac" / "direct" / "autodetect" / "system" / "manual", + // ? proxyAutoconfigUrl: text, + // ? ftpProxy: text, + // ? httpProxy: text, + // ? noProxy: [*text], + // ? sslProxy: text, + // ? socksProxy: text, + // ? socksVersion: 0..255, + // }, + // Extensible + // }; + acceptInsecureCerts?: boolean; + browserName?: string; + browserVersion?: string; +}; + /** * @internal */ @@ -73,8 +96,19 @@ interface Commands { }; 'session.new': { - params: {capabilities?: Record}; // TODO: Update Types in chromium bidi - returnType: {sessionId: string}; + params: { + // capabilities: session.CapabilitiesRequest + capabilities?: { + // session.CapabilitiesRequest = { + // ? alwaysMatch: session.CapabilityRequest, + // ? firstMatch: [*session.CapabilityRequest] + // } + alwaysMatch?: Capability; + }; + }; // TODO: Update Types in chromium bidi + returnType: { + result: {sessionId: string; capabilities: Capability}; + }; }; 'session.status': { params: object; diff --git a/packages/puppeteer-core/src/node/ProductLauncher.ts b/packages/puppeteer-core/src/node/ProductLauncher.ts index 9b92772f..5910cf05 100644 --- a/packages/puppeteer-core/src/node/ProductLauncher.ts +++ b/packages/puppeteer-core/src/node/ProductLauncher.ts @@ -143,6 +143,7 @@ export class ProductLauncher { protocolTimeout, slowMo, defaultViewport, + ignoreHTTPSErrors, } ); } else { @@ -169,6 +170,7 @@ export class ProductLauncher { protocolTimeout, slowMo, defaultViewport, + ignoreHTTPSErrors, } ); } else { @@ -329,6 +331,7 @@ export class ProductLauncher { protocolTimeout: number | undefined; slowMo: number; defaultViewport: Viewport | null; + ignoreHTTPSErrors?: boolean; } ): Promise { // TODO: use other options too. @@ -341,6 +344,7 @@ export class ProductLauncher { closeCallback, process: browserProcess.nodeProcess, defaultViewport: opts.defaultViewport, + ignoreHTTPSErrors: opts.ignoreHTTPSErrors, }); } @@ -355,6 +359,7 @@ export class ProductLauncher { protocolTimeout: number | undefined; slowMo: number; defaultViewport: Viewport | null; + ignoreHTTPSErrors?: boolean; } ): Promise { const browserWSEndpoint = @@ -377,6 +382,7 @@ export class ProductLauncher { closeCallback, process: browserProcess.nodeProcess, defaultViewport: opts.defaultViewport, + ignoreHTTPSErrors: opts.ignoreHTTPSErrors, }); } diff --git a/test/TestExpectations.json b/test/TestExpectations.json index b0060990..87503a7f 100644 --- a/test/TestExpectations.json +++ b/test/TestExpectations.json @@ -269,6 +269,12 @@ "parameters": ["webDriverBiDi"], "expectations": ["PASS"] }, + { + "testIdPattern": "[browser.spec] Browser specs Browser.version should return version", + "platforms": ["darwin", "linux", "win32"], + "parameters": ["firefox", "webDriverBiDi"], + "expectations": ["PASS"] + }, { "testIdPattern": "[chromiumonly.spec] *", "platforms": ["darwin", "linux", "win32"], diff --git a/test/src/bidi/Connection.spec.ts b/test/src/bidi/Connection.spec.ts index e5cd9de0..1baafa40 100644 --- a/test/src/bidi/Connection.spec.ts +++ b/test/src/bidi/Connection.spec.ts @@ -37,12 +37,10 @@ describe('WebDriver BiDi', () => { const transport = new TestConnectionTransport(); const connection = new Connection(transport); const responsePromise = connection.send('session.new', { - capabilities: { - proxy: {}, - }, + capabilities: {}, }); expect(transport.sent).toEqual([ - `{"id":1,"method":"session.new","params":{"capabilities":{"proxy":{}}}}`, + `{"id":1,"method":"session.new","params":{"capabilities":{}}}`, ]); const id = JSON.parse(transport.sent[0]!).id; const rawResponse = { diff --git a/test/src/browser.spec.ts b/test/src/browser.spec.ts index 2023da0f..dd9700bf 100644 --- a/test/src/browser.spec.ts +++ b/test/src/browser.spec.ts @@ -22,14 +22,12 @@ describe('Browser specs', function () { setupTestBrowserHooks(); describe('Browser.version', function () { - it('should return whether we are in headless', async () => { - const {browser, isHeadless, headless} = getTestState(); + it('should return version', async () => { + const {browser} = getTestState(); const version = await browser.version(); expect(version.length).toBeGreaterThan(0); - expect(version.startsWith('Headless')).toBe( - isHeadless && headless !== 'new' - ); + expect(version.toLowerCase()).atLeastOneToContain(['firefox', 'chrome']); }); });