@@ -331,7 +331,9 @@ export function patchEventTarget(
331
331
return function ( ) {
332
332
const target = this || _global ;
333
333
let delegate = arguments [ 1 ] ;
334
- if ( ! delegate ) {
334
+ // if handler is not available or we are in root zone
335
+ // use nativeListener
336
+ if ( ! delegate || Zone . current === Zone . root ) {
335
337
return nativeListener . apply ( this , arguments ) ;
336
338
}
337
339
@@ -488,6 +490,10 @@ export function patchEventTarget(
488
490
}
489
491
490
492
proto [ REMOVE_EVENT_LISTENER ] = function ( ) {
493
+ const delegate = arguments [ 1 ] ;
494
+ if ( ! delegate ) {
495
+ return nativeRemoveEventListener . apply ( this , arguments ) ;
496
+ }
491
497
const target = this || _global ;
492
498
const eventName = arguments [ 0 ] ;
493
499
const options = arguments [ 2 ] ;
@@ -503,11 +509,6 @@ export function patchEventTarget(
503
509
capture = options ? ! ! options . capture : false ;
504
510
}
505
511
506
- const delegate = arguments [ 1 ] ;
507
- if ( ! delegate ) {
508
- return nativeRemoveEventListener . apply ( this , arguments ) ;
509
- }
510
-
511
512
if ( validateHandler &&
512
513
! validateHandler ( nativeRemoveEventListener , delegate , target , arguments ) ) {
513
514
return ;
@@ -553,11 +554,32 @@ export function patchEventTarget(
553
554
554
555
const listeners : any [ ] = [ ] ;
555
556
const tasks = findEventTasks ( target , eventName ) ;
557
+ const invokes : any [ ] | null = nativeListeners ? [ ] : null ;
556
558
557
559
for ( let i = 0 ; i < tasks . length ; i ++ ) {
558
560
const task : any = tasks [ i ] ;
559
561
let delegate = task . originalDelegate ? task . originalDelegate : task . callback ;
560
562
listeners . push ( delegate ) ;
563
+ if ( invokes ) {
564
+ invokes . push ( task . invoke ) ;
565
+ }
566
+ }
567
+ if ( nativeListeners ) {
568
+ const natives = nativeListeners . apply ( this , arguments ) ;
569
+ if ( natives && invokes ) {
570
+ natives . forEach ( ( n : any ) => {
571
+ let found = false ;
572
+ for ( let i = 0 ; i < invokes . length ; i ++ ) {
573
+ if ( invokes [ i ] === n ) {
574
+ found = true ;
575
+ break ;
576
+ }
577
+ }
578
+ if ( ! found ) {
579
+ listeners . push ( n ) ;
580
+ }
581
+ } ) ;
582
+ }
561
583
}
562
584
return listeners ;
563
585
} ;
@@ -580,8 +602,12 @@ export function patchEventTarget(
580
602
this [ REMOVE_ALL_LISTENERS_EVENT_LISTENER ] . call ( this , evtName ) ;
581
603
}
582
604
}
583
- // remove removeListener listener finally
605
+ // call native again in case some event handler was not
606
+ // use patched version of addListener
584
607
this [ REMOVE_ALL_LISTENERS_EVENT_LISTENER ] . call ( this , 'removeListener' ) ;
608
+ if ( nativeRemoveAllListeners ) {
609
+ nativeRemoveAllListeners . call ( this ) ;
610
+ }
585
611
} else {
586
612
const symbolEventNames = zoneSymbolEventNames [ eventName ] ;
587
613
if ( symbolEventNames ) {
@@ -609,6 +635,10 @@ export function patchEventTarget(
609
635
}
610
636
}
611
637
}
638
+
639
+ if ( nativeRemoveAllListeners ) {
640
+ nativeRemoveAllListeners . call ( this , eventName ) ;
641
+ }
612
642
}
613
643
614
644
if ( returnTarget ) {
0 commit comments