mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-11-21 11:04:24 +00:00
Tabs: Suppress automatic activation when navigating with COMMAND
Fixes #9621
Closes gh-1383
(cherry picked from commit 6a242ab4eb
)
This commit is contained in:
parent
dc2c948dd6
commit
9dd1e733f3
@ -299,7 +299,12 @@ asyncTest( "keyboard support - LEFT, RIGHT, UP, DOWN, HOME, END, SPACE, ENTER",
|
|||||||
setTimeout( step1, 1 );
|
setTimeout( step1, 1 );
|
||||||
});
|
});
|
||||||
|
|
||||||
asyncTest( "keyboard support - CTRL navigation", function() {
|
// Navigation with CTRL and COMMAND (both behave the same)
|
||||||
|
$.each({
|
||||||
|
ctrl: "CTRL",
|
||||||
|
meta: "COMMAND"
|
||||||
|
}, function( modifier, label ) {
|
||||||
|
asyncTest( "keyboard support - " + label + " navigation", function() {
|
||||||
expect( 115 );
|
expect( 115 );
|
||||||
var element = $( "#tabs1" ).tabs(),
|
var element = $( "#tabs1" ).tabs(),
|
||||||
tabs = element.find( ".ui-tabs-nav li" ),
|
tabs = element.find( ".ui-tabs-nav li" ),
|
||||||
@ -313,11 +318,14 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
// down
|
// down
|
||||||
function step1() {
|
function step1() {
|
||||||
|
var eventProperties = { keyCode: keyCode.DOWN };
|
||||||
|
eventProperties[ modifier + "Key" ] = true;
|
||||||
|
|
||||||
ok( tabs.eq( 0 ).is( ".ui-state-focus" ), "first tab has focus" );
|
ok( tabs.eq( 0 ).is( ".ui-state-focus" ), "first tab has focus" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
||||||
|
|
||||||
tabs.eq( 0 ).simulate( "keydown", { keyCode: keyCode.DOWN, ctrlKey: true } );
|
tabs.eq( 0 ).simulate( "keydown", eventProperties );
|
||||||
ok( tabs.eq( 1 ).is( ".ui-state-focus" ), "DOWN moves focus to next tab" );
|
ok( tabs.eq( 1 ).is( ".ui-state-focus" ), "DOWN moves focus to next tab" );
|
||||||
ok( !tabs.eq( 0 ).is( ".ui-state-focus" ), "first tab is no longer focused" );
|
ok( !tabs.eq( 0 ).is( ".ui-state-focus" ), "first tab is no longer focused" );
|
||||||
equal( tabs.eq( 1 ).attr( "aria-selected" ), "false", "second tab has aria-selected=false" );
|
equal( tabs.eq( 1 ).attr( "aria-selected" ), "false", "second tab has aria-selected=false" );
|
||||||
@ -334,6 +342,9 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
// right
|
// right
|
||||||
function step2() {
|
function step2() {
|
||||||
|
var eventProperties = { keyCode: keyCode.RIGHT };
|
||||||
|
eventProperties[ modifier + "Key" ] = true;
|
||||||
|
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
||||||
@ -342,7 +353,7 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
equal( tabs.eq( 1 ).attr( "aria-expanded" ), "false", "second tab has aria-expanded=false" );
|
equal( tabs.eq( 1 ).attr( "aria-expanded" ), "false", "second tab has aria-expanded=false" );
|
||||||
equal( panels.eq( 1 ).attr( "aria-hidden" ), "true", "second panel has aria-hidden=true" );
|
equal( panels.eq( 1 ).attr( "aria-hidden" ), "true", "second panel has aria-hidden=true" );
|
||||||
|
|
||||||
tabs.eq( 1 ).simulate( "keydown", { keyCode: keyCode.RIGHT, ctrlKey: true } );
|
tabs.eq( 1 ).simulate( "keydown", eventProperties );
|
||||||
ok( tabs.eq( 2 ).is( ".ui-state-focus" ), "RIGHT moves focus to next tab" );
|
ok( tabs.eq( 2 ).is( ".ui-state-focus" ), "RIGHT moves focus to next tab" );
|
||||||
equal( tabs.eq( 2 ).attr( "aria-selected" ), "false", "third tab has aria-selected=false" );
|
equal( tabs.eq( 2 ).attr( "aria-selected" ), "false", "third tab has aria-selected=false" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
@ -358,6 +369,9 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
// down (wrap)
|
// down (wrap)
|
||||||
function step3() {
|
function step3() {
|
||||||
|
var eventProperties = { keyCode: keyCode.DOWN };
|
||||||
|
eventProperties[ modifier + "Key" ] = true;
|
||||||
|
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
||||||
@ -366,7 +380,7 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
equal( tabs.eq( 2 ).attr( "aria-expanded" ), "false", "third tab has aria-expanded=false" );
|
equal( tabs.eq( 2 ).attr( "aria-expanded" ), "false", "third tab has aria-expanded=false" );
|
||||||
equal( panels.eq( 2 ).attr( "aria-hidden" ), "true", "third panel has aria-hidden=true" );
|
equal( panels.eq( 2 ).attr( "aria-hidden" ), "true", "third panel has aria-hidden=true" );
|
||||||
|
|
||||||
tabs.eq( 2 ).simulate( "keydown", { keyCode: keyCode.DOWN, ctrlKey: true } );
|
tabs.eq( 2 ).simulate( "keydown", eventProperties );
|
||||||
ok( tabs.eq( 0 ).is( ".ui-state-focus" ), "DOWN wraps focus to first tab" );
|
ok( tabs.eq( 0 ).is( ".ui-state-focus" ), "DOWN wraps focus to first tab" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is still visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is still visible" );
|
||||||
@ -378,12 +392,15 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
// up (wrap)
|
// up (wrap)
|
||||||
function step4() {
|
function step4() {
|
||||||
|
var eventProperties = { keyCode: keyCode.UP };
|
||||||
|
eventProperties[ modifier + "Key" ] = true;
|
||||||
|
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
||||||
equal( panels.eq( 0 ).attr( "aria-hidden" ), "false", "first panel has aria-hidden=false" );
|
equal( panels.eq( 0 ).attr( "aria-hidden" ), "false", "first panel has aria-hidden=false" );
|
||||||
|
|
||||||
tabs.eq( 0 ).simulate( "keydown", { keyCode: keyCode.UP, ctrlKey: true } );
|
tabs.eq( 0 ).simulate( "keydown", eventProperties );
|
||||||
ok( tabs.eq( 2 ).is( ".ui-state-focus" ), "UP wraps focus to last tab" );
|
ok( tabs.eq( 2 ).is( ".ui-state-focus" ), "UP wraps focus to last tab" );
|
||||||
equal( tabs.eq( 2 ).attr( "aria-selected" ), "false", "third tab has aria-selected=false" );
|
equal( tabs.eq( 2 ).attr( "aria-selected" ), "false", "third tab has aria-selected=false" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
@ -399,6 +416,9 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
// left
|
// left
|
||||||
function step5() {
|
function step5() {
|
||||||
|
var eventProperties = { keyCode: keyCode.LEFT };
|
||||||
|
eventProperties[ modifier + "Key" ] = true;
|
||||||
|
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
||||||
@ -407,7 +427,7 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
equal( tabs.eq( 2 ).attr( "aria-expanded" ), "false", "third tab has aria-expanded=false" );
|
equal( tabs.eq( 2 ).attr( "aria-expanded" ), "false", "third tab has aria-expanded=false" );
|
||||||
equal( panels.eq( 2 ).attr( "aria-hidden" ), "true", "third panel has aria-hidden=true" );
|
equal( panels.eq( 2 ).attr( "aria-hidden" ), "true", "third panel has aria-hidden=true" );
|
||||||
|
|
||||||
tabs.eq( 2 ).simulate( "keydown", { keyCode: keyCode.LEFT, ctrlKey: true } );
|
tabs.eq( 2 ).simulate( "keydown", eventProperties );
|
||||||
ok( tabs.eq( 1 ).is( ".ui-state-focus" ), "LEFT moves focus to previous tab" );
|
ok( tabs.eq( 1 ).is( ".ui-state-focus" ), "LEFT moves focus to previous tab" );
|
||||||
equal( tabs.eq( 1 ).attr( "aria-selected" ), "false", "second tab has aria-selected=false" );
|
equal( tabs.eq( 1 ).attr( "aria-selected" ), "false", "second tab has aria-selected=false" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
@ -423,6 +443,9 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
// home
|
// home
|
||||||
function step6() {
|
function step6() {
|
||||||
|
var eventProperties = { keyCode: keyCode.HOME };
|
||||||
|
eventProperties[ modifier + "Key" ] = true;
|
||||||
|
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
||||||
@ -431,7 +454,7 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
equal( tabs.eq( 1 ).attr( "aria-expanded" ), "false", "second tab has aria-expanded=false" );
|
equal( tabs.eq( 1 ).attr( "aria-expanded" ), "false", "second tab has aria-expanded=false" );
|
||||||
equal( panels.eq( 1 ).attr( "aria-hidden" ), "true", "second panel has aria-hidden=true" );
|
equal( panels.eq( 1 ).attr( "aria-hidden" ), "true", "second panel has aria-hidden=true" );
|
||||||
|
|
||||||
tabs.eq( 1 ).simulate( "keydown", { keyCode: keyCode.HOME, ctrlKey: true } );
|
tabs.eq( 1 ).simulate( "keydown", eventProperties );
|
||||||
ok( tabs.eq( 0 ).is( ".ui-state-focus" ), "HOME moves focus to first tab" );
|
ok( tabs.eq( 0 ).is( ".ui-state-focus" ), "HOME moves focus to first tab" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
equal( tabs.eq( 1 ).attr( "aria-selected" ), "false", "second tab has aria-selected=false" );
|
equal( tabs.eq( 1 ).attr( "aria-selected" ), "false", "second tab has aria-selected=false" );
|
||||||
@ -447,12 +470,15 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
// end
|
// end
|
||||||
function step7() {
|
function step7() {
|
||||||
|
var eventProperties = { keyCode: keyCode.END };
|
||||||
|
eventProperties[ modifier + "Key" ] = true;
|
||||||
|
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
ok( panels.eq( 0 ).is( ":visible" ), "first panel is visible" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
equal( tabs.eq( 0 ).attr( "aria-expanded" ), "true", "first tab has aria-expanded=true" );
|
||||||
equal( panels.eq( 0 ).attr( "aria-hidden" ), "false", "first panel has aria-hidden=false" );
|
equal( panels.eq( 0 ).attr( "aria-hidden" ), "false", "first panel has aria-hidden=false" );
|
||||||
|
|
||||||
tabs.eq( 0 ).simulate( "keydown", { keyCode: keyCode.END, ctrlKey: true } );
|
tabs.eq( 0 ).simulate( "keydown", eventProperties );
|
||||||
ok( tabs.eq( 2 ).is( ".ui-state-focus" ), "END moves focus to last tab" );
|
ok( tabs.eq( 2 ).is( ".ui-state-focus" ), "END moves focus to last tab" );
|
||||||
equal( tabs.eq( 2 ).attr( "aria-selected" ), "false", "third tab has aria-selected=false" );
|
equal( tabs.eq( 2 ).attr( "aria-selected" ), "false", "third tab has aria-selected=false" );
|
||||||
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
equal( tabs.eq( 0 ).attr( "aria-selected" ), "true", "first tab has aria-selected=true" );
|
||||||
@ -491,6 +517,7 @@ asyncTest( "keyboard support - CTRL navigation", function() {
|
|||||||
|
|
||||||
setTimeout( step1, 1 );
|
setTimeout( step1, 1 );
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
asyncTest( "keyboard support - CTRL+UP, ALT+PAGE_DOWN, ALT+PAGE_UP", function() {
|
asyncTest( "keyboard support - CTRL+UP, ALT+PAGE_DOWN, ALT+PAGE_UP", function() {
|
||||||
expect( 50 );
|
expect( 50 );
|
||||||
|
@ -201,8 +201,9 @@ return $.widget( "ui.tabs", {
|
|||||||
clearTimeout( this.activating );
|
clearTimeout( this.activating );
|
||||||
selectedIndex = this._focusNextTab( selectedIndex, goingForward );
|
selectedIndex = this._focusNextTab( selectedIndex, goingForward );
|
||||||
|
|
||||||
// Navigating with control key will prevent automatic activation
|
// Navigating with control/command key will prevent automatic activation
|
||||||
if ( !event.ctrlKey ) {
|
if ( !event.ctrlKey && !event.metaKey ) {
|
||||||
|
|
||||||
// Update aria-selected immediately so that AT think the tab is already selected.
|
// Update aria-selected immediately so that AT think the tab is already selected.
|
||||||
// Otherwise AT may confuse the user by stating that they need to activate the tab,
|
// Otherwise AT may confuse the user by stating that they need to activate the tab,
|
||||||
// but the tab will already be activated by the time the announcement finishes.
|
// but the tab will already be activated by the time the announcement finishes.
|
||||||
|
Loading…
Reference in New Issue
Block a user