@@ -12,7 +12,7 @@ import {
1212 PASSIVE_NOT_SUPPORTED ,
1313} from 'legacy-events/EventSystemFlags' ;
1414import type { AnyNativeEvent } from 'legacy-events/PluginModuleType' ;
15- import { HostComponent } from 'shared/ReactWorkTags' ;
15+ import { HostComponent , ScopeComponent } from 'shared/ReactWorkTags' ;
1616import type { EventPriority } from 'shared/ReactTypes' ;
1717import type {
1818 ReactDOMEventResponder ,
@@ -66,6 +66,7 @@ type ResponderTimer = {|
6666 instance : ReactDOMEventResponderInstance ,
6767 func : ( ) => void ,
6868 id : number ,
69+ targetFiber : Fiber | null ,
6970 timeStamp : number ,
7071| } ;
7172
@@ -80,6 +81,7 @@ let currentTimers = new Map();
8081let currentInstance : null | ReactDOMEventResponderInstance = null ;
8182let currentTimerIDCounter = 0 ;
8283let currentDocument : null | Document = null ;
84+ let currentTargetFiber : null | Fiber = null ;
8385
8486const eventResponderContext : ReactDOMResponderContext = {
8587 dispatchEvent (
@@ -158,16 +160,20 @@ const eventResponderContext: ReactDOMResponderContext = {
158160 validateResponderContext ( ) ;
159161 const childFiber = getClosestInstanceFromNode ( childTarget ) ;
160162 const parentFiber = getClosestInstanceFromNode ( parentTarget ) ;
161- const parentAlternateFiber = parentFiber . alternate ;
162163
163- let node = childFiber ;
164- while ( node !== null ) {
165- if ( node === parentFiber || node === parentAlternateFiber ) {
166- return true ;
164+ if ( childFiber != null && parentFiber != null ) {
165+ const parentAlternateFiber = parentFiber . alternate ;
166+ let node = childFiber ;
167+ while ( node !== null ) {
168+ if ( node === parentFiber || node === parentAlternateFiber ) {
169+ return true ;
170+ }
171+ node = node . return ;
167172 }
168- node = node . return ;
173+ return false ;
169174 }
170- return false ;
175+ // Fallback to DOM APIs
176+ return parentTarget . contains ( childTarget ) ;
171177 } ,
172178 addRootEventTypes ( rootEventTypes : Array < string > ) : void {
173179 validateResponderContext ( ) ;
@@ -221,6 +227,7 @@ const eventResponderContext: ReactDOMResponderContext = {
221227 instance : ( ( currentInstance : any ) : ReactDOMEventResponderInstance ) ,
222228 func,
223229 id : timerId ,
230+ targetFiber : currentTargetFiber ,
224231 timeStamp : currentTimeStamp ,
225232 } ) ;
226233 activeTimeouts . set ( timerId , timeout ) ;
@@ -260,6 +267,24 @@ const eventResponderContext: ReactDOMResponderContext = {
260267 return false ;
261268 } ,
262269 enqueueStateRestore ,
270+ getCurrentTarget ( ) : Element | null {
271+ validateResponderContext ( ) ;
272+ const responderFiber = ( ( currentInstance : any ) : ReactDOMEventResponderInstance )
273+ . fiber ;
274+ let fiber = currentTargetFiber ;
275+ let currentTarget = null ;
276+
277+ while ( fiber !== null ) {
278+ if ( fiber . tag === HostComponent ) {
279+ currentTarget = fiber . stateNode ;
280+ }
281+ if ( fiber === responderFiber || fiber . alternate === responderFiber ) {
282+ break ;
283+ }
284+ fiber = fiber . return ;
285+ }
286+ return currentTarget ;
287+ } ,
263288} ;
264289
265290function validateEventValue ( eventValue : any ) : void {
@@ -317,7 +342,8 @@ function doesFiberHaveResponder(
317342 fiber : Fiber ,
318343 responder : ReactDOMEventResponder ,
319344) : boolean {
320- if ( fiber . tag === HostComponent ) {
345+ const tag = fiber . tag ;
346+ if ( tag === HostComponent || tag === ScopeComponent ) {
321347 const dependencies = fiber . dependencies ;
322348 if ( dependencies !== null ) {
323349 const respondersMap = dependencies . responders ;
@@ -341,8 +367,9 @@ function processTimers(
341367 try {
342368 batchedEventUpdates ( ( ) => {
343369 for ( let i = 0 ; i < timersArr . length ; i ++ ) {
344- const { instance, func, id, timeStamp} = timersArr [ i ] ;
370+ const { instance, func, id, timeStamp, targetFiber } = timersArr [ i ] ;
345371 currentInstance = instance ;
372+ currentTargetFiber = targetFiber ;
346373 currentTimeStamp = timeStamp + delay ;
347374 try {
348375 func ( ) ;
@@ -355,6 +382,7 @@ function processTimers(
355382 currentTimers = null ;
356383 currentInstance = null ;
357384 currentTimeStamp = 0 ;
385+ currentTargetFiber = null ;
358386 }
359387}
360388
@@ -386,7 +414,6 @@ function createDOMResponderEvent(
386414 passiveSupported,
387415 pointerId,
388416 pointerType : eventPointerType ,
389- responderTarget : null ,
390417 target : nativeEventTarget ,
391418 type : topLevelType ,
392419 } ;
@@ -443,13 +470,16 @@ function traverseAndHandleEventResponderInstances(
443470 let node = targetFiber ;
444471 while ( node !== null ) {
445472 const { dependencies, tag} = node ;
446- if ( tag === HostComponent && dependencies !== null ) {
473+ if (
474+ ( tag === HostComponent || tag === ScopeComponent ) &&
475+ dependencies !== null
476+ ) {
447477 const respondersMap = dependencies . responders ;
448478 if ( respondersMap !== null ) {
449479 const responderInstances = Array . from ( respondersMap . values ( ) ) ;
450480 for ( let i = 0 , length = responderInstances . length ; i < length ; i ++ ) {
451481 const responderInstance = responderInstances [ i ] ;
452- const { props, responder, state, target } = responderInstance ;
482+ const { props, responder, state} = responderInstance ;
453483 if (
454484 ! visitedResponders . has ( responder ) &&
455485 validateResponderTargetEventTypes ( eventType , responder )
@@ -458,9 +488,6 @@ function traverseAndHandleEventResponderInstances(
458488 const onEvent = responder . onEvent ;
459489 if ( onEvent !== null ) {
460490 currentInstance = responderInstance ;
461- responderEvent . responderTarget = ( ( target : any ) :
462- | Element
463- | Document ) ;
464491 onEvent ( responderEvent , eventResponderContext , props , state ) ;
465492 }
466493 }
@@ -478,11 +505,10 @@ function traverseAndHandleEventResponderInstances(
478505
479506 for ( let i = 0 ; i < responderInstances . length ; i ++ ) {
480507 const responderInstance = responderInstances [ i ] ;
481- const { props, responder, state, target } = responderInstance ;
508+ const { props, responder, state} = responderInstance ;
482509 const onRootEvent = responder . onRootEvent ;
483510 if ( onRootEvent !== null ) {
484511 currentInstance = responderInstance ;
485- responderEvent . responderTarget = ( ( target : any ) : Element | Document ) ;
486512 onRootEvent ( responderEvent , eventResponderContext , props , state ) ;
487513 }
488514 }
@@ -562,7 +588,9 @@ export function dispatchEventForResponderEventSystem(
562588 const previousTimers = currentTimers ;
563589 const previousTimeStamp = currentTimeStamp ;
564590 const previousDocument = currentDocument ;
591+ const previousTargetFiber = currentTargetFiber ;
565592 currentTimers = null ;
593+ currentTargetFiber = targetFiber ;
566594 // nodeType 9 is DOCUMENT_NODE
567595 currentDocument =
568596 ( nativeEventTarget : any ) . nodeType === 9
@@ -585,6 +613,7 @@ export function dispatchEventForResponderEventSystem(
585613 currentInstance = previousInstance ;
586614 currentTimeStamp = previousTimeStamp ;
587615 currentDocument = previousDocument ;
616+ currentTargetFiber = previousTargetFiber ;
588617 }
589618 }
590619}
0 commit comments