@@ -8,6 +8,7 @@ import fs from 'node:fs/promises';
88import os from 'node:os' ;
99import path from 'node:path' ;
1010
11+ import type { ParsedArguments } from './cli.js' ;
1112import type { TargetUniverse } from './DevtoolsUtils.js' ;
1213import {
1314 extractUrlLikeFromDevToolsTitle ,
@@ -29,6 +30,7 @@ import type {
2930 ScreenRecorder ,
3031 SerializedAXNode ,
3132 Viewport ,
33+ Target ,
3234} from './third_party/index.js' ;
3335import { Locator } from './third_party/index.js' ;
3436import { PredefinedNetworkConditions } from './third_party/index.js' ;
@@ -50,6 +52,12 @@ export interface TextSnapshotNode extends SerializedAXNode {
5052 children : TextSnapshotNode [ ] ;
5153}
5254
55+ export interface ExtensionServiceWorker {
56+ url : string ;
57+ target : Target ;
58+ id : string ;
59+ }
60+
5361export interface GeolocationOptions {
5462 latitude : number ;
5563 longitude : number ;
@@ -129,6 +137,8 @@ export class McpContext implements Context {
129137 #nextIsolatedContextId = 1 ;
130138
131139 #pages: Page [ ] = [ ] ;
140+ #extensionServiceWorkers: ExtensionServiceWorker [ ] = [ ] ;
141+
132142 #pageToDevToolsPage = new Map < Page , Page > ( ) ;
133143 #selectedPage?: Page ;
134144 #textSnapshot: TextSnapshot | null = null ;
@@ -146,6 +156,9 @@ export class McpContext implements Context {
146156 #pageIdMap = new WeakMap < Page , number > ( ) ;
147157 #nextPageId = 1 ;
148158
159+ #extensionServiceWorkerMap = new WeakMap < Target , string > ( ) ;
160+ #nextExtensionServiceWorkerId = 1 ;
161+
149162 #nextSnapshotId = 1 ;
150163 #traceResults: TraceResult [ ] = [ ] ;
151164
@@ -185,6 +198,7 @@ export class McpContext implements Context {
185198
186199 async #init( ) {
187200 const pages = await this . createPagesSnapshot ( ) ;
201+ await this . createExtensionServiceWorkersSnapshot ( ) ;
188202 await this . #networkCollector. init ( pages ) ;
189203 await this . #consoleCollector. init ( pages ) ;
190204 await this . #devtoolsUniverseManager. init ( pages ) ;
@@ -494,7 +508,7 @@ export class McpContext implements Context {
494508 }
495509 if ( page . isClosed ( ) ) {
496510 throw new Error (
497- `The selected page has been closed. Call ${ listPages . name } to see open pages.` ,
511+ `The selected page has been closed. Call ${ listPages ( { } as ParsedArguments ) . name } to see open pages.` ,
498512 ) ;
499513 }
500514 return page ;
@@ -584,6 +598,41 @@ export class McpContext implements Context {
584598 }
585599 }
586600
601+ /**
602+ * Creates a snapshot of the extension service workers.
603+ */
604+ async createExtensionServiceWorkersSnapshot ( ) : Promise <
605+ ExtensionServiceWorker [ ]
606+ > {
607+ const allTargets = await this . browser . targets ( ) ;
608+
609+ const serviceWorkers = allTargets . filter ( target => {
610+ return (
611+ target . type ( ) === 'service_worker' &&
612+ target . url ( ) . includes ( 'chrome-extension://' )
613+ ) ;
614+ } ) ;
615+
616+ for ( const serviceWorker of serviceWorkers ) {
617+ if ( ! this . #extensionServiceWorkerMap. has ( serviceWorker ) ) {
618+ this . #extensionServiceWorkerMap. set (
619+ serviceWorker ,
620+ 'sw-' + this . #nextExtensionServiceWorkerId++ ,
621+ ) ;
622+ }
623+ }
624+
625+ this . #extensionServiceWorkers = serviceWorkers . map ( serviceWorker => {
626+ return {
627+ target : serviceWorker ,
628+ id : this . #extensionServiceWorkerMap. get ( serviceWorker ) ! ,
629+ url : serviceWorker . url ( ) ,
630+ } ;
631+ } ) ;
632+
633+ return this . #extensionServiceWorkers;
634+ }
635+
587636 async createPagesSnapshot ( ) : Promise < Page [ ] > {
588637 const allPages = await this . #getAllPages( ) ;
589638
@@ -677,6 +726,16 @@ export class McpContext implements Context {
677726 }
678727 }
679728
729+ getExtensionServiceWorkers ( ) : ExtensionServiceWorker [ ] {
730+ return this . #extensionServiceWorkers;
731+ }
732+
733+ getExtensionServiceWorkerId (
734+ extensionServiceWorker : ExtensionServiceWorker ,
735+ ) : string | undefined {
736+ return this . #extensionServiceWorkerMap. get ( extensionServiceWorker . target ) ;
737+ }
738+
680739 getPages ( ) : Page [ ] {
681740 return this . #pages;
682741 }
0 commit comments