Skip to content

Commit 01454d4

Browse files
authored
chore: experimental includeAllPages option (#517)
1 parent d90abd4 commit 01454d4

File tree

4 files changed

+45
-20
lines changed

4 files changed

+45
-20
lines changed

src/McpContext.ts

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export interface TextSnapshot {
4545
interface McpContextOptions {
4646
// Whether the DevTools windows are exposed as pages for debugging of DevTools.
4747
experimentalDevToolsDebugging: boolean;
48+
// Whether all page-like targets are exposed as pages.
49+
experimentalIncludeAllPages?: boolean;
4850
}
4951

5052
const DEFAULT_TIMEOUT = 5_000;
@@ -114,24 +116,32 @@ export class McpContext implements Context {
114116
this.#locatorClass = locatorClass;
115117
this.#options = options;
116118

117-
this.#networkCollector = new NetworkCollector(this.browser);
119+
this.#networkCollector = new NetworkCollector(
120+
this.browser,
121+
undefined,
122+
this.#options.experimentalIncludeAllPages,
123+
);
118124

119-
this.#consoleCollector = new PageCollector(this.browser, collect => {
120-
return {
121-
console: event => {
122-
collect(event);
123-
},
124-
pageerror: event => {
125-
if (event instanceof Error) {
125+
this.#consoleCollector = new PageCollector(
126+
this.browser,
127+
collect => {
128+
return {
129+
console: event => {
126130
collect(event);
127-
} else {
128-
const error = new Error(`${event}`);
129-
error.stack = undefined;
130-
collect(error);
131-
}
132-
},
133-
} as ListenerMap;
134-
});
131+
},
132+
pageerror: event => {
133+
if (event instanceof Error) {
134+
collect(event);
135+
} else {
136+
const error = new Error(`${event}`);
137+
error.stack = undefined;
138+
collect(error);
139+
}
140+
},
141+
} as ListenerMap;
142+
},
143+
this.#options.experimentalIncludeAllPages,
144+
);
135145
}
136146

137147
async #init() {
@@ -364,7 +374,9 @@ export class McpContext implements Context {
364374
* Creates a snapshot of the pages.
365375
*/
366376
async createPagesSnapshot(): Promise<Page[]> {
367-
const allPages = await this.browser.pages();
377+
const allPages = await this.browser.pages(
378+
this.#options.experimentalIncludeAllPages,
379+
);
368380

369381
this.#pages = allPages.filter(page => {
370382
// If we allow debugging DevTools windows, return all pages.
@@ -382,7 +394,9 @@ export class McpContext implements Context {
382394

383395
async detectOpenDevToolsWindows() {
384396
this.logger('Detecting open DevTools windows');
385-
const pages = await this.browser.pages();
397+
const pages = await this.browser.pages(
398+
this.#options.experimentalIncludeAllPages,
399+
);
386400
this.#pageToDevToolsPage = new Map<Page, Page>();
387401
for (const devToolsPage of pages) {
388402
if (devToolsPage.url().startsWith('devtools://')) {

src/PageCollector.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export class PageCollector<T> {
3939
) => ListenerMap<PageEvents>;
4040
#listeners = new WeakMap<Page, ListenerMap>();
4141
#maxNavigationSaved = 3;
42+
#includeAllPages?: boolean;
4243

4344
/**
4445
* This maps a Page to a list of navigations with a sub-list
@@ -50,13 +51,15 @@ export class PageCollector<T> {
5051
constructor(
5152
browser: Browser,
5253
listeners: (collector: (item: T) => void) => ListenerMap<PageEvents>,
54+
includeAllPages?: boolean,
5355
) {
5456
this.#browser = browser;
5557
this.#listenersInitializer = listeners;
58+
this.#includeAllPages = includeAllPages;
5659
}
5760

5861
async init() {
59-
const pages = await this.#browser.pages();
62+
const pages = await this.#browser.pages(this.#includeAllPages);
6063
for (const page of pages) {
6164
this.#initializePage(page);
6265
}
@@ -203,8 +206,9 @@ export class NetworkCollector extends PageCollector<HTTPRequest> {
203206
},
204207
} as ListenerMap;
205208
},
209+
includeAllPages?: boolean,
206210
) {
207-
super(browser, listeners);
211+
super(browser, listeners, includeAllPages);
208212
}
209213
override splitAfterNavigation(page: Page) {
210214
const navigations = this.storage.get(page) ?? [];

src/cli.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ export const cliOptions = {
134134
describe: 'Whether to enable automation over DevTools targets',
135135
hidden: true,
136136
},
137+
experimentalIncludeAllPages: {
138+
type: 'boolean',
139+
describe:
140+
'Whether to include all kinds of pages such as webviews or background pages as pages.',
141+
hidden: true,
142+
},
137143
chromeArg: {
138144
type: 'array',
139145
describe:

src/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ async function getContext(): Promise<McpContext> {
8383
if (context?.browser !== browser) {
8484
context = await McpContext.from(browser, logger, {
8585
experimentalDevToolsDebugging: devtools,
86+
experimentalIncludeAllPages: args.experimentalIncludeAllPages,
8687
});
8788
}
8889
return context;

0 commit comments

Comments
 (0)