@@ -1292,6 +1292,43 @@ describe('Dropdown', () => {
1292
1292
triggerDropdown . click ( )
1293
1293
} )
1294
1294
1295
+ it ( 'should skip hidden element when using keyboard navigation' , done => {
1296
+ fixtureEl . innerHTML = [
1297
+ '<style>' ,
1298
+ ' .d-none {' ,
1299
+ ' display: none;' ,
1300
+ ' }' ,
1301
+ '</style>' ,
1302
+ '<div class="dropdown">' ,
1303
+ ' <button href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' ,
1304
+ ' <div class="dropdown-menu">' ,
1305
+ ' <button class="dropdown-item d-none" type="button">Hidden button by class</button>' ,
1306
+ ' <a class="dropdown-item" href="#sub1" style="display: none">Hidden link</a>' ,
1307
+ ' <a class="dropdown-item" href="#sub1" style="visibility: hidden">Hidden link</a>' ,
1308
+ ' <a id="item1" class="dropdown-item" href="#">Another link</a>' ,
1309
+ ' </div>' ,
1310
+ '</div>'
1311
+ ] . join ( '' )
1312
+
1313
+ const triggerDropdown = fixtureEl . querySelector ( '[data-toggle="dropdown"]' )
1314
+ const dropdown = fixtureEl . querySelector ( '.dropdown' )
1315
+
1316
+ dropdown . addEventListener ( 'shown.bs.dropdown' , ( ) => {
1317
+ const keyDown = createEvent ( 'keydown' )
1318
+ keyDown . which = 40
1319
+
1320
+ triggerDropdown . dispatchEvent ( keyDown )
1321
+
1322
+ expect ( document . activeElement . classList . contains ( 'd-none' ) ) . toEqual ( false , '.d-none not focused' )
1323
+ expect ( document . activeElement . style . display === 'none' ) . toEqual ( false , '"display: none" not focused' )
1324
+ expect ( document . activeElement . style . visibility === 'hidden' ) . toEqual ( false , '"visibility: hidden" not focused' )
1325
+
1326
+ done ( )
1327
+ } )
1328
+
1329
+ triggerDropdown . click ( )
1330
+ } )
1331
+
1295
1332
it ( 'should focus next/previous element when using keyboard navigation' , done => {
1296
1333
fixtureEl . innerHTML = [
1297
1334
'<div class="dropdown">' ,
0 commit comments