modal.js 19.8 KB
Newer Older
1
$(function () {
2
  'use strict'
3

fat's avatar
fat committed
4
  QUnit.module('modal plugin')
XhmikosR's avatar
XhmikosR committed
5

fat's avatar
fat committed
6
7
8
  QUnit.test('should be defined on jquery object', function (assert) {
    assert.expect(1)
    assert.ok($(document.body).modal, 'modal method is defined')
XhmikosR's avatar
XhmikosR committed
9
10
  })

fat's avatar
fat committed
11
  QUnit.module('modal', {
12
13
14
    before: function () {
      // Enable the scrollbar measurer
      $('<style type="text/css"> .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } </style>').appendTo('head')
15
16
17
18
19
20
21
22
23
      // Function to calculate the scrollbar width which is then compared to the padding or margin changes
      $.fn.getScrollbarWidth = function () {
        var scrollDiv = document.createElement('div')
        scrollDiv.className = 'modal-scrollbar-measure'
        document.body.appendChild(scrollDiv)
        var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
        document.body.removeChild(scrollDiv)
        return scrollbarWidth
      }
24
    },
fat's avatar
fat committed
25
    beforeEach: function () {
26
27
28
      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
      $.fn.bootstrapModal = $.fn.modal.noConflict()
    },
fat's avatar
fat committed
29
    afterEach: function () {
30
31
32
33
34
      $.fn.modal = $.fn.bootstrapModal
      delete $.fn.bootstrapModal
    }
  })

fat's avatar
fat committed
35
36
37
  QUnit.test('should provide no conflict', function (assert) {
    assert.expect(1)
    assert.strictEqual($.fn.modal, undefined, 'modal was set back to undefined (orig value)')
38
39
  })

40
41
42
43
44
45
46
47
48
49
50
51
  QUnit.test('should throw explicit error on undefined method', function (assert) {
    assert.expect(1)
    var $el = $('<div id="modal-test"/>')
    $el.bootstrapModal()
    try {
      $el.bootstrapModal('noMethod')
    }
    catch (err) {
      assert.strictEqual(err.message, 'No method named "noMethod"')
    }
  })

fat's avatar
fat committed
52
53
  QUnit.test('should return jquery collection containing the element', function (assert) {
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
54
55
    var $el = $('<div id="modal-test"/>')
    var $modal = $el.bootstrapModal()
fat's avatar
fat committed
56
57
    assert.ok($modal instanceof $, 'returns jquery collection')
    assert.strictEqual($modal[0], $el[0], 'collection contains element')
XhmikosR's avatar
XhmikosR committed
58
59
  })

fat's avatar
fat committed
60
61
  QUnit.test('should expose defaults var for settings', function (assert) {
    assert.expect(1)
62
    assert.ok($.fn.bootstrapModal.Constructor.Default, 'default object exposed')
XhmikosR's avatar
XhmikosR committed
63
64
  })

fat's avatar
fat committed
65
66
  QUnit.test('should insert into dom when show method is called', function (assert) {
    assert.expect(1)
67
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
68
69

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
70
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
71
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
72
        done()
XhmikosR's avatar
XhmikosR committed
73
      })
74
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
75
76
  })

fat's avatar
fat committed
77
78
  QUnit.test('should fire show event', function (assert) {
    assert.expect(1)
79
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
80
81

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
82
      .on('show.bs.modal', function () {
fat's avatar
fat committed
83
        assert.ok(true, 'show event fired')
84
        done()
XhmikosR's avatar
XhmikosR committed
85
      })
86
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
87
88
  })

fat's avatar
fat committed
89
90
  QUnit.test('should not fire shown when show was prevented', function (assert) {
    assert.expect(1)
91
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
92
93

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
94
95
      .on('show.bs.modal', function (e) {
        e.preventDefault()
fat's avatar
fat committed
96
        assert.ok(true, 'show event fired')
97
        done()
XhmikosR's avatar
XhmikosR committed
98
99
      })
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
100
        assert.ok(false, 'shown event fired')
XhmikosR's avatar
XhmikosR committed
101
      })
102
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
103
104
  })

