diff --git a/extensions/browser/src/browser/chrome-mcp.ts b/extensions/browser/src/browser/chrome-mcp.ts index 7bf1b9bd612..a940bd0fbb8 100644 --- a/extensions/browser/src/browser/chrome-mcp.ts +++ b/extensions/browser/src/browser/chrome-mcp.ts @@ -463,37 +463,6 @@ async function getExistingSession( } } -async function waitForChromeMcpReady( - session: ChromeMcpSession, - profileName: string, - timeoutMs?: number, -): Promise { - if (!timeoutMs || timeoutMs <= 0) { - await session.ready; - return; - } - - let timer: ReturnType | undefined; - try { - await Promise.race([ - session.ready, - new Promise((_, reject) => { - timer = setTimeout(() => { - reject( - new BrowserProfileUnavailableError( - `Chrome MCP existing-session attach for profile "${profileName}" timed out after ${timeoutMs}ms.`, - ), - ); - }, timeoutMs); - }), - ]); - } finally { - if (timer) { - clearTimeout(timer); - } - } -} - async function createEphemeralSession( profileName: string, userDataDir?: string, diff --git a/extensions/browser/src/browser/pw-session.ts b/extensions/browser/src/browser/pw-session.ts index 6a81cfd04f9..18e8b442ce6 100644 --- a/extensions/browser/src/browser/pw-session.ts +++ b/extensions/browser/src/browser/pw-session.ts @@ -886,22 +886,6 @@ export async function gotoPageWithNavigationGuard( } } -export async function getPageForTargetId(opts: { - cdpUrl: string; - targetId?: string; -}): Promise { - const reusedCachedBrowser = hasCachedPlaywrightBrowserConnection(opts.cdpUrl); - try { - return await getPageForTargetIdOnce(opts); - } catch (err) { - if (!isRecoverableStalePageSelectionError(err, reusedCachedBrowser)) { - throw err; - } - await closePlaywrightBrowserConnection({ cdpUrl: opts.cdpUrl }); - return await getPageForTargetIdOnce(opts); - } -} - export function refLocator(page: Page, ref: string) { const normalized = ref.startsWith("@") ? ref.slice(1) diff --git a/extensions/browser/src/browser/server-context.availability.ts b/extensions/browser/src/browser/server-context.availability.ts index 2a74f778900..480bf048b5a 100644 --- a/extensions/browser/src/browser/server-context.availability.ts +++ b/extensions/browser/src/browser/server-context.availability.ts @@ -90,6 +90,7 @@ export function createProfileAvailability({ const isTransportAvailable = async (timeoutMs?: number) => { if (capabilities.usesChromeMcp) { + const { ensureChromeMcpAvailable } = await getChromeMcpModule(); await ensureChromeMcpAvailable(profile.name, profile.userDataDir, { ephemeral: true, timeoutMs, diff --git a/extensions/browser/src/browser/server-context.existing-session.test.ts b/extensions/browser/src/browser/server-context.existing-session.test.ts index 38c582b2db6..619ec502909 100644 --- a/extensions/browser/src/browser/server-context.existing-session.test.ts +++ b/extensions/browser/src/browser/server-context.existing-session.test.ts @@ -3,7 +3,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import "../../test-support/browser-security-runtime.mock.js"; import type { BrowserServerState } from "./server-context.js"; -vi.mock("./chrome-mcp.js", () => ({ +const chromeMcpMock = vi.hoisted(() => ({ closeChromeMcpSession: vi.fn(async () => true), ensureChromeMcpAvailable: vi.fn(async () => {}), focusChromeMcpTab: vi.fn(async () => {}), @@ -20,8 +20,14 @@ vi.mock("./chrome-mcp.js", () => ({ getChromeMcpPid: vi.fn(() => 4321), })); +vi.mock("./chrome-mcp.js", () => chromeMcpMock); + +vi.mock("./chrome-mcp.runtime.js", () => ({ + getChromeMcpModule: vi.fn(async () => chromeMcpMock), +})); + const { createBrowserRouteContext } = await import("./server-context.js"); -const chromeMcp = await import("./chrome-mcp.js"); +const chromeMcp = chromeMcpMock; function makeState(): BrowserServerState { return { @@ -93,7 +99,8 @@ describe("browser server-context existing-session profile", () => { vi.mocked(chromeMcp.ensureChromeMcpAvailable).mockResolvedValueOnce(); vi.mocked(chromeMcp.listChromeMcpTabs).mockRejectedValueOnce(new Error("No page selected")); - await expect(ctx.listProfiles()).resolves.toEqual([ + const profiles = await ctx.listProfiles(); + expect(profiles).toEqual([ expect.objectContaining({ name: "chrome-live", transport: "chrome-mcp",