@@ -92,6 +92,38 @@ export class FrameContextManager {
9292 }
9393
9494 removeFrame ( frameId : string ) : void {
95+ // 1. Clean execution contexts
96+ const contextId = this . frameExecutionContexts . get ( frameId ) ;
97+ if ( contextId !== undefined ) {
98+ this . executionContextToFrame . delete ( contextId ) ;
99+ this . frameExecutionContexts . delete ( frameId ) ;
100+ }
101+
102+ const waiters = this . executionContextWaiters . get ( frameId ) ;
103+ if ( waiters ) {
104+ for ( const waiter of waiters ) {
105+ if ( waiter . timeoutId ) clearTimeout ( waiter . timeoutId ) ;
106+ waiter . resolve ( undefined ) ;
107+ }
108+ this . executionContextWaiters . delete ( frameId ) ;
109+ }
110+
111+ // 2. Clean session listeners
112+ const session = this . sessions . get ( frameId ) ;
113+ if ( session ) {
114+ const listeners = this . sessionListeners . get ( session ) ;
115+ if ( listeners ) {
116+ for ( const { event, handler } of listeners ) {
117+ session . off ?.( event , handler ) ;
118+ }
119+ this . sessionListeners . delete ( session ) ;
120+ }
121+ }
122+
123+ // 3. Clean OOPIF set
124+ this . oopifFrameIds . delete ( frameId ) ;
125+
126+ // 4. Remove from graph and sessions
95127 this . graph . removeFrame ( frameId ) ;
96128 this . sessions . delete ( frameId ) ;
97129 }
@@ -388,7 +420,11 @@ export class FrameContextManager {
388420 this . log (
389421 `[FrameContext] Frame ${ frame . url ( ) } is detached, removing cached record`
390422 ) ;
423+ const frameId = cachedRecord . frameId ;
391424 this . removeCachedPlaywrightFrame ( frame ) ;
425+ if ( frameId ) {
426+ this . removeFrame ( frameId ) ;
427+ }
392428 return null ;
393429 }
394430 cachedRecord . url = frame . url ( ) ;
@@ -439,6 +475,7 @@ export class FrameContextManager {
439475 } ;
440476 const detachHandler = ( ) : void => {
441477 this . removeCachedPlaywrightFrame ( frame ) ;
478+ this . removeFrame ( frameId ) ;
442479 oopifSession ?. off ?.( "Detached" , detachHandler ) ;
443480 } ;
444481 record . detachHandler = detachHandler ;
0 commit comments