@samitouri / QOS-React / commits / 7f696bd99c

fix: onFocus/onBlur/onBeforeInput have a matching event type (#19561)

* test: Add current behavior for event types of onFocus/onBlur * fix: onFocus/onBlur have a matching event type * fix useFocus * fix: don't compare native event types with react event types * Add FocusIn/FocusOutEventInterface * A simpler alternative fix * Add regression tests * Always pass React event type and fix beforeinput Co-authored-by: Dan Abramov <dan.abramov@me.com>

Sebastian Silbermann committed Aug 10, 2020 at 13:54 UTC 7f696bd99c39348a631c20378d2a8704634bab04
13 files changed +241 -41
packages/react-dom/src/__tests__/ReactDOMEventPropagation-test.js
+93
@@ -50,6 +50,7 @@ describe('ReactDOMEventListener', () => {
50 testNativeBubblingEvent({
51 type: 'div',
52 reactEvent: 'onAnimationEnd',
53 + reactEventType: 'animationend',
54 nativeEvent: 'animationend',
55 dispatch(node) {
56 node.dispatchEvent(
@@ -66,6 +67,7 @@ describe('ReactDOMEventListener', () => {
67 testNativeBubblingEvent({
68 type: 'div',
69 reactEvent: 'onAnimationIteration',
70 + reactEventType: 'animationiteration',
71 nativeEvent: 'animationiteration',
72 dispatch(node) {
73 node.dispatchEvent(
@@ -82,6 +84,7 @@ describe('ReactDOMEventListener', () => {
84 testNativeBubblingEvent({
85 type: 'div',
86 reactEvent: 'onAnimationStart',
87 + reactEventType: 'animationstart',
88 nativeEvent: 'animationstart',
89 dispatch(node) {
90 node.dispatchEvent(
@@ -98,6 +101,7 @@ describe('ReactDOMEventListener', () => {
101 testNativeBubblingEvent({
102 type: 'div',
103 reactEvent: 'onAuxClick',
104 + reactEventType: 'auxclick',
105 nativeEvent: 'auxclick',
106 dispatch(node) {
107 node.dispatchEvent(
@@ -114,6 +118,7 @@ describe('ReactDOMEventListener', () => {
118 testNativeBubblingEvent({
119 type: 'input',
120 reactEvent: 'onBlur',
121 + reactEventType: 'blur',
122 nativeEvent: 'focusout',
123 dispatch(node) {
124 const e = new Event('focusout', {
@@ -133,6 +138,7 @@ describe('ReactDOMEventListener', () => {
138 testNativeBubblingEvent({
139 type: 'div',
140 reactEvent: 'onClick',
141 + reactEventType: 'click',
142 nativeEvent: 'click',
143 dispatch(node) {
144 node.click();
@@ -144,6 +150,7 @@ describe('ReactDOMEventListener', () => {
150 testNativeBubblingEvent({
151 type: 'div',
152 reactEvent: 'onContextMenu',
153 + reactEventType: 'contextmenu',
154 nativeEvent: 'contextmenu',
155 dispatch(node) {
156 node.dispatchEvent(
@@ -160,6 +167,7 @@ describe('ReactDOMEventListener', () => {
167 testNativeBubblingEvent({
168 type: 'div',
169 reactEvent: 'onCopy',
170 + reactEventType: 'copy',
171 nativeEvent: 'copy',
172 dispatch(node) {
173 node.dispatchEvent(
@@ -176,6 +184,7 @@ describe('ReactDOMEventListener', () => {
184 testNativeBubblingEvent({
185 type: 'div',
186 reactEvent: 'onCut',
187 + reactEventType: 'cut',
188 nativeEvent: 'cut',
189 dispatch(node) {
190 node.dispatchEvent(
@@ -192,6 +201,7 @@ describe('ReactDOMEventListener', () => {
201 testNativeBubblingEvent({
202 type: 'div',
203 reactEvent: 'onDoubleClick',
204 + reactEventType: 'dblclick',
205 nativeEvent: 'dblclick',
206 dispatch(node) {
207 node.dispatchEvent(
@@ -208,6 +218,7 @@ describe('ReactDOMEventListener', () => {
218 testNativeBubblingEvent({
219 type: 'div',
220 reactEvent: 'onDrag',
221 + reactEventType: 'drag',
222 nativeEvent: 'drag',
223 dispatch(node) {
224 node.dispatchEvent(
@@ -224,6 +235,7 @@ describe('ReactDOMEventListener', () => {
235 testNativeBubblingEvent({
236 type: 'div',
237 reactEvent: 'onDragEnd',
238 + reactEventType: 'dragend',
239 nativeEvent: 'dragend',
240 dispatch(node) {
241 node.dispatchEvent(
@@ -240,6 +252,7 @@ describe('ReactDOMEventListener', () => {
252 testNativeBubblingEvent({
253 type: 'div',
254 reactEvent: 'onDragEnter',
255 + reactEventType: 'dragenter',
256 nativeEvent: 'dragenter',
257 dispatch(node) {
258 node.dispatchEvent(
@@ -256,6 +269,7 @@ describe('ReactDOMEventListener', () => {
269 testNativeBubblingEvent({
270 type: 'div',
271 reactEvent: 'onDragExit',
272 + reactEventType: 'dragexit',
273 nativeEvent: 'dragexit',
274 dispatch(node) {
275 node.dispatchEvent(
@@ -272,6 +286,7 @@ describe('ReactDOMEventListener', () => {
286 testNativeBubblingEvent({
287 type: 'div',
288 reactEvent: 'onDragLeave',
289 + reactEventType: 'dragleave',
290 nativeEvent: 'dragleave',
291 dispatch(node) {
292 node.dispatchEvent(
@@ -288,6 +303,7 @@ describe('ReactDOMEventListener', () => {
303 testNativeBubblingEvent({
304 type: 'div',
305 reactEvent: 'onDragOver',
306 + reactEventType: 'dragover',
307 nativeEvent: 'dragover',
308 dispatch(node) {
309 node.dispatchEvent(
@@ -304,6 +320,7 @@ describe('ReactDOMEventListener', () => {
320 testNativeBubblingEvent({
321 type: 'div',
322 reactEvent: 'onDragStart',
323 + reactEventType: 'dragstart',
324 nativeEvent: 'dragstart',
325 dispatch(node) {
326 node.dispatchEvent(
@@ -320,6 +337,7 @@ describe('ReactDOMEventListener', () => {
337 testNativeBubblingEvent({
338 type: 'div',
339 reactEvent: 'onDrop',
340 + reactEventType: 'drop',
341 nativeEvent: 'drop',
342 dispatch(node) {
343 node.dispatchEvent(
@@ -336,6 +354,7 @@ describe('ReactDOMEventListener', () => {
354 testNativeBubblingEvent({
355 type: 'input',
356 reactEvent: 'onFocus',
357 + reactEventType: 'focus',
358 nativeEvent: 'focusin',
359 dispatch(node) {
360 const e = new Event('focusin', {
@@ -351,6 +370,7 @@ describe('ReactDOMEventListener', () => {
370 testNativeBubblingEvent({
371 type: 'div',
372 reactEvent: 'onGotPointerCapture',
373 + reactEventType: 'gotpointercapture',
374 nativeEvent: 'gotpointercapture',
375 dispatch(node) {
376 node.dispatchEvent(
@@ -367,6 +387,7 @@ describe('ReactDOMEventListener', () => {
387 testNativeBubblingEvent({
388 type: 'input',
389 reactEvent: 'onKeyDown',
390 + reactEventType: 'keydown',
391 nativeEvent: 'keydown',
392 dispatch(node) {
393 node.dispatchEvent(
@@ -383,6 +404,7 @@ describe('ReactDOMEventListener', () => {
404 testNativeBubblingEvent({
405 type: 'input',
406 reactEvent: 'onKeyPress',
407 + reactEventType: 'keypress',
408 nativeEvent: 'keypress',
409 dispatch(node) {
410 node.dispatchEvent(
@@ -400,6 +422,7 @@ describe('ReactDOMEventListener', () => {
422 testNativeBubblingEvent({
423 type: 'input',
424 reactEvent: 'onKeyUp',
425 + reactEventType: 'keyup',
426 nativeEvent: 'keyup',
427 dispatch(node) {
428 node.dispatchEvent(
@@ -416,6 +439,7 @@ describe('ReactDOMEventListener', () => {
439 testNativeBubblingEvent({
440 type: 'div',
441 reactEvent: 'onLostPointerCapture',
442 + reactEventType: 'lostpointercapture',
443 nativeEvent: 'lostpointercapture',
444 dispatch(node) {
445 node.dispatchEvent(
@@ -432,6 +456,7 @@ describe('ReactDOMEventListener', () => {
456 testNativeBubblingEvent({
457 type: 'div',
458 reactEvent: 'onMouseDown',
459 + reactEventType: 'mousedown',
460 nativeEvent: 'mousedown',
461 dispatch(node) {
462 node.dispatchEvent(
@@ -448,6 +473,7 @@ describe('ReactDOMEventListener', () => {
473 testNativeBubblingEvent({
474 type: 'div',
475 reactEvent: 'onMouseOut',
476 + reactEventType: 'mouseout',
477 nativeEvent: 'mouseout',
478 dispatch(node) {
479 node.dispatchEvent(
@@ -464,6 +490,7 @@ describe('ReactDOMEventListener', () => {
490 testNativeBubblingEvent({
491 type: 'div',
492 reactEvent: 'onMouseOver',
493 + reactEventType: 'mouseover',
494 nativeEvent: 'mouseover',
495 dispatch(node) {
496 node.dispatchEvent(
@@ -480,6 +507,7 @@ describe('ReactDOMEventListener', () => {
507 testNativeBubblingEvent({
508 type: 'div',
509 reactEvent: 'onMouseUp',
510 + reactEventType: 'mouseup',
511 nativeEvent: 'mouseup',
512 dispatch(node) {
513 node.dispatchEvent(
@@ -496,6 +524,7 @@ describe('ReactDOMEventListener', () => {
524 testNativeBubblingEvent({
525 type: 'div',
526 reactEvent: 'onPaste',
527 + reactEventType: 'paste',
528 nativeEvent: 'paste',
529 dispatch(node) {
530 node.dispatchEvent(
@@ -512,6 +541,7 @@ describe('ReactDOMEventListener', () => {
541 testNativeBubblingEvent({
542 type: 'div',
543 reactEvent: 'onPointerCancel',
544 + reactEventType: 'pointercancel',
545 nativeEvent: 'pointercancel',
546 dispatch(node) {
547 node.dispatchEvent(
@@ -528,6 +558,7 @@ describe('ReactDOMEventListener', () => {
558 testNativeBubblingEvent({
559 type: 'div',
560 reactEvent: 'onPointerDown',
561 + reactEventType: 'pointerdown',
562 nativeEvent: 'pointerdown',
563 dispatch(node) {
564 node.dispatchEvent(
@@ -544,6 +575,7 @@ describe('ReactDOMEventListener', () => {
575 testNativeBubblingEvent({
576 type: 'div',
577 reactEvent: 'onPointerMove',
578 + reactEventType: 'pointermove',
579 nativeEvent: 'pointermove',
580 dispatch(node) {
581 node.dispatchEvent(
@@ -560,6 +592,7 @@ describe('ReactDOMEventListener', () => {
592 testNativeBubblingEvent({
593 type: 'div',
594 reactEvent: 'onPointerOut',
595 + reactEventType: 'pointerout',
596 nativeEvent: 'pointerout',
597 dispatch(node) {
598 node.dispatchEvent(
@@ -576,6 +609,7 @@ describe('ReactDOMEventListener', () => {
609 testNativeBubblingEvent({
610 type: 'div',
611 reactEvent: 'onPointerOver',
612 + reactEventType: 'pointerover',
613 nativeEvent: 'pointerover',
614 dispatch(node) {
615 node.dispatchEvent(
@@ -592,6 +626,7 @@ describe('ReactDOMEventListener', () => {
626 testNativeBubblingEvent({
627 type: 'div',
628 reactEvent: 'onPointerUp',
629 + reactEventType: 'pointerup',
630 nativeEvent: 'pointerup',
631 dispatch(node) {
632 node.dispatchEvent(
@@ -608,6 +643,7 @@ describe('ReactDOMEventListener', () => {
643 testNativeBubblingEvent({
644 type: 'form',
645 reactEvent: 'onReset',
646 + reactEventType: 'reset',
647 nativeEvent: 'reset',
648 dispatch(node) {
649 const e = new Event('reset', {
@@ -623,6 +659,7 @@ describe('ReactDOMEventListener', () => {
659 testNativeBubblingEvent({
660 type: 'form',
661 reactEvent: 'onSubmit',
662 + reactEventType: 'submit',
663 nativeEvent: 'submit',
664 dispatch(node) {
665 const e = new Event('submit', {
@@ -638,6 +675,7 @@ describe('ReactDOMEventListener', () => {
675 testNativeBubblingEvent({
676 type: 'div',
677 reactEvent: 'onTouchCancel',
678 + reactEventType: 'touchcancel',
679 nativeEvent: 'touchcancel',
680 dispatch(node) {
681 node.dispatchEvent(
@@ -654,6 +692,7 @@ describe('ReactDOMEventListener', () => {
692 testNativeBubblingEvent({
693 type: 'div',
694 reactEvent: 'onTouchEnd',
695 + reactEventType: 'touchend',
696 nativeEvent: 'touchend',
697 dispatch(node) {
698 node.dispatchEvent(
@@ -670,6 +709,7 @@ describe('ReactDOMEventListener', () => {
709 testNativeBubblingEvent({
710 type: 'div',
711 reactEvent: 'onTouchMove',
712 + reactEventType: 'touchmove',
713 nativeEvent: 'touchmove',
714 dispatch(node) {
715 node.dispatchEvent(
@@ -686,6 +726,7 @@ describe('ReactDOMEventListener', () => {
726 testNativeBubblingEvent({
727 type: 'div',
728 reactEvent: 'onTouchStart',
729 + reactEventType: 'touchstart',
730 nativeEvent: 'touchstart',
731 dispatch(node) {
732 node.dispatchEvent(
@@ -702,6 +743,7 @@ describe('ReactDOMEventListener', () => {
743 testNativeBubblingEvent({
744 type: 'div',
745 reactEvent: 'onTransitionEnd',
746 + reactEventType: 'transitionend',
747 nativeEvent: 'transitionend',
748 dispatch(node) {
749 node.dispatchEvent(
@@ -718,6 +760,7 @@ describe('ReactDOMEventListener', () => {
760 testNativeBubblingEvent({
761 type: 'div',
762 reactEvent: 'onWheel',
763 + reactEventType: 'wheel',
764 nativeEvent: 'wheel',
765 dispatch(node) {
766 node.dispatchEvent(
@@ -736,6 +779,7 @@ describe('ReactDOMEventListener', () => {
779 testEmulatedBubblingEvent({
780 type: 'video',
781 reactEvent: 'onAbort',
782 + reactEventType: 'abort',
783 nativeEvent: 'abort',
784 dispatch(node) {
785 const e = new Event('abort', {
@@ -751,6 +795,7 @@ describe('ReactDOMEventListener', () => {
795 testEmulatedBubblingEvent({
796 type: 'dialog',
797 reactEvent: 'onCancel',
798 + reactEventType: 'cancel',
799 nativeEvent: 'cancel',
800 dispatch(node) {
801 const e = new Event('cancel', {
@@ -766,6 +811,7 @@ describe('ReactDOMEventListener', () => {
811 testEmulatedBubblingEvent({
812 type: 'video',
813 reactEvent: 'onCanPlay',
814 + reactEventType: 'canplay',
815 nativeEvent: 'canplay',
816 dispatch(node) {
817 const e = new Event('canplay', {
@@ -781,6 +827,7 @@ describe('ReactDOMEventListener', () => {
827 testEmulatedBubblingEvent({
828 type: 'video',
829 reactEvent: 'onCanPlayThrough',
830 + reactEventType: 'canplaythrough',
831 nativeEvent: 'canplaythrough',
832 dispatch(node) {
833 const e = new Event('canplaythrough', {
@@ -796,6 +843,7 @@ describe('ReactDOMEventListener', () => {
843 testEmulatedBubblingEvent({
844 type: 'dialog',
845 reactEvent: 'onClose',
846 + reactEventType: 'close',
847 nativeEvent: 'close',
848 dispatch(node) {
849 const e = new Event('close', {
@@ -811,6 +859,7 @@ describe('ReactDOMEventListener', () => {
859 testEmulatedBubblingEvent({
860 type: 'video',
861 reactEvent: 'onDurationChange',
862 + reactEventType: 'durationchange',
863 nativeEvent: 'durationchange',
864 dispatch(node) {
865 const e = new Event('durationchange', {
@@ -826,6 +875,7 @@ describe('ReactDOMEventListener', () => {
875 testEmulatedBubblingEvent({
876 type: 'video',
877 reactEvent: 'onEmptied',
878 + reactEventType: 'emptied',
879 nativeEvent: 'emptied',
880 dispatch(node) {
881 const e = new Event('emptied', {
@@ -841,6 +891,7 @@ describe('ReactDOMEventListener', () => {
891 testEmulatedBubblingEvent({
892 type: 'video',
893 reactEvent: 'onEncrypted',
894 + reactEventType: 'encrypted',
895 nativeEvent: 'encrypted',
896 dispatch(node) {
897 const e = new Event('encrypted', {
@@ -856,6 +907,7 @@ describe('ReactDOMEventListener', () => {
907 testEmulatedBubblingEvent({
908 type: 'video',
909 reactEvent: 'onEnded',
910 + reactEventType: 'ended',
911 nativeEvent: 'ended',
912 dispatch(node) {
913 const e = new Event('ended', {
@@ -871,6 +923,7 @@ describe('ReactDOMEventListener', () => {
923 testEmulatedBubblingEvent({
924 type: 'img',
925 reactEvent: 'onError',
926 + reactEventType: 'error',
927 nativeEvent: 'error',
928 dispatch(node) {
929 const e = new Event('error', {
@@ -886,6 +939,7 @@ describe('ReactDOMEventListener', () => {
939 testEmulatedBubblingEvent({
940 type: 'input',
941 reactEvent: 'onInvalid',
942 + reactEventType: 'invalid',
943 nativeEvent: 'invalid',
944 dispatch(node) {
945 const e = new Event('invalid', {
@@ -901,6 +955,7 @@ describe('ReactDOMEventListener', () => {
955 testEmulatedBubblingEvent({
956 type: 'img',
957 reactEvent: 'onLoad',
958 + reactEventType: 'load',
959 nativeEvent: 'load',
960 dispatch(node) {
961 const e = new Event('load', {
@@ -916,6 +971,7 @@ describe('ReactDOMEventListener', () => {
971 testEmulatedBubblingEvent({
972 type: 'video',
973 reactEvent: 'onLoadedData',
974 + reactEventType: 'loadeddata',
975 nativeEvent: 'loadeddata',
976 dispatch(node) {
977 const e = new Event('loadeddata', {
@@ -931,6 +987,7 @@ describe('ReactDOMEventListener', () => {
987 testEmulatedBubblingEvent({
988 type: 'video',
989 reactEvent: 'onLoadedMetadata',
990 + reactEventType: 'loadedmetadata',
991 nativeEvent: 'loadedmetadata',
992 dispatch(node) {
993 const e = new Event('loadedmetadata', {
@@ -946,6 +1003,7 @@ describe('ReactDOMEventListener', () => {
1003 testEmulatedBubblingEvent({
1004 type: 'video',
1005 reactEvent: 'onLoadStart',
1006 + reactEventType: 'loadstart',
1007 nativeEvent: 'loadstart',
1008 dispatch(node) {
1009 const e = new Event('loadstart', {
@@ -961,6 +1019,7 @@ describe('ReactDOMEventListener', () => {
1019 testEmulatedBubblingEvent({
1020 type: 'video',
1021 reactEvent: 'onPause',
1022 + reactEventType: 'pause',
1023 nativeEvent: 'pause',
1024 dispatch(node) {
1025 const e = new Event('pause', {
@@ -976,6 +1035,7 @@ describe('ReactDOMEventListener', () => {
1035 testEmulatedBubblingEvent({
1036 type: 'video',
1037 reactEvent: 'onPlay',
1038 + reactEventType: 'play',
1039 nativeEvent: 'play',
1040 dispatch(node) {
1041 const e = new Event('play', {
@@ -991,6 +1051,7 @@ describe('ReactDOMEventListener', () => {
1051 testEmulatedBubblingEvent({
1052 type: 'video',
1053 reactEvent: 'onPlaying',
1054 + reactEventType: 'playing',
1055 nativeEvent: 'playing',
1056 dispatch(node) {
1057 const e = new Event('playing', {
@@ -1006,6 +1067,7 @@ describe('ReactDOMEventListener', () => {
1067 testEmulatedBubblingEvent({
1068 type: 'video',
1069 reactEvent: 'onProgress',
1070 + reactEventType: 'progress',
1071 nativeEvent: 'progress',
1072 dispatch(node) {
1073 const e = new Event('progress', {
@@ -1021,6 +1083,7 @@ describe('ReactDOMEventListener', () => {
1083 testEmulatedBubblingEvent({
1084 type: 'video',
1085 reactEvent: 'onRateChange',
1086 + reactEventType: 'ratechange',
1087 nativeEvent: 'ratechange',
1088 dispatch(node) {
1089 const e = new Event('ratechange', {
@@ -1036,6 +1099,7 @@ describe('ReactDOMEventListener', () => {
1099 testEmulatedBubblingEvent({
1100 type: 'video',
1101 reactEvent: 'onSeeked',
1102 + reactEventType: 'seeked',
1103 nativeEvent: 'seeked',
1104 dispatch(node) {
1105 const e = new Event('seeked', {
@@ -1051,6 +1115,7 @@ describe('ReactDOMEventListener', () => {
1115 testEmulatedBubblingEvent({
1116 type: 'video',
1117 reactEvent: 'onSeeking',
1118 + reactEventType: 'seeking',
1119 nativeEvent: 'seeking',
1120 dispatch(node) {
1121 const e = new Event('seeking', {
@@ -1066,6 +1131,7 @@ describe('ReactDOMEventListener', () => {
1131 testEmulatedBubblingEvent({
1132 type: 'video',
1133 reactEvent: 'onStalled',
1134 + reactEventType: 'stalled',
1135 nativeEvent: 'stalled',
1136 dispatch(node) {
1137 const e = new Event('stalled', {
@@ -1081,6 +1147,7 @@ describe('ReactDOMEventListener', () => {
1147 testEmulatedBubblingEvent({
1148 type: 'video',
1149 reactEvent: 'onSuspend',
1150 + reactEventType: 'suspend',
1151 nativeEvent: 'suspend',
1152 dispatch(node) {
1153 const e = new Event('suspend', {
@@ -1096,6 +1163,7 @@ describe('ReactDOMEventListener', () => {
1163 testEmulatedBubblingEvent({
1164 type: 'video',
1165 reactEvent: 'onTimeUpdate',
1166 + reactEventType: 'timeupdate',
1167 nativeEvent: 'timeupdate',
1168 dispatch(node) {
1169 const e = new Event('timeupdate', {
@@ -1111,6 +1179,7 @@ describe('ReactDOMEventListener', () => {
1179 testEmulatedBubblingEvent({
1180 type: 'details',
1181 reactEvent: 'onToggle',
1182 + reactEventType: 'toggle',
1183 nativeEvent: 'toggle',
1184 dispatch(node) {
1185 const e = new Event('toggle', {
@@ -1126,6 +1195,7 @@ describe('ReactDOMEventListener', () => {
1195 testEmulatedBubblingEvent({
1196 type: 'video',
1197 reactEvent: 'onVolumeChange',
1198 + reactEventType: 'volumechange',
1199 nativeEvent: 'volumechange',
1200 dispatch(node) {
1201 const e = new Event('volumechange', {
@@ -1141,6 +1211,7 @@ describe('ReactDOMEventListener', () => {
1211 testEmulatedBubblingEvent({
1212 type: 'video',
1213 reactEvent: 'onWaiting',
1214 + reactEventType: 'waiting',
1215 nativeEvent: 'waiting',
1216 dispatch(node) {
1217 const e = new Event('waiting', {
@@ -1158,6 +1229,7 @@ describe('ReactDOMEventListener', () => {
1229 testNonBubblingEvent({
1230 type: 'div',
1231 reactEvent: 'onScroll',
1232 + reactEventType: 'scroll',
1233 nativeEvent: 'scroll',
1234 dispatch(node) {
1235 const e = new Event('scroll', {
@@ -1368,6 +1440,7 @@ describe('ReactDOMEventListener', () => {
1440 log.push('- outer parent');
1441 },
1442 onBeforeInputCapture: e => {
1443 + expect(e.type).toBe('beforeinput');
1444 log.push('- outer parent capture');
1445 },
1446 }}
@@ -1430,6 +1503,7 @@ describe('ReactDOMEventListener', () => {
1503 log.push('- outer parent');
1504 },
1505 onChangeCapture: e => {
1506 + expect(e.type).toBe('change');
1507 log.push('- outer parent capture');
1508 },
1509 }}
@@ -1488,6 +1562,7 @@ describe('ReactDOMEventListener', () => {
1562 log.push('- outer parent');
1563 },
1564 onCompositionStartCapture: e => {
1565 + expect(e.type).toBe('compositionstart');
1566 log.push('- outer parent capture');
1567 },
1568 }}
@@ -1549,6 +1624,7 @@ describe('ReactDOMEventListener', () => {
1624 log.push('- outer parent');
1625 },
1626 onCompositionEndCapture: e => {
1627 + expect(e.type).toBe('compositionend');
1628 log.push('- outer parent capture');
1629 },
1630 }}
@@ -1610,6 +1686,7 @@ describe('ReactDOMEventListener', () => {
1686 log.push('- outer parent');
1687 },
1688 onCompositionUpdateCapture: e => {
1689 + expect(e.type).toBe('compositionupdate');
1690 log.push('- outer parent capture');
1691 },
1692 }}
@@ -1671,6 +1748,7 @@ describe('ReactDOMEventListener', () => {
1748 log.push('- outer parent');
1749 },
1750 onSelectCapture: e => {
1751 + expect(e.type).toBe('select');
1752 log.push('- outer parent capture');
1753 },
1754 }}
@@ -1769,6 +1847,7 @@ describe('ReactDOMEventListener', () => {
1847 log.push('- outer parent');
1848 },
1849 [eventConfig.reactEvent + 'Capture']: e => {
1850 + expect(e.type).toBe(eventConfig.reactEventType);
1851 log.push('- outer parent capture');
1852 },
1853 }}
@@ -1825,6 +1904,7 @@ describe('ReactDOMEventListener', () => {
1904 log.push('- outer parent');
1905 },
1906 [eventConfig.reactEvent + 'Capture']: e => {
1907 + expect(e.type).toBe(eventConfig.reactEventType);
1908 log.push('- outer parent capture');
1909 },
1910 }}
@@ -1883,6 +1963,7 @@ describe('ReactDOMEventListener', () => {
1963 log.push('- outer parent');
1964 },
1965 [eventConfig.reactEvent + 'Capture']: e => {
1966 + expect(e.type).toBe(eventConfig.reactEventType);
1967 log.push('- outer parent capture');
1968 },
1969 }}
@@ -1935,6 +2016,7 @@ describe('ReactDOMEventListener', () => {
2016 log.push('- outer parent');
2017 },
2018 [eventConfig.reactEvent + 'Capture']: e => {
2019 + expect(e.type).toBe(eventConfig.reactEventType);
2020 log.push('- outer parent capture');
2021 },
2022 }}
@@ -1986,6 +2068,7 @@ describe('ReactDOMEventListener', () => {
2068 log.push('- outer parent');
2069 },
2070 [eventConfig.reactEvent + 'Capture']: e => {
2071 + expect(e.type).toBe(eventConfig.reactEventType);
2072 log.push('- outer parent capture');
2073 },
2074 }}
@@ -2039,6 +2122,7 @@ describe('ReactDOMEventListener', () => {
2122 log.push('- outer parent');
2123 },
2124 [eventConfig.reactEvent + 'Capture']: e => {
2125 + expect(e.type).toBe(eventConfig.reactEventType);
2126 log.push('- outer parent capture');
2127 },
2128 }}
@@ -2103,6 +2187,7 @@ describe('ReactDOMEventListener', () => {
2187 log.push('- outer parent');
2188 },
2189 [eventConfig.reactEvent + 'Capture']: e => {
2190 + expect(e.type).toBe(eventConfig.reactEventType);
2191 log.push('- outer parent capture');
2192 },
2193 }}
@@ -2165,6 +2250,7 @@ describe('ReactDOMEventListener', () => {
2250 log.push('- outer parent');
2251 },
2252 [eventConfig.reactEvent + 'Capture']: e => {
2253 + expect(e.type).toBe(eventConfig.reactEventType);
2254 log.push('- outer parent capture');
2255 },
2256 }}
@@ -2228,6 +2314,7 @@ describe('ReactDOMEventListener', () => {
2314 log.push('- outer parent');
2315 },
2316 [eventConfig.reactEvent + 'Capture']: e => {
2317 + expect(e.type).toBe(eventConfig.reactEventType);
2318 log.push('- outer parent capture');
2319 },
2320 }}
@@ -2282,6 +2369,7 @@ describe('ReactDOMEventListener', () => {
2369 log.push('- outer parent');
2370 },
2371 [eventConfig.reactEvent + 'Capture']: e => {
2372 + expect(e.type).toBe(eventConfig.reactEventType);
2373 log.push('- outer parent capture');
2374 },
2375 }}
@@ -2350,6 +2438,7 @@ describe('ReactDOMEventListener', () => {
2438 log.push('- outer parent');
2439 },
2440 [eventConfig.reactEvent + 'Capture']: e => {
2441 + expect(e.type).toBe(eventConfig.reactEventType);
2442 log.push('- outer parent capture');
2443 },
2444 }}
@@ -2417,6 +2506,7 @@ describe('ReactDOMEventListener', () => {
2506 log.push('- outer parent');
2507 },
2508 [eventConfig.reactEvent + 'Capture']: e => {
2509 + expect(e.type).toBe(eventConfig.reactEventType);
2510 log.push('- outer parent capture');
2511 },
2512 }}
@@ -2482,6 +2572,7 @@ describe('ReactDOMEventListener', () => {
2572 log.push('- outer parent');
2573 },
2574 [eventConfig.reactEvent + 'Capture']: e => {
2575 + expect(e.type).toBe(eventConfig.reactEventType);
2576 log.push('- outer parent capture');
2577 },
2578 }}
@@ -2547,6 +2638,7 @@ describe('ReactDOMEventListener', () => {
2638 log.push('- outer parent');
2639 },
2640 [eventConfig.reactEvent + 'Capture']: e => {
2641 + expect(e.type).toBe(eventConfig.reactEventType);
2642 log.push('- outer parent capture');
2643 },
2644 }}
@@ -2615,6 +2707,7 @@ describe('ReactDOMEventListener', () => {
2707 log.push('- outer parent');
2708 },
2709 [eventConfig.reactEvent + 'Capture']: e => {
2710 + expect(e.type).toBe(eventConfig.reactEventType);
2711 log.push('- outer parent capture');
2712 },
2713 }}
packages/react-dom/src/events/DOMPluginEventSystem.js
+1 -1
@@ -709,7 +709,7 @@ export function accumulateSinglePhaseListeners(
709
710 let instance = targetFiber;
711 let lastHostComponent = null;
712 - const targetType = event.type;
712 + const targetType = event.nativeEvent.type;
713
714 // Accumulate all instances and listeners via the target -> root path.
715 while (instance !== null) {
packages/react-dom/src/events/ReactSyntheticEventType.js
+1
@@ -29,6 +29,7 @@ export type ReactSyntheticEvent = {|
29 _dispatchListeners?: null | Array<Function> | Function,
30 _reactName: string,
31 _targetInst: Fiber,
32 + nativeEvent: Event,
33 type: string,
34 currentTarget: null | EventTarget,
35 |};
packages/react-dom/src/events/SyntheticEvent.js
+2 -1
@@ -14,7 +14,6 @@ import getEventCharCode from './getEventCharCode';
14 * @see http://www.w3.org/TR/DOM-Level-3-Events/
15 */
16 const EventInterface = {
17 - type: 0,
17 eventPhase: 0,
18 bubbles: 0,
19 cancelable: 0,
@@ -48,6 +47,7 @@ function functionThatReturnsFalse() {
47 */
48 export function SyntheticEvent(
49 reactName,
50 + reactEventType,
51 targetInst,
52 nativeEvent,
53 nativeEventTarget,
@@ -55,6 +55,7 @@ export function SyntheticEvent(
55 ) {
56 this._reactName = reactName;
57 this._targetInst = targetInst;
58 + this.type = reactEventType;
59 this.nativeEvent = nativeEvent;
60 this.target = nativeEventTarget;
61 this.currentTarget = null;
packages/react-dom/src/events/__tests__/SyntheticFocusEvent-test.js new
+70
@@ -0,0 +1,70 @@
1 +/**
2 + * Copyright (c) Facebook, Inc. and its affiliates.
3 + *
4 + * This source code is licensed under the MIT license found in the
5 + * LICENSE file in the root directory of this source tree.
6 + */
7 +
8 +'use strict';
9 +
10 +describe('SyntheticFocusEvent', () => {
11 + let React;
12 + let ReactDOM;
13 + let container;
14 +
15 + beforeEach(() => {
16 + jest.resetModules();
17 + React = require('react');
18 + ReactDOM = require('react-dom');
19 +
20 + container = document.createElement('div');
21 + document.body.appendChild(container);
22 + });
23 +
24 + afterEach(() => {
25 + document.body.removeChild(container);
26 + container = null;
27 + });
28 +
29 + test('onFocus events have the focus type', () => {
30 + const log = [];
31 + ReactDOM.render(
32 + <button
33 + onFocus={event => log.push(`onFocus: ${event.type}`)}
34 + onFocusCapture={event => log.push(`onFocusCapture: ${event.type}`)}
35 + />,
36 + container,
37 + );
38 + const button = container.querySelector('button');
39 +
40 + button.dispatchEvent(
41 + new FocusEvent('focusin', {
42 + bubbles: true,
43 + cancelable: false,
44 + }),
45 + );
46 +
47 + expect(log).toEqual(['onFocusCapture: focus', 'onFocus: focus']);
48 + });
49 +
50 + test('onBlur events have the blur type', () => {
51 + const log = [];
52 + ReactDOM.render(
53 + <button
54 + onBlur={event => log.push(`onBlur: ${event.type}`)}
55 + onBlurCapture={event => log.push(`onBlurCapture: ${event.type}`)}
56 + />,
57 + container,
58 + );
59 + const button = container.querySelector('button');
60 +
61 + button.dispatchEvent(
62 + new FocusEvent('focusout', {
63 + bubbles: true,
64 + cancelable: false,
65 + }),
66 + );
67 +
68 + expect(log).toEqual(['onBlurCapture: blur', 'onBlur: blur']);
69 + });
70 +});
packages/react-dom/src/events/plugins/BeforeInputEventPlugin.js
+2
@@ -229,6 +229,7 @@ function extractCompositionEvent(
229
230 const event = new SyntheticEvent(
231 eventType,
232 + domEventName,
233 null,
234 nativeEvent,
235 nativeEventTarget,
@@ -397,6 +398,7 @@ function extractBeforeInputEvent(
398
399 const event = new SyntheticEvent(
400 'onBeforeInput',
401 + 'beforeinput',
402 null,
403 nativeEvent,
404 nativeEventTarget,
packages/react-dom/src/events/plugins/ChangeEventPlugin.js
+7 -2
@@ -49,8 +49,13 @@ function createAndAccumulateChangeEvent(
49 nativeEvent,
50 target,
51 ) {
52 - const event = new SyntheticEvent('onChange', null, nativeEvent, target);
53 - event.type = 'change';
52 + const event = new SyntheticEvent(
53 + 'onChange',
54 + 'change',
55 + null,
56 + nativeEvent,
57 + target,
58 + );
59 // Flag this event loop as needing state restore.
60 enqueueStateRestore(((target: any): Node));
61 accumulateTwoPhaseListeners(inst, dispatchQueue, event);
packages/react-dom/src/events/plugins/EnterLeaveEventPlugin.js
+2 -2
@@ -133,23 +133,23 @@ function extractEvents(
133
134 const leave = new SyntheticEvent(
135 leaveEventType,
136 + eventTypePrefix + 'leave',
137 from,
138 nativeEvent,
139 nativeEventTarget,
140 eventInterface,
141 );
141 - leave.type = eventTypePrefix + 'leave';
142 leave.target = fromNode;
143 leave.relatedTarget = toNode;
144
145 let enter = new SyntheticEvent(
146 enterEventType,
147 + eventTypePrefix + 'enter',
148 to,
149 nativeEvent,
150 nativeEventTarget,
151 eventInterface,
152 );
152 - enter.type = eventTypePrefix + 'enter';
153 enter.target = toNode;
154 enter.relatedTarget = fromNode;
155
packages/react-dom/src/events/plugins/SelectEventPlugin.js
+1 -2
@@ -114,12 +114,11 @@ function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {
114
115 const syntheticEvent = new SyntheticEvent(
116 'onSelect',
117 + 'select',
118 null,
119 nativeEvent,
120 nativeEventTarget,
121 );
121 -
122 - syntheticEvent.type = 'select';
122 syntheticEvent.target = activeElement;
123
124 accumulateTwoPhaseListeners(
packages/react-dom/src/events/plugins/SimpleEventPlugin.js
+8
@@ -63,6 +63,7 @@ function extractEvents(
63 return;
64 }
65 let EventInterface;
66 + let reactEventType = domEventName;
67 switch (domEventName) {
68 case 'keypress':
69 // Firefox creates a keypress event for function keys too. This removes
@@ -77,7 +78,13 @@ function extractEvents(
78 EventInterface = KeyboardEventInterface;
79 break;
80 case 'focusin':
81 + reactEventType = 'focus';
82 + EventInterface = FocusEventInterface;
83 + break;
84 case 'focusout':
85 + reactEventType = 'blur';
86 + EventInterface = FocusEventInterface;
87 + break;
88 case 'beforeblur':
89 case 'afterblur':
90 EventInterface = FocusEventInterface;
@@ -152,6 +159,7 @@ function extractEvents(
159 }
160 const event = new SyntheticEvent(
161 reactName,
162 + reactEventType,
163 null,
164 nativeEvent,
165 nativeEventTarget,
packages/react-dom/src/events/plugins/__tests__/ModernBeforeInputEventPlugin-test.js
+52 -32
@@ -224,14 +224,16 @@ describe('BeforeInputEventPlugin', () => {
224 {
225 run: ({beforeInputEvent, spyOnBeforeInput}) => {
226 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
227 - expect(beforeInputEvent.type).toBe('compositionend');
227 + expect(beforeInputEvent.nativeEvent.type).toBe('compositionend');
228 + expect(beforeInputEvent.type).toBe('beforeinput');
229 expect(beforeInputEvent.data).toBe('test string 3');
230 },
231 },
232 {
233 run: ({beforeInputEvent, spyOnBeforeInput}) => {
234 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
234 - expect(beforeInputEvent.type).toBe('textInput');
235 + expect(beforeInputEvent.nativeEvent.type).toBe('textInput');
236 + expect(beforeInputEvent.type).toBe('beforeinput');
237 expect(beforeInputEvent.data).toBe('abcß');
238 },
239 },
@@ -244,7 +246,8 @@ describe('BeforeInputEventPlugin', () => {
246 {
247 run: ({beforeInputEvent, spyOnBeforeInput}) => {
248 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
247 - expect(beforeInputEvent.type).toBe('keypress');
249 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
250 + expect(beforeInputEvent.type).toBe('beforeinput');
251 expect(beforeInputEvent.data).toBe(' ');
252 },
253 },
@@ -281,7 +284,8 @@ describe('BeforeInputEventPlugin', () => {
284 {
285 run: ({beforeInputEvent, spyOnBeforeInput}) => {
286 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
284 - expect(beforeInputEvent.type).toBe('textInput');
287 + expect(beforeInputEvent.nativeEvent.type).toBe('textInput');
288 + expect(beforeInputEvent.type).toBe('beforeinput');
289 expect(beforeInputEvent.data).toBe('\uD83D\uDE0A');
290 },
291 },
@@ -359,14 +363,16 @@ describe('BeforeInputEventPlugin', () => {
363 {
364 run: ({beforeInputEvent, spyOnBeforeInput}) => {
365 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
362 - expect(beforeInputEvent.type).toBe('keypress');
366 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
367 + expect(beforeInputEvent.type).toBe('beforeinput');
368 expect(beforeInputEvent.data).toBe('a');
369 },
370 },
371 {
372 run: ({beforeInputEvent, spyOnBeforeInput}) => {
373 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
369 - expect(beforeInputEvent.type).toBe('keypress');
374 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
375 + expect(beforeInputEvent.type).toBe('beforeinput');
376 expect(beforeInputEvent.data).toBe(' ');
377 },
378 },
@@ -391,14 +397,16 @@ describe('BeforeInputEventPlugin', () => {
397 {
398 run: ({beforeInputEvent, spyOnBeforeInput}) => {
399 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
394 - expect(beforeInputEvent.type).toBe('keypress');
400 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
401 + expect(beforeInputEvent.type).toBe('beforeinput');
402 expect(beforeInputEvent.data).toBe('c');
403 },
404 },
405 {
406 run: ({beforeInputEvent, spyOnBeforeInput}) => {
407 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
401 - expect(beforeInputEvent.type).toBe('keypress');
408 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
409 + expect(beforeInputEvent.type).toBe('beforeinput');
410 expect(beforeInputEvent.data).toBe('\uD83D\uDE0A');
411 },
412 },
@@ -482,14 +490,16 @@ describe('BeforeInputEventPlugin', () => {
490 {
491 run: ({beforeInputEvent, spyOnBeforeInput}) => {
492 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
485 - expect(beforeInputEvent.type).toBe('keypress');
493 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
494 + expect(beforeInputEvent.type).toBe('beforeinput');
495 expect(beforeInputEvent.data).toBe('a');
496 },
497 },
498 {
499 run: ({beforeInputEvent, spyOnBeforeInput}) => {
500 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
492 - expect(beforeInputEvent.type).toBe('keypress');
501 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
502 + expect(beforeInputEvent.type).toBe('beforeinput');
503 expect(beforeInputEvent.data).toBe(' ');
504 },
505 },
@@ -514,14 +524,16 @@ describe('BeforeInputEventPlugin', () => {
524 {
525 run: ({beforeInputEvent, spyOnBeforeInput}) => {
526 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
517 - expect(beforeInputEvent.type).toBe('keypress');
527 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
528 + expect(beforeInputEvent.type).toBe('beforeinput');
529 expect(beforeInputEvent.data).toBe('c');
530 },
531 },
532 {
533 run: ({beforeInputEvent, spyOnBeforeInput}) => {
534 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
524 - expect(beforeInputEvent.type).toBe('keypress');
535 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
536 + expect(beforeInputEvent.type).toBe('beforeinput');
537 expect(beforeInputEvent.data).toBe('\uD83D\uDE0A');
538 },
539 },
@@ -540,7 +552,8 @@ describe('BeforeInputEventPlugin', () => {
552 {
553 run: ({beforeInputEvent, spyOnBeforeInput}) => {
554 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
543 - expect(beforeInputEvent.type).toBe('keydown');
555 + expect(beforeInputEvent.nativeEvent.type).toBe('keydown');
556 + expect(beforeInputEvent.type).toBe('beforeinput');
557 expect(beforeInputEvent.data).toBe('bar');
558 },
559 },
@@ -553,7 +566,8 @@ describe('BeforeInputEventPlugin', () => {
566 {
567 run: ({beforeInputEvent, spyOnBeforeInput}) => {
568 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
556 - expect(beforeInputEvent.type).toBe('keyup');
569 + expect(beforeInputEvent.nativeEvent.type).toBe('keyup');
570 + expect(beforeInputEvent.type).toBe('beforeinput');
571 expect(beforeInputEvent.data).toBe('BAR');
572 },
573 },
@@ -566,7 +580,8 @@ describe('BeforeInputEventPlugin', () => {
580 {
581 run: ({beforeInputEvent, spyOnBeforeInput}) => {
582 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
569 - expect(beforeInputEvent.type).toBe('keypress');
583 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
584 + expect(beforeInputEvent.type).toBe('beforeinput');
585 expect(beforeInputEvent.data).toBe('Bar');
586 },
587 },
@@ -596,7 +611,8 @@ describe('BeforeInputEventPlugin', () => {
611 {
612 run: ({beforeInputEvent, spyOnBeforeInput}) => {
613 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
599 - expect(beforeInputEvent.type).toBe('compositionend');
614 + expect(beforeInputEvent.nativeEvent.type).toBe('compositionend');
615 + expect(beforeInputEvent.type).toBe('beforeinput');
616 expect(beforeInputEvent.data).toBe('test string 3');
617 },
618 },
@@ -609,14 +625,16 @@ describe('BeforeInputEventPlugin', () => {
625 {
626 run: ({beforeInputEvent, spyOnBeforeInput}) => {
627 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
612 - expect(beforeInputEvent.type).toBe('keypress');
628 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
629 + expect(beforeInputEvent.type).toBe('beforeinput');
630 expect(beforeInputEvent.data).toBe('a');
631 },
632 },
633 {
634 run: ({beforeInputEvent, spyOnBeforeInput}) => {
635 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
619 - expect(beforeInputEvent.type).toBe('keypress');
636 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
637 + expect(beforeInputEvent.type).toBe('beforeinput');
638 expect(beforeInputEvent.data).toBe(' ');
639 },
640 },
@@ -641,14 +659,16 @@ describe('BeforeInputEventPlugin', () => {
659 {
660 run: ({beforeInputEvent, spyOnBeforeInput}) => {
661 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
644 - expect(beforeInputEvent.type).toBe('keypress');
662 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
663 + expect(beforeInputEvent.type).toBe('beforeinput');
664 expect(beforeInputEvent.data).toBe('c');
665 },
666 },
667 {
668 run: ({beforeInputEvent, spyOnBeforeInput}) => {
669 expect(spyOnBeforeInput).toHaveBeenCalledTimes(1);
651 - expect(beforeInputEvent.type).toBe('keypress');
670 + expect(beforeInputEvent.nativeEvent.type).toBe('keypress');
671 + expect(beforeInputEvent.type).toBe('beforeinput');
672 expect(beforeInputEvent.data).toBe('\uD83D\uDE0A');
673 },
674 },
@@ -715,17 +735,17 @@ describe('BeforeInputEventPlugin', () => {
735 const node = ReactDOM.render(
736 <input
737 type="text"
718 - onBeforeInput={({type, data}) => {
738 + onBeforeInput={e => {
739 spyOnBeforeInput();
720 - beforeInputEvent = {type, data};
740 + beforeInputEvent = e;
741 }}
722 - onCompositionStart={({type, data}) => {
742 + onCompositionStart={e => {
743 spyOnCompositionStart();
724 - compositionStartEvent = {type, data};
744 + compositionStartEvent = e;
745 }}
726 - onCompositionUpdate={({type, data}) => {
746 + onCompositionUpdate={e => {
747 spyOnCompositionUpdate();
728 - compositionUpdateEvent = {type, data};
748 + compositionUpdateEvent = e;
749 }}
750 />,
751 container,
@@ -761,17 +781,17 @@ describe('BeforeInputEventPlugin', () => {
781 const node = ReactDOM.render(
782 <div
783 contentEditable={true}
764 - onBeforeInput={({type, data}) => {
784 + onBeforeInput={e => {
785 spyOnBeforeInput();
766 - beforeInputEvent = {type, data};
786 + beforeInputEvent = e;
787 }}
768 - onCompositionStart={({type, data}) => {
788 + onCompositionStart={e => {
789 spyOnCompositionStart();
770 - compositionStartEvent = {type, data};
790 + compositionStartEvent = e;
791 }}
772 - onCompositionUpdate={({type, data}) => {
792 + onCompositionUpdate={e => {
793 spyOnCompositionUpdate();
774 - compositionUpdateEvent = {type, data};
794 + compositionUpdateEvent = e;
795 }}
796 />,
797 container,
packages/react-dom/src/test-utils/ReactTestUtils.js
+1
@@ -587,6 +587,7 @@ function makeSimulator(eventType) {
587 const targetInst = getInstanceFromNode(domNode);
588 const event = new SyntheticEvent(
589 reactName,
590 + fakeNativeEvent.type,
591 targetInst,
592 fakeNativeEvent,
593 domNode,
packages/react-interactions/events/src/dom/create-event-handle/__tests__/useFocus-test.internal.js
+1 -1
@@ -36,7 +36,7 @@ function initializeModules(hasPointerEvents) {
36 const forcePointerEvents = true;
37 const table = [[forcePointerEvents], [!forcePointerEvents]];
38
39 -describe.each(table)(`useFocus`, hasPointerEvents => {
39 +describe.each(table)(`useFocus hasPointerEvents=%s`, hasPointerEvents => {
40 let container;
41
42 beforeEach(() => {