Merge branch 'master' into v4

This commit is contained in:
Chris Rebert 2015-01-21 13:00:12 -08:00
commit 9238337cbb
16 changed files with 1389 additions and 1128 deletions

View File

@ -180,6 +180,9 @@ The `.dropdown-backdrop` element isn't used on iOS in the nav because of the com
Page zooming inevitably presents rendering artifacts in some components, both in Bootstrap and the rest of the web. Depending on the issue, we may be able to fix it (search first and then open an issue if need be). However, we tend to ignore these as they often have no direct solution other than hacky workarounds.
### Sticky `:hover`/`:focus` on mobile
Even though real hovering isn't possible on most touchscreens, most mobile browsers emulate hovering support and make `:hover` "sticky". In other words, `:hover` styles start applying after tapping an element and only stop applying after the user taps some other element. This can cause Bootstrap's `:hover` states to become unwantedly "stuck" on such browsers. Some mobile browsers also make `:focus` similarly sticky. There is currently no simple workaround for these issues other than removing such styles entirely.
### Printing
Even in some modern browsers, printing can be quirky.

View File

@ -35,8 +35,8 @@ $(function () {
ok(!$affix.hasClass('affix'), 'affix class was not added')
})
test('should trigger affixed event after affix', function () {
stop()
test('should trigger affixed event after affix', function (assert) {
var done = assert.async()
var templateHTML = '<div id="affixTarget">'
+ '<ul>'
@ -57,7 +57,7 @@ $(function () {
}).on('affixed.bs.affix', function () {
ok(true, 'affixed event fired')
$('#affixTarget, #affixAfter').remove()
start()
done()
})
setTimeout(function () {
@ -69,8 +69,8 @@ $(function () {
}, 0)
})
test('should affix-top when scrolling up to offset when parent has padding', function () {
stop()
test('should affix-top when scrolling up to offset when parent has padding', function (assert) {
var done = assert.async()
var templateHTML = '<div id="padding-offset" style="padding-top: 20px;">'
+ '<div id="affixTopTarget">'
@ -87,7 +87,7 @@ $(function () {
.on('affixed-top.bs.affix', function () {
ok($('#affixTopTarget').hasClass('affix-top'), 'affix-top class applied')
$('#padding-offset').remove()
start()
done()
})
setTimeout(function () {

View File

@ -55,13 +55,13 @@ $(function () {
equal($('#qunit-fixture').find('.alert').length, 0, 'element removed from dom')
})
test('should not fire closed when close is prevented', function () {
stop()
test('should not fire closed when close is prevented', function (assert) {
var done = assert.async()
$('<div class="alert"/>')
.on('close.bs.alert', function (e) {
e.preventDefault()
ok(true, 'close event fired')
start()
done()
})
.on('closed.bs.alert', function () {
ok(false, 'closed event fired')

View File

@ -29,57 +29,57 @@ $(function () {
strictEqual($button[0], $el[0], 'collection contains element')
})
test('should return set state to loading', function () {
test('should return set state to loading', function (assert) {
var $btn = $('<button class="btn" data-loading-text="fat">mdo</button>')
equal($btn.html(), 'mdo', 'btn text equals mdo')
$btn.bootstrapButton('loading')
stop()
var done = assert.async()
setTimeout(function () {
equal($btn.html(), 'fat', 'btn text equals fat')
ok($btn[0].hasAttribute('disabled'), 'btn is disabled')
ok($btn.hasClass('disabled'), 'btn has disabled class')
start()
done()
}, 0)
})
test('should return reset state', function () {
test('should return reset state', function (assert) {
var $btn = $('<button class="btn" data-loading-text="fat">mdo</button>')
equal($btn.html(), 'mdo', 'btn text equals mdo')
$btn.bootstrapButton('loading')
stop()
var doneOne = assert.async()
setTimeout(function () {
equal($btn.html(), 'fat', 'btn text equals fat')
ok($btn[0].hasAttribute('disabled'), 'btn is disabled')
ok($btn.hasClass('disabled'), 'btn has disabled class')
start()
stop()
doneOne()
var doneTwo = assert.async()
$btn.bootstrapButton('reset')
setTimeout(function () {
equal($btn.html(), 'mdo', 'btn text equals mdo')
ok(!$btn[0].hasAttribute('disabled'), 'btn is not disabled')
ok(!$btn.hasClass('disabled'), 'btn does not have disabled class')
start()
doneTwo()
}, 0)
}, 0)
})
test('should work with an empty string as reset state', function () {
test('should work with an empty string as reset state', function (assert) {
var $btn = $('<button class="btn" data-loading-text="fat"/>')
equal($btn.html(), '', 'btn text equals ""')
$btn.bootstrapButton('loading')
stop()
var doneOne = assert.async()
setTimeout(function () {
equal($btn.html(), 'fat', 'btn text equals fat')
ok($btn[0].hasAttribute('disabled'), 'btn is disabled')
ok($btn.hasClass('disabled'), 'btn has disabled class')
start()
stop()
doneOne()
var doneTwo = assert.async()
$btn.bootstrapButton('reset')
setTimeout(function () {
equal($btn.html(), '', 'btn text equals ""')
ok(!$btn[0].hasAttribute('disabled'), 'btn is not disabled')
ok(!$btn.hasClass('disabled'), 'btn does not have disabled class')
start()
doneTwo()
}, 0)
}, 0)
})

View File

@ -29,13 +29,13 @@ $(function () {
strictEqual($carousel[0], $el[0], 'collection contains element')
})
test('should not fire slid when slide is prevented', function () {
stop()
test('should not fire slid when slide is prevented', function (assert) {
var done = assert.async()
$('<div class="carousel"/>')
.on('slide.bs.carousel', function (e) {
e.preventDefault()
ok(true, 'slide event fired')
start()
done()
})
.on('slid.bs.carousel', function () {
ok(false, 'slid event fired')
@ -43,7 +43,7 @@ $(function () {
.bootstrapCarousel('next')
})
test('should reset when slide is prevented', function () {
test('should reset when slide is prevented', function (assert) {
var carouselHTML = '<div id="carousel-example-generic" class="carousel slide">'
+ '<ol class="carousel-indicators">'
+ '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
@ -66,7 +66,7 @@ $(function () {
+ '</div>'
var $carousel = $(carouselHTML)
stop()
var done = assert.async()
$carousel
.one('slide.bs.carousel', function (e) {
e.preventDefault()
@ -82,13 +82,13 @@ $(function () {
ok(!$carousel.find('.carousel-indicators li:eq(0)').is('.active'), 'first indicator still active')
ok($carousel.find('.carousel-item:eq(1)').is('.active'), 'second item active')
ok($carousel.find('.carousel-indicators li:eq(1)').is('.active'), 'second indicator active')
start()
done()
}, 0)
})
.bootstrapCarousel('next')
})
test('should fire slide event with direction', function () {
test('should fire slide event with direction', function (assert) {
var carouselHTML = '<div id="myCarousel" class="carousel slide">'
+ '<div class="carousel-inner">'
+ '<div class="carousel-item active">'
@ -124,7 +124,7 @@ $(function () {
+ '</div>'
var $carousel = $(carouselHTML)
stop()
var done = assert.async()
$carousel
.one('slide.bs.carousel', function (e) {
@ -135,14 +135,14 @@ $(function () {
.one('slide.bs.carousel', function (e) {
ok(e.direction, 'direction present on prev')
strictEqual(e.direction, 'right', 'direction is right on prev')
start()
done()
})
.bootstrapCarousel('prev')
})
.bootstrapCarousel('next')
})
test('should fire slid event with direction', function () {
test('should fire slid event with direction', function (assert) {
var carouselHTML = '<div id="myCarousel" class="carousel slide">'
+ '<div class="carousel-inner">'
+ '<div class="carousel-item active">'
@ -178,7 +178,7 @@ $(function () {
+ '</div>'
var $carousel = $(carouselHTML)
stop()
var done = assert.async()
$carousel
.one('slid.bs.carousel', function (e) {
@ -189,14 +189,14 @@ $(function () {
.one('slid.bs.carousel', function (e) {
ok(e.direction, 'direction present on prev')
strictEqual(e.direction, 'right', 'direction is right on prev')
start()
done()
})
.bootstrapCarousel('prev')
})
.bootstrapCarousel('next')
})
test('should fire slide event with relatedTarget', function () {
test('should fire slide event with relatedTarget', function (assert) {
var template = '<div id="myCarousel" class="carousel slide">'
+ '<div class="carousel-inner">'
+ '<div class="carousel-item active">'
@ -231,18 +231,18 @@ $(function () {
+ '<a class="right carousel-control" href="#myCarousel" data-slide="next">&rsaquo;</a>'
+ '</div>'
stop()
var done = assert.async()
$(template)
.on('slide.bs.carousel', function (e) {
ok(e.relatedTarget, 'relatedTarget present')
ok($(e.relatedTarget).hasClass('carousel-item'), 'relatedTarget has class "carousel-item"')
start()
done()
})
.bootstrapCarousel('next')
})
test('should fire slid event with relatedTarget', function () {
test('should fire slid event with relatedTarget', function (assert) {
var template = '<div id="myCarousel" class="carousel slide">'
+ '<div class="carousel-inner">'
+ '<div class="carousel-item active">'
@ -277,13 +277,13 @@ $(function () {
+ '<a class="right carousel-control" href="#myCarousel" data-slide="next">&rsaquo;</a>'
+ '</div>'
stop()
var done = assert.async()
$(template)
.on('slid.bs.carousel', function (e) {
ok(e.relatedTarget, 'relatedTarget present')
ok($(e.relatedTarget).hasClass('carousel-item'), 'relatedTarget has class "carousel-item"')
start()
done()
})
.bootstrapCarousel('next')
})
@ -542,7 +542,7 @@ $(function () {
})
})
test('should wrap around from end to start when wrap option is true', function () {
test('should wrap around from end to start when wrap option is true', function (assert) {
var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="true">'
+ '<ol class="carousel-indicators">'
+ '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
@ -566,7 +566,7 @@ $(function () {
var $carousel = $(carouselHTML)
var getActiveId = function () { return $carousel.find('.carousel-item.active').attr('id') }
stop()
var done = assert.async()
$carousel
.one('slid.bs.carousel', function () {
@ -577,7 +577,7 @@ $(function () {
$carousel
.one('slid.bs.carousel', function () {
strictEqual(getActiveId(), 'one', 'carousel wrapped around and slid from 3rd to 1st slide')
start()
done()
})
.bootstrapCarousel('next')
})
@ -586,7 +586,7 @@ $(function () {
.bootstrapCarousel('next')
})
test('should wrap around from start to end when wrap option is true', function () {
test('should wrap around from start to end when wrap option is true', function (assert) {
var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="true">'
+ '<ol class="carousel-indicators">'
+ '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
@ -609,17 +609,17 @@ $(function () {
+ '</div>'
var $carousel = $(carouselHTML)
stop()
var done = assert.async()
$carousel
.on('slid.bs.carousel', function () {
strictEqual($carousel.find('.carousel-item.active').attr('id'), 'three', 'carousel wrapped around and slid from 1st to 3rd slide')
start()
done()
})
.bootstrapCarousel('prev')
})
test('should stay at the end when the next method is called and wrap is false', function () {
test('should stay at the end when the next method is called and wrap is false', function (assert) {
var carouselHTML = '<div id="carousel-example-generic" class="carousel slide" data-wrap="false">'
+ '<ol class="carousel-indicators">'
+ '<li data-target="#carousel-example-generic" data-slide-to="0" class="active"/>'
@ -643,7 +643,7 @@ $(function () {
var $carousel = $(carouselHTML)
var getActiveId = function () { return $carousel.find('.carousel-item.active').attr('id') }
stop()
var done = assert.async()
$carousel
.one('slid.bs.carousel', function () {
@ -657,7 +657,7 @@ $(function () {
})
.bootstrapCarousel('next')
strictEqual(getActiveId(), 'three', 'carousel did not wrap around and stayed on 3rd slide')
start()
done()
})
.bootstrapCarousel('next')
})

View File

@ -43,14 +43,14 @@ $(function () {
ok(/height/i.test($el.attr('style')), 'has height set')
})
test('should not fire shown when show is prevented', function () {
stop()
test('should not fire shown when show is prevented', function (assert) {
var done = assert.async()
$('<div class="collapse"/>')
.on('show.bs.collapse', function (e) {
e.preventDefault()
ok(true, 'show event fired')
start()
done()
})
.on('shown.bs.collapse', function () {
ok(false, 'shown event fired')
@ -58,8 +58,8 @@ $(function () {
.bootstrapCollapse('show')
})
test('should reset style to auto after finishing opening collapse', function () {
stop()
test('should reset style to auto after finishing opening collapse', function (assert) {
var done = assert.async()
$('<div class="collapse" style="height: 0px"/>')
.on('show.bs.collapse', function () {
@ -67,13 +67,13 @@ $(function () {
})
.on('shown.bs.collapse', function () {
strictEqual(this.style.height, '', 'height is auto')
start()
done()
})
.bootstrapCollapse('show')
})
test('should remove "collapsed" class from target when collapse is shown', function () {
stop()
test('should remove "collapsed" class from target when collapse is shown', function (assert) {
var done = assert.async()
var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
@ -81,14 +81,14 @@ $(function () {
.appendTo('#qunit-fixture')
.on('shown.bs.collapse', function () {
ok(!$target.hasClass('collapsed'))
start()
done()
})
$target.click()
})
test('should add "collapsed" class to target when collapse is hidden', function () {
stop()
test('should add "collapsed" class to target when collapse is hidden', function (assert) {
var done = assert.async()
var $target = $('<a data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
@ -96,14 +96,14 @@ $(function () {
.appendTo('#qunit-fixture')
.on('hidden.bs.collapse', function () {
ok($target.hasClass('collapsed'))
start()
done()
})
$target.click()
})
test('should not close a collapse when initialized with "show" if already shown', function () {
stop()
test('should not close a collapse when initialized with "show" if already shown', function (assert) {
var done = assert.async()
expect(0)
@ -115,11 +115,11 @@ $(function () {
$test.bootstrapCollapse('show')
setTimeout(start, 0)
setTimeout(done, 0)
})
test('should open a collapse when initialized with "show" if not already shown', function () {
stop()
test('should open a collapse when initialized with "show" if not already shown', function (assert) {
var done = assert.async()
expect(1)
@ -131,11 +131,11 @@ $(function () {
$test.bootstrapCollapse('show')
setTimeout(start, 0)
setTimeout(done, 0)
})
test('should remove "collapsed" class from active accordion target', function () {
stop()
test('should remove "collapsed" class from active accordion target', function (assert) {
var done = assert.async()
var accordionHTML = '<div class="panel-group" id="accordion">'
+ '<div class="panel"/>'
@ -161,14 +161,14 @@ $(function () {
ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
start()
done()
})
$target3.click()
})
test('should allow dots in data-parent', function () {
stop()
test('should allow dots in data-parent', function (assert) {
var done = assert.async()
var accordionHTML = '<div class="panel-group accordion">'
+ '<div class="panel"/>'
@ -194,14 +194,14 @@ $(function () {
ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
start()
done()
})
$target3.click()
})
test('should set aria-expanded="true" on target when collapse is shown', function () {
stop()
test('should set aria-expanded="true" on target when collapse is shown', function (assert) {
var done = assert.async()
var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
@ -209,14 +209,14 @@ $(function () {
.appendTo('#qunit-fixture')
.on('shown.bs.collapse', function () {
equal($target.attr('aria-expanded'), 'true', 'aria-expanded on target is "true"')
start()
done()
})
$target.click()
})
test('should set aria-expanded="false" on target when collapse is hidden', function () {
stop()
test('should set aria-expanded="false" on target when collapse is hidden', function (assert) {
var done = assert.async()
var $target = $('<a data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
@ -224,14 +224,14 @@ $(function () {
.appendTo('#qunit-fixture')
.on('hidden.bs.collapse', function () {
equal($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
start()
done()
})
$target.click()
})
test('should change aria-expanded from active accordion target to "false" and set the newly active one to "true"', function () {
stop()
test('should change aria-expanded from active accordion target to "false" and set the newly active one to "true"', function (assert) {
var done = assert.async()
var accordionHTML = '<div class="panel-group" id="accordion">'
+ '<div class="panel"/>'
@ -257,14 +257,14 @@ $(function () {
equal($target2.attr('aria-expanded'), 'false', 'inactive target 2 has aria-expanded="false"')
equal($target3.attr('aria-expanded'), 'true', 'active target 3 has aria-expanded="false"')
start()
done()
})
$target3.click()
})
test('should not fire show event if show is prevented because other element is still transitioning', function () {
stop()
test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
var done = assert.async()
var accordionHTML = '<div id="accordion">'
+ '<div class="panel"/>'
@ -294,12 +294,12 @@ $(function () {
setTimeout(function () {
ok(!showFired, 'show event didn\'t fire')
start()
done()
}, 1)
})
test('should add "collapsed" class to target when collapse is hidden via manual invocation', function () {
stop()
test('should add "collapsed" class to target when collapse is hidden via manual invocation', function (assert) {
var done = assert.async()
var $target = $('<a data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
@ -307,13 +307,13 @@ $(function () {
.appendTo('#qunit-fixture')
.on('hidden.bs.collapse', function () {
ok($target.hasClass('collapsed'))
start()
done()
})
.bootstrapCollapse('hide')
})
test('should remove "collapsed" class from target when collapse is shown via manual invocation', function () {
stop()
test('should remove "collapsed" class from target when collapse is shown via manual invocation', function (assert) {
var done = assert.async()
var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
@ -321,7 +321,7 @@ $(function () {
.appendTo('#qunit-fixture')
.on('shown.bs.collapse', function () {
ok(!$target.hasClass('collapsed'))
start()
done()
})
.bootstrapCollapse('show')
})

View File

@ -157,7 +157,7 @@ $(function () {
strictEqual($('#qunit-fixture .open').length, 0, '"open" class removed')
})
test('should fire show and hide event', function () {
test('should fire show and hide event', function (assert) {
var dropdownHTML = '<ul class="tabs">'
+ '<li class="dropdown">'
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
@ -174,7 +174,7 @@ $(function () {
.find('[data-toggle="dropdown"]')
.bootstrapDropdown()
stop()
var done = assert.async()
$dropdown
.parent('.dropdown')
@ -183,7 +183,7 @@ $(function () {
})
.on('hide.bs.dropdown', function () {
ok(true, 'hide was fired')
start()
done()
})
$dropdown.click()
@ -191,7 +191,7 @@ $(function () {
})
test('should fire shown and hidden event', function () {
test('should fire shown and hidden event', function (assert) {
var dropdownHTML = '<ul class="tabs">'
+ '<li class="dropdown">'
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
@ -208,7 +208,7 @@ $(function () {
.find('[data-toggle="dropdown"]')
.bootstrapDropdown()
stop()
var done = assert.async()
$dropdown
.parent('.dropdown')
@ -217,15 +217,15 @@ $(function () {
})
.on('hidden.bs.dropdown', function () {
ok(true, 'hidden was fired')
start()
done()
})
$dropdown.click()
$(document.body).click()
})
test('should ignore keyboard events within <input>s and <textarea>s', function () {
stop()
test('should ignore keyboard events within <input>s and <textarea>s', function (assert) {
var done = assert.async()
var dropdownHTML = '<ul class="tabs">'
+ '<li class="dropdown">'
@ -259,7 +259,7 @@ $(function () {
$textarea.focus().trigger($.Event('keydown', { which: 38 }))
ok($(document.activeElement).is($textarea), 'textarea still focused')
start()
done()
})
$dropdown.click()

View File

@ -33,36 +33,36 @@ $(function () {
ok($.fn.bootstrapModal.Constructor.DEFAULTS, 'default object exposed')
})
test('should insert into dom when show method is called', function () {
stop()
test('should insert into dom when show method is called', function (assert) {
var done = assert.async()
$('<div id="modal-test"/>')
.on('shown.bs.modal', function () {
notEqual($('#modal-test').length, 0, 'modal inserted into dom')
start()
done()
})
.bootstrapModal('show')
})
test('should fire show event', function () {
stop()
test('should fire show event', function (assert) {
var done = assert.async()
$('<div id="modal-test"/>')
.on('show.bs.modal', function () {
ok(true, 'show event fired')
start()
done()
})
.bootstrapModal('show')
})
test('should not fire shown when show was prevented', function () {
stop()
test('should not fire shown when show was prevented', function (assert) {
var done = assert.async()
$('<div id="modal-test"/>')
.on('show.bs.modal', function (e) {
e.preventDefault()
ok(true, 'show event fired')
start()
done()
})
.on('shown.bs.modal', function () {
ok(false, 'shown event fired')
@ -70,8 +70,8 @@ $(function () {
.bootstrapModal('show')
})
test('should hide modal when hide is called', function () {
stop()
test('should hide modal when hide is called', function (assert) {
var done = assert.async()
$('<div id="modal-test"/>')
.on('shown.bs.modal', function () {
@ -81,13 +81,13 @@ $(function () {
})
.on('hidden.bs.modal', function () {
ok(!$('#modal-test').is(':visible'), 'modal hidden')
start()
done()
})
.bootstrapModal('show')
})
test('should toggle when toggle is called', function () {
stop()
test('should toggle when toggle is called', function (assert) {
var done = assert.async()
$('<div id="modal-test"/>')
.on('shown.bs.modal', function () {
@ -97,13 +97,13 @@ $(function () {
})
.on('hidden.bs.modal', function () {
ok(!$('#modal-test').is(':visible'), 'modal hidden')
start()
done()
})
.bootstrapModal('toggle')
})
test('should remove from dom when click [data-dismiss="modal"]', function () {
stop()
test('should remove from dom when click [data-dismiss="modal"]', function (assert) {
var done = assert.async()
$('<div id="modal-test"><span class="close" data-dismiss="modal"/></div>')
.on('shown.bs.modal', function () {
@ -113,13 +113,13 @@ $(function () {
})
.on('hidden.bs.modal', function () {
ok(!$('#modal-test').is(':visible'), 'modal hidden')
start()
done()
})
.bootstrapModal('toggle')
})
test('should allow modal close with "backdrop:false"', function () {
stop()
test('should allow modal close with "backdrop:false"', function (assert) {
var done = assert.async()
$('<div id="modal-test" data-backdrop="false"/>')
.on('shown.bs.modal', function () {
@ -128,13 +128,13 @@ $(function () {
})
.on('hidden.bs.modal', function () {
ok(!$('#modal-test').is(':visible'), 'modal hidden')
start()
done()
})
.bootstrapModal('show')
})
test('should close modal when clicking outside of modal-content', function () {
stop()
test('should close modal when clicking outside of modal-content', function (assert) {
var done = assert.async()
$('<div id="modal-test"><div class="contents"/></div>')
.on('shown.bs.modal', function () {
@ -145,13 +145,13 @@ $(function () {
})
.on('hidden.bs.modal', function () {
ok(!$('#modal-test').is(':visible'), 'modal hidden')
start()
done()
})
.bootstrapModal('show')
})
test('should close modal when escape key is pressed via keydown', function () {
stop()
test('should close modal when escape key is pressed via keydown', function (assert) {
var done = assert.async()
var div = $('<div id="modal-test"/>')
div
@ -163,14 +163,14 @@ $(function () {
setTimeout(function () {
ok(!$('#modal-test').is(':visible'), 'modal hidden')
div.remove()
start()
done()
}, 0)
})
.bootstrapModal('show')
})
test('should not close modal when escape key is pressed via keyup', function () {
stop()
test('should not close modal when escape key is pressed via keyup', function (assert) {
var done = assert.async()
var div = $('<div id="modal-test"/>')
div
@ -182,14 +182,14 @@ $(function () {
setTimeout(function () {
ok($('#modal-test').is(':visible'), 'modal still visible')
div.remove()
start()
done()
}, 0)
})
.bootstrapModal('show')
})
test('should trigger hide event once when clicking outside of modal-content', function () {
stop()
test('should trigger hide event once when clicking outside of modal-content', function (assert) {
var done = assert.async()
var triggered
@ -201,31 +201,36 @@ $(function () {
.on('hide.bs.modal', function () {
triggered += 1
strictEqual(triggered, 1, 'modal hide triggered once')
start()
done()
})
.bootstrapModal('show')
})
test('should close reopened modal with [data-dismiss="modal"] click', function () {
stop()
test('should close reopened modal with [data-dismiss="modal"] click', function (assert) {
var done = assert.async()
$('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
.on('shown.bs.modal', function () {
.one('shown.bs.modal', function () {
$('#close').click()
ok(!$('#modal-test').is(':visible'), 'modal hidden')
})
.one('hidden.bs.modal', function () {
// after one open-close cycle
ok(!$('#modal-test').is(':visible'), 'modal hidden')
$(this)
.one('shown.bs.modal', function () {
$('#close').click()
})
.one('hidden.bs.modal', function () {
start()
ok(!$('#modal-test').is(':visible'), 'modal hidden')
done()
})
.bootstrapModal('show')
})
.bootstrapModal('show')
})
test('should restore focus to toggling element when modal is hidden after having been opened via data-api', function () {
stop()
test('should restore focus to toggling element when modal is hidden after having been opened via data-api', function (assert) {
var done = assert.async()
var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
@ -233,7 +238,7 @@ $(function () {
.on('hidden.bs.modal', function () {
setTimeout(function () {
ok($(document.activeElement).is($toggleBtn), 'toggling element is once again focused')
start()
done()
}, 0)
})
.on('shown.bs.modal', function () {
@ -244,8 +249,8 @@ $(function () {
$toggleBtn.click()
})
test('should not restore focus to toggling element if the associated show event gets prevented', function () {
stop()
test('should not restore focus to toggling element if the associated show event gets prevented', function (assert) {
var done = assert.async()
var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
var $otherBtn = $('<button id="other-btn"/>').appendTo('#qunit-fixture')
@ -260,7 +265,7 @@ $(function () {
.on('hidden.bs.modal', function () {
setTimeout(function () {
ok($(document.activeElement).is($otherBtn), 'focus returned to toggling element')
start()
done()
}, 0)
})
.on('shown.bs.modal', function () {

View File

@ -188,7 +188,7 @@ $(function () {
equal($('.popover').length, 0, 'popover was removed')
})
test('should detach popover content rather than removing it so that event handlers are left intact', function () {
test('should detach popover content rather than removing it so that event handlers are left intact', function (assert) {
var $content = $('<div class="content-with-handler"><a class="btn btn-warning">Button with event handler</a></div>').appendTo('#qunit-fixture')
var handlerCalled = false
@ -207,7 +207,7 @@ $(function () {
}
})
stop()
var done = assert.async()
$div
.one('shown.bs.popover', function () {
$div
@ -217,7 +217,7 @@ $(function () {
$('.content-with-handler .btn').click()
$div.bootstrapPopover('destroy')
ok(handlerCalled, 'content\'s event handler still present')
start()
done()
})
.bootstrapPopover('show')
})

View File

@ -29,8 +29,8 @@ $(function () {
strictEqual($scrollspy[0], $el[0], 'collection contains element')
})
test('should only switch "active" class on current target', function () {
stop()
test('should only switch "active" class on current target', function (assert) {
var done = assert.async()
var sectionHTML = '<div id="root" class="active">'
+ '<div class="topbar">'
@ -67,14 +67,14 @@ $(function () {
$scrollspy.on('scroll.bs.scrollspy', function () {
ok($section.hasClass('active'), '"active" class still on root node')
start()
done()
})
$scrollspy.scrollTop(350)
})
test('should correctly select middle navigation option when large offset is used', function () {
stop()
test('should correctly select middle navigation option when large offset is used', function (assert) {
var done = assert.async()
var sectionHTML = '<div id="header" style="height: 500px;"></div>'
+ '<nav id="navigation" class="navbar">'
@ -100,13 +100,13 @@ $(function () {
ok(!$section.find('#one-link').parent().hasClass('active'), '"active" class removed from first section')
ok($section.find('#two-link').parent().hasClass('active'), '"active" class on middle section')
ok(!$section.find('#three-link').parent().hasClass('active'), '"active" class not on last section')
start()
done()
})
$scrollspy.scrollTop(550)
})
test('should add the active class to the correct element', function () {
test('should add the active class to the correct element', function (assert) {
var navbarHtml =
'<nav class="navbar">'
+ '<ul class="nav">'
@ -128,10 +128,10 @@ $(function () {
var testElementIsActiveAfterScroll = function (element, target) {
var deferred = $.Deferred()
var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
stop()
var done = assert.async()
$content.one('scroll', function () {
ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
start()
done()
deferred.resolve()
})
$content.scrollTop(scrollHeight)
@ -142,8 +142,8 @@ $(function () {
.then(function () { return testElementIsActiveAfterScroll('#li-2', '#div-2') })
})
test('should clear selection if above the first section', function () {
stop()
test('should clear selection if above the first section', function (assert) {
var done = assert.async()
var sectionHTML = '<div id="header" style="height: 500px;"></div>'
+ '<nav id="navigation" class="navbar">'
@ -176,7 +176,7 @@ $(function () {
$scrollspy
.one('scroll.bs.scrollspy', function () {
strictEqual($('.active').length, 0, 'selection cleared')
start()
done()
})
.scrollTop(0)
})

View File

@ -59,14 +59,14 @@ $(function () {
equal($('#qunit-fixture').find('.active').attr('id'), 'home')
})
test('should not fire shown when show is prevented', function () {
stop()
test('should not fire shown when show is prevented', function (assert) {
var done = assert.async()
$('<div class="tab"/>')
.on('show.bs.tab', function (e) {
e.preventDefault()
ok(true, 'show event fired')
start()
done()
})
.on('shown.bs.tab', function () {
ok(false, 'shown event fired')
@ -74,8 +74,8 @@ $(function () {
.bootstrapTab('show')
})
test('show and shown events should reference correct relatedTarget', function () {
stop()
test('show and shown events should reference correct relatedTarget', function (assert) {
var done = assert.async()
var dropHTML = '<ul class="drop">'
+ '<li class="dropdown"><a data-toggle="dropdown" href="#">1</a>'
@ -93,16 +93,16 @@ $(function () {
.find('ul > li:last a')
.on('show.bs.tab', function (e) {
equal(e.relatedTarget.hash, '#1-1', 'references correct element as relatedTarget')
start()
})
.on('shown.bs.tab', function (e) {
equal(e.relatedTarget.hash, '#1-1', 'references correct element as relatedTarget')
done()
})
.bootstrapTab('show')
})
test('should fire hide and hidden events', function () {
stop()
test('should fire hide and hidden events', function (assert) {
var done = assert.async()
var tabsHTML = '<ul class="tabs">'
+ '<li><a href="#home">Home</a></li>'
@ -123,7 +123,7 @@ $(function () {
.find('li:first a')
.on('hidden.bs.tab', function () {
ok(true, 'hidden event fired')
start()
done()
})
.bootstrapTab('show')
.end()
@ -131,8 +131,8 @@ $(function () {
.bootstrapTab('show')
})
test('should not fire hidden when hide is prevented', function () {
stop()
test('should not fire hidden when hide is prevented', function (assert) {
var done = assert.async()
var tabsHTML = '<ul class="tabs">'
+ '<li><a href="#home">Home</a></li>'
@ -144,7 +144,7 @@ $(function () {
.on('hide.bs.tab', function (e) {
e.preventDefault()
ok(true, 'hide event fired')
start()
done()
})
.on('hidden.bs.tab', function () {
ok(false, 'hidden event fired')
@ -155,8 +155,8 @@ $(function () {
.bootstrapTab('show')
})
test('hide and hidden events contain correct relatedTarget', function () {
stop()
test('hide and hidden events contain correct relatedTarget', function (assert) {
var done = assert.async()
var tabsHTML = '<ul class="tabs">'
+ '<li><a href="#home">Home</a></li>'
@ -170,7 +170,7 @@ $(function () {
})
.on('hidden.bs.tab', function (e) {
equal(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
start()
done()
})
.bootstrapTab('show')
.end()

View File

@ -115,37 +115,37 @@ $(function () {
equal($('.tooltip').length, 0, 'tooltip removed')
})
test('should fire show event', function () {
stop()
test('should fire show event', function (assert) {
var done = assert.async()
$('<div title="tooltip title"/>')
.on('show.bs.tooltip', function () {
ok(true, 'show event fired')
start()
done()
})
.bootstrapTooltip('show')
})
test('should fire shown event', function () {
stop()
test('should fire shown event', function (assert) {
var done = assert.async()
$('<div title="tooltip title"></div>')
.appendTo('#qunit-fixture')
.on('shown.bs.tooltip', function () {
ok(true, 'shown was called')
start()
done()
})
.bootstrapTooltip('show')
})
test('should not fire shown event when show was prevented', function () {
stop()
test('should not fire shown event when show was prevented', function (assert) {
var done = assert.async()
$('<div title="tooltip title"/>')
.on('show.bs.tooltip', function (e) {
e.preventDefault()
ok(true, 'show event fired')
start()
done()
})
.on('shown.bs.tooltip', function () {
ok(false, 'shown event fired')
@ -153,8 +153,8 @@ $(function () {
.bootstrapTooltip('show')
})
test('should fire hide event', function () {
stop()
test('should fire hide event', function (assert) {
var done = assert.async()
$('<div title="tooltip title"/>')
.appendTo('#qunit-fixture')
@ -163,13 +163,13 @@ $(function () {
})
.on('hide.bs.tooltip', function () {
ok(true, 'hide event fired')
start()
done()
})
.bootstrapTooltip('show')
})
test('should fire hidden event', function () {
stop()
test('should fire hidden event', function (assert) {
var done = assert.async()
$('<div title="tooltip title"/>')
.appendTo('#qunit-fixture')
@ -178,13 +178,13 @@ $(function () {
})
.on('hidden.bs.tooltip', function () {
ok(true, 'hidden event fired')
start()
done()
})
.bootstrapTooltip('show')
})
test('should not fire hidden event when hide was prevented', function () {
stop()
test('should not fire hidden event when hide was prevented', function (assert) {
var done = assert.async()
$('<div title="tooltip title"/>')
.appendTo('#qunit-fixture')
@ -194,7 +194,7 @@ $(function () {
.on('hide.bs.tooltip', function (e) {
e.preventDefault()
ok(true, 'hide event fired')
start()
done()
})
.on('hidden.bs.tooltip', function () {
ok(false, 'hidden event fired')
@ -699,8 +699,8 @@ $(function () {
ok(passed, '.tooltip(\'show\') should not throw an error if element no longer is in dom')
})
test('should place tooltip on top of element', function () {
stop()
test('should place tooltip on top of element', function (assert) {
var done = assert.async()
var containerHTML = '<div>'
+ '<p style="margin-top: 200px">'
@ -732,12 +732,12 @@ $(function () {
setTimeout(function () {
ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
start()
done()
}, 0)
})
test('should place tooltip inside viewport', function () {
stop()
test('should place tooltip inside viewport', function (assert) {
var done = assert.async()
var $container = $('<div/>')
.css({
@ -763,12 +763,12 @@ $(function () {
setTimeout(function () {
ok($('.tooltip').offset().left >= 0)
start()
done()
}, 0)
})
test('should show tooltip if leave event hasn\'t occurred before delay expires', function () {
stop()
test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
var done = assert.async()
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
@ -780,14 +780,14 @@ $(function () {
setTimeout(function () {
ok($('.tooltip').is('.fade.in'), '200ms: tooltip is faded in')
start()
done()
}, 200)
$tooltip.trigger('mouseenter')
})
test('should not show tooltip if leave event occurs before delay expires', function () {
stop()
test('should not show tooltip if leave event occurs before delay expires', function (assert) {
var done = assert.async()
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
@ -800,14 +800,14 @@ $(function () {
setTimeout(function () {
ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
start()
done()
}, 200)
$tooltip.trigger('mouseenter')
})
test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function () {
stop()
test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
var done = assert.async()
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
@ -824,15 +824,15 @@ $(function () {
setTimeout(function () {
ok($('.tooltip').is('.fade.in'), '200ms: tooltip still faded in')
start()
done()
}, 200)
}, 0)
$tooltip.trigger('mouseenter')
})
test('should not show tooltip if leave event occurs before delay expires', function () {
stop()
test('should not show tooltip if leave event occurs before delay expires', function (assert) {
var done = assert.async()
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
@ -845,14 +845,14 @@ $(function () {
setTimeout(function () {
ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
start()
done()
}, 200)
$tooltip.trigger('mouseenter')
})
test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function () {
stop()
test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
var done = assert.async()
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
@ -865,14 +865,14 @@ $(function () {
setTimeout(function () {
ok(!$('.tooltip').is('.fade.in'), '250ms: tooltip not faded in')
start()
done()
}, 250)
$tooltip.trigger('mouseenter')
})
test('should wait 200ms before hiding the tooltip', function () {
stop()
test('should wait 200ms before hiding the tooltip', function (assert) {
var done = assert.async()
var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
@ -889,7 +889,7 @@ $(function () {
setTimeout(function () {
ok(!$tooltip.data('bs.tooltip').$tip.is('.in'), '200ms: tooltip removed')
start()
done()
}, 200)
}, 0)
@ -897,14 +897,14 @@ $(function () {
$tooltip.trigger('mouseenter')
})
test('should correctly position tooltips on SVG elements', function () {
test('should correctly position tooltips on SVG elements', function (assert) {
if (!window.SVGElement) {
// Skip IE8 since it doesn't support SVG
expect(0)
return
}
stop()
var done = assert.async()
var styles = '<style>'
+ '.tooltip, .tooltip *, .tooltip *:before, .tooltip *:after { box-sizing: border-box; }'
@ -928,15 +928,15 @@ $(function () {
ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
$circle.bootstrapTooltip('hide')
equal($('.tooltip').length, 0, 'tooltip removed from dom')
start()
done()
})
.bootstrapTooltip({ container: 'body', placement: 'top', trigger: 'manual' })
$circle.bootstrapTooltip('show')
})
test('should correctly determine auto placement based on container rather than parent', function () {
stop()
test('should correctly determine auto placement based on container rather than parent', function (assert) {
var done = assert.async()
var styles = '<style>'
+ '.tooltip, .tooltip *, .tooltip *:before, .tooltip *:after { box-sizing: border-box; }'
@ -965,7 +965,7 @@ $(function () {
$styles.remove()
$(this).remove()
equal($('.tooltip').length, 0, 'tooltip removed from dom')
start()
done()
})
.bootstrapTooltip({
container: 'body',
@ -1037,8 +1037,8 @@ $(function () {
equal(currentUid, $('#tt-content').text())
})
test('should position arrow correctly when tooltip is moved to not appear offscreen', function () {
stop()
test('should position arrow correctly when tooltip is moved to not appear offscreen', function (assert) {
var done = assert.async()
var styles = '<style>'
+ '.tooltip, .tooltip *, .tooltip *:before, .tooltip *:after { box-sizing: border-box; }'
@ -1059,7 +1059,7 @@ $(function () {
$styles.remove()
$(this).remove()
equal($('.tooltip').length, 0, 'tooltip removed from dom')
start()
done()
})
.bootstrapTooltip({
container: 'body',
@ -1069,14 +1069,14 @@ $(function () {
.bootstrapTooltip('show')
})
test('should correctly position tooltips on transformed elements', function () {
test('should correctly position tooltips on transformed elements', function (assert) {
var styleProps = document.documentElement.style
if (!('transform' in styleProps) && !('webkitTransform' in styleProps) && !('msTransform' in styleProps)) {
expect(0)
return
}
stop()
var done = assert.async()
var styles = '<style>'
+ '#qunit-fixture { top: 0; left: 0; }'
@ -1096,7 +1096,7 @@ $(function () {
ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
ok(Math.abs(offset.top - 126) <= 1, 'tooltip has correct vertical location')
$element.bootstrapTooltip('hide')
start()
done()
})
.bootstrapTooltip({
container: 'body',

View File

@ -1,12 +1,12 @@
/*!
* QUnit 1.15.0
* QUnit 1.17.0
* http://qunitjs.com/
*
* Copyright 2014 jQuery Foundation and other contributors
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2014-08-08T16:00Z
* Date: 2015-01-19T11:58Z
*/
/** Font Family and Sizes */
@ -77,6 +77,18 @@
#qunit-modulefilter-container {
float: right;
padding: 0.2em;
}
.qunit-url-config {
display: inline-block;
padding: 0.1em;
}
.qunit-filter {
display: block;
float: right;
margin-left: 1em;
}
/** Tests: Pass/Fail */
@ -91,7 +103,19 @@
list-style-position: inside;
}
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
#qunit-tests > li {
display: none;
}
#qunit-tests li.running,
#qunit-tests li.pass,
#qunit-tests li.fail,
#qunit-tests li.skipped {
display: list-item;
}
#qunit-tests.hidepass li.running,
#qunit-tests.hidepass li.pass {
display: none;
}
@ -99,6 +123,10 @@
cursor: pointer;
}
#qunit-tests li.skipped strong {
cursor: default;
}
#qunit-tests li a {
padding: 0.5em;
color: #C2CCD1;
@ -211,6 +239,21 @@
#qunit-banner.qunit-fail { background-color: #EE5757; }
/*** Skipped tests */
#qunit-tests .skipped {
background-color: #EBECE9;
}
#qunit-tests .qunit-skipped-label {
background-color: #F4FF77;
display: inline-block;
font-style: normal;
color: #366097;
line-height: 1.8em;
padding: 0 0.5em;
margin: -0.4em 0.4em -0.4em 0;
}
/** Result */

1494
js/tests/vendor/qunit.js vendored

File diff suppressed because it is too large Load Diff

View File

@ -55,12 +55,12 @@
"grunt-jekyll": "~0.4.2",
"grunt-jscs": "~1.2.0",
"grunt-sass": "~0.17.0",
"grunt-saucelabs": "~8.4.1",
"grunt-saucelabs": "~8.5.0",
"grunt-scss-lint": "^0.3.4",
"grunt-sed": "~0.1.1",
"load-grunt-tasks": "~2.0.0",
"markdown-it": "^3.0.4",
"npm-shrinkwrap": "^200.0.0",
"remarkable": "~1.6.0",
"time-grunt": "~1.0.0"
},
"engines": {

View File

@ -256,12 +256,12 @@
"resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-5.0.0.tgz",
"dependencies": {
"browserslist": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.1.1.tgz"
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.1.2.tgz"
},
"caniuse-db": {
"version": "1.0.30000048",
"resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000048.tgz"
"version": "1.0.30000049",
"resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000049.tgz"
},
"postcss": {
"version": "4.0.1",
@ -394,32 +394,8 @@
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.1.2.tgz",
"dependencies": {
"bl": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz",
"dependencies": {
"readable-stream": {
"version": "1.0.33",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
"dependencies": {
"core-util-is": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
},
"inherits": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
}
}
}
}
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz"
},
"end-of-stream": {
"version": "1.1.0",
@ -1692,8 +1668,8 @@
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
},
"bl": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz",
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz",
"dependencies": {
"readable-stream": {
"version": "1.0.33",
@ -1958,8 +1934,8 @@
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
},
"bl": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz",
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz",
"dependencies": {
"readable-stream": {
"version": "1.0.33",
@ -2894,18 +2870,18 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
},
"vow": {
"version": "0.4.7",
"resolved": "https://registry.npmjs.org/vow/-/vow-0.4.7.tgz"
"version": "0.4.8",
"resolved": "https://registry.npmjs.org/vow/-/vow-0.4.8.tgz"
}
}
},
"grunt-saucelabs": {
"version": "8.4.1",
"resolved": "https://registry.npmjs.org/grunt-saucelabs/-/grunt-saucelabs-8.4.1.tgz",
"version": "8.5.0",
"resolved": "https://registry.npmjs.org/grunt-saucelabs/-/grunt-saucelabs-8.5.0.tgz",
"dependencies": {
"colors": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz"
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz"
},
"lodash": {
"version": "2.4.1",
@ -2915,25 +2891,59 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz"
},
"request": {
"version": "2.35.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.35.0.tgz",
"requestretry": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.2.2.tgz",
"dependencies": {
"aws-sign2": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
},
"forever-agent": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz"
},
"form-data": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz",
"fg-lodash": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/fg-lodash/-/fg-lodash-0.0.2.tgz",
"dependencies": {
"async": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
"underscore.string": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
}
}
},
"request": {
"version": "2.51.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz",
"dependencies": {
"aws-sign2": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
},
"bl": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz",
"dependencies": {
"readable-stream": {
"version": "1.0.33",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
"dependencies": {
"core-util-is": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
},
"inherits": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
}
}
}
}
},
"caseless": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz"
},
"combined-stream": {
"version": "0.0.7",
@ -2944,290 +2954,110 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
}
}
}
}
},
"hawk": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz",
"dependencies": {
"boom": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz"
},
"cryptiles": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz"
"forever-agent": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz"
},
"hoek": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz"
},
"sntp": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz"
}
}
},
"http-signature": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
"dependencies": {
"asn1": {
"version": "0.1.11",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz"
},
"assert-plus": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz"
},
"ctype": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz"
}
}
},
"json-stringify-safe": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz"
},
"lodash.merge": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-2.4.1.tgz",
"dependencies": {
"lodash._basecreatecallback": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz",
"form-data": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz",
"dependencies": {
"lodash._setbinddata": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz",
"dependencies": {
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz"
},
"lodash.noop": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz"
}
}
"async": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
},
"lodash.bind": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz",
"mime-types": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.7.tgz",
"dependencies": {
"lodash._createwrapper": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz",
"dependencies": {
"lodash._basebind": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz",
"dependencies": {
"lodash._basecreate": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz",
"dependencies": {
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz"
},
"lodash.noop": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz"
}
}
}
}
},
"lodash._basecreatewrapper": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz",
"dependencies": {
"lodash._basecreate": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz",
"dependencies": {
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz"
},
"lodash.noop": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz"
}
}
}
}
},
"lodash.isfunction": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz"
}
}
}
}
},
"lodash.identity": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz"
},
"lodash.support": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz",
"dependencies": {
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz"
"mime-db": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.5.0.tgz"
}
}
}
}
},
"lodash._basemerge": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basemerge/-/lodash._basemerge-2.4.1.tgz",
"hawk": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
"dependencies": {
"lodash.foreach": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz"
"boom": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz"
},
"lodash.forown": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz",
"dependencies": {
"lodash._objecttypes": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz"
},
"lodash.keys": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz",
"dependencies": {
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz"
},
"lodash._shimkeys": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz"
}
}
}
}
"cryptiles": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz"
},
"lodash.isarray": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz",
"dependencies": {
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz"
}
}
"hoek": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz"
},
"lodash.isplainobject": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-2.4.1.tgz",
"dependencies": {
"lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz"
},
"lodash._shimisplainobject": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._shimisplainobject/-/lodash._shimisplainobject-2.4.1.tgz",
"dependencies": {
"lodash.forin": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.forin/-/lodash.forin-2.4.1.tgz",
"dependencies": {
"lodash._objecttypes": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz"
}
}
},
"lodash.isfunction": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz"
}
}
}
}
"sntp": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz"
}
}
},
"lodash._getarray": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz",
"http-signature": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
"dependencies": {
"lodash._arraypool": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz"
}
}
},
"lodash._releasearray": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz",
"dependencies": {
"lodash._arraypool": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz"
"asn1": {
"version": "0.1.11",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz"
},
"lodash._maxpoolsize": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz"
"assert-plus": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz"
},
"ctype": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz"
}
}
},
"lodash._slice": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz"
"json-stringify-safe": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz"
},
"lodash.isobject": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz",
"mime-types": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz"
},
"node-uuid": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.2.tgz"
},
"oauth-sign": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz"
},
"qs": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz"
},
"stringstream": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz"
},
"tough-cookie": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz",
"dependencies": {
"lodash._objecttypes": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz"
"punycode": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
}
}
},
"tunnel-agent": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz"
}
}
},
"mime": {
"version": "1.2.11",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz"
},
"node-uuid": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.2.tgz"
},
"oauth-sign": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz"
},
"qs": {
"version": "0.6.6",
"resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz"
},
"tough-cookie": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz",
"dependencies": {
"punycode": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
}
}
},
"tunnel-agent": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz"
}
}
},
@ -3465,6 +3295,30 @@
}
}
},
"markdown-it": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-3.0.4.tgz",
"dependencies": {
"argparse": {
"version": "0.1.16",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz",
"dependencies": {
"underscore": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz"
},
"underscore.string": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz"
}
}
},
"autolinker": {
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.2.tgz"
}
}
},
"npm-shrinkwrap": {
"version": "200.0.0",
"resolved": "https://registry.npmjs.org/npm-shrinkwrap/-/npm-shrinkwrap-200.0.0.tgz",
@ -4193,30 +4047,6 @@
}
}
},
"remarkable": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.6.0.tgz",
"dependencies": {
"argparse": {
"version": "0.1.16",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz",
"dependencies": {
"underscore": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz"
},
"underscore.string": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz"
}
}
},
"autolinker": {
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.2.tgz"
}
}
},
"time-grunt": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.0.0.tgz",