@@ -29,6 +29,7 @@ import type {
2929 ScreenRecorder ,
3030 SerializedAXNode ,
3131 Viewport ,
32+ Target ,
3233} from './third_party/index.js' ;
3334import { Locator , PredefinedNetworkConditions } from './third_party/index.js' ;
3435import { type ToolGroup } from './tools/inPage.js' ;
@@ -50,6 +51,12 @@ export interface TextSnapshotNode extends SerializedAXNode {
5051 children : TextSnapshotNode [ ] ;
5152}
5253
54+ export interface ExtensionServiceWorker {
55+ url : string ;
56+ target : Target ;
57+ id : string ;
58+ }
59+
5360export interface GeolocationOptions {
5461 latitude : number ;
5562 longitude : number ;
@@ -129,6 +136,8 @@ export class McpContext implements Context {
129136 #nextIsolatedContextId = 1 ;
130137
131138 #pages: Page [ ] = [ ] ;
139+ #extensionServiceWorkers: ExtensionServiceWorker [ ] = [ ] ;
140+
132141 #pageToDevToolsPage = new Map < Page , Page > ( ) ;
133142 #selectedPage?: Page ;
134143 #textSnapshot: TextSnapshot | null = null ;
@@ -147,6 +156,9 @@ export class McpContext implements Context {
147156 #pageIdMap = new WeakMap < Page , number > ( ) ;
148157 #nextPageId = 1 ;
149158
159+ #extensionServiceWorkerMap = new WeakMap < Target , string > ( ) ;
160+ #nextExtensionServiceWorkerId = 1 ;
161+
150162 #nextSnapshotId = 1 ;
151163 #traceResults: TraceResult [ ] = [ ] ;
152164
@@ -186,6 +198,7 @@ export class McpContext implements Context {
186198
187199 async #init( ) {
188200 const pages = await this . createPagesSnapshot ( ) ;
201+ await this . createExtensionServiceWorkersSnapshot ( ) ;
189202 await this . #networkCollector. init ( pages ) ;
190203 await this . #consoleCollector. init ( pages ) ;
191204 await this . #devtoolsUniverseManager. init ( pages ) ;
@@ -495,7 +508,7 @@ export class McpContext implements Context {
495508 }
496509 if ( page . isClosed ( ) ) {
497510 throw new Error (
498- `The selected page has been closed. Call ${ listPages . name } to see open pages.` ,
511+ `The selected page has been closed. Call ${ listPages ( ) . name } to see open pages.` ,
499512 ) ;
500513 }
501514 return page ;
@@ -593,6 +606,41 @@ export class McpContext implements Context {
593606 }
594607 }
595608
609+ /**
610+ * Creates a snapshot of the extension service workers.
611+ */
612+ async createExtensionServiceWorkersSnapshot ( ) : Promise <
613+ ExtensionServiceWorker [ ]
614+ > {
615+ const allTargets = await this . browser . targets ( ) ;
616+
617+ const serviceWorkers = allTargets . filter ( target => {
618+ return (
619+ target . type ( ) === 'service_worker' &&
620+ target . url ( ) . includes ( 'chrome-extension://' )
621+ ) ;
622+ } ) ;
623+
624+ for ( const serviceWorker of serviceWorkers ) {
625+ if ( ! this . #extensionServiceWorkerMap. has ( serviceWorker ) ) {
626+ this . #extensionServiceWorkerMap. set (
627+ serviceWorker ,
628+ 'sw-' + this . #nextExtensionServiceWorkerId++ ,
629+ ) ;
630+ }
631+ }
632+
633+ this . #extensionServiceWorkers = serviceWorkers . map ( serviceWorker => {
634+ return {
635+ target : serviceWorker ,
636+ id : this . #extensionServiceWorkerMap. get ( serviceWorker ) ! ,
637+ url : serviceWorker . url ( ) ,
638+ } ;
639+ } ) ;
640+
641+ return this . #extensionServiceWorkers;
642+ }
643+
596644 async createPagesSnapshot ( ) : Promise < Page [ ] > {
597645 const allPages = await this . #getAllPages( ) ;
598646
@@ -686,6 +734,16 @@ export class McpContext implements Context {
686734 }
687735 }
688736
737+ getExtensionServiceWorkers ( ) : ExtensionServiceWorker [ ] {
738+ return this . #extensionServiceWorkers;
739+ }
740+
741+ getExtensionServiceWorkerId (
742+ extensionServiceWorker : ExtensionServiceWorker ,
743+ ) : string | undefined {
744+ return this . #extensionServiceWorkerMap. get ( extensionServiceWorker . target ) ;
745+ }
746+
689747 getPages ( ) : Page [ ] {
690748 return this . #pages;
691749 }
0 commit comments