vertx-howtos-jekyll-theme 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +52 -0
  4. data/_layouts/page.html +61 -0
  5. data/_sass/bootstrap/js/dist/alert.js +199 -0
  6. data/_sass/bootstrap/js/dist/alert.js.map +1 -0
  7. data/_sass/bootstrap/js/dist/button.js +187 -0
  8. data/_sass/bootstrap/js/dist/button.js.map +1 -0
  9. data/_sass/bootstrap/js/dist/carousel.js +666 -0
  10. data/_sass/bootstrap/js/dist/carousel.js.map +1 -0
  11. data/_sass/bootstrap/js/dist/collapse.js +428 -0
  12. data/_sass/bootstrap/js/dist/collapse.js.map +1 -0
  13. data/_sass/bootstrap/js/dist/dropdown.js +591 -0
  14. data/_sass/bootstrap/js/dist/dropdown.js.map +1 -0
  15. data/_sass/bootstrap/js/dist/index.js +23 -0
  16. data/_sass/bootstrap/js/dist/index.js.map +1 -0
  17. data/_sass/bootstrap/js/dist/modal.js +644 -0
  18. data/_sass/bootstrap/js/dist/modal.js.map +1 -0
  19. data/_sass/bootstrap/js/dist/popover.js +261 -0
  20. data/_sass/bootstrap/js/dist/popover.js.map +1 -0
  21. data/_sass/bootstrap/js/dist/scrollspy.js +375 -0
  22. data/_sass/bootstrap/js/dist/scrollspy.js.map +1 -0
  23. data/_sass/bootstrap/js/dist/tab.js +266 -0
  24. data/_sass/bootstrap/js/dist/tab.js.map +1 -0
  25. data/_sass/bootstrap/js/dist/toast.js +278 -0
  26. data/_sass/bootstrap/js/dist/toast.js.map +1 -0
  27. data/_sass/bootstrap/js/dist/tooltip.js +745 -0
  28. data/_sass/bootstrap/js/dist/tooltip.js.map +1 -0
  29. data/_sass/bootstrap/js/dist/util.js +168 -0
  30. data/_sass/bootstrap/js/dist/util.js.map +1 -0
  31. data/_sass/bootstrap/js/src/alert.js +179 -0
  32. data/_sass/bootstrap/js/src/button.js +171 -0
  33. data/_sass/bootstrap/js/src/carousel.js +604 -0
  34. data/_sass/bootstrap/js/src/collapse.js +402 -0
  35. data/_sass/bootstrap/js/src/dropdown.js +538 -0
  36. data/_sass/bootstrap/js/src/index.js +52 -0
  37. data/_sass/bootstrap/js/src/modal.js +587 -0
  38. data/_sass/bootstrap/js/src/popover.js +184 -0
  39. data/_sass/bootstrap/js/src/scrollspy.js +326 -0
  40. data/_sass/bootstrap/js/src/tab.js +257 -0
  41. data/_sass/bootstrap/js/src/toast.js +223 -0
  42. data/_sass/bootstrap/js/src/tooltip.js +735 -0
  43. data/_sass/bootstrap/js/src/util.js +173 -0
  44. data/_sass/bootstrap/js/tests/README.md +69 -0
  45. data/_sass/bootstrap/js/tests/browsers.js +82 -0
  46. data/_sass/bootstrap/js/tests/index.html +145 -0
  47. data/_sass/bootstrap/js/tests/integration/bundle.js +8 -0
  48. data/_sass/bootstrap/js/tests/integration/index.html +66 -0
  49. data/_sass/bootstrap/js/tests/integration/rollup.bundle.js +20 -0
  50. data/_sass/bootstrap/js/tests/karma.conf.js +145 -0
  51. data/_sass/bootstrap/js/tests/unit/.eslintrc.json +40 -0
  52. data/_sass/bootstrap/js/tests/unit/alert.js +123 -0
  53. data/_sass/bootstrap/js/tests/unit/button.js +222 -0
  54. data/_sass/bootstrap/js/tests/unit/carousel.js +1273 -0
  55. data/_sass/bootstrap/js/tests/unit/collapse.js +892 -0
  56. data/_sass/bootstrap/js/tests/unit/dropdown.js +1364 -0
  57. data/_sass/bootstrap/js/tests/unit/modal.js +796 -0
  58. data/_sass/bootstrap/js/tests/unit/popover.js +471 -0
  59. data/_sass/bootstrap/js/tests/unit/scrollspy.js +728 -0
  60. data/_sass/bootstrap/js/tests/unit/tab.js +462 -0
  61. data/_sass/bootstrap/js/tests/unit/toast.js +239 -0
  62. data/_sass/bootstrap/js/tests/unit/tooltip.js +1072 -0
  63. data/_sass/bootstrap/js/tests/unit/util.js +164 -0
  64. data/_sass/bootstrap/js/tests/visual/alert.html +58 -0
  65. data/_sass/bootstrap/js/tests/visual/button.html +51 -0
  66. data/_sass/bootstrap/js/tests/visual/carousel.html +66 -0
  67. data/_sass/bootstrap/js/tests/visual/collapse.html +78 -0
  68. data/_sass/bootstrap/js/tests/visual/dropdown.html +212 -0
  69. data/_sass/bootstrap/js/tests/visual/modal.html +268 -0
  70. data/_sass/bootstrap/js/tests/visual/popover.html +46 -0
  71. data/_sass/bootstrap/js/tests/visual/scrollspy.html +95 -0
  72. data/_sass/bootstrap/js/tests/visual/tab.html +234 -0
  73. data/_sass/bootstrap/js/tests/visual/toast.html +72 -0
  74. data/_sass/bootstrap/js/tests/visual/tooltip.html +106 -0
  75. data/_sass/bootstrap/scss/_alert.scss +51 -0
  76. data/_sass/bootstrap/scss/_badge.scss +53 -0
  77. data/_sass/bootstrap/scss/_breadcrumb.scss +41 -0
  78. data/_sass/bootstrap/scss/_button-group.scss +163 -0
  79. data/_sass/bootstrap/scss/_buttons.scss +140 -0
  80. data/_sass/bootstrap/scss/_card.scss +310 -0
  81. data/_sass/bootstrap/scss/_carousel.scss +198 -0
  82. data/_sass/bootstrap/scss/_close.scss +44 -0
  83. data/_sass/bootstrap/scss/_code.scss +48 -0
  84. data/_sass/bootstrap/scss/_custom-forms.scss +507 -0
  85. data/_sass/bootstrap/scss/_dropdown.scss +191 -0
  86. data/_sass/bootstrap/scss/_forms.scss +334 -0
  87. data/_sass/bootstrap/scss/_functions.scss +86 -0
  88. data/_sass/bootstrap/scss/_grid.scss +52 -0
  89. data/_sass/bootstrap/scss/_images.scss +42 -0
  90. data/_sass/bootstrap/scss/_input-group.scss +193 -0
  91. data/_sass/bootstrap/scss/_jumbotron.scss +16 -0
  92. data/_sass/bootstrap/scss/_list-group.scss +121 -0
  93. data/_sass/bootstrap/scss/_media.scss +8 -0
  94. data/_sass/bootstrap/scss/_mixins.scss +41 -0
  95. data/_sass/bootstrap/scss/_modal.scss +186 -0
  96. data/_sass/bootstrap/scss/_nav.scss +120 -0
  97. data/_sass/bootstrap/scss/_navbar.scss +299 -0
  98. data/_sass/bootstrap/scss/_pagination.scss +78 -0
  99. data/_sass/bootstrap/scss/_popover.scss +183 -0
  100. data/_sass/bootstrap/scss/_print.scss +141 -0
  101. data/_sass/bootstrap/scss/_progress.scss +34 -0
  102. data/_sass/bootstrap/scss/_reboot.scss +462 -0
  103. data/_sass/bootstrap/scss/_root.scss +19 -0
  104. data/_sass/bootstrap/scss/_spinners.scss +53 -0
  105. data/_sass/bootstrap/scss/_tables.scss +187 -0
  106. data/_sass/bootstrap/scss/_toasts.scss +43 -0
  107. data/_sass/bootstrap/scss/_tooltip.scss +115 -0
  108. data/_sass/bootstrap/scss/_transitions.scss +22 -0
  109. data/_sass/bootstrap/scss/_type.scss +125 -0
  110. data/_sass/bootstrap/scss/_utilities.scss +16 -0
  111. data/_sass/bootstrap/scss/_variables.scss +1091 -0
  112. data/_sass/bootstrap/scss/bootstrap-grid.scss +29 -0
  113. data/_sass/bootstrap/scss/bootstrap-reboot.scss +12 -0
  114. data/_sass/bootstrap/scss/bootstrap.scss +44 -0
  115. data/_sass/bootstrap/scss/mixins/_alert.scss +13 -0
  116. data/_sass/bootstrap/scss/mixins/_background-variant.scss +21 -0
  117. data/_sass/bootstrap/scss/mixins/_badge.scss +11 -0
  118. data/_sass/bootstrap/scss/mixins/_border-radius.scss +35 -0
  119. data/_sass/bootstrap/scss/mixins/_box-shadow.scss +5 -0
  120. data/_sass/bootstrap/scss/mixins/_breakpoints.scss +123 -0
  121. data/_sass/bootstrap/scss/mixins/_buttons.scss +111 -0
  122. data/_sass/bootstrap/scss/mixins/_caret.scss +62 -0
  123. data/_sass/bootstrap/scss/mixins/_clearfix.scss +7 -0
  124. data/_sass/bootstrap/scss/mixins/_float.scss +11 -0
  125. data/_sass/bootstrap/scss/mixins/_forms.scss +198 -0
  126. data/_sass/bootstrap/scss/mixins/_gradients.scss +45 -0
  127. data/_sass/bootstrap/scss/mixins/_grid-framework.scss +66 -0
  128. data/_sass/bootstrap/scss/mixins/_grid.scss +51 -0
  129. data/_sass/bootstrap/scss/mixins/_hover.scss +37 -0
  130. data/_sass/bootstrap/scss/mixins/_image.scss +36 -0
  131. data/_sass/bootstrap/scss/mixins/_list-group.scss +21 -0
  132. data/_sass/bootstrap/scss/mixins/_lists.scss +7 -0
  133. data/_sass/bootstrap/scss/mixins/_nav-divider.scss +10 -0
  134. data/_sass/bootstrap/scss/mixins/_pagination.scss +22 -0
  135. data/_sass/bootstrap/scss/mixins/_reset-text.scss +17 -0
  136. data/_sass/bootstrap/scss/mixins/_resize.scss +6 -0
  137. data/_sass/bootstrap/scss/mixins/_screen-reader.scss +33 -0
  138. data/_sass/bootstrap/scss/mixins/_size.scss +6 -0
  139. data/_sass/bootstrap/scss/mixins/_table-row.scss +39 -0
  140. data/_sass/bootstrap/scss/mixins/_text-emphasis.scss +14 -0
  141. data/_sass/bootstrap/scss/mixins/_text-hide.scss +13 -0
  142. data/_sass/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  143. data/_sass/bootstrap/scss/mixins/_transition.scss +16 -0
  144. data/_sass/bootstrap/scss/mixins/_visibility.scss +7 -0
  145. data/_sass/bootstrap/scss/utilities/_align.scss +8 -0
  146. data/_sass/bootstrap/scss/utilities/_background.scss +19 -0
  147. data/_sass/bootstrap/scss/utilities/_borders.scss +63 -0
  148. data/_sass/bootstrap/scss/utilities/_clearfix.scss +3 -0
  149. data/_sass/bootstrap/scss/utilities/_display.scss +38 -0
  150. data/_sass/bootstrap/scss/utilities/_embed.scss +39 -0
  151. data/_sass/bootstrap/scss/utilities/_flex.scss +51 -0
  152. data/_sass/bootstrap/scss/utilities/_float.scss +9 -0
  153. data/_sass/bootstrap/scss/utilities/_overflow.scss +5 -0
  154. data/_sass/bootstrap/scss/utilities/_position.scss +32 -0
  155. data/_sass/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  156. data/_sass/bootstrap/scss/utilities/_shadows.scss +6 -0
  157. data/_sass/bootstrap/scss/utilities/_sizing.scss +20 -0
  158. data/_sass/bootstrap/scss/utilities/_spacing.scss +73 -0
  159. data/_sass/bootstrap/scss/utilities/_text.scss +67 -0
  160. data/_sass/bootstrap/scss/utilities/_visibility.scss +11 -0
  161. data/_sass/custom.scss +1 -0
  162. data/assets/css/style.scss +65 -0
  163. data/assets/images/vertx-square.svg +1 -0
  164. metadata +248 -0
