@@ -47,6 +47,7 @@ const {
47
47
} = EventEmitter ;
48
48
49
49
const kEvents = Symbol ( 'kEvents' ) ;
50
+ const kIsBeingDispatched = Symbol ( 'kIsBeingDispatched' ) ;
50
51
const kStop = Symbol ( 'kStop' ) ;
51
52
const kTarget = Symbol ( 'kTarget' ) ;
52
53
const kHandlers = Symbol ( 'khandlers' ) ;
@@ -105,6 +106,7 @@ class Event {
105
106
configurable : false
106
107
} ) ;
107
108
this [ kTarget ] = null ;
109
+ this [ kIsBeingDispatched ] = false ;
108
110
}
109
111
110
112
[ customInspectSymbol ] ( depth , options ) {
@@ -151,12 +153,12 @@ class Event {
151
153
// These are not supported in Node.js and are provided purely for
152
154
// API completeness.
153
155
154
- composedPath ( ) { return this [ kTarget ] ? [ this [ kTarget ] ] : [ ] ; }
156
+ composedPath ( ) { return this [ kIsBeingDispatched ] ? [ this [ kTarget ] ] : [ ] ; }
155
157
get returnValue ( ) { return ! this . defaultPrevented ; }
156
158
get bubbles ( ) { return this [ kBubbles ] ; }
157
159
get composed ( ) { return this [ kComposed ] ; }
158
160
get eventPhase ( ) {
159
- return this [ kTarget ] ? Event . AT_TARGET : Event . NONE ;
161
+ return this [ kIsBeingDispatched ] ? Event . AT_TARGET : Event . NONE ;
160
162
}
161
163
get cancelBubble ( ) { return this [ kPropagationStopped ] ; }
162
164
set cancelBubble ( value ) {
@@ -397,7 +399,7 @@ class EventTarget {
397
399
if ( ! isEventTarget ( this ) )
398
400
throw new ERR_INVALID_THIS ( 'EventTarget' ) ;
399
401
400
- if ( event [ kTarget ] !== null )
402
+ if ( event [ kIsBeingDispatched ] )
401
403
throw new ERR_EVENT_RECURSION ( event . type ) ;
402
404
403
405
this [ kHybridDispatch ] ( event , event . type , event ) ;
@@ -410,11 +412,14 @@ class EventTarget {
410
412
if ( event === undefined ) {
411
413
event = this [ kCreateEvent ] ( nodeValue , type ) ;
412
414
event [ kTarget ] = this ;
415
+ event [ kIsBeingDispatched ] = true ;
413
416
}
414
417
return event ;
415
418
} ;
416
- if ( event !== undefined )
419
+ if ( event !== undefined ) {
417
420
event [ kTarget ] = this ;
421
+ event [ kIsBeingDispatched ] = true ;
422
+ }
418
423
419
424
const root = this [ kEvents ] . get ( type ) ;
420
425
if ( root === undefined || root . next === undefined )
@@ -453,6 +458,9 @@ class EventTarget {
453
458
let result ;
454
459
if ( callback ) {
455
460
result = FunctionPrototypeCall ( callback , this , arg ) ;
461
+ if ( ! handler . isNodeStyleListener ) {
462
+ arg [ kIsBeingDispatched ] = false ;
463
+ }
456
464
}
457
465
if ( result !== undefined && result !== null )
458
466
addCatch ( result ) ;
@@ -464,7 +472,7 @@ class EventTarget {
464
472
}
465
473
466
474
if ( event !== undefined )
467
- event [ kTarget ] = undefined ;
475
+ event [ kIsBeingDispatched ] = false ;
468
476
}
469
477
470
478
[ kCreateEvent ] ( nodeValue , type ) {
0 commit comments