@@ -54,8 +54,6 @@ export class DOMEvent implements Event {
54
54
Object . defineProperty ( DOMEvent . prototype , 'currentTarget' , { value : null , writable : true } ) ;
55
55
Object . defineProperty ( DOMEvent . prototype , 'target' , { value : null , writable : true } ) ;
56
56
Object . defineProperty ( DOMEvent . prototype , 'propagationState' , { value : EventPropagationState . resume , writable : true } ) ;
57
- Object . defineProperty ( DOMEvent . prototype , 'listeners' , { value : emptyArray , writable : true } ) ;
58
- Object . defineProperty ( DOMEvent . prototype , 'listenersLazyCopy' , { value : emptyArray , writable : true } ) ;
59
57
}
60
58
61
59
declare NONE : 0 ;
@@ -265,7 +263,7 @@ export class DOMEvent implements Event {
265
263
*/
266
264
// Taking multiple params rather than a single property bag saves about 100
267
265
// nanoseconds per call.
268
- dispatchTo ( target : Observable , data : EventData , getGlobalEventHandlersPreHandling ?: ( ) => ListenerEntry [ ] , getGlobalEventHandlersPostHandling ?: ( ) => ListenerEntry [ ] ) : boolean {
266
+ dispatchTo ( target : Observable , data : EventData , getGlobalEventHandlers ?: ( data : EventData , eventType : 'First' | '' ) => readonly ListenerEntry [ ] | undefined ) : boolean {
269
267
if ( this . eventPhase !== DOMEvent . NONE ) {
270
268
throw new Error ( 'Tried to dispatch a dispatching event' ) ;
271
269
}
@@ -306,8 +304,7 @@ export class DOMEvent implements Event {
306
304
// event. This keeps behaviour as consistent with DOM Events as
307
305
// possible.
308
306
309
- this . listeners = getGlobalEventHandlersPreHandling ?.( ) || emptyArray ;
310
- this . handleEvent ( data , true , DOMEvent . CAPTURING_PHASE , removeGlobalEventListener , target . constructor ) ;
307
+ this . handleEvent ( data , true , ( ) => getGlobalEventHandlers ?.( data , 'First' ) || emptyArray , DOMEvent . CAPTURING_PHASE , removeGlobalEventListener , target . constructor ) ;
311
308
312
309
const eventPath = this . getEventPath ( target , 'capture' ) ;
313
310
@@ -319,8 +316,7 @@ export class DOMEvent implements Event {
319
316
this . currentTarget = currentTarget ;
320
317
this . eventPhase = this . target === this . currentTarget ? DOMEvent . AT_TARGET : DOMEvent . CAPTURING_PHASE ;
321
318
322
- this . listeners = currentTarget . getEventList ( this . type ) || emptyArray ;
323
- this . handleEvent ( data , false , DOMEvent . CAPTURING_PHASE , currentTarget . removeEventListener , currentTarget ) ;
319
+ this . handleEvent ( data , false , ( ) => currentTarget . getEventList ( this . type ) || emptyArray , DOMEvent . CAPTURING_PHASE , currentTarget . removeEventListener , currentTarget ) ;
324
320
325
321
if ( this . propagationState !== EventPropagationState . resume ) {
326
322
this . resetForRedispatch ( ) ;
@@ -335,8 +331,7 @@ export class DOMEvent implements Event {
335
331
this . currentTarget = currentTarget ;
336
332
this . eventPhase = this . target === this . currentTarget ? DOMEvent . AT_TARGET : DOMEvent . BUBBLING_PHASE ;
337
333
338
- this . listeners = currentTarget . getEventList ( this . type ) || emptyArray ;
339
- this . handleEvent ( data , false , DOMEvent . BUBBLING_PHASE , currentTarget . removeEventListener , currentTarget ) ;
334
+ this . handleEvent ( data , false , ( ) => currentTarget . getEventList ( this . type ) || emptyArray , DOMEvent . BUBBLING_PHASE , currentTarget . removeEventListener , currentTarget ) ;
340
335
341
336
if ( this . propagationState !== EventPropagationState . resume ) {
342
337
this . resetForRedispatch ( ) ;
@@ -356,24 +351,23 @@ export class DOMEvent implements Event {
356
351
this . eventPhase = DOMEvent . BUBBLING_PHASE ;
357
352
}
358
353
359
- this . listeners = getGlobalEventHandlersPostHandling ?.( ) || emptyArray ;
360
- this . handleEvent ( data , true , DOMEvent . BUBBLING_PHASE , removeGlobalEventListener , target . constructor ) ;
354
+ this . handleEvent ( data , true , ( ) => getGlobalEventHandlers ?.( data , '' ) || emptyArray , DOMEvent . BUBBLING_PHASE , removeGlobalEventListener , target . constructor ) ;
361
355
362
356
this . resetForRedispatch ( ) ;
363
357
return ! this . defaultPrevented ;
364
358
}
365
359
366
360
// Taking multiple params instead of a single property bag saves 250
367
361
// nanoseconds per dispatchTo() call.
368
- private handleEvent ( data : EventData , isGlobal : boolean , phase : 0 | 1 | 2 | 3 , removeEventListener : ( eventName : string , callback ?: any , thisArg ?: any , capture ?: boolean ) => void , removeEventListenerContext : unknown ) {
362
+ private handleEvent ( data : EventData , isGlobal : boolean , getListeners : ( ) => readonly ListenerEntry [ ] , phase : 0 | 1 | 2 | 3 , removeEventListener : ( eventName : string , callback ?: any , thisArg ?: any , capture ?: boolean ) => void , removeEventListenerContext : unknown ) {
369
363
// Clone the array just before any mutations. I tried swapping this out
370
364
// for a copy-on-write array, but as it had to maintain its own array of
371
365
// listeners for any write actions, it actually ran significantly
372
366
// slower.
373
367
//
374
368
// There's no clear observable difference between array spread and slice
375
369
// here, but I think slice has reason to run faster.
376
- const listeners = this . listeners . slice ( ) ;
370
+ const listeners = getListeners ( ) . slice ( ) ;
377
371
378
372
for ( let i = listeners . length - 1 ; i >= 0 ; i -- ) {
379
373
const listener = listeners [ i ] ;
@@ -402,7 +396,7 @@ export class DOMEvent implements Event {
402
396
// MutationSensitiveArray called afterRemoval, similar to
403
397
// beforeMutation) to allow O(1) lookup, but it went 1000 ns slower
404
398
// in practice, so it stays!
405
- if ( ! this . listeners . includes ( listener ) ) {
399
+ if ( ! getListeners ( ) . includes ( listener ) ) {
406
400
continue ;
407
401
}
408
402
@@ -456,6 +450,5 @@ export class DOMEvent implements Event {
456
450
this . target = null ;
457
451
this . eventPhase = DOMEvent . NONE ;
458
452
this . propagationState = EventPropagationState . resume ;
459
- this . listeners = emptyArray ;
460
453
}
461
454
}
0 commit comments