From bab999701c23d6bbf1b8ec659c59c1e34267e19c Mon Sep 17 00:00:00 2001 From: Johann-S Date: Thu, 22 Aug 2019 21:23:42 +0200 Subject: [PATCH] Backport #29277 dropdown - destroy old popper.js references --- js/src/dropdown.js | 4 ++++ js/tests/unit/dropdown.js | 46 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/js/src/dropdown.js b/js/src/dropdown.js index c064c3461a..f38712e476 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -436,6 +436,10 @@ class Dropdown { toggles[i].setAttribute('aria-expanded', 'false') + if (context._popper) { + context._popper.destroy() + } + $(dropdownMenu).removeClass(ClassName.SHOW) $(parent) .removeClass(ClassName.SHOW) diff --git a/js/tests/unit/dropdown.js b/js/tests/unit/dropdown.js index 85ebc0ed25..07702e2f62 100644 --- a/js/tests/unit/dropdown.js +++ b/js/tests/unit/dropdown.js @@ -799,7 +799,7 @@ $(function () { .parent('.dropdown') .on('shown.bs.dropdown', function () { // Forcibly focus first item - $item.focus() + $item[0].focus() assert.ok($(document.activeElement)[0] === $item[0], 'menu item initial focus set') // Key escape @@ -1506,4 +1506,48 @@ $(function () { assert.strictEqual(popperConfig.placement, 'left') }) + + QUnit.test('should destroy old popper references on toggle', function (assert) { + assert.expect(3) + var done = assert.async() + + var fixtureHtml = [ + '', + '' + ].join('') + + $(fixtureHtml).appendTo('#qunit-fixture') + + var $btnDropdown1 = $('.firstBtn').bootstrapDropdown() + var $btnDropdown2 = $('.secondBtn').bootstrapDropdown() + var $firstDropdownEl = $('.first') + var $secondDropdownEl = $('.second') + var dropdown1 = $btnDropdown1.data('bs.dropdown') + var dropdown2 = $btnDropdown2.data('bs.dropdown') + var spyPopper + + $firstDropdownEl.one('shown.bs.dropdown', function () { + assert.strictEqual($firstDropdownEl.hasClass('show'), true) + spyPopper = sinon.spy(dropdown1._popper, 'destroy') + dropdown2.toggle() + }) + + $secondDropdownEl.one('shown.bs.dropdown', function () { + assert.strictEqual($secondDropdownEl.hasClass('show'), true) + assert.ok(spyPopper.called) + done() + }) + + dropdown1.toggle() + }) })