@@ -469,12 +469,15 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
469
469
} ) ;
470
470
471
471
// @gate experimental
472
- it ( 'is called after valid "click " event' , ( ) => {
472
+ it ( 'is called after valid "keyup " event' , ( ) => {
473
473
componentInit ( ) ;
474
474
const target = createEventTarget ( ref . current ) ;
475
- target . pointerdown ( ) ;
476
- target . pointerup ( ) ;
475
+ target . keydown ( { key : 'Enter' } ) ;
476
+ target . keyup ( { key : 'Enter' } ) ;
477
477
expect ( onPress ) . toHaveBeenCalledTimes ( 1 ) ;
478
+ expect ( onPress ) . toHaveBeenCalledWith (
479
+ expect . objectContaining ( { pointerType : 'keyboard' , type : 'press' } ) ,
480
+ ) ;
478
481
} ) ;
479
482
480
483
// @gate experimental
@@ -801,6 +804,40 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
801
804
} ) ;
802
805
} ) ;
803
806
807
+ describe ( 'beyond bounds of hit rect' , ( ) => {
808
+ /** ┌──────────────────┐
809
+ * │ ┌────────────┐ │
810
+ * │ │ VisualRect │ │
811
+ * │ └────────────┘ │
812
+ * │ HitRect │
813
+ * └──────────────────┘
814
+ * X <= Move to X and release
815
+ */
816
+ // @gate experimental
817
+ it ( '"onPress" is not called on release' , ( ) => {
818
+ componentInit ( ) ;
819
+ const target = createEventTarget ( ref . current ) ;
820
+ const targetContainer = createEventTarget ( container ) ;
821
+ target . setBoundingClientRect ( rectMock ) ;
822
+ target . pointerdown ( { pointerType} ) ;
823
+ target . pointermove ( { pointerType, ...coordinatesInside } ) ;
824
+ if ( pointerType === 'mouse' ) {
825
+ // TODO: use setPointerCapture so this is only true for fallback mouse events.
826
+ targetContainer . pointermove ( { pointerType, ...coordinatesOutside } ) ;
827
+ targetContainer . pointerup ( { pointerType, ...coordinatesOutside } ) ;
828
+ } else {
829
+ target . pointermove ( { pointerType, ...coordinatesOutside } ) ;
830
+ target . pointerup ( { pointerType, ...coordinatesOutside } ) ;
831
+ }
832
+ expect ( events . filter ( removePressMoveStrings ) ) . toEqual ( [
833
+ 'onPressStart' ,
834
+ 'onPressChange' ,
835
+ 'onPressEnd' ,
836
+ 'onPressChange' ,
837
+ ] ) ;
838
+ } ) ;
839
+ } ) ;
840
+
804
841
// @gate experimental
805
842
it ( '"onPress" is called on re-entry to hit rect' , ( ) => {
806
843
componentInit ( ) ;
@@ -889,8 +926,8 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
889
926
'pointerdown' ,
890
927
'inner: onPressEnd' ,
891
928
'inner: onPressChange' ,
892
- 'pointerup' ,
893
929
'inner: onPress' ,
930
+ 'pointerup' ,
894
931
] ) ;
895
932
} ) ;
896
933
}
@@ -986,6 +1023,7 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
986
1023
// @gate experimental
987
1024
it ( 'prevents native behavior by default' , ( ) => {
988
1025
const onPress = jest . fn ( ) ;
1026
+ const preventDefault = jest . fn ( ) ;
989
1027
const ref = React . createRef ( ) ;
990
1028
991
1029
const Component = ( ) => {
@@ -996,8 +1034,79 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
996
1034
997
1035
const target = createEventTarget ( ref . current ) ;
998
1036
target . pointerdown ( ) ;
999
- target . pointerup ( ) ;
1000
- expect ( onPress ) . toBeCalled ( ) ;
1037
+ target . pointerup ( { preventDefault} ) ;
1038
+ expect ( preventDefault ) . toBeCalled ( ) ;
1039
+ expect ( onPress ) . toHaveBeenCalledWith (
1040
+ expect . objectContaining ( { defaultPrevented : true } ) ,
1041
+ ) ;
1042
+ } ) ;
1043
+
1044
+ // @gate experimental
1045
+ it ( 'prevents native behaviour for keyboard events by default' , ( ) => {
1046
+ const onPress = jest . fn ( ) ;
1047
+ const preventDefault = jest . fn ( ) ;
1048
+ const ref = React . createRef ( ) ;
1049
+
1050
+ const Component = ( ) => {
1051
+ const listener = usePress ( { onPress} ) ;
1052
+ return < a href = "#" ref = { ref } DEPRECATED_flareListeners = { listener } /> ;
1053
+ } ;
1054
+ ReactDOM . render ( < Component /> , container ) ;
1055
+
1056
+ const target = createEventTarget ( ref . current ) ;
1057
+ target . keydown ( { key : 'Enter' , preventDefault} ) ;
1058
+ target . keyup ( { key : 'Enter' } ) ;
1059
+ expect ( preventDefault ) . toBeCalled ( ) ;
1060
+ expect ( onPress ) . toHaveBeenCalledWith (
1061
+ expect . objectContaining ( { defaultPrevented : true } ) ,
1062
+ ) ;
1063
+ } ) ;
1064
+
1065
+ // @gate experimental
1066
+ it ( 'deeply prevents native behaviour by default' , ( ) => {
1067
+ const onPress = jest . fn ( ) ;
1068
+ const preventDefault = jest . fn ( ) ;
1069
+ const buttonRef = React . createRef ( ) ;
1070
+
1071
+ const Component = ( ) => {
1072
+ const listener = usePress ( { onPress} ) ;
1073
+ return (
1074
+ < a href = "#" >
1075
+ < button ref = { buttonRef } DEPRECATED_flareListeners = { listener } />
1076
+ </ a >
1077
+ ) ;
1078
+ } ;
1079
+ ReactDOM . render ( < Component /> , container ) ;
1080
+
1081
+ const target = createEventTarget ( buttonRef . current ) ;
1082
+ target . pointerdown ( ) ;
1083
+ target . pointerup ( { preventDefault} ) ;
1084
+ expect ( preventDefault ) . toBeCalled ( ) ;
1085
+ } ) ;
1086
+
1087
+ // @gate experimental
1088
+ it ( 'prevents native behaviour by default with nested elements' , ( ) => {
1089
+ const onPress = jest . fn ( ) ;
1090
+ const preventDefault = jest . fn ( ) ;
1091
+ const ref = React . createRef ( ) ;
1092
+
1093
+ const Component = ( ) => {
1094
+ const listener = usePress ( { onPress} ) ;
1095
+ return (
1096
+ < a href = "#" DEPRECATED_flareListeners = { listener } >
1097
+ < div ref = { ref } />
1098
+ </ a >
1099
+ ) ;
1100
+ } ;
1101
+ ReactDOM . render ( < Component /> , container ) ;
1102
+
1103
+ const target = createEventTarget ( ref . current ) ;
1104
+ target . pointerdown ( ) ;
1105
+ target . pointerup ( { preventDefault} ) ;
1106
+ expect ( preventDefault ) . toBeCalled ( ) ;
1107
+ expect ( onPress ) . toHaveBeenCalledWith (
1108
+ expect . objectContaining ( { defaultPrevented : true } ) ,
1109
+ ) ;
1001
1110
} ) ;
1002
1111
1003
1112
// @gate experimental
0 commit comments