diff --git a/src/McpContext.ts b/src/McpContext.ts index 59fc72b1..4e4da878 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -45,6 +45,8 @@ export interface TextSnapshot { interface McpContextOptions { // Whether the DevTools windows are exposed as pages for debugging of DevTools. experimentalDevToolsDebugging: boolean; + // Whether all page-like targets are exposed as pages. + experimentalIncludeAllPages?: boolean; } const DEFAULT_TIMEOUT = 5_000; @@ -114,24 +116,32 @@ export class McpContext implements Context { this.#locatorClass = locatorClass; this.#options = options; - this.#networkCollector = new NetworkCollector(this.browser); + this.#networkCollector = new NetworkCollector( + this.browser, + undefined, + this.#options.experimentalIncludeAllPages, + ); - this.#consoleCollector = new PageCollector(this.browser, collect => { - return { - console: event => { - collect(event); - }, - pageerror: event => { - if (event instanceof Error) { + this.#consoleCollector = new PageCollector( + this.browser, + collect => { + return { + console: event => { collect(event); - } else { - const error = new Error(`${event}`); - error.stack = undefined; - collect(error); - } - }, - } as ListenerMap; - }); + }, + pageerror: event => { + if (event instanceof Error) { + collect(event); + } else { + const error = new Error(`${event}`); + error.stack = undefined; + collect(error); + } + }, + } as ListenerMap; + }, + this.#options.experimentalIncludeAllPages, + ); } async #init() { @@ -364,7 +374,9 @@ export class McpContext implements Context { * Creates a snapshot of the pages. */ async createPagesSnapshot(): Promise { - const allPages = await this.browser.pages(); + const allPages = await this.browser.pages( + this.#options.experimentalIncludeAllPages, + ); this.#pages = allPages.filter(page => { // If we allow debugging DevTools windows, return all pages. @@ -382,7 +394,9 @@ export class McpContext implements Context { async detectOpenDevToolsWindows() { this.logger('Detecting open DevTools windows'); - const pages = await this.browser.pages(); + const pages = await this.browser.pages( + this.#options.experimentalIncludeAllPages, + ); this.#pageToDevToolsPage = new Map(); for (const devToolsPage of pages) { if (devToolsPage.url().startsWith('devtools://')) { diff --git a/src/PageCollector.ts b/src/PageCollector.ts index 22b9c7a8..56d29c51 100644 --- a/src/PageCollector.ts +++ b/src/PageCollector.ts @@ -39,6 +39,7 @@ export class PageCollector { ) => ListenerMap; #listeners = new WeakMap(); #maxNavigationSaved = 3; + #includeAllPages?: boolean; /** * This maps a Page to a list of navigations with a sub-list @@ -50,13 +51,15 @@ export class PageCollector { constructor( browser: Browser, listeners: (collector: (item: T) => void) => ListenerMap, + includeAllPages?: boolean, ) { this.#browser = browser; this.#listenersInitializer = listeners; + this.#includeAllPages = includeAllPages; } async init() { - const pages = await this.#browser.pages(); + const pages = await this.#browser.pages(this.#includeAllPages); for (const page of pages) { this.#initializePage(page); } @@ -203,8 +206,9 @@ export class NetworkCollector extends PageCollector { }, } as ListenerMap; }, + includeAllPages?: boolean, ) { - super(browser, listeners); + super(browser, listeners, includeAllPages); } override splitAfterNavigation(page: Page) { const navigations = this.storage.get(page) ?? []; diff --git a/src/cli.ts b/src/cli.ts index b7d7306b..5ce8673e 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -134,6 +134,12 @@ export const cliOptions = { describe: 'Whether to enable automation over DevTools targets', hidden: true, }, + experimentalIncludeAllPages: { + type: 'boolean', + describe: + 'Whether to include all kinds of pages such as webviews or background pages as pages.', + hidden: true, + }, chromeArg: { type: 'array', describe: diff --git a/src/main.ts b/src/main.ts index 395f07a8..18b3a1d9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -83,6 +83,7 @@ async function getContext(): Promise { if (context?.browser !== browser) { context = await McpContext.from(browser, logger, { experimentalDevToolsDebugging: devtools, + experimentalIncludeAllPages: args.experimentalIncludeAllPages, }); } return context;