var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, options)
- this.$target = $(this.options.target)
+ var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)
+
+ this.$target = target
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
}
Collapse.prototype.getParent = function () {
- return $(this.options.parent)
+ return $(document).find(this.options.parent)
.find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
.each($.proxy(function (i, element) {
var $element = $(element)
}, 250)
}, 250)
})
+
+ QUnit.test('should raise exception to avoid xss on target', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+
+ var templateHTML = '<div id="affixTarget"></div>'
+ $(templateHTML).appendTo(document.body)
+
+ $('#affixTarget').bootstrapAffix({
+ target: '<img src=1 onerror=\'alert(0)\'>'
+ })
+
+ }, new Error('Syntax error, unrecognized expression: <img src=1 onerror=\'alert(0)\'>'))
+ })
+
})
.bootstrapCollapse('show')
})
+ QUnit.test('should raise exception to avoid xss on data-parent', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+ $('<a role="button" data-toggle="collapse" data-parent="<img src=1 onerror=\'alert(0)\'>" href="#collapseThree">')
+ .appendTo('#qunit-fixture')
+ .bootstrapCollapse('show')
+ .trigger('click');
+ }, new Error('Syntax error, unrecognized expression: <img src=1 onerror=\'alert(0)\'>'))
+ })
+
})
})
})
+ QUnit.test('should raise exception to avoid xss on data-container', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+ $('<button data-toggle="tooltip" data-container="<img src=1 onerror=\'alert(0)\'>" title="Tooltip on right">Tooltip on right</button>')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip('show')
+ }, new Error('Syntax error, unrecognized expression: <img src=1 onerror=\'alert(0)\'>'))
+ })
+
+ QUnit.test('should raise exception to avoid xss on data-viewport', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+ $('<button data-toggle="tooltip" data-viewport="<img src=1 onerror=\'alert(0)\'>" title="Tooltip on right">Tooltip on right</button>')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip('show')
+ }, new Error('Syntax error, unrecognized expression: <img src=1 onerror=\'alert(0)\'>'))
+ })
+
})
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+ this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
this.inState = { click: false, hover: false, focus: false }
if (this.$element[0] instanceof document.constructor && !this.options.selector) {
.addClass(placement)
.data('bs.' + this.type, this)
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+ this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)
this.$element.trigger('inserted.bs.' + this.type)
var pos = this.getPosition()