diff --git a/src/McpContext.ts b/src/McpContext.ts index eb12e7da8..adee09212 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -39,6 +39,11 @@ export interface TextSnapshot { snapshotId: string; } +interface McpContextOptions { + // Whether the DevTools windows are exposed as pages. + devtools: boolean; +} + const DEFAULT_TIMEOUT = 5_000; const NAVIGATION_TIMEOUT = 10_000; @@ -92,15 +97,18 @@ export class McpContext implements Context { #traceResults: TraceResult[] = []; #locatorClass: typeof Locator; + #options: McpContextOptions; private constructor( browser: Browser, logger: Debugger, + options: McpContextOptions, locatorClass: typeof Locator, ) { this.browser = browser; this.logger = logger; this.#locatorClass = locatorClass; + this.#options = options; this.#networkCollector = new NetworkCollector(this.browser); @@ -132,10 +140,11 @@ export class McpContext implements Context { static async from( browser: Browser, logger: Debugger, + opts: McpContextOptions, /* Let tests use unbundled Locator class to avoid overly strict checks within puppeteer that fail when mixing bundled and unbundled class instances */ locatorClass: typeof Locator = Locator, ) { - const context = new McpContext(browser, logger, locatorClass); + const context = new McpContext(browser, logger, opts, locatorClass); await context.#init(); return context; } @@ -315,7 +324,12 @@ export class McpContext implements Context { * Creates a snapshot of the pages. */ async createPagesSnapshot(): Promise { - this.#pages = await this.browser.pages(); + this.#pages = (await this.browser.pages()).filter(page => { + if (page.url().startsWith('devtools://')) { + return this.#options.devtools; + } + return true; + }); return this.#pages; } diff --git a/src/browser.ts b/src/browser.ts index 1947651b9..88765a7d0 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -18,16 +18,13 @@ import {puppeteer} from './third_party/index.js'; let browser: Browser | undefined; -function makeTargetFilter(devtools: boolean) { +function makeTargetFilter() { const ignoredPrefixes = new Set([ 'chrome://', 'chrome-extension://', 'chrome-untrusted://', ]); - if (!devtools) { - ignoredPrefixes.add('devtools://'); - } return function targetFilter(target: Target): boolean { if (target.url() === 'chrome://newtab/') { return true; @@ -52,7 +49,7 @@ export async function ensureBrowserConnected(options: { } const connectOptions: Parameters[0] = { - targetFilter: makeTargetFilter(options.devtools), + targetFilter: makeTargetFilter(), defaultViewport: null, handleDevToolsAsPage: options.devtools, }; @@ -129,7 +126,7 @@ export async function launch(options: McpLaunchOptions): Promise { try { const browser = await puppeteer.launch({ channel: puppeteerChannel, - targetFilter: makeTargetFilter(options.devtools), + targetFilter: makeTargetFilter(), executablePath, defaultViewport: null, userDataDir, diff --git a/src/main.ts b/src/main.ts index 6dd783fbd..38f39cbe9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -81,7 +81,9 @@ async function getContext(): Promise { }); if (context?.browser !== browser) { - context = await McpContext.from(browser, logger); + context = await McpContext.from(browser, logger, { + devtools, + }); } return context; } diff --git a/tests/utils.ts b/tests/utils.ts index 17e86ca24..0c071f90d 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -36,7 +36,14 @@ export async function withBrowser( }), ); const response = new McpResponse(); - const context = await McpContext.from(browser, logger('test'), Locator); + const context = await McpContext.from( + browser, + logger('test'), + { + devtools: false, + }, + Locator, + ); await cb(response, context); }