@@ -1400,6 +1400,94 @@ describe('jqLite', function() {
1400
1400
expect ( extraSpy ) . toHaveBeenCalledOnce ( ) ;
1401
1401
} ) ;
1402
1402
1403
+
1404
+ describe ( 'native listener deregistration' , function ( ) {
1405
+
1406
+ it ( 'should deregister the native listener when all jqLite listeners for given type are gone ' +
1407
+ 'after off("eventName", listener) call' , function ( ) {
1408
+ var aElem = jqLite ( a ) ;
1409
+ var addEventListenerSpy = spyOn ( aElem [ 0 ] , 'addEventListener' ) . andCallThrough ( ) ;
1410
+ var removeEventListenerSpy = spyOn ( aElem [ 0 ] , 'removeEventListener' ) . andCallThrough ( ) ;
1411
+ var nativeListenerFn ;
1412
+
1413
+ var jqLiteListener = function ( ) { } ;
1414
+ aElem . on ( 'click' , jqLiteListener ) ;
1415
+
1416
+ expect ( addEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'click' , jasmine . any ( Function ) , false ) ;
1417
+ nativeListenerFn = addEventListenerSpy . mostRecentCall . args [ 1 ] ;
1418
+ expect ( removeEventListenerSpy ) . not . toHaveBeenCalled ( ) ;
1419
+
1420
+ aElem . off ( 'click' , jqLiteListener ) ;
1421
+ expect ( removeEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'click' , nativeListenerFn , false ) ;
1422
+ } ) ;
1423
+
1424
+
1425
+ it ( 'should deregister the native listener when all jqLite listeners for given type are gone ' +
1426
+ 'after off("eventName") call' , function ( ) {
1427
+ var aElem = jqLite ( a ) ;
1428
+ var addEventListenerSpy = spyOn ( aElem [ 0 ] , 'addEventListener' ) . andCallThrough ( ) ;
1429
+ var removeEventListenerSpy = spyOn ( aElem [ 0 ] , 'removeEventListener' ) . andCallThrough ( ) ;
1430
+ var nativeListenerFn ;
1431
+
1432
+ aElem . on ( 'click' , function ( ) { } ) ;
1433
+ expect ( addEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'click' , jasmine . any ( Function ) , false ) ;
1434
+ nativeListenerFn = addEventListenerSpy . mostRecentCall . args [ 1 ] ;
1435
+ expect ( removeEventListenerSpy ) . not . toHaveBeenCalled ( ) ;
1436
+
1437
+ aElem . off ( 'click' ) ;
1438
+ expect ( removeEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'click' , nativeListenerFn , false ) ;
1439
+ } ) ;
1440
+
1441
+
1442
+ it ( 'should deregister the native listener when all jqLite listeners for given type are gone ' +
1443
+ 'after off("eventName1 eventName2") call' , function ( ) {
1444
+ var aElem = jqLite ( a ) ;
1445
+ var addEventListenerSpy = spyOn ( aElem [ 0 ] , 'addEventListener' ) . andCallThrough ( ) ;
1446
+ var removeEventListenerSpy = spyOn ( aElem [ 0 ] , 'removeEventListener' ) . andCallThrough ( ) ;
1447
+ var nativeListenerFn ;
1448
+
1449
+ aElem . on ( 'click' , function ( ) { } ) ;
1450
+ expect ( addEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'click' , jasmine . any ( Function ) , false ) ;
1451
+ nativeListenerFn = addEventListenerSpy . mostRecentCall . args [ 1 ] ;
1452
+ addEventListenerSpy . reset ( ) ;
1453
+
1454
+ aElem . on ( 'dblclick' , function ( ) { } ) ;
1455
+ expect ( addEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'dblclick' , nativeListenerFn , false ) ;
1456
+
1457
+ expect ( removeEventListenerSpy ) . not . toHaveBeenCalled ( ) ;
1458
+
1459
+ aElem . off ( 'click dblclick' ) ;
1460
+
1461
+ expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'click' , nativeListenerFn , false ) ;
1462
+ expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'dblclick' , nativeListenerFn , false ) ;
1463
+ expect ( removeEventListenerSpy . callCount ) . toBe ( 2 ) ;
1464
+ } ) ;
1465
+
1466
+
1467
+ it ( 'should deregister the native listener when all jqLite listeners for given type are gone ' +
1468
+ 'after off() call' , function ( ) {
1469
+ var aElem = jqLite ( a ) ;
1470
+ var addEventListenerSpy = spyOn ( aElem [ 0 ] , 'addEventListener' ) . andCallThrough ( ) ;
1471
+ var removeEventListenerSpy = spyOn ( aElem [ 0 ] , 'removeEventListener' ) . andCallThrough ( ) ;
1472
+ var nativeListenerFn ;
1473
+
1474
+ aElem . on ( 'click' , function ( ) { } ) ;
1475
+ expect ( addEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'click' , jasmine . any ( Function ) , false ) ;
1476
+ nativeListenerFn = addEventListenerSpy . mostRecentCall . args [ 1 ] ;
1477
+ addEventListenerSpy . reset ( ) ;
1478
+
1479
+ aElem . on ( 'dblclick' , function ( ) { } ) ;
1480
+ expect ( addEventListenerSpy ) . toHaveBeenCalledOnceWith ( 'dblclick' , nativeListenerFn , false ) ;
1481
+
1482
+ aElem . off ( ) ;
1483
+
1484
+ expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'click' , nativeListenerFn , false ) ;
1485
+ expect ( removeEventListenerSpy ) . toHaveBeenCalledWith ( 'dblclick' , nativeListenerFn , false ) ;
1486
+ expect ( removeEventListenerSpy . callCount ) . toBe ( 2 ) ;
1487
+ } ) ;
1488
+ } ) ;
1489
+
1490
+
1403
1491
// Only run this test for jqLite and not normal jQuery
1404
1492
if ( _jqLiteMode ) {
1405
1493
it ( 'should throw an error if a selector is passed' , function ( ) {
0 commit comments