]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Fix event propagation from inactive and disabled dropdowns (#30510) (#30511)
authorluktom <lksztmczk@gmail.com>
Tue, 7 Apr 2020 18:16:17 +0000 (20:16 +0200)
committerGitHub <noreply@github.com>
Tue, 7 Apr 2020 18:16:17 +0000 (21:16 +0300)
js/src/dropdown.js
js/tests/unit/dropdown.js

index 12ca85756e1252c131ca33bf6d7d245c240771ca..c0f1f6ffe1eb7b255847d31a1ba6336acd4ffd45 100644 (file)
@@ -452,9 +452,6 @@ class Dropdown {
       return
     }
 
-    event.preventDefault()
-    event.stopPropagation()
-
     if (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)) {
       return
     }
@@ -466,6 +463,9 @@ class Dropdown {
       return
     }
 
+    event.preventDefault()
+    event.stopPropagation()
+
     if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
       if (event.which === ESCAPE_KEYCODE) {
         const toggle = parent.querySelector(SELECTOR_DATA_TOGGLE)
index 7bc1abca20c279904ee844b141325523660e286b..12fa93a0e6d5e513f33760c23243b43e05035cb0 100644 (file)
@@ -1020,6 +1020,70 @@ $(function () {
     $textarea.trigger('click')
   })
 
+  QUnit.test('should not stop key event propagation when dropdown is disabled', function (assert) {
+    assert.expect(1)
+    var done = assert.async()
+
+    var dropdownHTML = '<div class="tabs">' +
+        '<div class="dropdown">' +
+        '<a href="#" class="dropdown-toggle" id="toggle" data-toggle="dropdown" disabled>Dropdown</a>' +
+        '<div class="dropdown-menu">' +
+        '<a class="dropdown-item" id="item" href="#">Menu item</a>' +
+        '</div>' +
+        '</div>'
+
+    var $dropdown = $(dropdownHTML)
+      .appendTo('#qunit-fixture')
+      .find('[data-toggle="dropdown"]')
+      .bootstrapDropdown()
+
+    var $body = $('body')
+
+    $(document).on('keydown', function () {
+      $body.addClass('event-handled')
+    })
+
+    // Key escape
+    $dropdown.trigger('focus').trigger($.Event('keydown', {
+      which: 27
+    }))
+
+    assert.ok($body.hasClass('event-handled'), 'ESC key event was propagated')
+    done()
+  })
+
+  QUnit.test('should not stop ESC key event propagation when dropdown is not active', function (assert) {
+    assert.expect(1)
+    var done = assert.async()
+
+    var dropdownHTML = '<div class="tabs">' +
+        '<div class="dropdown">' +
+        '<a href="#" class="dropdown-toggle" id="toggle" data-toggle="dropdown">Dropdown</a>' +
+        '<div class="dropdown-menu">' +
+        '<a class="dropdown-item" id="item" href="#">Menu item</a>' +
+        '</div>' +
+        '</div>'
+
+    var $dropdown = $(dropdownHTML)
+      .appendTo('#qunit-fixture')
+      .find('[data-toggle="dropdown"]')
+      .bootstrapDropdown()
+
+    var $body = $('body')
+
+    $(document).on('keydown', function () {
+      $body.addClass('event-handled')
+    })
+
+    // Key escape
+    $dropdown.trigger('focus').trigger($.Event('keydown', {
+      which: 27
+    }))
+
+    assert.ok($body.hasClass('event-handled'), 'ESC key event was propagated')
+    done()
+  })
+
   QUnit.test('should not use Popper.js if display set to static', function (assert) {
     assert.expect(1)
     var dropdownHTML =