@@ -2316,6 +2316,98 @@ describe('Scope', function() {
2316
2316
} ) ) ;
2317
2317
2318
2318
2319
+ // See issue https://github.com/angular/angular.js/issues/16135
2320
+ it ( 'should deallocate the listener array entry' , inject ( function ( $rootScope ) {
2321
+ var remove1 = $rootScope . $on ( 'abc' , noop ) ;
2322
+ $rootScope . $on ( 'abc' , noop ) ;
2323
+
2324
+ expect ( $rootScope . $$listeners [ 'abc' ] . length ) . toBe ( 2 ) ;
2325
+ expect ( 0 in $rootScope . $$listeners [ 'abc' ] ) . toBe ( true ) ;
2326
+
2327
+ remove1 ( ) ;
2328
+
2329
+ expect ( $rootScope . $$listeners [ 'abc' ] . length ) . toBe ( 2 ) ;
2330
+ expect ( 0 in $rootScope . $$listeners [ 'abc' ] ) . toBe ( false ) ;
2331
+ } ) ) ;
2332
+
2333
+
2334
+ it ( 'should call next listener when removing current' , inject ( function ( $rootScope ) {
2335
+ var remove1 = $rootScope . $on ( 'abc' , function ( ) { remove1 ( ) } ) ;
2336
+
2337
+ var listener2 = jasmine . createSpy ( ) ;
2338
+ var remove2 = $rootScope . $on ( 'abc' , listener2 ) ;
2339
+
2340
+ var listener3 = jasmine . createSpy ( ) ;
2341
+ var remove3 = $rootScope . $on ( 'abc' , listener3 ) ;
2342
+
2343
+ $rootScope . $broadcast ( 'abc' ) ;
2344
+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2345
+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2346
+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2347
+
2348
+ listener1 . calls . reset ( ) ;
2349
+ listener2 . calls . reset ( ) ;
2350
+ listener3 . calls . reset ( ) ;
2351
+
2352
+ $rootScope . $broadcast ( 'abc' ) ;
2353
+ expect ( listener1 ) . not . toHaveBeenCalled ( ) ;
2354
+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2355
+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2356
+ } ) ) ;
2357
+
2358
+
2359
+ it ( 'should call all listeners when removing previous' , inject ( function ( $rootScope ) {
2360
+ var listener1 = jasmine . createSpy ( ) ;
2361
+ var remove1 = $rootScope . $on ( 'abc' , listener1 ) ;
2362
+
2363
+ var listener2 = jasmine . createSpy ( ) . and . callFake ( remove1 ) ;
2364
+ var remove2 = $rootScope . $on ( 'abc' , listener2 ) ;
2365
+
2366
+ var listener3 = jasmine . createSpy ( ) ;
2367
+ var remove3 = $rootScope . $on ( 'abc' , listener3 ) ;
2368
+
2369
+ $rootScope . $broadcast ( 'abc' ) ;
2370
+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2371
+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2372
+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2373
+
2374
+ listener1 . calls . reset ( ) ;
2375
+ listener2 . calls . reset ( ) ;
2376
+ listener3 . calls . reset ( ) ;
2377
+
2378
+ $rootScope . $broadcast ( 'abc' ) ;
2379
+ expect ( listener1 ) . not . toHaveBeenCalled ( ) ;
2380
+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2381
+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2382
+ } ) ) ;
2383
+
2384
+
2385
+ it ( 'should not call listener when removed by previous' , inject ( function ( $rootScope ) {
2386
+ var listener1 = jasmine . createSpy ( ) ;
2387
+ var remove1 = $rootScope . $on ( 'abc' , listener1 ) ;
2388
+
2389
+ var listener2 = jasmine . createSpy ( ) . and . callFake ( function ( ) { remove3 ( ) ; } ) ;
2390
+ var remove2 = $rootScope . $on ( 'abc' , listener2 ) ;
2391
+
2392
+ var listener3 = jasmine . createSpy ( ) ;
2393
+ var remove3 = $rootScope . $on ( 'abc' , listener3 ) ;
2394
+
2395
+ $rootScope . $broadcast ( 'abc' ) ;
2396
+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2397
+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2398
+ expect ( listener3 ) . not . toHaveBeenCalled ( ) ;
2399
+
2400
+ listener1 . calls . reset ( ) ;
2401
+ listener2 . calls . reset ( ) ;
2402
+ listener3 . calls . reset ( ) ;
2403
+
2404
+ $rootScope . $broadcast ( 'abc' ) ;
2405
+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2406
+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2407
+ expect ( listener3 ) . not . toHaveBeenCalled ( ) ;
2408
+ } ) ) ;
2409
+
2410
+
2319
2411
it ( 'should decrement ancestor $$listenerCount entries' , inject ( function ( $rootScope ) {
2320
2412
var child1 = $rootScope . $new ( ) ,
2321
2413
child2 = child1 . $new ( ) ,
0 commit comments