@@ -123,13 +123,12 @@ test( "accessibility", function() {
123
123
} ) ;
124
124
125
125
asyncTest ( "keyboard support - LEFT, RIGHT, UP, DOWN, HOME, END, SPACE, ENTER" , function ( ) {
126
- expect ( 90 ) ;
126
+ expect ( 92 ) ;
127
127
var element = $ ( "#tabs1" ) . tabs ( {
128
128
active : 0 ,
129
129
collapsible : true
130
130
} ) ,
131
131
tabs = element . find ( ".ui-tabs-nav li" ) ,
132
- anchors = tabs . find ( ".ui-tabs-anchor" ) ,
133
132
panels = element . find ( ".ui-tabs-panel" ) ,
134
133
keyCode = $ . ui . keyCode ;
135
134
@@ -192,6 +191,7 @@ asyncTest( "keyboard support - LEFT, RIGHT, UP, DOWN, HOME, END, SPACE, ENTER",
192
191
// left, home, space
193
192
function step2 ( ) {
194
193
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" ) ;
195
195
ok ( panels . eq ( 2 ) . is ( ":visible" ) , "third panel is visible" ) ;
196
196
equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "true" , "third panel has aria-expanded=true" ) ;
197
197
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",
229
229
// end, enter
230
230
function step3 ( ) {
231
231
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" ) ;
232
233
ok ( panels . eq ( 0 ) . is ( ":visible" ) , "first panel is visible" ) ;
233
234
equal ( panels . eq ( 0 ) . attr ( "aria-expanded" ) , "true" , "first panel has aria-expanded=true" ) ;
234
235
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",
269
270
equal ( panels . eq ( 2 ) . attr ( "aria-expanded" ) , "false" , "third panel has aria-expanded=false" ) ;
270
271
equal ( panels . eq ( 2 ) . attr ( "aria-hidden" ) , "true" , "third panel has aria-hidden=true" ) ;
271
272
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 ) ;
273
470
}
274
471
275
472
setTimeout ( step1 , 1 ) ;
0 commit comments