12
12
let React ;
13
13
let ReactFeatureFlags ;
14
14
let ReactDOM ;
15
+ let ReactSymbols ;
15
16
16
17
function createReactEventComponent (
17
18
targetEventTypes ,
@@ -42,6 +43,14 @@ function dispatchClickEvent(element) {
42
43
element . dispatchEvent ( clickEvent ) ;
43
44
}
44
45
46
+ function createReactEventTarget ( type ) {
47
+ return {
48
+ $$typeof : ReactSymbols . REACT_EVENT_TARGET_TYPE ,
49
+ displayName : 'TestEventTarget' ,
50
+ type,
51
+ } ;
52
+ }
53
+
45
54
// This is a new feature in Fiber so I put it in its own test file. It could
46
55
// probably move to one of the other test files once it is official.
47
56
describe ( 'DOMEventResponderSystem' , ( ) => {
@@ -55,6 +64,7 @@ describe('DOMEventResponderSystem', () => {
55
64
ReactDOM = require ( 'react-dom' ) ;
56
65
container = document . createElement ( 'div' ) ;
57
66
document . body . appendChild ( container ) ;
67
+ ReactSymbols = require ( 'shared/ReactSymbols' ) ;
58
68
} ) ;
59
69
60
70
afterEach ( ( ) => {
@@ -414,4 +424,229 @@ describe('DOMEventResponderSystem', () => {
414
424
expect ( ownershipGained ) . toEqual ( true ) ;
415
425
expect ( onOwnershipChangeFired ) . toEqual ( 1 ) ;
416
426
} ) ;
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
+ } ) ;
417
652
} ) ;
0 commit comments