Skip to content

Commit

Permalink
fix regression about using element for tooltip container option
Browse files Browse the repository at this point in the history
  • Loading branch information
Johann-S committed Dec 5, 2018
1 parent 1a171b8 commit 37f74c7
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 4 deletions.
15 changes: 13 additions & 2 deletions js/src/tooltip.js
Original file line number Diff line number Diff line change
Expand Up @@ -272,8 +272,7 @@ class Tooltip {
const attachment = this._getAttachment(placement)
this.addAttachmentClass(attachment)

const container = this.config.container === false ? document.body : $(document).find(this.config.container)

const container = this._getContainer()
$(tip).data(this.constructor.DATA_KEY, this)

if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
Expand Down Expand Up @@ -450,6 +449,18 @@ class Tooltip {

// Private

_getContainer() {
if (this.config.container === false) {
return document.body
}

if (Util.isElement(this.config.container)) {
return $(this.config.container)
}

return $(document).find(this.config.container)
}

_getAttachment(placement) {
return AttachmentMap[placement.toUpperCase()]
}
Expand Down
46 changes: 46 additions & 0 deletions js/tests/unit/tooltip.js
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,52 @@ $(function () {
.bootstrapTooltip('show')
})

QUnit.test('should place tooltips inside a specific container when container is an element', function (assert) {
assert.expect(3)
var done = assert.async()
var $container = $('<div></div>').appendTo('#qunit-fixture')
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
container: $container[0]
})

$tooltip
.one('shown.bs.tooltip', function () {
assert.strictEqual($container.find('.tooltip').length, 1)
assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
$tooltip.bootstrapTooltip('hide')
})
.one('hidden.bs.tooltip', function () {
assert.strictEqual($container.find('.tooltip').length, 0, 'tooltip was removed from dom')
done()
})
.bootstrapTooltip('show')
})

QUnit.test('should place tooltips inside a specific container when container is a selector', function (assert) {
assert.expect(3)
var done = assert.async()
var $container = $('<div id="container"></div>').appendTo('#qunit-fixture')
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
container: '#container'
})

$tooltip
.one('shown.bs.tooltip', function () {
assert.strictEqual($container.find('.tooltip').length, 1)
assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
$tooltip.bootstrapTooltip('hide')
})
.one('hidden.bs.tooltip', function () {
assert.strictEqual($container.find('.tooltip').length, 0, 'tooltip was removed from dom')
done()
})
.bootstrapTooltip('show')
})

QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
assert.expect(2)
var done = assert.async()
Expand Down
10 changes: 8 additions & 2 deletions js/tests/visual/tooltip.html
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,11 @@ <h1>Tooltip <small>Bootstrap Visual Test</small></h1>
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="left" title="Tooltip with XSS" data-container="<img src=1 onerror=alert(123) />">
Tooltip with XSS
</button>
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="left" title="Tooltip with container" data-container="#customContainer">
Tooltip with container
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="left" title="Tooltip with container (selector)" data-container="#customContainer">
Tooltip with container (selector)
</button>
<button id="tooltipElement" type="button" class="btn btn-secondary" data-placement="left" title="Tooltip with container (element)">
Tooltip with container (element)
</button>
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-html="true" title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">
Tooltip with HTML
Expand All @@ -70,6 +73,9 @@ <h1>Tooltip <small>Bootstrap Visual Test</small></h1>
<script>
$(function () {
$('[data-toggle="tooltip"]').tooltip()
$('#tooltipElement').tooltip({
container: $('#customContainer')[0]
})
$('#target').tooltip({
placement : 'top',
trigger : 'manual'
Expand Down

0 comments on commit 37f74c7

Please sign in to comment.