@@ -331,7 +331,9 @@ export function patchEventTarget(
331331 return function ( ) {
332332 const target = this || _global ;
333333 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 ) {
335337 return nativeListener . apply ( this , arguments ) ;
336338 }
337339
@@ -488,6 +490,10 @@ export function patchEventTarget(
488490 }
489491
490492 proto [ REMOVE_EVENT_LISTENER ] = function ( ) {
493+ const delegate = arguments [ 1 ] ;
494+ if ( ! delegate ) {
495+ return nativeRemoveEventListener . apply ( this , arguments ) ;
496+ }
491497 const target = this || _global ;
492498 const eventName = arguments [ 0 ] ;
493499 const options = arguments [ 2 ] ;
@@ -503,11 +509,6 @@ export function patchEventTarget(
503509 capture = options ? ! ! options . capture : false ;
504510 }
505511
506- const delegate = arguments [ 1 ] ;
507- if ( ! delegate ) {
508- return nativeRemoveEventListener . apply ( this , arguments ) ;
509- }
510-
511512 if ( validateHandler &&
512513 ! validateHandler ( nativeRemoveEventListener , delegate , target , arguments ) ) {
513514 return ;
@@ -553,11 +554,32 @@ export function patchEventTarget(
553554
554555 const listeners : any [ ] = [ ] ;
555556 const tasks = findEventTasks ( target , eventName ) ;
557+ const invokes : any [ ] | null = nativeListeners ? [ ] : null ;
556558
557559 for ( let i = 0 ; i < tasks . length ; i ++ ) {
558560 const task : any = tasks [ i ] ;
559561 let delegate = task . originalDelegate ? task . originalDelegate : task . callback ;
560562 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+ }
561583 }
562584 return listeners ;
563585 } ;
@@ -580,8 +602,12 @@ export function patchEventTarget(
580602 this [ REMOVE_ALL_LISTENERS_EVENT_LISTENER ] . call ( this , evtName ) ;
581603 }
582604 }
583- // remove removeListener listener finally
605+ // call native again in case some event handler was not
606+ // use patched version of addListener
584607 this [ REMOVE_ALL_LISTENERS_EVENT_LISTENER ] . call ( this , 'removeListener' ) ;
608+ if ( nativeRemoveAllListeners ) {
609+ nativeRemoveAllListeners . call ( this ) ;
610+ }
585611 } else {
586612 const symbolEventNames = zoneSymbolEventNames [ eventName ] ;
587613 if ( symbolEventNames ) {
@@ -609,6 +635,10 @@ export function patchEventTarget(
609635 }
610636 }
611637 }
638+
639+ if ( nativeRemoveAllListeners ) {
640+ nativeRemoveAllListeners . call ( this , eventName ) ;
641+ }
612642 }
613643
614644 if ( returnTarget ) {
0 commit comments