diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index af5fd16fc956..6381b91be4b0 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -320,7 +320,7 @@ class Dropdown extends BaseComponent {
return {
...defaultBsPopperConfig,
- ...execute(this._config.popperConfig, [defaultBsPopperConfig])
+ ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])
}
}
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index 1252811573e9..a478bd2d8317 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -436,7 +436,7 @@ class Tooltip extends BaseComponent {
return {
...defaultBsPopperConfig,
- ...execute(this._config.popperConfig, [defaultBsPopperConfig])
+ ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])
}
}
diff --git a/js/src/util/index.js b/js/src/util/index.js
index 68b8d8988195..220c43e1e5b0 100644
--- a/js/src/util/index.js
+++ b/js/src/util/index.js
@@ -223,7 +223,7 @@ const defineJQueryPlugin = plugin => {
}
const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
- return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue
+ return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue
}
const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
diff --git a/js/src/util/template-factory.js b/js/src/util/template-factory.js
index f73589bcc785..6d1532b4d4bb 100644
--- a/js/src/util/template-factory.js
+++ b/js/src/util/template-factory.js
@@ -143,7 +143,7 @@ class TemplateFactory extends Config {
}
_resolvePossibleFunction(arg) {
- return execute(arg, [this])
+ return execute(arg, [undefined, this])
}
_putElementInTemplate(element, templateElement) {
diff --git a/js/tests/unit/popover.spec.js b/js/tests/unit/popover.spec.js
index 53dc7d89ea6d..6b8195039115 100644
--- a/js/tests/unit/popover.spec.js
+++ b/js/tests/unit/popover.spec.js
@@ -95,6 +95,33 @@ describe('Popover', () => {
})
})
+ it('should call content and title functions with correct this value', () => {
+ return new Promise(resolve => {
+ fixtureEl.innerHTML = 'BS twitter'
+
+ const popoverEl = fixtureEl.querySelector('a')
+ const popover = new Popover(popoverEl, {
+ title() {
+ return this.dataset.foo
+ },
+ content() {
+ return this.dataset.foo
+ }
+ })
+
+ popoverEl.addEventListener('shown.bs.popover', () => {
+ const popoverDisplayed = document.querySelector('.popover')
+
+ expect(popoverDisplayed).not.toBeNull()
+ expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('bar')
+ expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('bar')
+ resolve()
+ })
+
+ popover.show()
+ })
+ })
+
it('should show a popover with just content without having header', () => {
return new Promise(resolve => {
fixtureEl.innerHTML = 'Nice link'
diff --git a/js/tests/unit/tooltip.spec.js b/js/tests/unit/tooltip.spec.js
index 080432e9abab..1c15e52b72f4 100644
--- a/js/tests/unit/tooltip.spec.js
+++ b/js/tests/unit/tooltip.spec.js
@@ -1335,6 +1335,19 @@ describe('Tooltip', () => {
expect(tooltip._getTitle()).toEqual('test')
})
+
+ it('should call title function with correct this value', () => {
+ fixtureEl.innerHTML = ''
+
+ const tooltipEl = fixtureEl.querySelector('a')
+ const tooltip = new Tooltip(tooltipEl, {
+ title() {
+ return this.dataset.foo
+ }
+ })
+
+ expect(tooltip._getTitle()).toEqual('bar')
+ })
})
describe('getInstance', () => {
diff --git a/js/tests/unit/util/index.spec.js b/js/tests/unit/util/index.spec.js
index 4065a9168032..9e154818f288 100644
--- a/js/tests/unit/util/index.spec.js
+++ b/js/tests/unit/util/index.spec.js
@@ -521,10 +521,10 @@ describe('Util', () => {
it('should execute if arg is function & return the result', () => {
const functionFoo = (num1, num2 = 10) => num1 + num2
- const resultFoo = Util.execute(functionFoo, [4, 5])
+ const resultFoo = Util.execute(functionFoo, [undefined, 4, 5])
expect(resultFoo).toBe(9)
- const resultFoo1 = Util.execute(functionFoo, [4])
+ const resultFoo1 = Util.execute(functionFoo, [undefined, 4])
expect(resultFoo1).toBe(14)
const functionBar = () => 'foo'