@@ -92,6 +92,134 @@ describe('Keyboard event responder', () => {
9292 } ) ;
9393 } ) ;
9494
95+ describe ( 'preventKeys' , ( ) => {
96+ it ( 'onKeyDown is default prevented' , ( ) => {
97+ const onKeyDown = jest . fn ( ) ;
98+ const ref = React . createRef ( ) ;
99+ const Component = ( ) => {
100+ const listener = useKeyboard ( {
101+ onKeyDown,
102+ preventKeys : [ 'Tab' ] ,
103+ } ) ;
104+ return < div ref = { ref } listeners = { listener } /> ;
105+ } ;
106+ ReactDOM . render ( < Component /> , container ) ;
107+
108+ const preventDefault = jest . fn ( ) ;
109+ const target = createEventTarget ( ref . current ) ;
110+ target . keydown ( { key : 'Tab' , preventDefault} ) ;
111+ expect ( onKeyDown ) . toHaveBeenCalledTimes ( 1 ) ;
112+ expect ( preventDefault ) . toBeCalled ( ) ;
113+ expect ( onKeyDown ) . toHaveBeenCalledWith (
114+ expect . objectContaining ( {
115+ key : 'Tab' ,
116+ type : 'keydown' ,
117+ defaultPrevented : true ,
118+ } ) ,
119+ ) ;
120+ } ) ;
121+
122+ it ( 'onKeyDown is default prevented (falsy modifier keys)' , ( ) => {
123+ let onKeyDown = jest . fn ( ) ;
124+ let ref = React . createRef ( ) ;
125+ let Component = ( ) => {
126+ const listener = useKeyboard ( {
127+ onKeyDown,
128+ preventKeys : [ [ 'Tab' , { metaKey : false } ] ] ,
129+ } ) ;
130+ return < div ref = { ref } listeners = { listener } /> ;
131+ } ;
132+ ReactDOM . render ( < Component /> , container ) ;
133+
134+ let preventDefault = jest . fn ( ) ;
135+ let target = createEventTarget ( ref . current ) ;
136+ target . keydown ( { key : 'Tab' , preventDefault, metaKey : true } ) ;
137+ expect ( onKeyDown ) . toHaveBeenCalledTimes ( 1 ) ;
138+ expect ( preventDefault ) . not . toBeCalled ( ) ;
139+ expect ( onKeyDown ) . toHaveBeenCalledWith (
140+ expect . objectContaining ( {
141+ key : 'Tab' ,
142+ type : 'keydown' ,
143+ defaultPrevented : false ,
144+ } ) ,
145+ ) ;
146+
147+ onKeyDown = jest . fn ( ) ;
148+ ref = React . createRef ( ) ;
149+ Component = ( ) => {
150+ const listener = useKeyboard ( {
151+ onKeyDown,
152+ preventKeys : [ [ 'Tab' , { metaKey : true } ] ] ,
153+ } ) ;
154+ return < div ref = { ref } listeners = { listener } /> ;
155+ } ;
156+ ReactDOM . render ( < Component /> , container ) ;
157+
158+ preventDefault = jest . fn ( ) ;
159+ target = createEventTarget ( ref . current ) ;
160+ target . keydown ( { key : 'Tab' , preventDefault, metaKey : false } ) ;
161+ expect ( onKeyDown ) . toHaveBeenCalledTimes ( 1 ) ;
162+ expect ( preventDefault ) . not . toBeCalled ( ) ;
163+ expect ( onKeyDown ) . toHaveBeenCalledWith (
164+ expect . objectContaining ( {
165+ key : 'Tab' ,
166+ type : 'keydown' ,
167+ defaultPrevented : false ,
168+ } ) ,
169+ ) ;
170+ } ) ;
171+
172+ it ( 'onKeyDown is default prevented (truthy modifier keys)' , ( ) => {
173+ let onKeyDown = jest . fn ( ) ;
174+ let ref = React . createRef ( ) ;
175+ let Component = ( ) => {
176+ const listener = useKeyboard ( {
177+ onKeyDown,
178+ preventKeys : [ [ 'Tab' , { metaKey : true } ] ] ,
179+ } ) ;
180+ return < div ref = { ref } listeners = { listener } /> ;
181+ } ;
182+ ReactDOM . render ( < Component /> , container ) ;
183+
184+ let preventDefault = jest . fn ( ) ;
185+ let target = createEventTarget ( ref . current ) ;
186+ target . keydown ( { key : 'Tab' , preventDefault, metaKey : true } ) ;
187+ expect ( onKeyDown ) . toHaveBeenCalledTimes ( 1 ) ;
188+ expect ( preventDefault ) . toBeCalled ( ) ;
189+ expect ( onKeyDown ) . toHaveBeenCalledWith (
190+ expect . objectContaining ( {
191+ key : 'Tab' ,
192+ type : 'keydown' ,
193+ defaultPrevented : true ,
194+ } ) ,
195+ ) ;
196+
197+ onKeyDown = jest . fn ( ) ;
198+ ref = React . createRef ( ) ;
199+ Component = ( ) => {
200+ const listener = useKeyboard ( {
201+ onKeyDown,
202+ preventKeys : [ [ 'Tab' , { metaKey : false } ] ] ,
203+ } ) ;
204+ return < div ref = { ref } listeners = { listener } /> ;
205+ } ;
206+ ReactDOM . render ( < Component /> , container ) ;
207+
208+ preventDefault = jest . fn ( ) ;
209+ target = createEventTarget ( ref . current ) ;
210+ target . keydown ( { key : 'Tab' , preventDefault, metaKey : false } ) ;
211+ expect ( onKeyDown ) . toHaveBeenCalledTimes ( 1 ) ;
212+ expect ( preventDefault ) . toBeCalled ( ) ;
213+ expect ( onKeyDown ) . toHaveBeenCalledWith (
214+ expect . objectContaining ( {
215+ key : 'Tab' ,
216+ type : 'keydown' ,
217+ defaultPrevented : true ,
218+ } ) ,
219+ ) ;
220+ } ) ;
221+ } ) ;
222+
95223 describe ( 'onKeyUp' , ( ) => {
96224 let onKeyDown , onKeyUp , ref ;
97225
0 commit comments