@@ -24,15 +24,12 @@ type KeyboardEventType =
2424
2525type KeyboardProps = { |
2626 disabled ? : boolean ,
27- onClick ?: ( e : KeyboardEvent ) => ?boolean ,
28- onKeyDown ?: ( e : KeyboardEvent ) => ?boolean ,
29- onKeyUp ?: ( e : KeyboardEvent ) => ?boolean ,
30- preventClick ?: boolean ,
31- preventKeys ? : PreventKeysArray ,
27+ onClick ?: ( e : KeyboardEvent ) => void ,
28+ onKeyDown ?: ( e : KeyboardEvent ) => void ,
29+ onKeyUp ?: ( e : KeyboardEvent ) => void ,
3230| } ;
3331
3432type KeyboardState = { |
35- defaultPrevented : boolean ,
3633 isActive : boolean ,
3734| } ;
3835
@@ -48,20 +45,11 @@ export type KeyboardEvent = {|
4845 target : Element | Document ,
4946 type : KeyboardEventType ,
5047 timeStamp : number ,
48+ continuePropagation : ( ) => void ,
49+ preventDefault : ( ) => void ,
5150| } ;
5251
53- type ModifiersObject = { |
54- altKey ? : boolean ,
55- ctrlKey ? : boolean ,
56- metaKey ? : boolean ,
57- shiftKey ? : boolean ,
58- | } ;
59-
60- type PreventKeysArray = Array < string | Array < string | ModifiersObject >> ;
61-
62- const isArray = Array . isArray ;
6352const targetEventTypes = [ 'click_active' , 'keydown_active' , 'keyup' ] ;
64- const modifiers = [ 'altKey' , 'ctrlKey' , 'metaKey' , 'shiftKey' ] ;
6553
6654/**
6755 * Normalization of deprecated HTML5 `key` values
@@ -146,20 +134,31 @@ function createKeyboardEvent(
146134 event : ReactDOMResponderEvent ,
147135 context : ReactDOMResponderContext ,
148136 type : KeyboardEventType ,
149- defaultPrevented : boolean ,
150137) : KeyboardEvent {
151138 const nativeEvent = ( event : any ) . nativeEvent ;
152139 const { altKey, ctrlKey, metaKey, shiftKey} = nativeEvent ;
153140 let keyboardEvent = {
154141 altKey,
155142 ctrlKey,
156- defaultPrevented,
143+ defaultPrevented : nativeEvent . defaultPrevented === true ,
157144 metaKey,
158145 pointerType : 'keyboard' ,
159146 shiftKey,
160147 target : event . target ,
161148 timeStamp : context . getTimeStamp ( ) ,
162149 type,
150+ // We don't use stopPropagation, as the default behavior
151+ // is to not propagate. Plus, there might be confusion
152+ // using stopPropagation as we don't actually stop
153+ // native propagation from working, but instead only
154+ // allow propagation to the others keyboard responders.
155+ continuePropagation ( ) {
156+ context . continuePropagation ( ) ;
157+ } ,
158+ preventDefault ( ) {
159+ keyboardEvent . defaultPrevented = true ;
160+ nativeEvent . preventDefault ( ) ;
161+ } ,
163162 } ;
164163 if ( type !== 'keyboard:click' ) {
165164 const key = getEventKey ( nativeEvent ) ;
@@ -171,32 +170,18 @@ function createKeyboardEvent(
171170
172171function dispatchKeyboardEvent (
173172 event : ReactDOMResponderEvent ,
174- listener : KeyboardEvent => ? boolean ,
173+ listener : KeyboardEvent => void ,
175174 context : ReactDOMResponderContext ,
176175 type : KeyboardEventType ,
177- defaultPrevented : boolean ,
178176) : void {
179- const syntheticEvent = createKeyboardEvent (
180- event ,
181- context ,
182- type ,
183- defaultPrevented ,
184- ) ;
185- let shouldPropagate ;
186- const listenerWithReturnValue = e => {
187- shouldPropagate = listener ( e ) ;
188- } ;
189- context . dispatchEvent ( syntheticEvent , listenerWithReturnValue , DiscreteEvent ) ;
190- if ( shouldPropagate ) {
191- context . continuePropagation ( ) ;
192- }
177+ const syntheticEvent = createKeyboardEvent ( event , context , type ) ;
178+ context . dispatchEvent ( syntheticEvent , listener , DiscreteEvent ) ;
193179}
194180
195181const keyboardResponderImpl = {
196182 targetEventTypes,
197183 getInitialState ( ) : KeyboardState {
198184 return {
199- defaultPrevented : false ,
200185 isActive : false ,
201186 } ;
202187 } ,
@@ -207,82 +192,36 @@ const keyboardResponderImpl = {
207192 state : KeyboardState ,
208193 ) : void {
209194 const { type} = event ;
210- const nativeEvent : any = event . nativeEvent ;
211195
212196 if ( props . disabled ) {
213197 return ;
214198 }
215199
216200 if ( type === 'keydown' ) {
217- state . defaultPrevented = nativeEvent . defaultPrevented === true ;
218-
219- const preventKeys = ( ( props . preventKeys : any ) : PreventKeysArray ) ;
220- if ( ! state . defaultPrevented && isArray ( preventKeys ) ) {
221- preventKeyLoop: for ( let i = 0 ; i < preventKeys . length ; i ++ ) {
222- const preventKey = preventKeys [ i ] ;
223- let key = preventKey ;
224-
225- if ( isArray ( preventKey ) ) {
226- key = preventKey [ 0 ] ;
227- const config = ( ( preventKey [ 1 ] : any ) : Object ) ;
228- for ( let s = 0 ; s < modifiers . length ; s ++ ) {
229- const modifier = modifiers [ s ] ;
230- const configModifier = config [ modifier ] ;
231- const eventModifier = nativeEvent [ modifier ] ;
232- if (
233- ( configModifier && ! eventModifier ) ||
234- ( ! configModifier && eventModifier )
235- ) {
236- continue preventKeyLoop;
237- }
238- }
239- }
240-
241- if ( key === getEventKey ( nativeEvent ) ) {
242- state . defaultPrevented = true ;
243- nativeEvent . preventDefault ( ) ;
244- break ;
245- }
246- }
247- }
248201 state . isActive = true ;
249202 const onKeyDown = props . onKeyDown ;
250203 if ( onKeyDown != null ) {
251204 dispatchKeyboardEvent (
252205 event ,
253- ( ( onKeyDown : any ) : ( e : KeyboardEvent ) = > ? boolean ) ,
206+ ( ( onKeyDown : any ) : ( e : KeyboardEvent ) = > void ) ,
254207 context ,
255208 'keyboard:keydown' ,
256- state . defaultPrevented ,
257209 ) ;
258210 }
259211 } else if ( type === 'click' && isVirtualClick ( event ) ) {
260- if ( props . preventClick !== false ) {
261- // 'click' occurs before or after 'keyup', and may need native
262- // behavior prevented
263- nativeEvent . preventDefault ( ) ;
264- state . defaultPrevented = true ;
265- }
266212 const onClick = props . onClick ;
267213 if ( onClick != null ) {
268- dispatchKeyboardEvent (
269- event ,
270- onClick ,
271- context ,
272- 'keyboard:click' ,
273- state . defaultPrevented ,
274- ) ;
214+ dispatchKeyboardEvent ( event , onClick , context , 'keyboard:click' ) ;
275215 }
276216 } else if ( type === 'keyup' ) {
277217 state . isActive = false ;
278218 const onKeyUp = props . onKeyUp ;
279219 if ( onKeyUp != null ) {
280220 dispatchKeyboardEvent (
281221 event ,
282- ( ( onKeyUp : any ) : ( e : KeyboardEvent ) = > ? boolean ) ,
222+ ( ( onKeyUp : any ) : ( e : KeyboardEvent ) = > void ) ,
283223 context ,
284224 'keyboard:keyup' ,
285- state . defaultPrevented ,
286225 ) ;
287226 }
288227 }
0 commit comments