1
1
import { ReactTestInstance } from 'react-test-renderer' ;
2
2
import act from '../../act' ;
3
- import { isEventEnabled , isTouchResponder } from '../../fireEvent' ;
4
3
import { flushMicroTasks } from '../../flushMicroTasks' ;
5
4
import { getHostParent } from '../../helpers/component-tree' ;
5
+ import { isHostTextInput } from '../../helpers/host-component-names' ;
6
6
7
7
type EventHandler = ( event : unknown ) => void ;
8
8
@@ -42,7 +42,7 @@ export function dispatchOwnHostEvent(
42
42
eventName : string ,
43
43
event : unknown
44
44
) {
45
- const handler = getEnabledEventHandler ( element , eventName ) ;
45
+ const handler = getEventHandler ( element , eventName ) ;
46
46
if ( ! handler ) {
47
47
return ;
48
48
}
@@ -53,45 +53,73 @@ export function dispatchOwnHostEvent(
53
53
} ) ;
54
54
}
55
55
56
+ /**
57
+ * Looks up for event handler in the element and its ancestors.
58
+ */
56
59
function findEnabledEventHandler (
57
60
element : ReactTestInstance ,
58
61
eventName : string
59
62
) : EventHandler | null {
60
- const handler = getEnabledEventHandler ( element , eventName ) ;
61
- if ( handler ) {
62
- return handler ;
63
- }
64
-
65
- const parent = getHostParent ( element ) ;
66
- if ( ! parent ) {
67
- return null ;
68
- }
63
+ let current : ReactTestInstance | null = element ;
64
+ while ( current != null ) {
65
+ const handler = getEventHandler ( current , eventName ) ;
66
+ if ( handler ) {
67
+ return handler ;
68
+ }
69
69
70
- return findEnabledEventHandler ( parent , eventName ) ;
71
- }
72
-
73
- function getEnabledEventHandler (
74
- element : ReactTestInstance ,
75
- eventName : string
76
- ) : EventHandler | null {
77
- const touchResponder = isTouchResponder ( element ) ? element : undefined ;
78
- const handler = getEventHandler ( element , eventName ) ;
79
- if ( handler && isEventEnabled ( element , eventName , touchResponder ) ) {
80
- return handler ;
70
+ current = getHostParent ( current ) ;
81
71
}
82
72
83
73
return null ;
84
74
}
85
75
86
76
function getEventHandler ( element : ReactTestInstance , eventName : string ) {
87
77
const eventHandlerName = getEventHandlerName ( eventName ) ;
88
- if ( typeof element . props [ eventHandlerName ] === 'function' ) {
89
- return element . props [ eventHandlerName ] ;
78
+ if ( typeof element . props [ eventHandlerName ] !== 'function' ) {
79
+ return null ;
80
+ }
81
+
82
+ if ( ! isEventEnabled ( element ) ) {
83
+ return null ;
90
84
}
91
85
92
- return undefined ;
86
+ return element . props [ eventHandlerName ] ;
93
87
}
94
88
95
89
function getEventHandlerName ( eventName : string ) {
96
90
return `on${ eventName . charAt ( 0 ) . toUpperCase ( ) } ${ eventName . slice ( 1 ) } ` ;
97
91
}
92
+
93
+ function isEventEnabled ( element : ReactTestInstance ) {
94
+ if ( isHostTextInput ( element ) ) {
95
+ return element ?. props . editable !== false ;
96
+ }
97
+
98
+ if ( ! isPointerEventEnabled ( element ) ) {
99
+ return false ;
100
+ }
101
+
102
+ const touchStart = element ?. props . onStartShouldSetResponder ?.( ) ;
103
+ return touchStart !== false ;
104
+ }
105
+
106
+ export function isPointerEventEnabled (
107
+ element : ReactTestInstance ,
108
+ isParent ?: boolean
109
+ ) : boolean {
110
+ const pointerEvents = element . props . pointerEvents ;
111
+ if ( pointerEvents === 'none' ) {
112
+ return false ;
113
+ }
114
+
115
+ if ( isParent ? pointerEvents === 'box-only' : pointerEvents === 'box-none' ) {
116
+ return false ;
117
+ }
118
+
119
+ const parent = getHostParent ( element ) ;
120
+ if ( ! parent ) {
121
+ return true ;
122
+ }
123
+
124
+ return isPointerEventEnabled ( parent , true ) ;
125
+ }
0 commit comments