Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix regression about using element for tooltip container option #27773

Merged
merged 1 commit into from
Dec 5, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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