From d491c29aa005177ef148c40d4b7b0a3decc7edef Mon Sep 17 00:00:00 2001 From: Ryan Berliner Date: Sat, 6 Mar 2021 03:35:28 +0200 Subject: [PATCH] prevent tooltip from being deleted on quick re-activations --- js/src/tooltip.js | 4 ++++ js/tests/unit/tooltip.spec.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/js/src/tooltip.js b/js/src/tooltip.js index 6f33245f8e..e9f9bfff1b 100644 --- a/js/src/tooltip.js +++ b/js/src/tooltip.js @@ -329,6 +329,10 @@ class Tooltip extends BaseComponent { const tip = this.getTipElement() const complete = () => { + if (this._isWithActiveTrigger()) { + return + } + if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { tip.parentNode.removeChild(tip) } diff --git a/js/tests/unit/tooltip.spec.js b/js/tests/unit/tooltip.spec.js index 7bf6aa3ab8..41f73d6d8a 100644 --- a/js/tests/unit/tooltip.spec.js +++ b/js/tests/unit/tooltip.spec.js @@ -708,6 +708,35 @@ describe('Tooltip', () => { tooltipEl.dispatchEvent(createEvent('mouseover')) }) + it('should not hide tooltip if leave event occurs and enter event occurs during hide transition', done => { + fixtureEl.innerHTML = '' + + const tooltipEl = fixtureEl.querySelector('a') + const tooltip = new Tooltip(tooltipEl) + + spyOn(window, 'getComputedStyle').and.returnValue({ + transitionDuration: '0.15s', + transitionDelay: '0s' + }) + + setTimeout(() => { + expect(tooltip._popper).not.toBeNull() + tooltipEl.dispatchEvent(createEvent('mouseout')) + + setTimeout(() => { + expect(tooltip.getTipElement().classList.contains('show')).toEqual(false) + tooltipEl.dispatchEvent(createEvent('mouseover')) + }, 100) + + setTimeout(() => { + expect(tooltip._popper).not.toBeNull() + done() + }, 200) + }, 0) + + tooltipEl.dispatchEvent(createEvent('mouseover')) + }) + it('should show a tooltip with custom class provided in data attributes', done => { fixtureEl.innerHTML = ''