@@ -107,11 +107,8 @@ const eventListeners:
107107 ($Shape< PartialEventObject > ) => void ,
108108 > = new PossiblyWeakMap ( ) ;
109109
110- const responderOwners : Map <
111- ReactEventResponder ,
112- ReactEventComponentInstance ,
113- > = new Map ( ) ;
114110let globalOwner = null ;
111+ let continueLocalPropagation = false ;
115112
116113let currentTimeStamp = 0 ;
117114let currentTimers = new Map ( ) ;
@@ -308,31 +305,15 @@ const eventResponderContext: ReactResponderContext = {
308305 } ,
309306 hasOwnership ( ) : boolean {
310307 validateResponderContext ( ) ;
311- const responder = ( ( currentInstance : any ) : ReactEventComponentInstance )
312- . responder ;
313- return (
314- globalOwner === currentInstance ||
315- responderOwners . get ( responder ) === currentInstance
316- ) ;
308+ return globalOwner === currentInstance ;
317309 } ,
318310 requestGlobalOwnership ( ) : boolean {
319311 validateResponderContext ( ) ;
320312 if ( globalOwner !== null ) {
321313 return false ;
322314 }
323315 globalOwner = currentInstance ;
324- triggerOwnershipListeners ( null ) ;
325- return true ;
326- } ,
327- requestResponderOwnership ( ) : boolean {
328- validateResponderContext ( ) ;
329- const eventComponentInstance = ( ( currentInstance : any ) : ReactEventComponentInstance ) ;
330- const responder = eventComponentInstance . responder ;
331- if ( responderOwners . has ( responder ) ) {
332- return false ;
333- }
334- responderOwners . set ( responder , eventComponentInstance ) ;
335- triggerOwnershipListeners ( responder ) ;
316+ triggerOwnershipListeners ( ) ;
336317 return true ;
337318 } ,
338319 releaseOwnership ( ) : boolean {
@@ -433,6 +414,10 @@ const eventResponderContext: ReactResponderContext = {
433414 }
434415 return false ;
435416 } ,
417+ continueLocalPropagation ( ) {
418+ validateResponderContext ( ) ;
419+ continueLocalPropagation = true ;
420+ } ,
436421} ;
437422
438423function collectFocusableElements (
@@ -485,22 +470,12 @@ function getActiveDocument(): Document {
485470function releaseOwnershipForEventComponentInstance (
486471 eventComponentInstance : ReactEventComponentInstance ,
487472) : boolean {
488- const responder = eventComponentInstance . responder ;
489- let triggerOwnershipListenersWith ;
490- if ( responderOwners . get ( responder ) === eventComponentInstance ) {
491- responderOwners . delete ( responder ) ;
492- triggerOwnershipListenersWith = responder ;
493- }
494473 if ( globalOwner === eventComponentInstance ) {
495474 globalOwner = null ;
496- triggerOwnershipListenersWith = null ;
497- }
498- if ( triggerOwnershipListenersWith !== undefined ) {
499- triggerOwnershipListeners ( triggerOwnershipListenersWith ) ;
475+ triggerOwnershipListeners ( ) ;
500476 return true ;
501- } else {
502- return false ;
503477 }
478+ return false ;
504479}
505480
506481function isFiberHostComponentFocusable ( fiber : Fiber ) : boolean {
@@ -725,10 +700,10 @@ function getRootEventResponderInstances(
725700
726701function shouldSkipEventComponent (
727702 eventResponderInstance : ReactEventComponentInstance ,
703+ responder : ReactEventResponder ,
728704 propagatedEventResponders : null | Set < ReactEventResponder > ,
729705) : boolean {
730- const responder = eventResponderInstance . responder ;
731- if ( propagatedEventResponders !== null && responder . stopLocalPropagation ) {
706+ if ( propagatedEventResponders !== null ) {
732707 if ( propagatedEventResponders . has ( responder ) ) {
733708 return true ;
734709 }
@@ -737,15 +712,19 @@ function shouldSkipEventComponent(
737712 if ( globalOwner && globalOwner !== eventResponderInstance ) {
738713 return true ;
739714 }
740- if (
741- responderOwners . has ( responder ) &&
742- responderOwners . get ( responder ) !== eventResponderInstance
743- ) {
744- return true ;
745- }
746715 return false ;
747716}
748717
718+ function checkForLocalPropagationContinuation (
719+ responder : ReactEventResponder ,
720+ propagatedEventResponders : Set < ReactEventResponder > ,
721+ ) {
722+ if ( continueLocalPropagation === true ) {
723+ propagatedEventResponders . delete ( responder ) ;
724+ continueLocalPropagation = false ;
725+ }
726+ }
727+
749728function traverseAndHandleEventResponderInstances (
750729 topLevelType : DOMTopLevelEventType ,
751730 targetFiber : null | Fiber ,
@@ -795,13 +774,18 @@ function traverseAndHandleEventResponderInstances(
795774 if (
796775 shouldSkipEventComponent (
797776 targetEventResponderInstance ,
777+ responder ,
798778 propagatedEventResponders ,
799779 )
800780 ) {
801781 continue ;
802782 }
803783 currentInstance = targetEventResponderInstance ;
804784 eventListener ( responderEvent , eventResponderContext, props, state ) ;
785+ checkForLocalPropagationContinuation (
786+ responder ,
787+ propagatedEventResponders ,
788+ ) ;
805789 }
806790 }
807791 // We clean propagated event responders between phases.
@@ -815,13 +799,18 @@ function traverseAndHandleEventResponderInstances(
815799 if (
816800 shouldSkipEventComponent (
817801 targetEventResponderInstance ,
802+ responder ,
818803 propagatedEventResponders ,
819804 )
820805 ) {
821806 continue ;
822807 }
823808 currentInstance = targetEventResponderInstance ;
824809 eventListener ( responderEvent , eventResponderContext, props, state ) ;
810+ checkForLocalPropagationContinuation (
811+ responder ,
812+ propagatedEventResponders ,
813+ ) ;
825814 }
826815 }
827816 }
@@ -836,7 +825,9 @@ function traverseAndHandleEventResponderInstances(
836825 const { responder , props , state } = rootEventResponderInstance ;
837826 const eventListener = responder . onRootEvent ;
838827 if ( eventListener !== undefined ) {
839- if ( shouldSkipEventComponent ( rootEventResponderInstance , null ) ) {
828+ if (
829+ shouldSkipEventComponent ( rootEventResponderInstance , responder , null )
830+ ) {
840831 continue ;
841832 }
842833 currentInstance = rootEventResponderInstance ;
@@ -846,18 +837,13 @@ function traverseAndHandleEventResponderInstances(
846837 }
847838}
848839
849- function triggerOwnershipListeners (
850- limitByResponder : null | ReactEventResponder ,
851- ) : void {
840+ function triggerOwnershipListeners ( ) : void {
852841 const listeningInstances = Array . from ( ownershipChangeListeners ) ;
853842 const previousInstance = currentInstance ;
854843 try {
855844 for ( let i = 0 ; i < listeningInstances . length ; i ++ ) {
856845 const instance = listeningInstances [ i ] ;
857846 const { props, responder, state} = instance ;
858- if ( limitByResponder !== null && limitByResponder !== responder ) {
859- continue;
860- }
861847 currentInstance = instance ;
862848 const onOwnershipChange = responder . onOwnershipChange ;
863849 if ( onOwnershipChange !== undefined ) {
0 commit comments