@@ -29,6 +29,7 @@ import type {
2929 ScreenRecorder ,
3030 SerializedAXNode ,
3131 Viewport ,
32+ Target ,
3233} from './third_party/index.js' ;
3334import { Locator } from './third_party/index.js' ;
3435import { PredefinedNetworkConditions } from './third_party/index.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 ;
@@ -146,6 +155,9 @@ export class McpContext implements Context {
146155 #pageIdMap = new WeakMap < Page , number > ( ) ;
147156 #nextPageId = 1 ;
148157
158+ #extensionServiceWorkerMap = new WeakMap < Target , string > ( ) ;
159+ #nextExtensionServiceWorkerId = 1 ;
160+
149161 #nextSnapshotId = 1 ;
150162 #traceResults: TraceResult [ ] = [ ] ;
151163
@@ -185,6 +197,7 @@ export class McpContext implements Context {
185197
186198 async #init( ) {
187199 const pages = await this . createPagesSnapshot ( ) ;
200+ await this . createExtensionServiceWorkersSnapshot ( ) ;
188201 await this . #networkCollector. init ( pages ) ;
189202 await this . #consoleCollector. init ( pages ) ;
190203 await this . #devtoolsUniverseManager. init ( pages ) ;
@@ -494,7 +507,7 @@ export class McpContext implements Context {
494507 }
495508 if ( page . isClosed ( ) ) {
496509 throw new Error (
497- `The selected page has been closed. Call ${ listPages . name } to see open pages.` ,
510+ `The selected page has been closed. Call ${ listPages ( ) . name } to see open pages.` ,
498511 ) ;
499512 }
500513 return page ;
@@ -584,6 +597,41 @@ export class McpContext implements Context {
584597 }
585598 }
586599
600+ /**
601+ * Creates a snapshot of the extension service workers.
602+ */
603+ async createExtensionServiceWorkersSnapshot ( ) : Promise <
604+ ExtensionServiceWorker [ ]
605+ > {
606+ const allTargets = await this . browser . targets ( ) ;
607+
608+ const serviceWorkers = allTargets . filter ( target => {
609+ return (
610+ target . type ( ) === 'service_worker' &&
611+ target . url ( ) . includes ( 'chrome-extension://' )
612+ ) ;
613+ } ) ;
614+
615+ for ( const serviceWorker of serviceWorkers ) {
616+ if ( ! this . #extensionServiceWorkerMap. has ( serviceWorker ) ) {
617+ this . #extensionServiceWorkerMap. set (
618+ serviceWorker ,
619+ 'sw-' + this . #nextExtensionServiceWorkerId++ ,
620+ ) ;
621+ }
622+ }
623+
624+ this . #extensionServiceWorkers = serviceWorkers . map ( serviceWorker => {
625+ return {
626+ target : serviceWorker ,
627+ id : this . #extensionServiceWorkerMap. get ( serviceWorker ) ! ,
628+ url : serviceWorker . url ( ) ,
629+ } ;
630+ } ) ;
631+
632+ return this . #extensionServiceWorkers;
633+ }
634+
587635 async createPagesSnapshot ( ) : Promise < Page [ ] > {
588636 const allPages = await this . #getAllPages( ) ;
589637
@@ -677,6 +725,16 @@ export class McpContext implements Context {
677725 }
678726 }
679727
728+ getExtensionServiceWorkers ( ) : ExtensionServiceWorker [ ] {
729+ return this . #extensionServiceWorkers;
730+ }
731+
732+ getExtensionServiceWorkerId (
733+ extensionServiceWorker : ExtensionServiceWorker ,
734+ ) : string | undefined {
735+ return this . #extensionServiceWorkerMap. get ( extensionServiceWorker . target ) ;
736+ }
737+
680738 getPages ( ) : Page [ ] {
681739 return this . #pages;
682740 }
0 commit comments