fat's avatar
fat committed
105
106
  QUnit.test('should hide modal when hide is called', function (assert) {
    assert.expect(3)
107
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
108

Heinrich Fenkart's avatar
Heinrich Fenkart committed
109
    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
110
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
111
112
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
113
        $(this).bootstrapModal('hide')
XhmikosR's avatar
XhmikosR committed
114
115
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
116
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
117
        done()
XhmikosR's avatar
XhmikosR committed
118
      })
119
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
120
121
  })

fat's avatar
fat committed
122
123
  QUnit.test('should toggle when toggle is called', function (assert) {
    assert.expect(3)
124
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
125
126

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
127
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
128
129
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
130
        $(this).bootstrapModal('toggle')
XhmikosR's avatar
XhmikosR committed
131
132
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
133
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
134
        done()
XhmikosR's avatar
XhmikosR committed
135
      })
136
      .bootstrapModal('toggle')
XhmikosR's avatar
XhmikosR committed
137
138
  })

fat's avatar
fat committed
139
140
  QUnit.test('should remove from dom when click [data-dismiss="modal"]', function (assert) {
    assert.expect(3)
141
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
142
143

    $('<div id="modal-test"><span class="close" data-dismiss="modal"/></div>')
XhmikosR's avatar
XhmikosR committed
144
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
145
146
147
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
        $(this).find('.close').trigger('click')
XhmikosR's avatar
XhmikosR committed
148
149
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
150
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
151
        done()
XhmikosR's avatar
XhmikosR committed
152
      })
153
      .bootstrapModal('toggle')
XhmikosR's avatar
XhmikosR committed
154
155
  })

fat's avatar
fat committed
156
157
  QUnit.test('should allow modal close with "backdrop:false"', function (assert) {
    assert.expect(2)
158
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
159
160

    $('<div id="modal-test" data-backdrop="false"/>')
XhmikosR's avatar
XhmikosR committed
161
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
162
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
163
        $(this).bootstrapModal('hide')
XhmikosR's avatar
XhmikosR committed
164
165
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
166
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
167
        done()
XhmikosR's avatar
XhmikosR committed
168
      })
169
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
170
171
  })

fat's avatar
fat committed
172
173
  QUnit.test('should close modal when clicking outside of modal-content', function (assert) {
    assert.expect(3)
174
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
175
176

    $('<div id="modal-test"><div class="contents"/></div>')
177
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
178
179
180
181
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
        $('.contents').trigger('click')
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        $('#modal-test').trigger('click')
XhmikosR's avatar
XhmikosR committed
182
      })
183
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
184
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
185
        done()
XhmikosR's avatar
XhmikosR committed
186
      })
187
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
188
189
  })

190
191
192
193
194
195
196
197
198
199
200
201
202
  QUnit.test('should not close modal when clicking outside of modal-content if data-backdrop="true"', function (assert) {
    assert.expect(1)
    var done = assert.async()

    $('<div id="modal-test" data-backdrop="false"><div class="contents"/></div>')
      .on('shown.bs.modal', function () {
        $('#modal-test').trigger('click')
        assert.ok($('#modal-test').is(':visible'), 'modal not hidden')
        done()
      })
      .bootstrapModal('show')
  })

fat's avatar
fat committed
203
204
  QUnit.test('should close modal when escape key is pressed via keydown', function (assert) {
    assert.expect(3)
205
    var done = assert.async()
206

fat's avatar
fat committed
207
208
    var $div = $('<div id="modal-test"/>')
    $div
209
      .on('shown.bs.modal', function () {
210
        assert.ok($('#modal-test').length, 'modal inserted into dom')
fat's avatar
fat committed
211
212
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        $div.trigger($.Event('keydown', { which: 27 }))
213
214

        setTimeout(function () {
fat's avatar
fat committed
215
216
          assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
          $div.remove()
217
          done()
218
219
220
221
222
        }, 0)
      })
      .bootstrapModal('show')
  })

