@@ -2316,6 +2316,99 @@ describe('Scope', function() {
23162316 } ) ) ;
23172317
23182318
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 listener1 = jasmine . createSpy ( ) . and . callFake ( function ( ) { remove1 ( ) ; } ) ;
2336+ var remove1 = $rootScope . $on ( 'abc' , listener1 ) ;
2337+
2338+ var listener2 = jasmine . createSpy ( ) ;
2339+ var remove2 = $rootScope . $on ( 'abc' , listener2 ) ;
2340+
2341+ var listener3 = jasmine . createSpy ( ) ;
2342+ var remove3 = $rootScope . $on ( 'abc' , listener3 ) ;
2343+
2344+ $rootScope . $broadcast ( 'abc' ) ;
2345+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2346+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2347+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2348+
2349+ listener1 . calls . reset ( ) ;
2350+ listener2 . calls . reset ( ) ;
2351+ listener3 . calls . reset ( ) ;
2352+
2353+ $rootScope . $broadcast ( 'abc' ) ;
2354+ expect ( listener1 ) . not . toHaveBeenCalled ( ) ;
2355+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2356+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2357+ } ) ) ;
2358+
2359+
2360+ it ( 'should call all listeners when removing previous' , inject ( function ( $rootScope ) {
2361+ var listener1 = jasmine . createSpy ( ) ;
2362+ var remove1 = $rootScope . $on ( 'abc' , listener1 ) ;
2363+
2364+ var listener2 = jasmine . createSpy ( ) . and . callFake ( remove1 ) ;
2365+ var remove2 = $rootScope . $on ( 'abc' , listener2 ) ;
2366+
2367+ var listener3 = jasmine . createSpy ( ) ;
2368+ var remove3 = $rootScope . $on ( 'abc' , listener3 ) ;
2369+
2370+ $rootScope . $broadcast ( 'abc' ) ;
2371+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2372+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2373+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2374+
2375+ listener1 . calls . reset ( ) ;
2376+ listener2 . calls . reset ( ) ;
2377+ listener3 . calls . reset ( ) ;
2378+
2379+ $rootScope . $broadcast ( 'abc' ) ;
2380+ expect ( listener1 ) . not . toHaveBeenCalled ( ) ;
2381+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2382+ expect ( listener3 ) . toHaveBeenCalled ( ) ;
2383+ } ) ) ;
2384+
2385+
2386+ it ( 'should not call listener when removed by previous' , inject ( function ( $rootScope ) {
2387+ var listener1 = jasmine . createSpy ( ) ;
2388+ var remove1 = $rootScope . $on ( 'abc' , listener1 ) ;
2389+
2390+ var listener2 = jasmine . createSpy ( ) . and . callFake ( function ( ) { remove3 ( ) ; } ) ;
2391+ var remove2 = $rootScope . $on ( 'abc' , listener2 ) ;
2392+
2393+ var listener3 = jasmine . createSpy ( ) ;
2394+ var remove3 = $rootScope . $on ( 'abc' , listener3 ) ;
2395+
2396+ $rootScope . $broadcast ( 'abc' ) ;
2397+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2398+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2399+ expect ( listener3 ) . not . toHaveBeenCalled ( ) ;
2400+
2401+ listener1 . calls . reset ( ) ;
2402+ listener2 . calls . reset ( ) ;
2403+ listener3 . calls . reset ( ) ;
2404+
2405+ $rootScope . $broadcast ( 'abc' ) ;
2406+ expect ( listener1 ) . toHaveBeenCalled ( ) ;
2407+ expect ( listener2 ) . toHaveBeenCalled ( ) ;
2408+ expect ( listener3 ) . not . toHaveBeenCalled ( ) ;
2409+ } ) ) ;
2410+
2411+
23192412 it ( 'should decrement ancestor $$listenerCount entries' , inject ( function ( $rootScope ) {
23202413 var child1 = $rootScope . $new ( ) ,
23212414 child2 = child1 . $new ( ) ,
0 commit comments