]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
prevent tooltip from being deleted on quick re-activations
authorRyan Berliner <ryan.berliner@gmail.com>
Sat, 6 Mar 2021 01:35:28 +0000 (03:35 +0200)
committerXhmikosR <xhmikosr@gmail.com>
Tue, 16 Mar 2021 05:48:50 +0000 (07:48 +0200)
js/src/tooltip.js
js/tests/unit/tooltip.spec.js

index 6f33245f8ee0afbf26f8a5b5e82b424f901226a1..e9f9bfff1b44fe23632666818326323be043c83a 100644 (file)
@@ -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)
       }
index 7bf6aa3ab8370ed738ea51948506a21fc953aec7..41f73d6d8a7df925c04a4bd1c7d040c253cd4130 100644 (file)
@@ -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 = '<a href="#" rel="tooltip" title="Another tooltip">'
+
+      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 = '<a href="#" rel="tooltip" title="Another tooltip" data-bs-custom-class="custom-class">'