Skip to content

Commit a3e953b

Browse files
committed
Menu: Don't focus dividers when wrapping via keyboard navigation
Fixes #15157 Closes gh-1804
1 parent abc9e7c commit a3e953b

File tree

Image for: File tree

3 files changed

Image for: 3 files changed
+45
-11
lines changed

3 files changed

Image for: 3 files changed
+45
-11
lines changed

‎tests/unit/menu/events.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,4 +757,26 @@ QUnit.test( "#10571: When typing in a menu, only menu-items should be focused",
757757
} );
758758
} );
759759

760+
QUnit.test( "#15157: Must not focus menu dividers with the keyboard", function( assert ) {
761+
var ready = assert.async();
762+
assert.expect( 6 );
763+
764+
var element = $( "#menu-with-dividers" ).menu( {
765+
focus: function( event, ui ) {
766+
assert.hasClasses( ui.item, "ui-menu-item", "Should have menu item class" );
767+
log( ui.item.text() );
768+
}
769+
} );
770+
771+
element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
772+
element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
773+
element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
774+
element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
775+
element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } );
776+
setTimeout( function() {
777+
assert.equal( logOutput(), "beginning,middle,end,beginning,end", "Should wrap around items" );
778+
ready();
779+
} );
780+
} );
781+
760782
} );

‎tests/unit/menu/menu.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,16 @@
323323
<li class="foo"><div>Addyston</div></li>
324324
<li class="foo"><div>Adelphi</div></li>
325325
</ul>
326+
327+
<ul id="menu-with-dividers">
328+
<li>-</li>
329+
<li>beginning</li>
330+
<li>-</li>
331+
<li>middle</li>
332+
<li>-</li>
333+
<li>end</li>
334+
<li>-</li>
335+
</ul>
326336
</div>
327337
</body>
328338
</html>

‎ui/widgets/menu.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ return $.widget( "ui.menu", {
136136

137137
// If there's already an active item, keep it active
138138
// If not, activate the first item
139-
var item = this.active || this.element.find( this.options.items ).eq( 0 );
139+
var item = this.active || this._menuItems().first();
140140

141141
if ( !keepActiveItem ) {
142142
this.focus( event, item );
@@ -538,11 +538,7 @@ return $.widget( "ui.menu", {
538538
},
539539

540540
expand: function( event ) {
541-
var newItem = this.active &&
542-
this.active
543-
.children( ".ui-menu " )
544-
.find( this.options.items )
545-
.first();
541+
var newItem = this.active && this._menuItems( this.active.children( ".ui-menu" ) ).first();
546542

547543
if ( newItem && newItem.length ) {
548544
this._open( newItem.parent() );
@@ -570,21 +566,27 @@ return $.widget( "ui.menu", {
570566
return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
571567
},
572568

569+
_menuItems: function( menu ) {
570+
return ( menu || this.element )
571+
.find( this.options.items )
572+
.filter( ".ui-menu-item" );
573+
},
574+
573575
_move: function( direction, filter, event ) {
574576
var next;
575577
if ( this.active ) {
576578
if ( direction === "first" || direction === "last" ) {
577579
next = this.active
578580
[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
579-
.eq( -1 );
581+
.last();
580582
} else {
581583
next = this.active
582584
[ direction + "All" ]( ".ui-menu-item" )
583-
.eq( 0 );
585+
.first();
584586
}
585587
}
586588
if ( !next || !next.length || !this.active ) {
587-
next = this.activeMenu.find( this.options.items )[ filter ]();
589+
next = this._menuItems( this.activeMenu )[ filter ]();
588590
}
589591

590592
this.focus( event, next );
@@ -610,7 +612,7 @@ return $.widget( "ui.menu", {
610612

611613
this.focus( event, item );
612614
} else {
613-
this.focus( event, this.activeMenu.find( this.options.items )
615+
this.focus( event, this._menuItems( this.activeMenu )
614616
[ !this.active ? "first" : "last" ]() );
615617
}
616618
},
@@ -634,7 +636,7 @@ return $.widget( "ui.menu", {
634636

635637
this.focus( event, item );
636638
} else {
637-
this.focus( event, this.activeMenu.find( this.options.items ).first() );
639+
this.focus( event, this._menuItems( this.activeMenu ).first() );
638640
}
639641
},
640642

0 commit comments

Image for: 0 commit comments
Comments
 (0)