Skip to content

Commit 1f49e53

Browse files
committed
Core: Remove ancestor visibility requirement from :focusable selector
1 parent 8bf46a4 commit 1f49e53

File tree

2 files changed

+11
-19
lines changed

2 files changed

+11
-19
lines changed

tests/unit/core/selector.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,14 @@ test( "focusable - hidden styles", function() {
130130
isNotFocusable( "#displayNoneAncestor-input", "input, display: none parent" );
131131
isNotFocusable( "#displayNoneAncestor-span", "span with tabindex, display: none parent" );
132132

133-
isNotFocusable( "#visibilityHiddenAncestor-input", "input, visibility: hidden parent" );
134-
isNotFocusable( "#visibilityHiddenAncestor-span", "span with tabindex, visibility: hidden parent" );
133+
isFocusable( "#visibilityHiddenAncestor-input", "input, visibility: hidden parent" );
134+
isFocusable( "#visibilityHiddenAncestor-span", "span with tabindex, visibility: hidden parent" );
135135

136136
isNotFocusable( "#displayNone-input", "input, display: none" );
137-
isNotFocusable( "#visibilityHidden-input", "input, visibility: hidden" );
137+
isFocusable( "#visibilityHidden-input", "input, visibility: hidden" );
138138

139139
isNotFocusable( "#displayNone-span", "span with tabindex, display: none" );
140-
isNotFocusable( "#visibilityHidden-span", "span with tabindex, visibility: hidden" );
140+
isFocusable( "#visibilityHidden-span", "span with tabindex, visibility: hidden" );
141141
});
142142

143143
test( "focusable - natively focusable with various tabindex", function() {
@@ -215,14 +215,14 @@ test( "tabbable - hidden styles", function() {
215215
isNotTabbable( "#displayNoneAncestor-input", "input, display: none parent" );
216216
isNotTabbable( "#displayNoneAncestor-span", "span with tabindex, display: none parent" );
217217

218-
isNotTabbable( "#visibilityHiddenAncestor-input", "input, visibility: hidden parent" );
219-
isNotTabbable( "#visibilityHiddenAncestor-span", "span with tabindex, visibility: hidden parent" );
218+
isTabbable( "#visibilityHiddenAncestor-input", "input, visibility: hidden parent" );
219+
isTabbable( "#visibilityHiddenAncestor-span", "span with tabindex, visibility: hidden parent" );
220220

221221
isNotTabbable( "#displayNone-input", "input, display: none" );
222-
isNotTabbable( "#visibilityHidden-input", "input, visibility: hidden" );
222+
isTabbable( "#visibilityHidden-input", "input, visibility: hidden" );
223223

224224
isNotTabbable( "#displayNone-span", "span with tabindex, display: none" );
225-
isNotTabbable( "#visibilityHidden-span", "span with tabindex, visibility: hidden" );
225+
isTabbable( "#visibilityHidden-span", "span with tabindex, visibility: hidden" );
226226
});
227227

228228
test( "tabbable - natively tabbable with various tabindex", function() {

ui/focusable.js

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,17 @@ $.ui.focusable = function( element, hasTabindex ) {
3434
if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
3535
return false;
3636
}
37-
img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
38-
return !!img && visible( img );
37+
img = $( "img[usemap='#" + mapName + "']" );
38+
return img.length > 0 && img.is( ":visible" );
3939
}
4040
return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
4141
!element.disabled :
4242
"a" === nodeName ?
4343
element.href || hasTabindex :
4444
hasTabindex ) &&
45-
// the element and all of its ancestors must be visible
46-
visible( element );
45+
$( element ).is( ":visible" );
4746
};
4847

49-
function visible( element ) {
50-
return $.expr.filters.visible( element ) &&
51-
!$( element ).parents().addBack().filter( function() {
52-
return $.css( this, "visibility" ) === "hidden";
53-
} ).length;
54-
}
55-
5648
$.extend( $.expr[ ":" ], {
5749
focusable: function( element ) {
5850
return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );

0 commit comments

Comments
 (0)