@@ -0,0 +1,796 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ window.Util = typeof bootstrap !== 'undefined' ? bootstrap.Util : Util
5
+
6
+ QUnit.module('modal plugin')
7
+
8
+ QUnit.test('should be defined on jquery object', function (assert) {
9
+ assert.expect(1)
10
+ assert.ok($(document.body).modal, 'modal method is defined')
11
+ })
12
+
13
+ QUnit.module('modal', {
14
+ before: function () {
15
+ // Enable the scrollbar measurer
16
+ $('<style type="text/css"> .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } </style>').appendTo('head')
17
+ // Function to calculate the scrollbar width which is then compared to the padding or margin changes
18
+ $.fn.getScrollbarWidth = $.fn.modal.Constructor.prototype._getScrollbarWidth
19
+
20
+ // Simulate scrollbars
21
+ $('html').css('padding-right', '16px')
22
+ },
23
+ beforeEach: function () {
24
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
25
+ $.fn.bootstrapModal = $.fn.modal.noConflict()
26
+ },
27
+ afterEach: function () {
28
+ $('.modal-backdrop, #modal-test').remove()
29
+ $(document.body).removeClass('modal-open')
30
+ $.fn.modal = $.fn.bootstrapModal
31
+ delete $.fn.bootstrapModal
32
+ $('#qunit-fixture').html('')
33
+ }
34
+ })
35
+
36
+ QUnit.test('should provide no conflict', function (assert) {
37
+ assert.expect(1)
38
+ assert.strictEqual(typeof $.fn.modal, 'undefined', 'modal was set back to undefined (orig value)')
39
+ })
40
+
41
+ QUnit.test('should throw explicit error on undefined method', function (assert) {
42
+ assert.expect(1)
43
+ var $el = $('<div id="modal-test"/>')
44
+ $el.bootstrapModal()
45
+ try {
46
+ $el.bootstrapModal('noMethod')
47
+ } catch (err) {
48
+ assert.strictEqual(err.message, 'No method named "noMethod"')
49
+ }
50
+ })
51
+
52
+ QUnit.test('should return jquery collection containing the element', function (assert) {
53
+ assert.expect(2)
54
+ var $el = $('<div id="modal-test"/>')
55
+ var $modal = $el.bootstrapModal()
56
+ assert.ok($modal instanceof $, 'returns jquery collection')
57
+ assert.strictEqual($modal[0], $el[0], 'collection contains element')
58
+ })
59
+
60
+ QUnit.test('should expose defaults var for settings', function (assert) {
61
+ assert.expect(1)
62
+ assert.ok($.fn.bootstrapModal.Constructor.Default, 'default object exposed')
63
+ })
64
+
65
+ QUnit.test('should insert into dom when show method is called', function (assert) {
66
+ assert.expect(1)
67
+ var done = assert.async()
68
+
69
+ $('<div id="modal-test"/>')
70
+ .on('shown.bs.modal', function () {
71
+ assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
72
+ done()
73
+ })
74
+ .bootstrapModal('show')
75
+ })
76
+
77
+ QUnit.test('should fire show event', function (assert) {
78
+ assert.expect(1)
79
+ var done = assert.async()
80
+
81
+ $('<div id="modal-test"/>')
82
+ .on('show.bs.modal', function () {
83
+ assert.ok(true, 'show event fired')
84
+ done()
85
+ })
86
+ .bootstrapModal('show')
87
+ })
88
+
89
+ QUnit.test('should not fire shown when show was prevented', function (assert) {
90
+ assert.expect(1)
91
+ var done = assert.async()
92
+
93
+ $('<div id="modal-test"/>')
94
+ .on('show.bs.modal', function (e) {
95
+ e.preventDefault()
96
+ assert.ok(true, 'show event fired')
97
+ done()
98
+ })
99
+ .on('shown.bs.modal', function () {
100
+ assert.ok(false, 'shown event fired')
101
+ })
102
+ .bootstrapModal('show')
103
+ })
104
+
105
+ QUnit.test('should hide modal when hide is called', function (assert) {
106
+ assert.expect(3)
107
+ var done = assert.async()
108
+
109
+ $('<div id="modal-test"/>')
110
+ .on('shown.bs.modal', function () {
111
+ assert.ok($('#modal-test').is(':visible'), 'modal visible')
112
+ assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
113
+ $(this).bootstrapModal('hide')
114
+ })
115
+ .on('hidden.bs.modal', function () {
116
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
117
+ done()
118
+ })
119
+ .bootstrapModal('show')
120
+ })
121
+
122
+ QUnit.test('should toggle when toggle is called', function (assert) {
123
+ assert.expect(3)
124
+ var done = assert.async()
125
+
126
+ $('<div id="modal-test"/>')
127
+ .on('shown.bs.modal', function () {
128
+ assert.ok($('#modal-test').is(':visible'), 'modal visible')
129
+ assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
130
+ $(this).bootstrapModal('toggle')
131
+ })
132
+ .on('hidden.bs.modal', function () {
133
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
134
+ done()
135
+ })
136
+ .bootstrapModal('toggle')
137
+ })
138
+
139
+ QUnit.test('should remove from dom when click [data-dismiss="modal"]', function (assert) {
140
+ assert.expect(3)
141
+ var done = assert.async()
142
+
143
+ $('<div id="modal-test"><span class="close" data-dismiss="modal"/></div>')
144
+ .on('shown.bs.modal', function () {
145
+ assert.ok($('#modal-test').is(':visible'), 'modal visible')
146
+ assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
147
+ $(this).find('.close').trigger('click')
148
+ })
149
+ .on('hidden.bs.modal', function () {
150
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
151
+ done()
152
+ })
153
+ .bootstrapModal('toggle')
154
+ })
155
+
156
+ QUnit.test('should allow modal close with "backdrop:false"', function (assert) {
157
+ assert.expect(2)
158
+ var done = assert.async()
159
+
160
+ $('<div id="modal-test" data-backdrop="false"/>')
161
+ .on('shown.bs.modal', function () {
162
+ assert.ok($('#modal-test').is(':visible'), 'modal visible')
163
+ $(this).bootstrapModal('hide')
164
+ })
165
+ .on('hidden.bs.modal', function () {
166
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
167
+ done()
168
+ })
169
+ .bootstrapModal('show')
170
+ })
171
+
172
+ QUnit.test('should close modal when clicking outside of modal-content', function (assert) {
173
+ assert.expect(3)
174
+ var done = assert.async()
175
+
176
+ $('<div id="modal-test"><div class="contents"/></div>')
177
+ .on('shown.bs.modal', function () {
178
+ assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
179
+ $('.contents').trigger('click')
180
+ assert.ok($('#modal-test').is(':visible'), 'modal visible')
181
+ $('#modal-test').trigger('click')
182
+ })
183
+ .on('hidden.bs.modal', function () {
184
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
185
+ done()
186
+ })
187
+ .bootstrapModal('show')
188
+ })
189
+
190
+ QUnit.test('should not close modal when clicking outside of modal-content if data-backdrop="true"', function (assert) {
191
+ assert.expect(1)
192
+ var done = assert.async()
193
+
194
+ $('<div id="modal-test" data-backdrop="false"><div class="contents"/></div>')
195
+ .on('shown.bs.modal', function () {
196
+ $('#modal-test').trigger('click')
197
+ assert.ok($('#modal-test').is(':visible'), 'modal not hidden')
198
+ done()
199
+ })
200
+ .bootstrapModal('show')
201
+ })
202
+
203
+ QUnit.test('should close modal when escape key is pressed via keydown', function (assert) {
204
+ assert.expect(3)
205
+ var done = assert.async()
206
+
207
+ var $div = $('<div id="modal-test"/>')
208
+ $div
209
+ .on('shown.bs.modal', function () {
210
+ assert.ok($('#modal-test').length, 'modal inserted into dom')
211
+ assert.ok($('#modal-test').is(':visible'), 'modal visible')
212
+ $div.trigger($.Event('keydown', {
213
+ which: 27
214
+ }))
215
+
216
+ setTimeout(function () {
217
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
218
+ $div.remove()
219
+ done()
220
+ }, 0)
221
+ })
222
+ .bootstrapModal('show')
223
+ })
224
+
225
+ QUnit.test('should not close modal when escape key is pressed via keyup', function (assert) {
226
+ assert.expect(3)
227
+ var done = assert.async()
228
+
229
+ var $div = $('<div id="modal-test"/>')
230
+ $div
231
+ .on('shown.bs.modal', function () {
232
+ assert.ok($('#modal-test').length, 'modal inserted into dom')
233
+ assert.ok($('#modal-test').is(':visible'), 'modal visible')
234
+ $div.trigger($.Event('keyup', {
235
+ which: 27
236
+ }))
237
+
238
+ setTimeout(function () {
239
+ assert.ok($div.is(':visible'), 'modal still visible')
240
+ $div.remove()
241
+ done()
242
+ }, 0)
243
+ })
244
+ .bootstrapModal('show')
245
+ })
246
+
247
+ QUnit.test('should trigger hide event once when clicking outside of modal-content', function (assert) {
248
+ assert.expect(1)
249
+ var done = assert.async()
250
+
251
+ var triggered
252
+
253
+ $('<div id="modal-test"><div class="contents"/></div>')
254
+ .on('shown.bs.modal', function () {
255
+ triggered = 0
256
+ $('#modal-test').trigger('click')
257
+ })
258
+ .on('hide.bs.modal', function () {
259
+ triggered += 1
260
+ assert.strictEqual(triggered, 1, 'modal hide triggered once')
261
+ done()
262
+ })
263
+ .bootstrapModal('show')
264
+ })
265
+
266
+ QUnit.test('should remove aria-hidden attribute when shown, add it back when hidden', function (assert) {
267
+ assert.expect(3)
268
+ var done = assert.async()
269
+
270
+ $('<div id="modal-test" aria-hidden="true"/>')
271
+ .on('shown.bs.modal', function () {
272
+ assert.notOk($('#modal-test').is('[aria-hidden]'), 'aria-hidden attribute removed')
273
+ $(this).bootstrapModal('hide')
274
+ })
275
+ .on('hidden.bs.modal', function () {
276
+ assert.ok($('#modal-test').is('[aria-hidden]'), 'aria-hidden attribute added')
277
+ assert.strictEqual($('#modal-test').attr('aria-hidden'), 'true', 'correct aria-hidden="true" added')
278
+ done()
279
+ })
280
+ .bootstrapModal('show')
281
+ })
282
+
283
+ QUnit.test('should add aria-modal attribute when shown, remove it again when hidden', function (assert) {
284
+ assert.expect(3)
285
+ var done = assert.async()
286
+
287
+ $('<div id="modal-test"/>')
288
+ .on('shown.bs.modal', function () {
289
+ assert.ok($('#modal-test').is('[aria-modal]'), 'aria-modal attribute added')
290
+ assert.strictEqual($('#modal-test').attr('aria-modal'), 'true', 'correct aria-modal="true" added')
291
+ $(this).bootstrapModal('hide')
292
+ })
293
+ .on('hidden.bs.modal', function () {
294
+ assert.notOk($('#modal-test').is('[aria-modal]'), 'aria-modal attribute removed')
295
+ done()
296
+ })
297
+ .bootstrapModal('show')
298
+ })
299
+
300
+ QUnit.test('should close reopened modal with [data-dismiss="modal"] click', function (assert) {
301
+ assert.expect(2)
302
+ var done = assert.async()
303
+
304
+ $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
305
+ .one('shown.bs.modal', function () {
306
+ $('#close').trigger('click')
307
+ })
308
+ .one('hidden.bs.modal', function () {
309
+ // After one open-close cycle
310
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
311
+ $(this)
312
+ .one('shown.bs.modal', function () {
313
+ $('#close').trigger('click')
314
+ })
315
+ .one('hidden.bs.modal', function () {
316
+ assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
317
+ done()
318
+ })
319
+ .bootstrapModal('show')
320
+ })
321
+ .bootstrapModal('show')
322
+ })
323
+
324
+ QUnit.test('should restore focus to toggling element when modal is hidden after having been opened via data-api', function (assert) {
325
+ assert.expect(1)
326
+ var done = assert.async()
327
+
328
+ var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
329
+
330
+ $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
331
+ .on('hidden.bs.modal', function () {
332
+ setTimeout(function () {
333
+ assert.ok($(document.activeElement).is($toggleBtn), 'toggling element is once again focused')
334
+ done()
335
+ }, 0)
336
+ })
337
+ .on('shown.bs.modal', function () {
338
+ $('#close').trigger('click')
339
+ })
340
+ .appendTo('#qunit-fixture')
341
+
342
+ $toggleBtn.trigger('click')
343
+ })
344
+
345
+ QUnit.test('should not restore focus to toggling element if the associated show event gets prevented', function (assert) {
346
+ assert.expect(1)
347
+ var done = assert.async()
348
+ var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
349
+ var $otherBtn = $('<button id="other-btn"/>').appendTo('#qunit-fixture')
350
+
351
+ $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div>')
352
+ .one('show.bs.modal', function (e) {
353
+ e.preventDefault()
354
+ $otherBtn.trigger('focus')
355
+ setTimeout($.proxy(function () {
356
+ $(this).bootstrapModal('show')
357
+ }, this), 0)
358
+ })
359
+ .on('hidden.bs.modal', function () {
360
+ setTimeout(function () {
361
+ assert.ok($(document.activeElement).is($otherBtn), 'focus returned to toggling element')
362
+ done()
363
+ }, 0)
364
+ })
365
+ .on('shown.bs.modal', function () {
366
+ $('#close').trigger('click')
367
+ })
368
+ .appendTo('#qunit-fixture')
369
+
370
+ $toggleBtn.trigger('click')
371
+ })
372
+
373
+ QUnit.test('should adjust the inline padding of the modal when opening', function (assert) {
374
+ assert.expect(1)
375
+ var done = assert.async()
376
+
377
+ $('<div id="modal-test"/>')
378
+ .on('shown.bs.modal', function () {
379
+ var expectedPadding = $(this).getScrollbarWidth() + 'px'
380
+ var currentPadding = $(this).css('padding-right')
381
+ assert.strictEqual(currentPadding, expectedPadding, 'modal padding should be adjusted while opening')
382
+ done()
383
+ })
384
+ .bootstrapModal('show')
385
+ })
386
+
387
+ QUnit.test('should adjust the inline body padding when opening and restore when closing', function (assert) {
388
+ assert.expect(2)
389
+ var done = assert.async()
390
+ var $body = $(document.body)
391
+ var originalPadding = $body.css('padding-right')
392
+
393
+ $('<div id="modal-test"/>')
394
+ .on('hidden.bs.modal', function () {
395
+ var currentPadding = $body.css('padding-right')
396
+ assert.strictEqual(currentPadding, originalPadding, 'body padding should be reset after closing')
397
+ $body.removeAttr('style')
398
+ done()
399
+ })
400
+ .on('shown.bs.modal', function () {
401
+ var expectedPadding = parseFloat(originalPadding) + $(this).getScrollbarWidth() + 'px'
402
+ var currentPadding = $body.css('padding-right')
403
+ assert.strictEqual(currentPadding, expectedPadding, 'body padding should be adjusted while opening')
404
+ $(this).bootstrapModal('hide')
405
+ })
406
+ .bootstrapModal('show')
407
+ })
408
+
409
+ QUnit.test('should store the original body padding in data-padding-right before showing', function (assert) {
410
+ assert.expect(2)
411
+ var done = assert.async()
412
+ var $body = $(document.body)
413
+ var originalPadding = '0px'
414
+ $body.css('padding-right', originalPadding)
415
+
416
+ $('<div id="modal-test"/>')
417
+ .on('hidden.bs.modal', function () {
418
+ assert.strictEqual(typeof $body.data('padding-right'), 'undefined', 'data-padding-right should be cleared after closing')
419
+ $body.removeAttr('style')
420
+ done()
421
+ })
422
+ .on('shown.bs.modal', function () {
423
+ assert.strictEqual($body.data('padding-right'), originalPadding, 'original body padding should be stored in data-padding-right')
424
+ $(this).bootstrapModal('hide')
425
+ })
426
+ .bootstrapModal('show')
427
+ })
428
+
429
+ QUnit.test('should not adjust the inline body padding when it does not overflow', function (assert) {
430
+ assert.expect(1)
431
+ var done = assert.async()
432
+ var $body = $(document.body)
433
+ var originalPadding = $body.css('padding-right')
434
+
435
+ // Hide scrollbars to prevent the body overflowing
436
+ $body.css('overflow', 'hidden') // Real scrollbar (for in-browser testing)
437
+ $('html').css('padding-right', '0px') // Simulated scrollbar (for PhantomJS)
438
+
439
+ $('<div id="modal-test"/>')
440
+ .on('shown.bs.modal', function () {
441
+ var currentPadding = $body.css('padding-right')
442
+ assert.strictEqual(currentPadding, originalPadding, 'body padding should not be adjusted')
443
+ $(this).bootstrapModal('hide')
444
+
445
+ // Restore scrollbars
446
+ $body.css('overflow', 'auto')
447
+ $('html').css('padding-right', '16px')
448
+ done()
449
+ })
450
+ .bootstrapModal('show')
451
+ })
452
+
453
+ QUnit.test('should adjust the inline padding of fixed elements when opening and restore when closing', function (assert) {
454
+ assert.expect(2)
455
+ var done = assert.async()
456
+ var $element = $('<div class="fixed-top"></div>').appendTo('#qunit-fixture')
457
+ var originalPadding = $element.css('padding-right')
458
+
459
+ $('<div id="modal-test"/>')
460
+ .on('hidden.bs.modal', function () {
461
+ var currentPadding = $element.css('padding-right')
462
+ assert.strictEqual(currentPadding, originalPadding, 'fixed element padding should be reset after closing')
463
+ $element.remove()
464
+ done()
465
+ })
466
+ .on('shown.bs.modal', function () {
467
+ var expectedPadding = parseFloat(originalPadding) + $(this).getScrollbarWidth() + 'px'
468
+ var currentPadding = $element.css('padding-right')
469
+ assert.strictEqual(currentPadding, expectedPadding, 'fixed element padding should be adjusted while opening')
470
+ $(this).bootstrapModal('hide')
471
+ })
472
+ .bootstrapModal('show')
473
+ })
474
+
475
+ QUnit.test('should store the original padding of fixed elements in data-padding-right before showing', function (assert) {
476
+ assert.expect(2)
477
+ var done = assert.async()
478
+ var $element = $('<div class="fixed-top"></div>').appendTo('#qunit-fixture')
479
+ var originalPadding = '0px'
480
+ $element.css('padding-right', originalPadding)
481
+
482
+ $('<div id="modal-test"/>')
483
+ .on('hidden.bs.modal', function () {
484
+ assert.strictEqual(typeof $element.data('padding-right'), 'undefined', 'data-padding-right should be cleared after closing')
485
+ $element.remove()
486
+ done()
487
+ })
488
+ .on('shown.bs.modal', function () {
489
+ assert.strictEqual($element.data('padding-right'), originalPadding, 'original fixed element padding should be stored in data-padding-right')
490
+ $(this).bootstrapModal('hide')
491
+ })
492
+ .bootstrapModal('show')
493
+ })
494
+
495
+ QUnit.test('should adjust the inline margin of sticky elements when opening and restore when closing', function (assert) {
496
+ assert.expect(2)
497
+ var done = assert.async()
498
+ var $element = $('<div class="sticky-top"></div>').appendTo('#qunit-fixture')
499
+ var originalPadding = $element.css('margin-right')
500
+
501
+ $('<div id="modal-test"/>')
502
+ .on('hidden.bs.modal', function () {
503
+ var currentPadding = $element.css('margin-right')
504
+ assert.strictEqual(currentPadding, originalPadding, 'sticky element margin should be reset after closing')
505
+ $element.remove()
506
+ done()
507
+ })
508
+ .on('shown.bs.modal', function () {
509
+ var expectedPadding = parseFloat(originalPadding) - $(this).getScrollbarWidth() + 'px'
510
+ var currentPadding = $element.css('margin-right')
511
+ assert.strictEqual(currentPadding, expectedPadding, 'sticky element margin should be adjusted while opening')
512
+ $(this).bootstrapModal('hide')
513
+ })
514
+ .bootstrapModal('show')
515
+ })
516
+
517
+ QUnit.test('should store the original margin of sticky elements in data-margin-right before showing', function (assert) {
518
+ assert.expect(2)
519
+ var done = assert.async()
520
+ var $element = $('<div class="sticky-top"></div>').appendTo('#qunit-fixture')
521
+ var originalPadding = '0px'
522
+ $element.css('margin-right', originalPadding)
523
+
524
+ $('<div id="modal-test"/>')
525
+ .on('hidden.bs.modal', function () {
526
+ assert.strictEqual(typeof $element.data('margin-right'), 'undefined', 'data-margin-right should be cleared after closing')
527
+ $element.remove()
528
+ done()
529
+ })
530
+ .on('shown.bs.modal', function () {
531
+ assert.strictEqual($element.data('margin-right'), originalPadding, 'original sticky element margin should be stored in data-margin-right')
532
+ $(this).bootstrapModal('hide')
533
+ })
534
+ .bootstrapModal('show')
535
+ })
536
+
537
+ QUnit.test('should ignore values set via CSS when trying to restore body padding after closing', function (assert) {
538
+ assert.expect(1)
539
+ var done = assert.async()
540
+ var $body = $(document.body)
541
+ var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')
542
+
543
+ $('<div id="modal-test"/>')
544
+ .on('hidden.bs.modal', function () {
545
+ assert.strictEqual($body.attr('style').indexOf('padding-right'), -1, 'body does not have inline padding set')
546
+ $style.remove()
547
+ done()
548
+ })
549
+ .on('shown.bs.modal', function () {
550
+ $(this).bootstrapModal('hide')
551
+ })
552
+ .bootstrapModal('show')
553
+ })
554
+
555
+ QUnit.test('should ignore other inline styles when trying to restore body padding after closing', function (assert) {
556
+ assert.expect(2)
557
+ var done = assert.async()
558
+ var $body = $(document.body)
559
+ var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')
560
+
561
+ $body.css('color', 'red')
562
+
563
+ $('<div id="modal-test"/>')
564
+ .on('hidden.bs.modal', function () {
565
+ assert.strictEqual($body[0].style.paddingRight, '', 'body does not have inline padding set')
566
+ assert.strictEqual($body[0].style.color, 'red', 'body still has other inline styles set')
567
+ $body.removeAttr('style')
568
+ $style.remove()
569
+ done()
570
+ })
571
+ .on('shown.bs.modal', function () {
572
+ $(this).bootstrapModal('hide')
573
+ })
574
+ .bootstrapModal('show')
575
+ })
576
+
577
+ QUnit.test('should properly restore non-pixel inline body padding after closing', function (assert) {
578
+ assert.expect(1)
579
+ var done = assert.async()
580
+ var $body = $(document.body)
581
+
582
+ $body.css('padding-right', '5%')
583
+
584
+ $('<div id="modal-test"/>')
585
+ .on('hidden.bs.modal', function () {
586
+ assert.strictEqual($body[0].style.paddingRight, '5%', 'body does not have inline padding set')
587
+ $body.removeAttr('style')
588
+ done()
589
+ })
590
+ .on('shown.bs.modal', function () {
591
+ $(this).bootstrapModal('hide')
592
+ })
593
+ .bootstrapModal('show')
594
+ })
595
+
596
+ QUnit.test('should not follow link in area tag', function (assert) {
597
+ assert.expect(2)
598
+ var done = assert.async()
599
+
600
+ $('<map><area id="test" shape="default" data-toggle="modal" data-target="#modal-test" href="demo.html"/></map>')
601
+ .appendTo('#qunit-fixture')
602
+
603
+ $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
604
+ .appendTo('#qunit-fixture')
605
+
606
+ $('#test')
607
+ .on('click.bs.modal.data-api', function (event) {
608
+ assert.notOk(event.isDefaultPrevented(), 'navigating to href will happen')
609
+
610
+ setTimeout(function () {
611
+ assert.ok(event.isDefaultPrevented(), 'model shown instead of navigating to href')
612
+ done()
613
+ }, 1)
614
+ })
615
+ .trigger('click')
616
+ })
617
+
618
+ QUnit.test('should not parse target as html', function (assert) {
619
+ assert.expect(1)
620
+ var done = assert.async()
621
+
622
+ try {
623
+ var $toggleBtn = $('<button data-toggle="modal" data-target="&lt;div id=&quot;modal-test&quot;&gt;&lt;div class=&quot;contents&quot;&lt;div&lt;div id=&quot;close&quot; data-dismiss=&quot;modal&quot;/&gt;&lt;/div&gt;&lt;/div&gt;"/>')
624
+ .appendTo('#qunit-fixture')
625
+
626
+ $toggleBtn.trigger('click')
627
+ } catch (e) {
628
+ assert.strictEqual($('#modal-test').length, 0, 'target has not been parsed and added to the document')
629
+ done()
630
+ }
631
+ })
632
+
633
+ QUnit.test('should not execute js from target', function (assert) {
634
+ assert.expect(0)
635
+ var done = assert.async()
636
+
637
+ try {
638
+ // This toggle button contains XSS payload in its data-target
639
+ // Note: it uses the onerror handler of an img element to execute the js, because a simple script element does not work here
640
+ // a script element works in manual tests though, so here it is likely blocked by the qunit framework
641
+ var $toggleBtn = $('<button data-toggle="modal" data-target="&lt;div&gt;&lt;image src=&quot;missing.png&quot; onerror=&quot;$(&apos;#qunit-fixture button.control&apos;).trigger(&apos;click&apos;)&quot;&gt;&lt;/div&gt;"/>')
642
+ .appendTo('#qunit-fixture')
643
+ // The XSS payload above does not have a closure over this function and cannot access the assert object directly
644
+ // However, it can send a click event to the following control button, which will then fail the assert
645
+ $('<button>')
646
+ .addClass('control')
647
+ .on('click', function () {
648
+ assert.notOk(true, 'XSS payload is not executed as js')
649
+ })
650
+ .appendTo('#qunit-fixture')
651
+
652
+ $toggleBtn.trigger('click')
653
+ } catch (e) {
654
+ done()
655
+ }
656
+ })
657
+
658
+ QUnit.test('should not try to open a modal which is already visible', function (assert) {
659
+ assert.expect(1)
660
+ var done = assert.async()
661
+ var count = 0
662
+
663
+ $('<div id="modal-test"/>').on('shown.bs.modal', function () {
664
+ count++
665
+ }).on('hidden.bs.modal', function () {
666
+ assert.strictEqual(count, 1, 'show() runs only once')
667
+ done()
668
+ })
669
+ .bootstrapModal('show')
670
+ .bootstrapModal('show')
671
+ .bootstrapModal('hide')
672
+ })
673
+
674
+ QUnit.test('transition duration should be the modal-dialog duration before triggering shown event', function (assert) {
675
+ assert.expect(2)
676
+ var done = assert.async()
677
+ var style = [
678
+ '<style>',
679
+ ' .modal.fade .modal-dialog {',
680
+ ' transition: -webkit-transform .3s ease-out;',
681
+ ' transition: transform .3s ease-out;',
682
+ ' transition: transform .3s ease-out,-webkit-transform .3s ease-out;',
683
+ ' -webkit-transform: translate(0,-50px);',
684
+ ' transform: translate(0,-50px);',
685
+ ' }',
686
+ '</style>'
687
+ ].join('')
688
+
689
+ var $style = $(style).appendTo('head')
690
+ var modalHTML = [
691
+ '<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">',
692
+ ' <div class="modal-dialog" role="document">',
693
+ ' <div class="modal-content">',
694
+ ' <div class="modal-body">...</div>',
695
+ ' </div>',
696
+ ' </div>',
697
+ '</div>'
698
+ ].join('')
699
+
700
+ var beginTimestamp = 0
701
+ var $modal = $(modalHTML).appendTo('#qunit-fixture')
702
+ var $modalDialog = $('.modal-dialog')
703
+ var transitionDuration = Util.getTransitionDurationFromElement($modalDialog[0])
704
+
705
+ assert.strictEqual(transitionDuration, 300)
706
+
707
+ $modal.on('shown.bs.modal', function () {
708
+ var diff = Date.now() - beginTimestamp
709
+ assert.ok(diff < 400)
710
+ $style.remove()
711
+ done()
712
+ })
713
+ .bootstrapModal('show')
714
+
715
+ beginTimestamp = Date.now()
716
+ })
717
+
718
+ QUnit.test('should dispose modal', function (assert) {
719
+ assert.expect(3)
720
+ var done = assert.async()
721
+
722
+ var $modal = $([
723
+ '<div id="modal-test">',
724
+ ' <div class="modal-dialog">',
725
+ ' <div class="modal-content">',
726
+ ' <div class="modal-body" />',
727
+ ' </div>',
728
+ ' </div>',
729
+ '</div>'
730
+ ].join('')).appendTo('#qunit-fixture')
731
+
732
+ $modal.on('shown.bs.modal', function () {
733
+ var spy = sinon.spy($.fn, 'off')
734
+
735
+ $(this).bootstrapModal('dispose')
736
+
737
+ var modalDataApiEvent = []
738
+ $._data(document, 'events').click
739
+ .forEach(function (e) {
740
+ if (e.namespace === 'bs.data-api.modal') {
741
+ modalDataApiEvent.push(e)
742
+ }
743
+ })
744
+
745
+ assert.ok(typeof $(this).data('bs.modal') === 'undefined', 'modal data object was disposed')
746
+
747
+ assert.ok(spy.callCount === 4, '`jQuery.off` was called')
748
+
749
+ assert.ok(modalDataApiEvent.length === 1, '`Event.CLICK_DATA_API` on `document` was not removed')
750
+
751
+ $.fn.off.restore()
752
+ done()
753
+ }).bootstrapModal('show')
754
+ })
755
+
756
+ QUnit.test('should enforce focus', function (assert) {
757
+ assert.expect(4)
758
+ var done = assert.async()
759
+
760
+ var $modal = $([
761
+ '<div id="modal-test" data-show="false">',
762
+ ' <div class="modal-dialog">',
763
+ ' <div class="modal-content">',
764
+ ' <div class="modal-body" />',
765
+ ' </div>',
766
+ ' </div>',
767
+ '</div>'
768
+ ].join(''))
769
+ .bootstrapModal()
770
+ .appendTo('#qunit-fixture')
771
+
772
+ var modal = $modal.data('bs.modal')
773
+ var spy = sinon.spy(modal, '_enforceFocus')
774
+ var spyDocOff = sinon.spy($(document), 'off')
775
+ var spyDocOn = sinon.spy($(document), 'on')
776
+
777
+ $modal.one('shown.bs.modal', function () {
778
+ assert.ok(spy.called, '_enforceFocus called')
779
+ assert.ok(spyDocOff.withArgs('focusin.bs.modal'))
780
+ assert.ok(spyDocOn.withArgs('focusin.bs.modal'))
781
+
782
+ var spyFocus = sinon.spy(modal._element, 'focus')
783
+ var event = $.Event('focusin', {
784
+ target: $('#qunit-fixture')[0]
785
+ })
786
+
787
+ $(document).one('focusin', function () {
788
+ assert.ok(spyFocus.called)
789
+ done()
790
+ })
791
+
792
+ $(document).trigger(event)
793
+ })
794
+ .bootstrapModal('show')
795
+ })
796
+ })