@@ -123,13 +123,12 @@ test( "accessibility", function() {
123123} ) ;
124124
125125asyncTest ( "keyboard support - LEFT, RIGHT, UP, DOWN, HOME, END, SPACE, ENTER" , function ( ) {
126- expect ( 90 ) ;
126+ expect ( 92 ) ;
127127 var element = $ ( "#tabs1" ) . tabs ( {
128128 active : 0 ,
129129 collapsible : true
130130 } ) ,
131131 tabs = element . find ( ".ui-tabs-nav li" ) ,
132- anchors = tabs . find ( ".ui-tabs-anchor" ) ,
133132 panels = element . find ( ".ui-tabs-panel" ) ,
134133 keyCode = $ . ui . keyCode ;
135134
@@ -192,6 +191,7 @@ asyncTest( "keyboard support - LEFT, RIGHT, UP, DOWN, HOME, END, SPACE, ENTER",
192191 // left, home, space
193192 function step2 ( ) {
194193 equal ( tabs . eq ( 2 ) . attr ( "aria-selected" ) , "true" , "third tab has aria-selected=true" ) ;
194+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "false" , "first tab has aria-selected=false" ) ;
195195 ok ( panels . eq ( 2 ) . is ( ":visible" ) , "third panel is visible" ) ;
196196 equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "true" , "third panel has aria-expanded=true" ) ;
197197 equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "false" , "third panel has aria-hidden=false" ) ;
@@ -229,6 +229,7 @@ asyncTest( "keyboard support - LEFT, RIGHT, UP, DOWN, HOME, END, SPACE, ENTER",
229229 // end, enter
230230 function step3 ( ) {
231231 equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
232+ equal ( tabs . eq ( 2 ) . attr ( "aria-selected" ) , "false" , "third tab has aria-selected=false" ) ;
232233 ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
233234 equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
234235 equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
@@ -269,7 +270,203 @@ asyncTest( "keyboard support - LEFT, RIGHT, UP, DOWN, HOME, END, SPACE, ENTER",
269270 equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
270271 equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
271272
272- start ( ) ;
273+ setTimeout ( start , 1 ) ;
274+ }
275+
276+ setTimeout ( step1 , 1 ) ;
277+ } ) ;
278+
279+ asyncTest ( "keyboard support - CTRL navigation" , function ( ) {
280+ expect ( 115 ) ;
281+ var element = $ ( "#tabs1" ) . tabs ( {
282+ active : 0 ,
283+ collapsible : true
284+ } ) ,
285+ tabs = element . find ( ".ui-tabs-nav li" ) ,
286+ panels = element . find ( ".ui-tabs-panel" ) ,
287+ keyCode = $ . ui . keyCode ;
288+
289+ element . data ( "tabs" ) . delay = 50 ;
290+
291+ equal ( tabs . filter ( ".ui-state-focus" ) . length , 0 , "no tabs focused on init" ) ;
292+ tabs . eq ( 0 ) . simulate ( "focus" ) ;
293+
294+ // down
295+ function step1 ( ) {
296+ ok ( tabs . eq ( 0 ) . is ( ".ui-state-focus" ) , "first tab has focus" ) ;
297+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
298+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
299+
300+ tabs . eq ( 0 ) . simulate ( "keydown" , { keyCode : keyCode . DOWN , ctrlKey : true } ) ;
301+ ok ( tabs . eq ( 1 ) . is ( ".ui-state-focus" ) , "DOWN moves focus to next tab" ) ;
302+ ok ( ! tabs . eq ( 0 ) . is ( ".ui-state-focus" ) , "first tab is no longer focused" ) ;
303+ equal ( tabs . eq ( 1 ) . attr ( "aria-selected" ) , "false" , "second tab has aria-selected=false" ) ;
304+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
305+ ok ( panels . eq ( 1 ) . is ( ":hidden" ) , "second panel is still hidden" ) ;
306+ equal ( panels . eq ( 1 ) . attr ( "aria-expanded" ) , "false" , "second panel has aria-expanded=false" ) ;
307+ equal ( panels . eq ( 1 ) . attr ( "aria-hidden" ) , "true" , "second panel has aria-hidden=true" ) ;
308+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is still visible" ) ;
309+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
310+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
311+
312+ setTimeout ( step2 , 100 ) ;
313+ }
314+
315+ // right
316+ function step2 ( ) {
317+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
318+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
319+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
320+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
321+ ok ( panels . eq ( 1 ) . is ( ":hidden" ) , "second panel is hidden" ) ;
322+ equal ( panels . eq ( 1 ) . attr ( "aria-expanded" ) , "false" , "second panel has aria-expanded=false" ) ;
323+ equal ( panels . eq ( 1 ) . attr ( "aria-hidden" ) , "true" , "second panel has aria-hidden=true" ) ;
324+
325+ tabs . eq ( 1 ) . simulate ( "keydown" , { keyCode : keyCode . RIGHT , ctrlKey : true } ) ;
326+ ok ( tabs . eq ( 2 ) . is ( ".ui-state-focus" ) , "RIGHT moves focus to next tab" ) ;
327+ equal ( tabs . eq ( 2 ) . attr ( "aria-selected" ) , "false" , "third tab has aria-selected=false" ) ;
328+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
329+ ok ( panels . eq ( 2 ) . is ( ":hidden" ) , "third panel is still hidden" ) ;
330+ equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
331+ equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
332+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is still visible" ) ;
333+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
334+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
335+
336+ setTimeout ( step3 , 100 ) ;
337+ }
338+
339+ // down (wrap)
340+ function step3 ( ) {
341+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
342+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
343+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
344+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
345+ ok ( panels . eq ( 2 ) . is ( ":hidden" ) , "third panel is hidden" ) ;
346+ equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
347+ equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
348+
349+ tabs . eq ( 2 ) . simulate ( "keydown" , { keyCode : keyCode . DOWN , ctrlKey : true } ) ;
350+ ok ( tabs . eq ( 0 ) . is ( ".ui-state-focus" ) , "DOWN wraps focus to first tab" ) ;
351+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
352+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is still visible" ) ;
353+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
354+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
355+
356+ setTimeout ( step4 , 100 ) ;
357+ }
358+
359+ // up (wrap)
360+ function step4 ( ) {
361+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
362+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
363+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
364+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
365+
366+ tabs . eq ( 0 ) . simulate ( "keydown" , { keyCode : keyCode . UP , ctrlKey : true } ) ;
367+ ok ( tabs . eq ( 2 ) . is ( ".ui-state-focus" ) , "UP wraps focus to last tab" ) ;
368+ equal ( tabs . eq ( 2 ) . attr ( "aria-selected" ) , "false" , "third tab has aria-selected=false" ) ;
369+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
370+ ok ( panels . eq ( 2 ) . is ( ":hidden" ) , "third panel is still hidden" ) ;
371+ equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
372+ equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
373+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is still visible" ) ;
374+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
375+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
376+
377+ setTimeout ( step5 , 100 ) ;
378+ }
379+
380+ // left
381+ function step5 ( ) {
382+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
383+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
384+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
385+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
386+ ok ( panels . eq ( 2 ) . is ( ":hidden" ) , "third panel is hidden" ) ;
387+ equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
388+ equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
389+
390+ tabs . eq ( 2 ) . simulate ( "keydown" , { keyCode : keyCode . LEFT , ctrlKey : true } ) ;
391+ ok ( tabs . eq ( 1 ) . is ( ".ui-state-focus" ) , "LEFT moves focus to previous tab" ) ;
392+ equal ( tabs . eq ( 1 ) . attr ( "aria-selected" ) , "false" , "second tab has aria-selected=false" ) ;
393+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
394+ ok ( panels . eq ( 1 ) . is ( ":hidden" ) , "second panel is still hidden" ) ;
395+ equal ( panels . eq ( 1 ) . attr ( "aria-expanded" ) , "false" , "second panel has aria-expanded=false" ) ;
396+ equal ( panels . eq ( 1 ) . attr ( "aria-hidden" ) , "true" , "second panel has aria-hidden=true" ) ;
397+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is still visible" ) ;
398+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
399+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
400+
401+ setTimeout ( step6 , 100 ) ;
402+ }
403+
404+ // home
405+ function step6 ( ) {
406+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
407+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
408+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
409+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
410+ ok ( panels . eq ( 1 ) . is ( ":hidden" ) , "second panel is hidden" ) ;
411+ equal ( panels . eq ( 1 ) . attr ( "aria-expanded" ) , "false" , "second panel has aria-expanded=false" ) ;
412+ equal ( panels . eq ( 1 ) . attr ( "aria-hidden" ) , "true" , "second panel has aria-hidden=true" ) ;
413+
414+ tabs . eq ( 1 ) . simulate ( "keydown" , { keyCode : keyCode . HOME , ctrlKey : true } ) ;
415+ ok ( tabs . eq ( 0 ) . is ( ".ui-state-focus" ) , "HOME moves focus to first tab" ) ;
416+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
417+ equal ( tabs . eq ( 1 ) . attr ( "aria-selected" ) , "false" , "second tab has aria-selected=false" ) ;
418+ ok ( panels . eq ( 1 ) . is ( ":hidden" ) , "second panel is still hidden" ) ;
419+ equal ( panels . eq ( 1 ) . attr ( "aria-expanded" ) , "false" , "second panel has aria-expanded=false" ) ;
420+ equal ( panels . eq ( 1 ) . attr ( "aria-hidden" ) , "true" , "second panel has aria-hidden=true" ) ;
421+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is still visible" ) ;
422+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
423+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
424+
425+ setTimeout ( step7 , 100 ) ;
426+ }
427+
428+ // end
429+ function step7 ( ) {
430+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
431+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
432+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
433+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
434+
435+ tabs . eq ( 0 ) . simulate ( "keydown" , { keyCode : keyCode . END , ctrlKey : true } ) ;
436+ ok ( tabs . eq ( 2 ) . is ( ".ui-state-focus" ) , "END moves focus to last tab" ) ;
437+ equal ( tabs . eq ( 2 ) . attr ( "aria-selected" ) , "false" , "third tab has aria-selected=false" ) ;
438+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
439+ ok ( panels . eq ( 2 ) . is ( ":hidden" ) , "third panel is still hidden" ) ;
440+ equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
441+ equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
442+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is still visible" ) ;
443+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
444+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
445+
446+ setTimeout ( step8 , 100 ) ;
447+ }
448+
449+ // space
450+ function step8 ( ) {
451+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "true" , "first tab has aria-selected=true" ) ;
452+ ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
453+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
454+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "false" , "first panel has aria-hidden=false" ) ;
455+ ok ( panels . eq ( 2 ) . is ( ":hidden" ) , "third panel is hidden" ) ;
456+ equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
457+ equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
458+
459+ tabs . eq ( 2 ) . simulate ( "keydown" , { keyCode : keyCode . SPACE } ) ;
460+ equal ( tabs . eq ( 2 ) . attr ( "aria-selected" ) , "true" , "third tab has aria-selected=true" ) ;
461+ equal ( tabs . eq ( 0 ) . attr ( "aria-selected" ) , "false" , "first tab has aria-selected=false" ) ;
462+ ok ( panels . eq ( 2 ) . is ( ":visible" ) , "third panel is visible" ) ;
463+ equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "true" , "third panel has aria-expanded=true" ) ;
464+ equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "false" , "third panel has aria-hidden=false" ) ;
465+ ok ( panels . eq ( 0 ) . is ( ":hidden" ) , "first panel is hidden" ) ;
466+ equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "false" , "first panel has aria-expanded=false" ) ;
467+ equal ( panels . eq ( 0 ) . attr ( "aria-hidden" ) , "true" , "first panel has aria-hidden=true" ) ;
468+
469+ setTimeout ( start , 1 ) ;
273470 }
274471
275472 setTimeout ( step1 , 1 ) ;
0 commit comments