Skip to content

Commit 7c8c5d5

Browse files
committed
refactor: connect to DevTools targets by default
1 parent fc2f058 commit 7c8c5d5

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

src/McpContext.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ export interface TextSnapshot {
3939
snapshotId: string;
4040
}
4141

42+
interface McpContextOptions {
43+
// Whether the DevTools windows are exposed as pages.
44+
devtools: boolean,
45+
}
46+
4247
const DEFAULT_TIMEOUT = 5_000;
4348
const NAVIGATION_TIMEOUT = 10_000;
4449

@@ -92,15 +97,18 @@ export class McpContext implements Context {
9297
#traceResults: TraceResult[] = [];
9398

9499
#locatorClass: typeof Locator;
100+
#options: McpContextOptions;
95101

96102
private constructor(
97103
browser: Browser,
98104
logger: Debugger,
105+
options: McpContextOptions,
99106
locatorClass: typeof Locator,
100107
) {
101108
this.browser = browser;
102109
this.logger = logger;
103110
this.#locatorClass = locatorClass;
111+
this.#options = options;
104112

105113
this.#networkCollector = new NetworkCollector(this.browser);
106114

@@ -132,10 +140,11 @@ export class McpContext implements Context {
132140
static async from(
133141
browser: Browser,
134142
logger: Debugger,
143+
opts: McpContextOptions,
135144
/* Let tests use unbundled Locator class to avoid overly strict checks within puppeteer that fail when mixing bundled and unbundled class instances */
136145
locatorClass: typeof Locator = Locator,
137146
) {
138-
const context = new McpContext(browser, logger, locatorClass);
147+
const context = new McpContext(browser, logger, opts, locatorClass);
139148
await context.#init();
140149
return context;
141150
}
@@ -315,7 +324,12 @@ export class McpContext implements Context {
315324
* Creates a snapshot of the pages.
316325
*/
317326
async createPagesSnapshot(): Promise<Page[]> {
318-
this.#pages = await this.browser.pages();
327+
this.#pages = (await this.browser.pages()).filter(page => {
328+
if (this.#options.devtools) {
329+
return true;
330+
}
331+
return !page.url().startsWith('devtools://');
332+
});
319333
return this.#pages;
320334
}
321335

src/browser.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,13 @@ import {puppeteer} from './third_party/index.js';
1818

1919
let browser: Browser | undefined;
2020

21-
function makeTargetFilter(devtools: boolean) {
21+
function makeTargetFilter() {
2222
const ignoredPrefixes = new Set([
2323
'chrome://',
2424
'chrome-extension://',
2525
'chrome-untrusted://',
2626
]);
2727

28-
if (!devtools) {
29-
ignoredPrefixes.add('devtools://');
30-
}
3128
return function targetFilter(target: Target): boolean {
3229
if (target.url() === 'chrome://newtab/') {
3330
return true;
@@ -52,7 +49,7 @@ export async function ensureBrowserConnected(options: {
5249
}
5350

5451
const connectOptions: Parameters<typeof puppeteer.connect>[0] = {
55-
targetFilter: makeTargetFilter(options.devtools),
52+
targetFilter: makeTargetFilter(),
5653
defaultViewport: null,
5754
handleDevToolsAsPage: options.devtools,
5855
};
@@ -129,7 +126,7 @@ export async function launch(options: McpLaunchOptions): Promise<Browser> {
129126
try {
130127
const browser = await puppeteer.launch({
131128
channel: puppeteerChannel,
132-
targetFilter: makeTargetFilter(options.devtools),
129+
targetFilter: makeTargetFilter(),
133130
executablePath,
134131
defaultViewport: null,
135132
userDataDir,

src/main.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ async function getContext(): Promise<McpContext> {
8181
});
8282

8383
if (context?.browser !== browser) {
84-
context = await McpContext.from(browser, logger);
84+
context = await McpContext.from(browser, logger, {
85+
devtools,
86+
});
8587
}
8688
return context;
8789
}

tests/utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ export async function withBrowser(
3636
}),
3737
);
3838
const response = new McpResponse();
39-
const context = await McpContext.from(browser, logger('test'), Locator);
39+
const context = await McpContext.from(browser, logger('test'), {
40+
devtools: false,
41+
}, Locator);
4042

4143
await cb(response, context);
4244
}

0 commit comments

Comments
 (0)