fat's avatar
fat committed
223
224
  QUnit.test('should not close modal when escape key is pressed via keyup', function (assert) {
    assert.expect(3)
225
    var done = assert.async()
226

fat's avatar
fat committed
227
228
    var $div = $('<div id="modal-test"/>')
    $div
229
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
230
231
232
        assert.ok($('#modal-test').length, 'modal inserted into dom')
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        $div.trigger($.Event('keyup', { which: 27 }))
233
234

        setTimeout(function () {
fat's avatar
fat committed
235
236
          assert.ok($div.is(':visible'), 'modal still visible')
          $div.remove()
237
          done()
238
239
240
241
242
        }, 0)
      })
      .bootstrapModal('show')
  })

fat's avatar
fat committed
243
244
  QUnit.test('should trigger hide event once when clicking outside of modal-content', function (assert) {
    assert.expect(1)
245
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
246
247
248

    var triggered

Heinrich Fenkart's avatar
Heinrich Fenkart committed
249
    $('<div id="modal-test"><div class="contents"/></div>')
250
      .on('shown.bs.modal', function () {
XhmikosR's avatar
XhmikosR committed
251
        triggered = 0
fat's avatar
fat committed
252
        $('#modal-test').trigger('click')
XhmikosR's avatar
XhmikosR committed
253
      })
254
      .on('hide.bs.modal', function () {
XhmikosR's avatar
XhmikosR committed
255
        triggered += 1
fat's avatar
fat committed
256
        assert.strictEqual(triggered, 1, 'modal hide triggered once')
257
        done()
XhmikosR's avatar
XhmikosR committed
258
      })
259
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
260
261
  })

262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  QUnit.test('should remove aria-hidden attribute when shown, add it back when hidden', function (assert) {
    assert.expect(3)
    var done = assert.async()

    $('<div id="modal-test" aria-hidden="true"/>')
      .on('shown.bs.modal', function () {
        assert.notOk($('#modal-test').is('[aria-hidden]'), 'aria-hidden attribute removed')
        $(this).bootstrapModal('hide')
      })
      .on('hidden.bs.modal', function () {
        assert.ok($('#modal-test').is('[aria-hidden]'), 'aria-hidden attribute added')
        assert.strictEqual($('#modal-test').attr('aria-hidden'), 'true', 'correct aria-hidden="true" added')
        done()
      })
      .bootstrapModal('show')
  })

fat's avatar
fat committed
279
280
  QUnit.test('should close reopened modal with [data-dismiss="modal"] click', function (assert) {
    assert.expect(2)
281
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
282
283

    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
284
      .one('shown.bs.modal', function () {
fat's avatar
fat committed
285
        $('#close').trigger('click')
XhmikosR's avatar
XhmikosR committed
286
287
      })
      .one('hidden.bs.modal', function () {
288
        // after one open-close cycle
fat's avatar
fat committed
289
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
290
        $(this)
291
          .one('shown.bs.modal', function () {
fat's avatar
fat committed
292
            $('#close').trigger('click')
293
          })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
294
          .one('hidden.bs.modal', function () {
fat's avatar
fat committed
295
            assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
296
            done()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
297
298
          })
          .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
299
      })
300
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
301
  })
Chris Rebert's avatar
Chris Rebert committed
302

fat's avatar
fat committed
303
304
  QUnit.test('should restore focus to toggling element when modal is hidden after having been opened via data-api', function (assert) {
    assert.expect(1)
305
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
306
307
308
309

    var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')

    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
Chris Rebert's avatar
Chris Rebert committed
310
      .on('hidden.bs.modal', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
311
        setTimeout(function () {
fat's avatar
fat committed
312
          assert.ok($(document.activeElement).is($toggleBtn), 'toggling element is once again focused')
313
          done()
Chris Rebert's avatar
Chris Rebert committed
314
315
316
        }, 0)
      })
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
317
        $('#close').trigger('click')
Chris Rebert's avatar
Chris Rebert committed
318
319
      })
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
320

fat's avatar
fat committed
321
    $toggleBtn.trigger('click')
Chris Rebert's avatar
Chris Rebert committed
322
323
  })

