@@ -6,6 +6,7 @@ const playwright = require('playwright');
66const { identity, pickBy } = require ( 'lodash' ) ;
77
88var MochaSpecReporter = require ( 'mocha' ) . reporters . Spec ;
9+ const createMochaStatsCollector = require ( 'mocha/lib/stats-collector' ) ;
910
1011var devserver = require ( './dev-server.js' ) ;
1112
@@ -59,20 +60,30 @@ const qs = {
5960testUrl += '?' ;
6061testUrl += new URLSearchParams ( pickBy ( qs , identity ) ) ;
6162
63+ class ArrayMap extends Map {
64+ get ( key ) {
65+ if ( ! this . has ( key ) ) {
66+ this . set ( key , [ ] ) ;
67+ }
68+ return super . get ( key ) ;
69+ }
70+ }
71+
6272class RemoteRunner {
6373 constructor ( browser ) {
6474 this . browser = browser ;
65- this . handlers = { } ;
75+ this . handlers = new ArrayMap ( ) ;
76+ this . onceHandlers = new ArrayMap ( ) ;
6677 this . handleEvent = this . handleEvent . bind ( this ) ;
78+ createMochaStatsCollector ( this ) ;
6779 }
6880
69- on ( name , handler ) {
70- var handlers = this . handlers ;
81+ once ( name , handler ) {
82+ this . onceHandlers . get ( name ) . push ( handler ) ;
83+ }
7184
72- if ( ! handlers [ name ] ) {
73- handlers [ name ] = [ ] ;
74- }
75- handlers [ name ] . push ( handler ) ;
85+ on ( name , handler ) {
86+ this . handlers . get ( name ) . push ( handler ) ;
7687 }
7788
7889 async handleEvent ( event ) {
@@ -83,9 +94,12 @@ class RemoteRunner {
8394 } ;
8495 var obj = Object . assign ( { } , event . obj , additionalProps ) ;
8596
86- this . handlers [ event . name ] . forEach ( function ( handler ) {
87- handler ( obj , event . err ) ;
88- } ) ;
97+ const triggerHandler = handler => handler ( obj , event . err ) ;
98+
99+ this . onceHandlers . get ( event . name ) . forEach ( triggerHandler ) ;
100+ this . onceHandlers . delete ( event . name ) ;
101+
102+ this . handlers . get ( event . name ) . forEach ( triggerHandler ) ;
89103
90104 switch ( event . name ) {
91105 case 'fail' : this . handleFailed ( ) ; break ;
0 commit comments