]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
backport #29523: skip hidden dropdowns while focusing
authorJohann-S <johann.servoire@gmail.com>
Mon, 28 Oct 2019 12:34:11 +0000 (13:34 +0100)
committerXhmikosR <xhmikosr@gmail.com>
Sat, 2 Nov 2019 08:02:07 +0000 (10:02 +0200)
js/src/dropdown.js
js/tests/unit/dropdown.js

index 48125517ee1143efe0947d42ebe056b2901e02af..3f738b5c5444d8fda83e362f4e9d812bc55d2a1d 100644 (file)
@@ -488,6 +488,7 @@ class Dropdown {
     }
 
     const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))
+      .filter((item) => $(item).is(':visible'))
 
     if (items.length === 0) {
       return
index bfe5aebf589c5c5cbfbfa984fb5b5dd1f0f92514..7bc1abca20c279904ee844b141325523660e286b 100644 (file)
@@ -1585,4 +1585,45 @@ $(function () {
 
     dropdown.show(true)
   })
+
+  QUnit.test('it should skip hidden element when using keyboard navigation', function (assert) {
+    assert.expect(3)
+    var done = assert.async()
+
+    var fixtureHtml = [
+      '<style>',
+      '  .d-none {',
+      '    display: none;',
+      '  }',
+      '</style>',
+      '<div class="dropdown">',
+      '  <button href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>',
+      '  <div class="dropdown-menu">',
+      '    <button class="dropdown-item d-none" type="button">Hidden button by class</button>',
+      '    <a class="dropdown-item" href="#sub1" style="display: none">Hidden link</a>',
+      '    <a class="dropdown-item" href="#sub1" style="visibility: hidden">Hidden link</a>',
+      '    <a id="item1" class="dropdown-item" href="#">Another link</a>',
+      '  </div>',
+      '</div>'
+    ].join('')
+
+    $(fixtureHtml).appendTo('#qunit-fixture')
+
+    var $dropdownEl = $('.dropdown')
+    var $dropdown = $('[data-toggle="dropdown"]')
+      .bootstrapDropdown()
+
+    $dropdownEl.one('shown.bs.dropdown', function () {
+      $dropdown.trigger($.Event('keydown', {
+        which: 40
+      }))
+
+      assert.strictEqual($(document.activeElement).hasClass('d-none'), false, '.d-none not focused')
+      assert.strictEqual($(document.activeElement).css('display') === 'none', false, '"display: none" not focused')
+      assert.strictEqual(document.activeElement.style.visibility === 'hidden', false, '"visibility: hidden" not focused')
+      done()
+    })
+
+    $dropdown.trigger('click')
+  })
 })