aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick H. Lauke <[email protected]>2019-06-19 10:23:41 +0100
committerXhmikosR <[email protected]>2019-06-19 12:23:41 +0300
commitf0f75379f661587936fdcf7138fe9805838b7a01 (patch)
treef9673b36c0229eb7df0b2546b5587df7767b400d
parentceffc3a5fd7af7609150048f0651f025ef19672c (diff)
downloadbootstrap-f0f75379f661587936fdcf7138fe9805838b7a01.tar.xz
bootstrap-f0f75379f661587936fdcf7138fe9805838b7a01.zip
Closing dropdown with ESC correctly sets focus to toggle (#28928)
Just firing the focus event isn't enough ... need to actually call the proper `focus()` method for it to actually do it...
-rw-r--r--js/src/dropdown.js2
-rw-r--r--js/tests/unit/dropdown.js39
2 files changed, 40 insertions, 1 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index 6bae6a4b4..729b64732 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -486,7 +486,7 @@ class Dropdown {
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
if (event.which === ESCAPE_KEYCODE) {
- EventHandler.trigger(SelectorEngine.findOne(Selector.DATA_TOGGLE, parent), 'focus')
+ SelectorEngine.findOne(Selector.DATA_TOGGLE, parent).focus()
}
Dropdown._clearMenus()
diff --git a/js/tests/unit/dropdown.js b/js/tests/unit/dropdown.js
index 63f83b3bb..ab0fdbd44 100644
--- a/js/tests/unit/dropdown.js
+++ b/js/tests/unit/dropdown.js
@@ -765,6 +765,45 @@ $(function () {
$triggerDropdown[0].dispatchEvent(new Event('click'))
})
+ QUnit.test('should close dropdown and set focus back to toggle when escape is pressed while focused on a dropdown item', function (assert) {
+ assert.expect(3)
+ 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 $item = $('#item')
+ var $toggle = $('#toggle')
+
+ $dropdown
+ .parent('.dropdown')
+ .on('shown.bs.dropdown', function () {
+ // Forcibly focus first item
+ $item.focus()
+ assert.ok($(document.activeElement)[0] === $item[0], 'menu item initial focus set')
+
+ // Key escape
+ var keydown = new Event('keydown')
+ keydown.which = 27
+ $item[0].dispatchEvent(keydown)
+
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu was closed after escape')
+ assert.ok($(document.activeElement)[0] === $toggle[0], 'toggle has focus again once menu was closed after escape')
+ done()
+ })
+
+ $dropdown[0].dispatchEvent(new Event('click'))
+ })
+
QUnit.test('should ignore keyboard events for <input>s and <textarea>s within dropdown-menu, except for escape key', function (assert) {
assert.expect(7)
var done = assert.async()