This repository was archived by the owner on Mar 13, 2018. It is now read-only.
File tree 2 files changed +36
-1
lines changed
2 files changed +36
-1
lines changed Original file line number Diff line number Diff line change 382
382
targetTable . set ( event , target ) ;
383
383
currentTargetTable . set ( event , currentTarget ) ;
384
384
385
+ // Keep track of the invoke depth so that we only clean up the removed
386
+ // listeners if we are in the outermost invoke.
387
+ listeners . depth ++ ;
388
+
385
389
for ( var i = 0 , len = listeners . length ; i < len ; i ++ ) {
386
390
var listener = listeners [ i ] ;
387
391
if ( listener . removed ) {
410
414
}
411
415
}
412
416
413
- if ( anyRemoved ) {
417
+ listeners . depth -- ;
418
+
419
+ if ( anyRemoved && listeners . depth === 0 ) {
414
420
var copy = listeners . slice ( ) ;
415
421
listeners . length = 0 ;
416
422
for ( var i = 0 ; i < copy . length ; i ++ ) {
707
713
var listeners = listenersTable . get ( this ) ;
708
714
if ( ! listeners ) {
709
715
listeners = [ ] ;
716
+ listeners . depth = 0 ;
710
717
listenersTable . set ( this , listeners ) ;
711
718
} else {
712
719
// Might have a duplicate.
Original file line number Diff line number Diff line change @@ -1448,4 +1448,32 @@ test('retarget order (multiple shadow roots)', function() {
1448
1448
assert . equal ( gCount , 2 ) ;
1449
1449
assert . equal ( hCount , 1 ) ;
1450
1450
} ) ;
1451
+
1452
+ test ( 'Event reentrancy' , function ( ) {
1453
+ div = document . createElement ( 'div' ) ;
1454
+ document . body . appendChild ( div ) ;
1455
+ var s = '' ;
1456
+ var depth = 0 ;
1457
+
1458
+ function f ( ) {
1459
+ s += 'f' + depth ;
1460
+ if ( depth === 0 ) {
1461
+ depth ++ ;
1462
+ div . dispatchEvent ( new Event ( 'x' ) ) ;
1463
+ } else if ( depth === 1 ) {
1464
+ div . removeEventListener ( 'x' , g ) ;
1465
+ }
1466
+ }
1467
+
1468
+ function g ( ) {
1469
+ s += 'g' + depth ;
1470
+ }
1471
+
1472
+ div . addEventListener ( 'x' , f ) ;
1473
+ div . addEventListener ( 'x' , g ) ;
1474
+
1475
+ div . dispatchEvent ( new Event ( 'x' ) ) ;
1476
+
1477
+ assert . equal ( s , 'f0f1' ) ;
1478
+ } ) ;
1451
1479
} ) ;
You can’t perform that action at this time.
0 commit comments