fat's avatar
fat committed
324
325
  QUnit.test('should not restore focus to toggling element if the associated show event gets prevented', function (assert) {
    assert.expect(1)
326
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
327
328
329
330
    var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
    var $otherBtn = $('<button id="other-btn"/>').appendTo('#qunit-fixture')

    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div>')
Chris Rebert's avatar
Chris Rebert committed
331
332
      .one('show.bs.modal', function (e) {
        e.preventDefault()
fat's avatar
fat committed
333
        $otherBtn.trigger('focus')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
334
335
336
        setTimeout($.proxy(function () {
          $(this).bootstrapModal('show')
        }, this), 0)
Chris Rebert's avatar
Chris Rebert committed
337
338
      })
      .on('hidden.bs.modal', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
339
        setTimeout(function () {
fat's avatar
fat committed
340
          assert.ok($(document.activeElement).is($otherBtn), 'focus returned to toggling element')
341
          done()
Chris Rebert's avatar
Chris Rebert committed
342
343
344
        }, 0)
      })
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
345
        $('#close').trigger('click')
Chris Rebert's avatar
Chris Rebert committed
346
347
      })
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
348

fat's avatar
fat committed
349
350
351
    $toggleBtn.trigger('click')
  })

352
  QUnit.test('should adjust the inline body padding when opening and restore when closing', function (assert) {
fat's avatar
fat committed
353
354
355
    assert.expect(2)
    var done = assert.async()
    var $body = $(document.body)
356
    var originalPadding = $body.css('padding-right')
fat's avatar
fat committed
357
358
359

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
360
361
        var currentPadding = $body.css('padding-right')
        assert.strictEqual(currentPadding, originalPadding, 'body padding should be reset after closing')
fat's avatar
fat committed
362
363
364
365
        $body.removeAttr('style')
        done()
      })
      .on('shown.bs.modal', function () {
366
        var expectedPadding = parseFloat(originalPadding) + $(this).getScrollbarWidth() + 'px'
367
        var currentPadding = $body.css('padding-right')
368
        assert.strictEqual(currentPadding, expectedPadding, 'body padding should be adjusted while opening')
fat's avatar
fat committed
369
370
371
372
373
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

374
375
  QUnit.test('should store the original body padding in data-padding-right before showing', function (assert) {
    assert.expect(2)
fat's avatar
fat committed
376
377
    var done = assert.async()
    var $body = $(document.body)
378
379
    var originalPadding = '0px'
    $body.css('padding-right', originalPadding)
fat's avatar
fat committed
380
381
382

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
383
384
        assert.strictEqual($body.data('padding-right'), undefined, 'data-padding-right should be cleared after closing')
        $body.removeAttr('style')
fat's avatar
fat committed
385
386
387
        done()
      })
      .on('shown.bs.modal', function () {
388
        assert.strictEqual($body.data('padding-right'), originalPadding, 'original body padding should be stored in data-padding-right')
fat's avatar
fat committed
389
390
391
392
393
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

394
  QUnit.test('should adjust the inline padding of fixed elements when opening and restore when closing', function (assert) {
395
396
    assert.expect(2)
    var done = assert.async()
397
398
    var $element = $('<div class="fixed-top"></div>').appendTo('#qunit-fixture')
    var originalPadding = $element.css('padding-right')
399
400

    $('<div id="modal-test"/>')
401
402
403
404
405
406
      .on('hidden.bs.modal', function () {
        var currentPadding = $element.css('padding-right')
        assert.strictEqual(currentPadding, originalPadding, 'fixed element padding should be reset after closing')
        $element.remove()
        done()
      })
407
      .on('shown.bs.modal', function () {
408
        var expectedPadding = parseFloat(originalPadding) + $(this).getScrollbarWidth() + 'px'
409
        var currentPadding = $element.css('padding-right')
410
        assert.strictEqual(currentPadding, expectedPadding, 'fixed element padding should be adjusted while opening')
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

  QUnit.test('should store the original padding of fixed elements in data-padding-right before showing', function (assert) {
    assert.expect(2)
    var done = assert.async()
    var $element = $('<div class="fixed-top"></div>').appendTo('#qunit-fixture')
    var originalPadding = '0px'
    $element.css('padding-right', originalPadding)

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        assert.strictEqual($element.data('padding-right'), undefined, 'data-padding-right should be cleared after closing')
        $element.remove()
427
428
        done()
      })
429
430
431
432
      .on('shown.bs.modal', function () {
        assert.strictEqual($element.data('padding-right'), originalPadding, 'original fixed element padding should be stored in data-padding-right')
        $(this).bootstrapModal('hide')
      })
433
434
435
      .bootstrapModal('show')
  })

436
437
438
439
440
441
442
443
444
445
446
447
448
449
  QUnit.test('should adjust the inline margin of the navbar-toggler when opening and restore when closing', function (assert) {
    assert.expect(2)
    var done = assert.async()
    var $element = $('<div class="navbar-toggler"></div>').appendTo('#qunit-fixture')
    var originalMargin = $element.css('margin-right')

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        var currentMargin = $element.css('margin-right')
        assert.strictEqual(currentMargin, originalMargin, 'navbar-toggler margin should be reset after closing')
        $element.remove()
        done()
      })
      .on('shown.bs.modal', function () {
450
        var expectedMargin = parseFloat(originalMargin) + $(this).getScrollbarWidth() + 'px'
451
        var currentMargin = $element.css('margin-right')
452
        assert.strictEqual(currentMargin, expectedMargin, 'navbar-toggler margin should be adjusted while opening')
453
454
455
456
457
458
459
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

  QUnit.test('should store the original margin of the navbar-toggler in data-margin-right before showing', function (assert) {
    assert.expect(2)
460
    var done = assert.async()
461
462
463
    var $element = $('<div class="navbar-toggler"></div>').appendTo('#qunit-fixture')
    var originalMargin = '0px'
    $element.css('margin-right', originalMargin)
464
465

    $('<div id="modal-test"/>')
466
467
468
469
470
      .on('hidden.bs.modal', function () {
        assert.strictEqual($element.data('margin-right'), undefined, 'data-margin-right should be cleared after closing')
        $element.remove()
        done()
      })
471
      .on('shown.bs.modal', function () {
472
        assert.strictEqual($element.data('margin-right'), originalMargin, 'original navbar-toggler margin should be stored in data-margin-right')
473
474
        $(this).bootstrapModal('hide')
      })
475
476
477
478
479
480
481
482
483
484
      .bootstrapModal('show')
  })

  QUnit.test('should ignore values set via CSS when trying to restore body padding after closing', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var $body = $(document.body)
    var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')

    $('<div id="modal-test"/>')
485
      .on('hidden.bs.modal', function () {
486
487
        assert.ok(!$body.attr('style'), 'body does not have inline padding set')
        $style.remove()
488
489
        done()
      })
490
491
492
      .on('shown.bs.modal', function () {
        $(this).bootstrapModal('hide')
      })
493
494
495
      .bootstrapModal('show')
  })

fat's avatar
fat committed
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
  QUnit.test('should ignore other inline styles when trying to restore body padding after closing', function (assert) {
    assert.expect(2)
    var done = assert.async()
    var $body = $(document.body)
    var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')

    $body.css('color', 'red')

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        assert.strictEqual($body[0].style.paddingRight, '', 'body does not have inline padding set')
        assert.strictEqual($body[0].style.color, 'red', 'body still has other inline styles set')
        $body.removeAttr('style')
        $style.remove()
        done()
      })
      .on('shown.bs.modal', function () {
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

  QUnit.test('should properly restore non-pixel inline body padding after closing', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var $body = $(document.body)

    $body.css('padding-right', '5%')

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        assert.strictEqual($body[0].style.paddingRight, '5%', 'body does not have inline padding set')
        $body.removeAttr('style')
        done()
      })
      .on('shown.bs.modal', function () {
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
Chris Rebert's avatar
Chris Rebert committed
535
  })
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557

  QUnit.test('should not follow link in area tag', function (assert) {
    assert.expect(2)
    var done = assert.async()

    $('<map><area id="test" shape="default" data-toggle="modal" data-target="#modal-test" href="demo.html"/></map>')
      .appendTo('#qunit-fixture')

    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
      .appendTo('#qunit-fixture')

    $('#test')
      .on('click.bs.modal.data-api', function (event) {
        assert.notOk(event.isDefaultPrevented(), 'navigating to href will happen')

        setTimeout(function () {
          assert.ok(event.isDefaultPrevented(), 'model shown instead of navigating to href')
          done()
        }, 1)
      })
      .trigger('click')
  })
558
})