1212let React ;
1313let ReactFeatureFlags ;
1414let ReactDOM ;
15+ let ReactSymbols ;
1516
1617function createReactEventComponent (
1718 targetEventTypes ,
@@ -42,6 +43,14 @@ function dispatchClickEvent(element) {
4243 element . dispatchEvent ( clickEvent ) ;
4344}
4445
46+ function createReactEventTarget ( type ) {
47+ return {
48+ $$typeof : ReactSymbols . REACT_EVENT_TARGET_TYPE ,
49+ displayName : 'TestEventTarget' ,
50+ type,
51+ } ;
52+ }
53+
4554// This is a new feature in Fiber so I put it in its own test file. It could
4655// probably move to one of the other test files once it is official.
4756describe ( 'DOMEventResponderSystem' , ( ) => {
@@ -55,6 +64,7 @@ describe('DOMEventResponderSystem', () => {
5564 ReactDOM = require ( 'react-dom' ) ;
5665 container = document . createElement ( 'div' ) ;
5766 document . body . appendChild ( container ) ;
67+ ReactSymbols = require ( 'shared/ReactSymbols' ) ;
5868 } ) ;
5969
6070 afterEach ( ( ) => {
@@ -414,4 +424,229 @@ describe('DOMEventResponderSystem', () => {
414424 expect ( ownershipGained ) . toEqual ( true ) ;
415425 expect ( onOwnershipChangeFired ) . toEqual ( 1 ) ;
416426 } ) ;
427+
428+ it ( 'should be possible to get event targets' , ( ) => {
429+ let queryResult = null ;
430+ const buttonRef = React . createRef ( ) ;
431+ const divRef = React . createRef ( ) ;
432+ const eventTargetType = Symbol . for ( 'react.event_target.test' ) ;
433+ const EventTarget = createReactEventTarget ( eventTargetType ) ;
434+
435+ const EventComponent = createReactEventComponent (
436+ [ 'click' ] ,
437+ undefined ,
438+ ( event , context , props , state ) => {
439+ queryResult = Array . from (
440+ context . getEventTargetsFromTarget ( event . target ) ,
441+ ) ;
442+ } ,
443+ ) ;
444+
445+ const Test = ( ) => (
446+ < EventComponent >
447+ < div ref = { divRef } >
448+ < EventTarget foo = { 1 } />
449+ < button ref = { buttonRef } >
450+ < EventTarget foo = { 2 } />
451+ Press me!
452+ </ button >
453+ </ div >
454+ </ EventComponent >
455+ ) ;
456+
457+ ReactDOM . render ( < Test /> , container ) ;
458+
459+ let buttonElement = buttonRef . current ;
460+ let divElement = divRef . current ;
461+ dispatchClickEvent ( buttonElement ) ;
462+ jest . runAllTimers ( ) ;
463+
464+ expect ( queryResult ) . toEqual ( [
465+ {
466+ node : buttonElement ,
467+ props : {
468+ foo : 2 ,
469+ } ,
470+ } ,
471+ {
472+ node : divElement ,
473+ props : {
474+ foo : 1 ,
475+ } ,
476+ } ,
477+ ] ) ;
478+ } ) ;
479+
480+ it ( 'should be possible to query event targets by type' , ( ) => {
481+ let queryResult = null ;
482+ const buttonRef = React . createRef ( ) ;
483+ const divRef = React . createRef ( ) ;
484+ const eventTargetType = Symbol . for ( 'react.event_target.test' ) ;
485+ const EventTarget = createReactEventTarget ( eventTargetType ) ;
486+
487+ const eventTargetType2 = Symbol . for ( 'react.event_target.test2' ) ;
488+ const EventTarget2 = createReactEventTarget ( eventTargetType2 ) ;
489+
490+ const EventComponent = createReactEventComponent (
491+ [ 'click' ] ,
492+ undefined ,
493+ ( event , context , props , state ) => {
494+ queryResult = context . getEventTargetsFromTarget (
495+ event . target ,
496+ eventTargetType2 ,
497+ ) ;
498+ } ,
499+ ) ;
500+
501+ const Test = ( ) => (
502+ < EventComponent >
503+ < div ref = { divRef } >
504+ < EventTarget2 foo = { 1 } />
505+ < button ref = { buttonRef } >
506+ < EventTarget foo = { 2 } />
507+ Press me!
508+ </ button >
509+ </ div >
510+ </ EventComponent >
511+ ) ;
512+
513+ ReactDOM . render ( < Test /> , container ) ;
514+
515+ let buttonElement = buttonRef . current ;
516+ let divElement = divRef . current ;
517+ dispatchClickEvent ( buttonElement ) ;
518+ jest . runAllTimers ( ) ;
519+
520+ expect ( queryResult ) . toEqual ( [
521+ {
522+ node : divElement ,
523+ props : {
524+ foo : 1 ,
525+ } ,
526+ } ,
527+ ] ) ;
528+ } ) ;
529+
530+ it ( 'should be possible to query event targets by key' , ( ) => {
531+ let queryResult = null ;
532+ const buttonRef = React . createRef ( ) ;
533+ const divRef = React . createRef ( ) ;
534+ const eventTargetType = Symbol . for ( 'react.event_target.test' ) ;
535+ const EventTarget = createReactEventTarget ( eventTargetType ) ;
536+
537+ const EventComponent = createReactEventComponent (
538+ [ 'click' ] ,
539+ undefined ,
540+ ( event , context , props , state ) => {
541+ queryResult = context . getEventTargetsFromTarget (
542+ event . target ,
543+ undefined ,
544+ 'a' ,
545+ ) ;
546+ } ,
547+ ) ;
548+
549+ const Test = ( ) => (
550+ < EventComponent >
551+ < div ref = { divRef } >
552+ < EventTarget foo = { 1 } />
553+ < button ref = { buttonRef } >
554+ < EventTarget key = "a" foo = { 2 } />
555+ Press me!
556+ </ button >
557+ </ div >
558+ </ EventComponent >
559+ ) ;
560+
561+ ReactDOM . render ( < Test /> , container ) ;
562+
563+ let buttonElement = buttonRef . current ;
564+ dispatchClickEvent ( buttonElement ) ;
565+ jest . runAllTimers ( ) ;
566+
567+ expect ( queryResult ) . toEqual ( [
568+ {
569+ node : buttonElement ,
570+ props : {
571+ foo : 2 ,
572+ } ,
573+ } ,
574+ ] ) ;
575+ } ) ;
576+
577+ it ( 'should be possible to query event targets by type and key' , ( ) => {
578+ let queryResult = null ;
579+ let queryResult2 = null ;
580+ let queryResult3 = null ;
581+ const buttonRef = React . createRef ( ) ;
582+ const divRef = React . createRef ( ) ;
583+ const eventTargetType = Symbol . for ( 'react.event_target.test' ) ;
584+ const EventTarget = createReactEventTarget ( eventTargetType ) ;
585+
586+ const eventTargetType2 = Symbol . for ( 'react.event_target.test2' ) ;
587+ const EventTarget2 = createReactEventTarget ( eventTargetType2 ) ;
588+
589+ const EventComponent = createReactEventComponent (
590+ [ 'click' ] ,
591+ undefined ,
592+ ( event , context , props , state ) => {
593+ queryResult = context . getEventTargetsFromTarget (
594+ event . target ,
595+ eventTargetType2 ,
596+ 'a' ,
597+ ) ;
598+
599+ queryResult2 = context . getEventTargetsFromTarget (
600+ event . target ,
601+ eventTargetType ,
602+ 'c' ,
603+ ) ;
604+
605+ // Should return an empty array as this doesn't exist
606+ queryResult3 = context . getEventTargetsFromTarget (
607+ event . target ,
608+ eventTargetType ,
609+ 'd' ,
610+ ) ;
611+ } ,
612+ ) ;
613+
614+ const Test = ( ) => (
615+ < EventComponent >
616+ < div ref = { divRef } >
617+ < EventTarget2 key = "a" foo = { 1 } />
618+ < EventTarget2 key = "b" foo = { 2 } />
619+ < button ref = { buttonRef } >
620+ < EventTarget key = "c" foo = { 3 } />
621+ Press me!
622+ </ button >
623+ </ div >
624+ </ EventComponent >
625+ ) ;
626+
627+ ReactDOM . render ( < Test /> , container ) ;
628+
629+ let buttonElement = buttonRef . current ;
630+ let divElement = divRef . current ;
631+ dispatchClickEvent ( buttonElement ) ;
632+ jest . runAllTimers ( ) ;
633+
634+ expect ( queryResult ) . toEqual ( [
635+ {
636+ node : divElement ,
637+ props : {
638+ foo : 1 ,
639+ } ,
640+ } ,
641+ ] ) ;
642+ expect ( queryResult2 ) . toEqual ( [
643+ {
644+ node : buttonElement ,
645+ props : {
646+ foo : 3 ,
647+ } ,
648+ } ,
649+ ] ) ;
650+ expect ( queryResult3 ) . toEqual ( [ ] ) ;
651+ } ) ;
417652} ) ;
0 commit comments