@@ -34,8 +34,9 @@ import { WebSocketRouteDispatcher } from './webSocketRouteDispatcher';
34
34
import { WritableStreamDispatcher } from './writableStreamDispatcher' ;
35
35
import { createGuid } from '../utils/crypto' ;
36
36
import { urlMatches } from '../../utils/isomorphic/urlMatch' ;
37
- import { Recorder } from '../recorder' ;
37
+ import { Recorder , RecorderEvent } from '../recorder' ;
38
38
import { RecorderApp } from '../recorder/recorderApp' ;
39
+ import { eventsHelper , RegisteredListener } from '../utils/eventsHelper' ;
39
40
40
41
import type { Artifact } from '../artifact' ;
41
42
import type { ConsoleMessage } from '../console' ;
@@ -45,6 +46,7 @@ import type { InitScript, Page, PageBinding } from '../page';
45
46
import type { DispatcherScope } from './dispatcher' ;
46
47
import type * as channels from '@protocol/channels' ;
47
48
import type { Progress } from '@protocol/progress' ;
49
+ import type * as actions from '@recorder/actions' ;
48
50
49
51
export class BrowserContextDispatcher extends Dispatcher < BrowserContext , channels . BrowserContextChannel , DispatcherScope > implements channels . BrowserContextChannel {
50
52
_type_EventTarget = true ;
@@ -59,6 +61,7 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
59
61
private _requestInterceptor : RouteHandler ;
60
62
private _interceptionUrlMatchers : ( string | RegExp ) [ ] = [ ] ;
61
63
private _routeWebSocketInitScript : InitScript | undefined ;
64
+ private _recorderListeners : RegisteredListener [ ] = [ ] ;
62
65
63
66
static from ( parentScope : DispatcherScope , context : BrowserContext ) : BrowserContextDispatcher {
64
67
const result = parentScope . connection . existingDispatcher < BrowserContextDispatcher > ( context ) ;
@@ -200,9 +203,6 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
200
203
page : PageDispatcher . fromNullable ( this , request . frame ( ) ?. _page . initializedOrUndefined ( ) ) ,
201
204
} ) ;
202
205
} ) ;
203
- this . addObjectListener ( BrowserContext . Events . RecorderEvent , ( { event, data, page, code } : { event : 'actionAdded' | 'actionUpdated' | 'signalAdded' , data : any , page : Page , code : string } ) => {
204
- this . _dispatchEvent ( 'recorderEvent' , { event, data, code, page : PageDispatcher . from ( this , page ) } ) ;
205
- } ) ;
206
206
}
207
207
208
208
private _shouldDispatchNetworkEvent ( request : Request , event : channels . BrowserContextUpdateSubscriptionParams [ 'event' ] & channels . PageUpdateSubscriptionParams [ 'event' ] ) : boolean {
@@ -340,13 +340,37 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
340
340
}
341
341
342
342
async enableRecorder ( params : channels . BrowserContextEnableRecorderParams , progress : Progress ) : Promise < void > {
343
- await RecorderApp . show ( this . _context , params ) ;
343
+ if ( params . recorderMode !== 'api' ) {
344
+ await RecorderApp . show ( this . _context , params ) ;
345
+ return ;
346
+ }
347
+
348
+ const findPageByGuid = ( guid : string ) => this . _context . pages ( ) . find ( p => p . guid === guid ) ;
349
+ const recorder = await Recorder . forContext ( this . _context , params ) ;
350
+ this . _recorderListeners = [
351
+ eventsHelper . addEventListener ( recorder , RecorderEvent . ActionAdded , ( action : actions . ActionInContext ) => {
352
+ const page = findPageByGuid ( action . frame . pageGuid ) ;
353
+ if ( page )
354
+ this . _dispatchEvent ( 'recorderEvent' , { event : 'actionAdded' , data : action , page : PageDispatcher . from ( this , page ) } ) ;
355
+ } ) ,
356
+ eventsHelper . addEventListener ( recorder , RecorderEvent . ActionUpdated , ( action : actions . ActionInContext ) => {
357
+ const page = findPageByGuid ( action . frame . pageGuid ) ;
358
+ if ( page )
359
+ this . _dispatchEvent ( 'recorderEvent' , { event : 'actionUpdated' , data : action , page : PageDispatcher . from ( this , page ) } ) ;
360
+ } ) ,
361
+ eventsHelper . addEventListener ( recorder , RecorderEvent . SignalAdded , ( signal : actions . SignalInContext ) => {
362
+ const page = findPageByGuid ( signal . frame . pageGuid ) ;
363
+ if ( page )
364
+ this . _dispatchEvent ( 'recorderEvent' , { event : 'signalAdded' , data : signal , page : PageDispatcher . from ( this , page ) } ) ;
365
+ } ) ,
366
+ ] ;
344
367
}
345
368
346
369
async disableRecorder ( params : channels . BrowserContextDisableRecorderParams , progress : Progress ) : Promise < void > {
347
370
const recorder = Recorder . existingForContext ( this . _context ) ;
348
371
if ( recorder )
349
372
recorder . setMode ( 'none' ) ;
373
+ eventsHelper . removeEventListeners ( this . _recorderListeners ) ;
350
374
}
351
375
352
376
async pause ( params : channels . BrowserContextPauseParams , progress : Progress ) {
@@ -442,5 +466,6 @@ export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channel
442
466
if ( this . _clockPaused )
443
467
this . _context . clock . resumeNoReply ( ) ;
444
468
this . _clockPaused = false ;
469
+ eventsHelper . removeEventListeners ( this . _recorderListeners ) ;
445
470
}
446
471
}
0 commit comments