From 592e159fb7557464930f1286a0f36a5796998ac4 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Tue, 11 Apr 2023 11:20:45 +0200 Subject: [PATCH] chore: tab wip --- docs/api/puppeteer.target.type.md | 5 ++-- packages/puppeteer-core/src/common/Browser.ts | 10 ++++++-- .../src/common/ChromeTargetManager.ts | 25 ++++++++++++++++--- packages/puppeteer-core/src/common/Target.ts | 6 +++-- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/docs/api/puppeteer.target.type.md b/docs/api/puppeteer.target.type.md index 39c573445e0ca..7abed51a0e83d 100644 --- a/docs/api/puppeteer.target.type.md +++ b/docs/api/puppeteer.target.type.md @@ -17,13 +17,14 @@ class Target { | 'shared_worker' | 'other' | 'browser' - | 'webview'; + | 'webview' + | 'tab'; } ``` **Returns:** -'page' \| 'background_page' \| 'service_worker' \| 'shared_worker' \| 'other' \| 'browser' \| 'webview' +'page' \| 'background_page' \| 'service_worker' \| 'shared_worker' \| 'other' \| 'browser' \| 'webview' \| 'tab' ## Remarks diff --git a/packages/puppeteer-core/src/common/Browser.ts b/packages/puppeteer-core/src/common/Browser.ts index 6a2b46f2e2072..810cccb699af4 100644 --- a/packages/puppeteer-core/src/common/Browser.ts +++ b/packages/puppeteer-core/src/common/Browser.ts @@ -415,7 +415,9 @@ export class CDPBrowser extends BrowserBase { url: 'about:blank', browserContextId: contextId || undefined, }); - const target = this.#targetManager.getAvailableTargets().get(targetId); + const target = await this.waitForTarget(t => { + return t._targetId === targetId; + }); if (!target) { throw new Error(`Missing target for page (id = ${targetId})`); } @@ -615,7 +617,11 @@ export class CDPBrowserContext extends BrowserContext { options: {timeout?: number} = {} ): Promise { return this.#browser.waitForTarget(target => { - return target.browserContext() === this && predicate(target); + return ( + target.browserContext() === this && + target._getTargetInfo().type !== 'tab' && + predicate(target) + ); }, options); } diff --git a/packages/puppeteer-core/src/common/ChromeTargetManager.ts b/packages/puppeteer-core/src/common/ChromeTargetManager.ts index 58c8353aadbcf..da10270ae3eae 100644 --- a/packages/puppeteer-core/src/common/ChromeTargetManager.ts +++ b/packages/puppeteer-core/src/common/ChromeTargetManager.ts @@ -84,6 +84,9 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { #initializePromise = createDeferredPromise(); #targetsIdsForInit: Set = new Set(); + #tabMode = false; + #discoveryFilter = this.#tabMode ? [{}] : [{type: 'tab', exclude: true}, {}]; + constructor( connection: Connection, targetFactory: TargetFactory, @@ -103,7 +106,7 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { this.#connection .send('Target.setDiscoverTargets', { discover: true, - filter: [{type: 'tab', exclude: true}, {}], + filter: this.#discoveryFilter, }) .then(this.#storeExistingTargetsForInit) .catch(debugError); @@ -129,6 +132,15 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { waitForDebuggerOnStart: true, flatten: true, autoAttach: true, + filter: this.#tabMode + ? [ + { + type: 'page', + exclude: true, + }, + ...this.#discoveryFilter, + ] + : this.#discoveryFilter, }); this.#finishInitializationIfReady(); await this.#initializePromise; @@ -144,7 +156,13 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { } getAvailableTargets(): Map { - return this.#attachedTargetsByTargetId; + const result = new Map(); + for (const [id, target] of this.#attachedTargetsByTargetId.entries()) { + if (target.type() !== 'tab') { + result.set(id, target); + } + } + return result; } addTargetInterceptor( @@ -359,7 +377,7 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { } this.#targetsIdsForInit.delete(target._targetId); - if (!existingTarget) { + if (!existingTarget && target.type() !== 'tab') { this.emit(TargetManagerEmittedEvents.TargetAvailable, target); } this.#finishInitializationIfReady(); @@ -371,6 +389,7 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { waitForDebuggerOnStart: true, flatten: true, autoAttach: true, + filter: this.#discoveryFilter, }), session.send('Runtime.runIfWaitingForDebugger'), ]).catch(debugError); diff --git a/packages/puppeteer-core/src/common/Target.ts b/packages/puppeteer-core/src/common/Target.ts index fd9b5f9f27d5d..9a46d29a83694 100644 --- a/packages/puppeteer-core/src/common/Target.ts +++ b/packages/puppeteer-core/src/common/Target.ts @@ -226,7 +226,8 @@ export class Target { | 'shared_worker' | 'other' | 'browser' - | 'webview' { + | 'webview' + | 'tab' { const type = this.#targetInfo.type; if ( type === 'page' || @@ -234,7 +235,8 @@ export class Target { type === 'service_worker' || type === 'shared_worker' || type === 'browser' || - type === 'webview' + type === 'webview' || + type === 'tab' ) { return type; }