diff --git a/docs/api/puppeteer.targetfiltercallback.md b/docs/api/puppeteer.targetfiltercallback.md index 45efa95f909..77611196ca0 100644 --- a/docs/api/puppeteer.targetfiltercallback.md +++ b/docs/api/puppeteer.targetfiltercallback.md @@ -7,7 +7,7 @@ sidebar_label: TargetFilterCallback #### Signature: ```typescript -export type TargetFilterCallback = ( - target: Protocol.Target.TargetInfo -) => boolean; +export type TargetFilterCallback = (target: Target) => boolean; ``` + +**References:** [Target](./puppeteer.target.md) diff --git a/packages/puppeteer-core/src/api/Browser.ts b/packages/puppeteer-core/src/api/Browser.ts index 46623737feb..a5cbf99da71 100644 --- a/packages/puppeteer-core/src/api/Browser.ts +++ b/packages/puppeteer-core/src/api/Browser.ts @@ -51,16 +51,12 @@ export type BrowserCloseCallback = () => Promise | void; /** * @public */ -export type TargetFilterCallback = ( - target: Protocol.Target.TargetInfo -) => boolean; +export type TargetFilterCallback = (target: Target) => boolean; /** * @internal */ -export type IsPageTargetCallback = ( - target: Protocol.Target.TargetInfo -) => boolean; +export type IsPageTargetCallback = (target: Target) => boolean; /** * @internal diff --git a/packages/puppeteer-core/src/common/Browser.ts b/packages/puppeteer-core/src/common/Browser.ts index 10926fb7d92..95aa64f3878 100644 --- a/packages/puppeteer-core/src/common/Browser.ts +++ b/packages/puppeteer-core/src/common/Browser.ts @@ -226,11 +226,11 @@ export class CDPBrowser extends BrowserBase { #setIsPageTargetCallback(isPageTargetCallback?: IsPageTargetCallback): void { this.#isPageTargetCallback = isPageTargetCallback || - ((target: Protocol.Target.TargetInfo): boolean => { + ((target: Target): boolean => { return ( - target.type === 'page' || - target.type === 'background_page' || - target.type === 'webview' + target.type() === 'page' || + target.type() === 'background_page' || + target.type() === 'webview' ); }); } @@ -326,7 +326,14 @@ export class CDPBrowser extends BrowserBase { const createSession = (isAutoAttachEmulated: boolean) => { return this.#connection._createSession(targetInfo, isAutoAttachEmulated); }; - if (this.#isPageTargetCallback(targetInfo)) { + const targetForFilter = new OtherTarget( + targetInfo, + session, + context, + this.#targetManager, + createSession + ); + if (this.#isPageTargetCallback(targetForFilter)) { return new PageTarget( targetInfo, session, @@ -638,9 +645,7 @@ export class CDPBrowserContext extends BrowserContext { return ( target.type() === 'page' || (target.type() === 'other' && - this.#browser._getIsPageTargetCallback()?.( - target._getTargetInfo() - )) + this.#browser._getIsPageTargetCallback()?.(target)) ); }) .map(target => { diff --git a/packages/puppeteer-core/src/common/ChromeTargetManager.ts b/packages/puppeteer-core/src/common/ChromeTargetManager.ts index f80cbb842b1..d14605872b4 100644 --- a/packages/puppeteer-core/src/common/ChromeTargetManager.ts +++ b/packages/puppeteer-core/src/common/ChromeTargetManager.ts @@ -115,9 +115,16 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { targetId, targetInfo, ] of this.#discoveredTargetsByTargetId.entries()) { + const targetForFilter = new Target( + targetInfo, + undefined, + undefined, + this, + undefined + ); if ( (!this.#targetFilterCallback || - this.#targetFilterCallback(targetInfo)) && + this.#targetFilterCallback(targetForFilter)) && targetInfo.type !== 'browser' ) { this.#targetsIdsForInit.add(targetId); @@ -339,7 +346,7 @@ export class ChromeTargetManager extends EventEmitter implements TargetManager { ? this.#attachedTargetsByTargetId.get(targetInfo.targetId)! : this.#targetFactory(targetInfo, session); - if (this.#targetFilterCallback && !this.#targetFilterCallback(targetInfo)) { + if (this.#targetFilterCallback && !this.#targetFilterCallback(target)) { this.#ignoredTargets.add(targetInfo.targetId); this.#finishInitializationIfReady(targetInfo.targetId); await silentDetach(); diff --git a/packages/puppeteer-core/src/common/FirefoxTargetManager.ts b/packages/puppeteer-core/src/common/FirefoxTargetManager.ts index b798180c8e4..6477de4b066 100644 --- a/packages/puppeteer-core/src/common/FirefoxTargetManager.ts +++ b/packages/puppeteer-core/src/common/FirefoxTargetManager.ts @@ -194,10 +194,7 @@ export class FirefoxTargetManager } const target = this.#targetFactory(event.targetInfo, undefined); - if ( - this.#targetFilterCallback && - !this.#targetFilterCallback(event.targetInfo) - ) { + if (this.#targetFilterCallback && !this.#targetFilterCallback(target)) { this.#ignoredTargets.add(event.targetInfo.targetId); this.#finishInitializationIfReady(event.targetInfo.targetId); return; diff --git a/packages/puppeteer-core/src/common/Target.ts b/packages/puppeteer-core/src/common/Target.ts index 559cd1d95aa..594027cc7d4 100644 --- a/packages/puppeteer-core/src/common/Target.ts +++ b/packages/puppeteer-core/src/common/Target.ts @@ -46,11 +46,13 @@ export enum InitializationStatus { * @public */ export class Target { - #browserContext: BrowserContext; + #browserContext?: BrowserContext; #session?: CDPSession; #targetInfo: Protocol.Target.TargetInfo; - #targetManager: TargetManager; - #sessionFactory: (isAutoAttachEmulated: boolean) => Promise; + #targetManager?: TargetManager; + #sessionFactory: + | ((isAutoAttachEmulated: boolean) => Promise) + | undefined; /** * @internal @@ -73,9 +75,11 @@ export class Target { constructor( targetInfo: Protocol.Target.TargetInfo, session: CDPSession | undefined, - browserContext: BrowserContext, - targetManager: TargetManager, - sessionFactory: (isAutoAttachEmulated: boolean) => Promise + browserContext: BrowserContext | undefined, + targetManager: TargetManager | undefined, + sessionFactory: + | ((isAutoAttachEmulated: boolean) => Promise) + | undefined ) { this.#session = session; this.#targetManager = targetManager; @@ -98,6 +102,9 @@ export class Target { protected _sessionFactory(): ( isAutoAttachEmulated: boolean ) => Promise { + if (!this.#sessionFactory) { + throw new Error('sessionFactory is not initialized'); + } return this.#sessionFactory; } @@ -105,6 +112,9 @@ export class Target { * Creates a Chrome Devtools Protocol session attached to the target. */ createCDPSession(): Promise { + if (!this.#sessionFactory) { + throw new Error('sessionFactory is not initialized'); + } return this.#sessionFactory(false); } @@ -112,6 +122,9 @@ export class Target { * @internal */ _targetManager(): TargetManager { + if (!this.#targetManager) { + throw new Error('targetManager is not initialized'); + } return this.#targetManager; } @@ -166,6 +179,9 @@ export class Target { * Get the browser the target belongs to. */ browser(): Browser { + if (!this.#browserContext) { + throw new Error('browserContext is not initialised'); + } return this.#browserContext.browser(); } @@ -173,6 +189,9 @@ export class Target { * Get the browser context the target belongs to. */ browserContext(): BrowserContext { + if (!this.#browserContext) { + throw new Error('browserContext is not initialised'); + } return this.#browserContext; } diff --git a/test/src/headful.spec.ts b/test/src/headful.spec.ts index 4049dc8a4d6..f058823ffe1 100644 --- a/test/src/headful.spec.ts +++ b/test/src/headful.spec.ts @@ -171,7 +171,7 @@ const serviceWorkerExtensionPath = path.join( browserWSEndpoint, _isPageTarget(target) { return ( - target.type === 'other' && target.url.startsWith('devtools://') + target.type() === 'other' && target.url().startsWith('devtools://') ); }, }); diff --git a/test/src/launcher.spec.ts b/test/src/launcher.spec.ts index aefab91b37a..fbabe55b6a8 100644 --- a/test/src/launcher.spec.ts +++ b/test/src/launcher.spec.ts @@ -19,7 +19,6 @@ import os from 'os'; import path from 'path'; import {TLSSocket} from 'tls'; -import {Protocol} from 'devtools-protocol'; import expect from 'expect'; import {TimeoutError} from 'puppeteer'; import {Page} from 'puppeteer-core/internal/api/Page.js'; @@ -709,7 +708,7 @@ describe('Launcher specs', function () { const {browser, close} = await launch( { targetFilter: target => { - return target.type !== 'page'; + return target.type() !== 'page'; }, waitForInitialPage: false, }, @@ -746,8 +745,8 @@ describe('Launcher specs', function () { const remoteBrowser = await puppeteer.connect({ browserWSEndpoint, - targetFilter: (targetInfo: Protocol.Target.TargetInfo) => { - return !targetInfo.url?.includes('should-be-ignored'); + targetFilter: target => { + return !target.url().includes('should-be-ignored'); }, });