]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Regression on tooltip template creation process. (#34628)
authorGeoSot <geo.sotis@gmail.com>
Tue, 3 Aug 2021 08:59:33 +0000 (11:59 +0300)
committerGitHub <noreply@github.com>
Tue, 3 Aug 2021 08:59:33 +0000 (11:59 +0300)
* Regression on tooltip template creation process.

* check if template content does not exist, or given argument is empty

* call `setContent()` once.

js/src/popover.js
js/src/tooltip.js
js/tests/unit/popover.spec.js
js/tests/unit/tooltip.spec.js

index 15deaafe23153d2a64737e68888d18e0f71ea8b5..dbd67558f8209cfe963de4f60ea195790e29fbee 100644 (file)
@@ -84,9 +84,7 @@ class Popover extends Tooltip {
     return this.getTitle() || this._getContent()
   }
 
-  setContent() {
-    const tip = this.getTipElement()
-
+  setContent(tip) {
     this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)
     this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)
   }
index f932a9ff995e8f6012fa9f5d1607dd39aa4851d9..2632e46e00654d5f3bcdb5c8744e56627db621f7 100644 (file)
@@ -243,8 +243,6 @@ class Tooltip extends BaseComponent {
     tip.setAttribute('id', tipId)
     this._element.setAttribute('aria-describedby', tipId)
 
-    this.setContent()
-
     if (this._config.animation) {
       tip.classList.add(CLASS_NAME_FADE)
     }
@@ -371,20 +369,21 @@ class Tooltip extends BaseComponent {
     element.innerHTML = this._config.template
 
     const tip = element.children[0]
+    this.setContent(tip)
     tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)
 
     this.tip = tip
     return this.tip
   }
 
-  setContent() {
-    const tip = this.getTipElement()
+  setContent(tip) {
     this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)
   }
 
   _sanitizeAndSetContent(template, content, selector) {
     const templateElement = SelectorEngine.findOne(selector, template)
-    if (!content) {
+
+    if (!content && templateElement) {
       templateElement.remove()
       return
     }
index 5460528b4c8267f823c81be63911182458b43502..c54fc49eee16407516b1ea123d96bfd0b7d48c7a 100644 (file)
@@ -1,7 +1,7 @@
 import Popover from '../../src/popover'
 
 /** Test helpers */
-import { getFixture, clearFixture, jQueryMock } from '../helpers/fixture'
+import { clearFixture, getFixture, jQueryMock } from '../helpers/fixture'
 
 describe('Popover', () => {
   let fixtureEl
@@ -157,6 +157,37 @@ describe('Popover', () => {
       popover.show()
     })
 
+    it('should call setContent once', done => {
+      fixtureEl.innerHTML = '<a href="#">BS twitter</a>'
+
+      const popoverEl = fixtureEl.querySelector('a')
+      const popover = new Popover(popoverEl, {
+        content: 'Popover content'
+      })
+
+      const spy = spyOn(popover, 'setContent').and.callThrough()
+      let times = 1
+
+      popoverEl.addEventListener('hidden.bs.popover', () => {
+        popover.show()
+      })
+
+      popoverEl.addEventListener('shown.bs.popover', () => {
+        const popoverDisplayed = document.querySelector('.popover')
+
+        expect(popoverDisplayed).not.toBeNull()
+        expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('Popover content')
+        expect(spy).toHaveBeenCalledTimes(1)
+        if (times > 1) {
+          done()
+        }
+
+        times++
+        popover.hide()
+      })
+      popover.show()
+    })
+
     it('should show a popover with provided custom class', done => {
       fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap" data-bs-custom-class="custom-class">BS twitter</a>'
 
index f3f90c3a3ffc2254ae5cf182f67b14c03789af8e..22a7edd017561b82793da8225ee6f27e3059109c 100644 (file)
@@ -1045,10 +1045,10 @@ describe('Tooltip', () => {
       const tooltipEl = fixtureEl.querySelector('a')
       const tooltip = new Tooltip(tooltipEl)
 
-      tooltip.setContent()
-
       const tip = tooltip.getTipElement()
 
+      tooltip.setContent(tip)
+
       expect(tip.classList.contains('show')).toEqual(false)
       expect(tip.classList.contains('fade')).toEqual(false)
       expect(tip.querySelector('.tooltip-inner').textContent).toEqual('Another tooltip')