@@ -120,8 +120,6 @@ export class McpContext implements Context {
120120 null ;
121121 #focusedPagePerContext = new Map < BrowserContext , Page > ( ) ;
122122
123- #requestPage?: ContextPage ;
124-
125123 #nextPageId = 1 ;
126124
127125 #extensionServiceWorkerMap = new WeakMap < Target , string > ( ) ;
@@ -196,17 +194,6 @@ export class McpContext implements Context {
196194 return context ;
197195 }
198196
199- // TODO: Refactor away mutable request state (e.g. per-request facade,
200- // per-request context object, or another approach). Once resolved, the
201- // global toolMutex could become per-BrowserContext for parallel execution.
202- setRequestPage ( page ?: ContextPage ) : void {
203- this . #requestPage = page ;
204- }
205-
206- #resolveTargetPage( ) : Page {
207- return this . #requestPage?. pptrPage ?? this . getSelectedPptrPage ( ) ;
208- }
209-
210197 resolveCdpRequestId ( page : McpPage , cdpRequestId : string ) : number | undefined {
211198 if ( ! cdpRequestId ) {
212199 this . logger ( 'no network request' ) ;
@@ -250,20 +237,28 @@ export class McpContext implements Context {
250237 return ;
251238 }
252239
253- getNetworkRequests ( includePreservedRequests ?: boolean ) : HTTPRequest [ ] {
254- const page = this . #resolveTargetPage( ) ;
255- return this . #networkCollector. getData ( page , includePreservedRequests ) ;
240+ getNetworkRequests (
241+ page : McpPage ,
242+ includePreservedRequests ?: boolean ,
243+ ) : HTTPRequest [ ] {
244+ return this . #networkCollector. getData (
245+ page . pptrPage ,
246+ includePreservedRequests ,
247+ ) ;
256248 }
257249
258250 getConsoleData (
251+ page : McpPage ,
259252 includePreservedMessages ?: boolean ,
260253 ) : Array < ConsoleMessage | Error | DevTools . AggregatedIssue | UncaughtError > {
261- const page = this . #resolveTargetPage( ) ;
262- return this . #consoleCollector. getData ( page , includePreservedMessages ) ;
254+ return this . #consoleCollector. getData (
255+ page . pptrPage ,
256+ includePreservedMessages ,
257+ ) ;
263258 }
264259
265- getDevToolsUniverse ( ) : TargetUniverse | null {
266- return this . #devtoolsUniverseManager. get ( this . #resolveTargetPage ( ) ) ;
260+ getDevToolsUniverse ( page : McpPage ) : TargetUniverse | null {
261+ return this . #devtoolsUniverseManager. get ( page . pptrPage ) ;
267262 }
268263
269264 getConsoleMessageStableId (
@@ -273,15 +268,16 @@ export class McpContext implements Context {
273268 }
274269
275270 getConsoleMessageById (
271+ page : McpPage ,
276272 id : number ,
277273 ) : ConsoleMessage | Error | DevTools . AggregatedIssue | UncaughtError {
278- return this . #consoleCollector. getById ( this . #resolveTargetPage ( ) , id ) ;
274+ return this . #consoleCollector. getById ( page . pptrPage , id ) ;
279275 }
280276
281277 async newPage (
282278 background ?: boolean ,
283279 isolatedContextName ?: string ,
284- ) : Promise < ContextPage > {
280+ ) : Promise < McpPage > {
285281 let page : Page ;
286282 if ( isolatedContextName !== undefined ) {
287283 let ctx = this . #isolatedContexts. get ( isolatedContextName ) ;
@@ -316,15 +312,13 @@ export class McpContext implements Context {
316312 await page . close ( { runBeforeUnload : false } ) ;
317313 }
318314
319- getNetworkRequestById ( reqid : number ) : HTTPRequest {
320- return this . #networkCollector. getById ( this . #resolveTargetPage ( ) , reqid ) ;
315+ getNetworkRequestById ( page : McpPage , reqid : number ) : HTTPRequest {
316+ return this . #networkCollector. getById ( page . pptrPage , reqid ) ;
321317 }
322318
323- async restoreEmulation ( targetPage ?: Page ) {
324- const page = targetPage ?? this . getSelectedPptrPage ( ) ;
325- const mcpPage = this . #getMcpPage( page ) ;
326- const currentSetting = mcpPage . emulationSettings ;
327- await this . emulate ( currentSetting , targetPage ) ;
319+ async restoreEmulation ( page : McpPage ) {
320+ const currentSetting = page . emulationSettings ;
321+ await this . emulate ( currentSetting , page . pptrPage ) ;
328322 }
329323
330324 async emulate (
@@ -440,30 +434,6 @@ export class McpContext implements Context {
440434 }
441435 }
442436
443- getNetworkConditions ( ) : string | null {
444- return this . #getMcpPage( this . #resolveTargetPage( ) ) . networkConditions ;
445- }
446-
447- getCpuThrottlingRate ( ) : number {
448- return this . #getMcpPage( this . #resolveTargetPage( ) ) . cpuThrottlingRate ;
449- }
450-
451- getGeolocation ( ) : GeolocationOptions | null {
452- return this . #getMcpPage( this . #resolveTargetPage( ) ) . geolocation ;
453- }
454-
455- getViewport ( ) : Viewport | null {
456- return this . #getMcpPage( this . #resolveTargetPage( ) ) . viewport ;
457- }
458-
459- getUserAgent ( ) : string | null {
460- return this . #getMcpPage( this . #resolveTargetPage( ) ) . userAgent ;
461- }
462-
463- getColorScheme ( ) : 'dark' | 'light' | null {
464- return this . #getMcpPage( this . #resolveTargetPage( ) ) . colorScheme ;
465- }
466-
467437 setIsRunningPerformanceTrace ( x : boolean ) : void {
468438 this . #isRunningTrace = x ;
469439 }
@@ -573,23 +543,20 @@ export class McpContext implements Context {
573543 }
574544
575545 #updateSelectedPageTimeouts( ) {
576- const page = this . getSelectedPptrPage ( ) ;
546+ const page = this . #getSelectedMcpPage ( ) ;
577547 // For waiters 5sec timeout should be sufficient.
578548 // Increased in case we throttle the CPU
579- const cpuMultiplier = this . getCpuThrottlingRate ( ) ;
580- page . setDefaultTimeout ( DEFAULT_TIMEOUT * cpuMultiplier ) ;
549+ const cpuMultiplier = page . cpuThrottlingRate ;
550+ page . pptrPage . setDefaultTimeout ( DEFAULT_TIMEOUT * cpuMultiplier ) ;
581551 // 10sec should be enough for the load event to be emitted during
582552 // navigations.
583553 // Increased in case we throttle the network requests
584554 const networkMultiplier = getNetworkMultiplierFromString (
585- this . getNetworkConditions ( ) ,
555+ page . networkConditions ,
556+ ) ;
557+ page . pptrPage . setDefaultNavigationTimeout (
558+ NAVIGATION_TIMEOUT * networkMultiplier ,
586559 ) ;
587- page . setDefaultNavigationTimeout ( NAVIGATION_TIMEOUT * networkMultiplier ) ;
588- }
589-
590- getNavigationTimeout ( ) {
591- const page = this . #resolveTargetPage( ) ;
592- return page . getDefaultNavigationTimeout ( ) ;
593560 }
594561
595562 // Linear scan over per-page snapshots. The page count is small (typically
@@ -858,11 +825,10 @@ export class McpContext implements Context {
858825 return this . #mcpPages. get ( page ) ?. devToolsPage ;
859826 }
860827
861- async getDevToolsData ( ) : Promise < DevToolsData > {
828+ async getDevToolsData ( page : McpPage ) : Promise < DevToolsData > {
862829 try {
863830 this . logger ( 'Getting DevTools UI data' ) ;
864- const selectedPage = this . #resolveTargetPage( ) ;
865- const devtoolsPage = this . getDevToolsPage ( selectedPage ) ;
831+ const devtoolsPage = this . getDevToolsPage ( page . pptrPage ) ;
866832 if ( ! devtoolsPage ) {
867833 this . logger ( 'No DevTools page detected' ) ;
868834 return { } ;
@@ -896,21 +862,19 @@ export class McpContext implements Context {
896862 * Creates a text snapshot of a page.
897863 */
898864 async createTextSnapshot (
865+ page : McpPage ,
899866 verbose = false ,
900867 devtoolsData : DevToolsData | undefined = undefined ,
901- targetPage ?: Page ,
902868 ) : Promise < void > {
903- const page = targetPage ?? this . getSelectedPptrPage ( ) ;
904- const mcpPage = this . #getMcpPage( page ) ;
905- const rootNode = await page . accessibility . snapshot ( {
869+ const rootNode = await page . pptrPage . accessibility . snapshot ( {
906870 includeIframes : true ,
907871 interestingOnly : ! verbose ,
908872 } ) ;
909873 if ( ! rootNode ) {
910874 return ;
911875 }
912876
913- const { uniqueBackendNodeIdToMcpId} = mcpPage ;
877+ const { uniqueBackendNodeIdToMcpId} = page ;
914878
915879 const snapshotId = this . #nextSnapshotId++ ;
916880 // Iterate through the whole accessibility node tree and assign node ids that
@@ -961,12 +925,12 @@ export class McpContext implements Context {
961925 hasSelectedElement : false ,
962926 verbose,
963927 } ;
964- mcpPage . textSnapshot = snapshot ;
965- const data = devtoolsData ?? ( await this . getDevToolsData ( ) ) ;
928+ page . textSnapshot = snapshot ;
929+ const data = devtoolsData ?? ( await this . getDevToolsData ( page ) ) ;
966930 if ( data ?. cdpBackendNodeId ) {
967931 snapshot . hasSelectedElement = true ;
968932 snapshot . selectedElementUid = this . resolveCdpElementId (
969- mcpPage ,
933+ page ,
970934 data ?. cdpBackendNodeId ,
971935 ) ;
972936 }
@@ -1041,13 +1005,13 @@ export class McpContext implements Context {
10411005 action : ( ) => Promise < unknown > ,
10421006 options ?: { timeout ?: number } ,
10431007 ) : Promise < void > {
1044- const page = this . getSelectedPptrPage ( ) ;
1045- const cpuMultiplier = this . getCpuThrottlingRate ( ) ;
1008+ const page = this . #getSelectedMcpPage ( ) ;
1009+ const cpuMultiplier = page . cpuThrottlingRate ;
10461010 const networkMultiplier = getNetworkMultiplierFromString (
1047- this . getNetworkConditions ( ) ,
1011+ page . networkConditions ,
10481012 ) ;
10491013 const waitForHelper = this . getWaitForHelper (
1050- page ,
1014+ page . pptrPage ,
10511015 cpuMultiplier ,
10521016 networkMultiplier ,
10531017 ) ;
0 commit comments