@@ -76,42 +76,45 @@ const rootEventTypesToEventResponderInstances: Map<
7676Set < ReactDOMEventResponderInstance > ,
7777> = new Map ( ) ;
7878
79+ type PropagationBehavior = 0 | 1 ;
80+
81+ const DoNotPropagateToNextResponder = 0 ;
82+ const PropagateToNextResponder = 1 ;
83+
7984let currentTimeStamp = 0 ;
8085let currentTimers = new Map ( ) ;
8186let currentInstance : null | ReactDOMEventResponderInstance = null ;
8287let currentTimerIDCounter = 0 ;
8388let currentDocument : null | Document = null ;
89+ let currentPropagationBehavior : PropagationBehavior = DoNotPropagateToNextResponder ;
8490let currentTargetFiber : null | Fiber = null ;
8591
8692const eventResponderContext : ReactDOMResponderContext = {
8793dispatchEvent (
8894eventValue : any ,
8995eventListener : any => void ,
9096eventPriority : EventPriority ,
91- ) : void {
97+ ) : any {
9298validateResponderContext ( ) ;
9399validateEventValue ( eventValue ) ;
94100switch ( eventPriority ) {
95101case DiscreteEvent: {
96102flushDiscreteUpdatesIfNeeded ( currentTimeStamp ) ;
97- discreteUpdates ( ( ) =>
103+ return discreteUpdates ( ( ) =>
98104executeUserEventHandler ( eventListener , eventValue ) ,
99105) ;
100- break ;
101106}
102107case UserBlockingEvent: {
103108if ( enableUserBlockingEvents ) {
104- runWithPriority ( UserBlockingPriority , ( ) =>
109+ return runWithPriority ( UserBlockingPriority , ( ) =>
105110executeUserEventHandler ( eventListener , eventValue ) ,
106111) ;
107112} else {
108- executeUserEventHandler ( eventListener , eventValue ) ;
113+ return executeUserEventHandler ( eventListener , eventValue ) ;
109114}
110- break ;
111115}
112116case ContinuousEvent: {
113- executeUserEventHandler ( eventListener , eventValue ) ;
114- break ;
117+ return executeUserEventHandler ( eventListener , eventValue ) ;
115118}
116119}
117120} ,
@@ -266,6 +269,9 @@ const eventResponderContext: ReactDOMResponderContext = {
266269}
267270return false ;
268271} ,
272+ continuePropagation ( ) {
273+ currentPropagationBehavior = PropagateToNextResponder ;
274+ } ,
269275enqueueStateRestore ,
270276getCurrentTarget ( ) : Element | null {
271277validateResponderContext ( ) ;
@@ -489,6 +495,10 @@ function traverseAndHandleEventResponderInstances(
489495if ( onEvent !== null ) {
490496currentInstance = responderInstance ;
491497onEvent ( responderEvent , eventResponderContext , props , state ) ;
498+ if ( currentPropagationBehavior === PropagateToNextResponder ) {
499+ visitedResponders . delete ( responder ) ;
500+ currentPropagationBehavior = DoNotPropagateToNextResponder ;
501+ }
492502}
493503}
494504}
@@ -588,7 +598,9 @@ export function dispatchEventForResponderEventSystem(
588598const previousTimers = currentTimers ;
589599const previousTimeStamp = currentTimeStamp ;
590600const previousDocument = currentDocument ;
601+ const previousPropagationBehavior = currentPropagationBehavior ;
591602const previousTargetFiber = currentTargetFiber ;
603+ currentPropagationBehavior = DoNotPropagateToNextResponder ;
592604currentTimers = null ;
593605currentTargetFiber = targetFiber ;
594606// nodeType 9 is DOCUMENT_NODE
@@ -613,6 +625,7 @@ export function dispatchEventForResponderEventSystem(
613625currentInstance = previousInstance ;
614626currentTimeStamp = previousTimeStamp ;
615627currentDocument = previousDocument ;
628+ currentPropagationBehavior = previousPropagationBehavior ;
616629currentTargetFiber = previousTargetFiber ;
617630}
618631}
0 commit comments