@@ -35,36 +35,37 @@ import type { ClientInfo } from '../utils/mcp/server';
3535import type { Playwright } from '../../client/playwright' ;
3636import type { BrowserInfo } from '../../serverRegistry' ;
3737
38- type ClientInfoEx = ClientInfo & {
39- sessionName ?: string ;
40- workspaceDir ?: string ;
41- } ;
42-
4338type BrowserWithInfo = {
4439 browser : playwright . Browser ,
45- browserInfo : BrowserInfo
40+ browserInfo : BrowserInfo ,
41+ canBind : boolean ,
4642} ;
4743
48- export async function createBrowser ( config : FullConfig , clientInfo : ClientInfoEx ) : Promise < playwright . Browser > {
44+ export async function createBrowser ( config : FullConfig , clientInfo : ClientInfo ) : Promise < playwright . Browser > {
4945 const { browser } = await createBrowserWithInfo ( config , clientInfo ) ;
5046 return browser ;
5147}
5248
53- export async function createBrowserWithInfo ( config : FullConfig , clientInfo : ClientInfoEx ) : Promise < BrowserWithInfo > {
49+ export async function createBrowserWithInfo ( config : FullConfig , clientInfo : ClientInfo ) : Promise < BrowserWithInfo > {
5450 if ( config . browser . remoteEndpoint )
5551 return await createRemoteBrowser ( config ) ;
5652
5753 let browser : playwright . Browser ;
58- if ( config . browser . cdpEndpoint )
59- browser = await createCDPBrowser ( config , clientInfo ) ;
60- else if ( config . browser . isolated )
54+ let canBind = false ;
55+ if ( config . browser . cdpEndpoint ) {
56+ browser = await createCDPBrowser ( config ) ;
57+ canBind = true ;
58+ } else if ( config . browser . isolated ) {
6159 browser = await createIsolatedBrowser ( config , clientInfo ) ;
62- else if ( config . extension )
63- browser = await createExtensionBrowser ( config , clientInfo ) ;
64- else
60+ canBind = true ;
61+ } else if ( config . extension ) {
62+ browser = await createExtensionBrowser ( config , clientInfo . clientName ) ;
63+ } else {
6564 browser = await createPersistentBrowser ( config , clientInfo ) ;
65+ canBind = true ;
66+ }
6667
67- return { browser, browserInfo : browserInfo ( browser , config ) } ;
68+ return { browser, browserInfo : browserInfo ( browser , config ) , canBind } ;
6869}
6970
7071export interface BrowserContextFactory {
@@ -82,7 +83,7 @@ function browserInfo(browser: playwright.Browser, config: FullConfig): BrowserIn
8283 } ;
8384}
8485
85- async function createIsolatedBrowser ( config : FullConfig , clientInfo : ClientInfoEx ) : Promise < playwright . Browser > {
86+ async function createIsolatedBrowser ( config : FullConfig , clientInfo : ClientInfo ) : Promise < playwright . Browser > {
8687 testDebug ( 'create browser (isolated)' ) ;
8788 await injectCdpPort ( config . browser ) ;
8889 const browserType = playwright [ config . browser . browserName ] ;
@@ -97,17 +98,15 @@ async function createIsolatedBrowser(config: FullConfig, clientInfo: ClientInfoE
9798 throwBrowserIsNotInstalledError ( config ) ;
9899 throw error ;
99100 } ) ;
100- await startServer ( browser , clientInfo ) ;
101101 return browser ;
102102}
103103
104- async function createCDPBrowser ( config : FullConfig , clientInfo : ClientInfoEx ) : Promise < playwright . Browser > {
104+ async function createCDPBrowser ( config : FullConfig ) : Promise < playwright . Browser > {
105105 testDebug ( 'create browser (cdp)' ) ;
106106 const browser = await playwright . chromium . connectOverCDP ( config . browser . cdpEndpoint ! , {
107107 headers : config . browser . cdpHeaders ,
108108 timeout : config . browser . cdpTimeout
109109 } ) ;
110- await startServer ( browser , clientInfo ) ;
111110 return browser ;
112111}
113112
@@ -123,7 +122,8 @@ async function createRemoteBrowser(config: FullConfig): Promise<BrowserWithInfo>
123122 browserName : descriptor . browser . browserName ,
124123 launchOptions : descriptor . browser . launchOptions ,
125124 userDataDir : descriptor . browser . userDataDir
126- }
125+ } ,
126+ canBind : false ,
127127 } ;
128128 }
129129
@@ -132,10 +132,10 @@ async function createRemoteBrowser(config: FullConfig): Promise<BrowserWithInfo>
132132 // Use connectToBrowser instead of playwright[browserName].connect because we don't have browserName.
133133 const browser = await connectToBrowser ( playwrightObject , { endpoint } ) ;
134134 browser . _connectToBrowserType ( playwrightObject [ browser . _browserName ] , { } , undefined ) ;
135- return { browser, browserInfo : browserInfo ( browser , config ) } ;
135+ return { browser, browserInfo : browserInfo ( browser , config ) , canBind : false } ;
136136}
137137
138- async function createPersistentBrowser ( config : FullConfig , clientInfo : ClientInfoEx ) : Promise < playwright . Browser > {
138+ async function createPersistentBrowser ( config : FullConfig , clientInfo : ClientInfo ) : Promise < playwright . Browser > {
139139 testDebug ( 'create browser (persistent)' ) ;
140140 await injectCdpPort ( config . browser ) ;
141141 const userDataDir = config . browser . userDataDir ?? await createUserDataDir ( config , clientInfo ) ;
@@ -162,7 +162,6 @@ async function createPersistentBrowser(config: FullConfig, clientInfo: ClientInf
162162 try {
163163 const browserContext = await browserType . launchPersistentContext ( userDataDir , launchOptions ) ;
164164 const browser = browserContext . browser ( ) ! ;
165- await startServer ( browser , clientInfo ) ;
166165 return browser ;
167166 } catch ( error : any ) {
168167 if ( error . message . includes ( 'Executable doesn\'t exist' ) )
@@ -254,8 +253,3 @@ function throwBrowserIsNotInstalledError(config: FullConfig): never {
254253 else
255254 throw new Error ( `Browser "${ channel } " is not installed. Run \`npx @playwright/mcp install-browser ${ channel } \` to install` ) ;
256255}
257-
258- async function startServer ( browser : playwright . Browser , clientInfo : ClientInfoEx ) {
259- if ( clientInfo . sessionName )
260- await browser . bind ( clientInfo . sessionName , { workspaceDir : clientInfo . workspaceDir } ) ;
261- }
0 commit comments