@@ -255,6 +255,46 @@ export function main() {
255255 expect ( receivedEvents ) . toEqual ( [ ] ) ;
256256 } ) ;
257257
258+ it ( 'should be able to remove event listener which was added inside of ngZone' , ( ) => {
259+ const Zone = ( window as any ) [ 'Zone' ] ;
260+
261+ const element = el ( '<div><div></div></div>' ) ;
262+ getDOM ( ) . appendChild ( doc . body , element ) ;
263+ const dispatchedEvent = getDOM ( ) . createMouseEvent ( 'click' ) ;
264+ let receivedEvents : any [ ] /** TODO #9100 */ = [ ] ;
265+ let receivedZones : any [ ] = [ ] ;
266+ const handler1 = ( e : any /** TODO #9100 */ ) => {
267+ receivedEvents . push ( e ) ;
268+ receivedZones . push ( Zone . current . name ) ;
269+ } ;
270+ const handler2 = ( e : any /** TODO #9100 */ ) => {
271+ receivedEvents . push ( e ) ;
272+ receivedZones . push ( Zone . current . name ) ;
273+ } ;
274+ const manager = new EventManager ( [ domEventPlugin ] , new FakeNgZone ( ) ) ;
275+
276+ let remover1 = null ;
277+ let remover2 = null ;
278+ // handler1 is added in root zone
279+ Zone . root . run ( ( ) => { remover1 = manager . addEventListener ( element , 'click' , handler1 ) ; } ) ;
280+ // handler2 is added in 'angular' zone
281+ Zone . root . fork ( { name : 'fakeAngularZone' , properties : { isAngularZone : true } } ) . run ( ( ) => {
282+ remover2 = manager . addEventListener ( element , 'click' , handler2 ) ;
283+ } ) ;
284+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
285+ expect ( receivedEvents ) . toEqual ( [ dispatchedEvent , dispatchedEvent ] ) ;
286+ expect ( receivedZones ) . toEqual ( [ Zone . root . name , 'fakeAngularZone' ] ) ;
287+
288+ receivedEvents = [ ] ;
289+ remover1 && remover1 ( ) ;
290+ remover2 && remover2 ( ) ;
291+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
292+ // handler1 and handler2 are added in different zone
293+ // one is angular zone, the other is not
294+ // should still be able to remove them correctly
295+ expect ( receivedEvents ) . toEqual ( [ ] ) ;
296+ } ) ;
297+
258298 it ( 'should run blackListedEvents handler outside of ngZone' , ( ) => {
259299 const Zone = ( window as any ) [ 'Zone' ] ;
260300 const element = el ( '<div><div></div></div>' ) ;
0 commit comments