unpoly-rails 0.32.0 → 0.33.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of unpoly-rails might be problematic. Click here for more details.

Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +106 -76
  3. data/README.md +8 -5
  4. data/README_RAILS.md +1 -1
  5. data/design/test_rejected_promise.txt +5 -0
  6. data/dist/unpoly-bootstrap3.js +1 -1
  7. data/dist/unpoly-bootstrap3.min.js +1 -1
  8. data/dist/unpoly.js +814 -417
  9. data/dist/unpoly.min.js +3 -3
  10. data/lib/assets/javascripts/unpoly/{browser.js.coffee → browser.coffee} +15 -6
  11. data/lib/assets/javascripts/unpoly/{bus.js.coffee → bus.coffee} +13 -13
  12. data/lib/assets/javascripts/unpoly/dom/extract_cascade.coffee +73 -0
  13. data/lib/assets/javascripts/unpoly/dom/extract_plan.coffee +65 -0
  14. data/lib/assets/javascripts/unpoly/{flow.js.coffee → dom.coffee} +109 -114
  15. data/lib/assets/javascripts/unpoly/{navigation.js.coffee → feedback.coffee} +11 -11
  16. data/lib/assets/javascripts/unpoly/{form.js.coffee → form.coffee} +35 -24
  17. data/lib/assets/javascripts/unpoly/{history.js.coffee → history.coffee} +9 -10
  18. data/lib/assets/javascripts/unpoly/{layout.js.coffee → layout.coffee} +53 -21
  19. data/lib/assets/javascripts/unpoly/{link.js.coffee → link.coffee} +46 -40
  20. data/lib/assets/javascripts/unpoly/{log.js.coffee → log.coffee} +2 -2
  21. data/lib/assets/javascripts/unpoly/{modal.js.coffee → modal.coffee} +17 -14
  22. data/lib/assets/javascripts/unpoly/{motion.js.coffee → motion.coffee} +28 -31
  23. data/lib/assets/javascripts/unpoly/namespace.coffee.erb +10 -0
  24. data/lib/assets/javascripts/unpoly/{popup.js.coffee → popup.coffee} +22 -10
  25. data/lib/assets/javascripts/unpoly/{proxy.js.coffee → proxy.coffee} +34 -12
  26. data/lib/assets/javascripts/unpoly/{rails.js.coffee → rails.coffee} +0 -0
  27. data/lib/assets/javascripts/unpoly/{syntax.js.coffee → syntax.coffee} +32 -21
  28. data/lib/assets/javascripts/unpoly/{toast.js.coffee → toast.coffee} +0 -0
  29. data/lib/assets/javascripts/unpoly/{tooltip.js.coffee → tooltip.coffee} +2 -2
  30. data/lib/assets/javascripts/unpoly/{util.js.coffee → util.coffee} +122 -35
  31. data/lib/assets/javascripts/unpoly-bootstrap3/{form-ext.js.coffee → form-ext.coffee} +0 -0
  32. data/lib/assets/javascripts/unpoly-bootstrap3/{layout-ext.js.coffee → layout-ext.coffee} +0 -0
  33. data/lib/assets/javascripts/unpoly-bootstrap3/{modal-ext.js.coffee → modal-ext.coffee} +0 -0
  34. data/lib/assets/javascripts/unpoly-bootstrap3/{navigation-ext.js.coffee → navigation-ext.coffee} +1 -1
  35. data/lib/assets/javascripts/{unpoly-bootstrap3.js.coffee → unpoly-bootstrap3.coffee} +0 -0
  36. data/lib/assets/javascripts/unpoly.coffee +22 -0
  37. data/lib/assets/stylesheets/unpoly/{close.css.sass → close.sass} +0 -0
  38. data/lib/assets/stylesheets/unpoly/{flow.css.sass → flow.sass} +0 -0
  39. data/lib/assets/stylesheets/unpoly/{link.css.sass → link.sass} +0 -0
  40. data/lib/assets/stylesheets/unpoly/{modal.css.sass → modal.sass} +0 -0
  41. data/lib/assets/stylesheets/unpoly/{popup.css.sass → popup.sass} +0 -0
  42. data/lib/assets/stylesheets/unpoly/{toast.css.sass → toast.sass} +0 -0
  43. data/lib/assets/stylesheets/unpoly/{tooltip.css.sass → tooltip.sass} +0 -0
  44. data/lib/assets/stylesheets/unpoly-bootstrap3/{modal-ext.css.sass → modal-ext.sass} +0 -0
  45. data/lib/assets/stylesheets/{unpoly-bootstrap3.css.sass → unpoly-bootstrap3.sass} +0 -0
  46. data/lib/assets/stylesheets/{unpoly.css.sass → unpoly.sass} +0 -0
  47. data/lib/unpoly/rails/version.rb +1 -1
  48. data/package.json +1 -1
  49. data/spec_app/Gemfile.lock +11 -13
  50. data/spec_app/app/assets/javascripts/jasmine_specs.coffee +1 -1
  51. data/spec_app/app/assets/stylesheets/_helpers.sass +1 -1
  52. data/spec_app/config/initializers/assets.rb +1 -5
  53. data/spec_app/spec/javascripts/up/{flow_spec.js.coffee → dom_spec.js.coffee} +294 -44
  54. data/spec_app/spec/javascripts/up/{navigation_spec.js.coffee → feedback_spec.js.coffee} +2 -2
  55. data/spec_app/spec/javascripts/up/form_spec.js.coffee +1 -0
  56. data/spec_app/spec/javascripts/up/layout_spec.js.coffee +10 -0
  57. data/spec_app/spec/javascripts/up/link_spec.js.coffee +28 -0
  58. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +46 -9
  59. data/spec_app/spec/javascripts/up/motion_spec.js.coffee +32 -2
  60. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +5 -4
  61. data/spec_app/spec/javascripts/up/util_spec.js.coffee +75 -0
  62. data/spec_app/vendor/{assets/bower_components/jasmine-ajax → asset-libs/jasmine-ajax-3.3.1}/.bower.json +0 -0
  63. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.gitignore +6 -0
  64. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.npmignore +10 -0
  65. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.pairs +6 -0
  66. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.travis.yml +56 -0
  67. data/spec_app/vendor/{assets/bower_components/jasmine-ajax/lib/mock-ajax.js → asset-libs/jasmine-ajax-3.3.1/jasmine-ajax.js} +83 -26
  68. data/spec_app/vendor/{assets/bower_components/jasmine-fixture/dist → asset-libs/jasmine-fixture-1.3.4}/jasmine-fixture.js +13 -13
  69. data/spec_app/vendor/{assets/bower_components/jasmine-jquery → asset-libs/jasmine-jquery-2.1.1}/.bower.json +0 -0
  70. data/spec_app/vendor/{assets/bower_components/jasmine-jquery/lib → asset-libs/jasmine-jquery-2.1.1}/jasmine-jquery.js +0 -0
  71. data/spec_app/vendor/assets/{javascripts/.keep → .keep} +0 -0
  72. metadata +52 -203
  73. data/lib/assets/javascripts/unpoly/module.js.coffee.erb +0 -8
  74. data/lib/assets/javascripts/unpoly.js.coffee +0 -21
  75. data/spec_app/Bowerfile +0 -3
  76. data/spec_app/vendor/assets/.bowerrc +0 -3
  77. data/spec_app/vendor/assets/bower.json +0 -8
  78. data/spec_app/vendor/assets/bower_components/jasmine/.bower.json +0 -50
  79. data/spec_app/vendor/assets/bower_components/jasmine/CONTRIBUTING.md +0 -130
  80. data/spec_app/vendor/assets/bower_components/jasmine/GOALS_2.0.md +0 -64
  81. data/spec_app/vendor/assets/bower_components/jasmine/MANIFEST.in +0 -5
  82. data/spec_app/vendor/assets/bower_components/jasmine/MIT.LICENSE +0 -20
  83. data/spec_app/vendor/assets/bower_components/jasmine/README.md +0 -73
  84. data/spec_app/vendor/assets/bower_components/jasmine/RELEASE.md +0 -73
  85. data/spec_app/vendor/assets/bower_components/jasmine/bower.json +0 -41
  86. data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.png +0 -0
  87. data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.svg +0 -102
  88. data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine_favicon.png +0 -0
  89. data/spec_app/vendor/assets/bower_components/jasmine/lib/console/console.js +0 -190
  90. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/boot.js +0 -143
  91. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Player.js +0 -24
  92. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Song.js +0 -9
  93. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine-html.js +0 -446
  94. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.css +0 -58
  95. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.js +0 -3298
  96. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/json2.js +0 -489
  97. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/node_boot.js +0 -41
  98. data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core.js +0 -37
  99. data/spec_app/vendor/assets/bower_components/jasmine/package.json +0 -34
  100. data/spec_app/vendor/assets/bower_components/jasmine/requirements.txt +0 -1
  101. data/spec_app/vendor/assets/bower_components/jasmine-ajax/MIT.LICENSE +0 -20
  102. data/spec_app/vendor/assets/bower_components/jasmine-ajax/README.markdown +0 -289
  103. data/spec_app/vendor/assets/bower_components/jasmine-ajax/bower.json +0 -35
  104. data/spec_app/vendor/assets/bower_components/jasmine-ajax/package.json +0 -26
  105. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.0.2.md +0 -50
  106. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.99.md +0 -14
  107. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.0.md +0 -28
  108. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.0.md +0 -24
  109. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.1.md +0 -23
  110. data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.2.0.md +0 -20
  111. data/spec_app/vendor/assets/bower_components/jasmine-fixture/.bower.json +0 -27
  112. data/spec_app/vendor/assets/bower_components/jasmine-fixture/.gitignore +0 -8
  113. data/spec_app/vendor/assets/bower_components/jasmine-fixture/.npmignore +0 -8
  114. data/spec_app/vendor/assets/bower_components/jasmine-fixture/LICENSE.txt +0 -24
  115. data/spec_app/vendor/assets/bower_components/jasmine-fixture/README.md +0 -118
  116. data/spec_app/vendor/assets/bower_components/jasmine-fixture/bower.json +0 -17
  117. data/spec_app/vendor/assets/bower_components/jasmine-fixture/dist/jasmine-fixture.min.js +0 -5
  118. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/basic-usage-spec.coffee +0 -14
  119. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/invariants.coffee +0 -17
  120. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/spec-within-a-spec.coffee +0 -24
  121. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/tmp-files.coffee +0 -8
  122. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine1-testem-config.json +0 -11
  123. data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine2-testem-config.json +0 -11
  124. data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.11.0.js +0 -10337
  125. data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.8.3.js +0 -9472
  126. data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-2.1.0.js +0 -9111
  127. data/spec_app/vendor/assets/bower_components/jasmine-jquery/CONTRIBUTING.md +0 -28
  128. data/spec_app/vendor/assets/bower_components/jasmine-jquery/Gruntfile.js +0 -49
  129. data/spec_app/vendor/assets/bower_components/jasmine-jquery/LICENSE +0 -20
  130. data/spec_app/vendor/assets/bower_components/jasmine-jquery/README.md +0 -367
  131. data/spec_app/vendor/assets/bower_components/jasmine-jquery/bower.json +0 -15
  132. data/spec_app/vendor/assets/bower_components/jasmine-jquery/package.json +0 -35
  133. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_checkbox_with_checked.html +0 -6
  134. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript.html +0 -1
  135. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript_block.html +0 -1
  136. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_click.js +0 -1
  137. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_hover.js +0 -1
  138. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/json/jasmine_json_test.json +0 -1
  139. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture.html +0 -1
  140. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture_style.css +0 -1
  141. data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/suites/jasmine-jquery-spec.js +0 -1842
  142. data/spec_app/vendor/assets/bower_components/jquery/.bower.json +0 -38
  143. data/spec_app/vendor/assets/bower_components/jquery/MIT-LICENSE.txt +0 -21
  144. data/spec_app/vendor/assets/bower_components/jquery/bower.json +0 -28
  145. data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.js +0 -9210
  146. data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.js +0 -5
  147. data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.map +0 -1
  148. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/jsonp.js +0 -89
  149. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/load.js +0 -75
  150. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseJSON.js +0 -13
  151. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseXML.js +0 -28
  152. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/script.js +0 -64
  153. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/nonce.js +0 -5
  154. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/rquery.js +0 -3
  155. data/spec_app/vendor/assets/bower_components/jquery/src/ajax/xhr.js +0 -136
  156. data/spec_app/vendor/assets/bower_components/jquery/src/ajax.js +0 -786
  157. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -141
  158. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/classes.js +0 -158
  159. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/prop.js +0 -94
  160. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/support.js +0 -35
  161. data/spec_app/vendor/assets/bower_components/jquery/src/attributes/val.js +0 -161
  162. data/spec_app/vendor/assets/bower_components/jquery/src/attributes.js +0 -11
  163. data/spec_app/vendor/assets/bower_components/jquery/src/callbacks.js +0 -205
  164. data/spec_app/vendor/assets/bower_components/jquery/src/core/access.js +0 -60
  165. data/spec_app/vendor/assets/bower_components/jquery/src/core/init.js +0 -123
  166. data/spec_app/vendor/assets/bower_components/jquery/src/core/parseHTML.js +0 -39
  167. data/spec_app/vendor/assets/bower_components/jquery/src/core/ready.js +0 -97
  168. data/spec_app/vendor/assets/bower_components/jquery/src/core/var/rsingleTag.js +0 -4
  169. data/spec_app/vendor/assets/bower_components/jquery/src/core.js +0 -502
  170. data/spec_app/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +0 -22
  171. data/spec_app/vendor/assets/bower_components/jquery/src/css/curCSS.js +0 -57
  172. data/spec_app/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +0 -70
  173. data/spec_app/vendor/assets/bower_components/jquery/src/css/hiddenVisibleSelectors.js +0 -15
  174. data/spec_app/vendor/assets/bower_components/jquery/src/css/support.js +0 -96
  175. data/spec_app/vendor/assets/bower_components/jquery/src/css/swap.js +0 -28
  176. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/cssExpand.js +0 -3
  177. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +0 -12
  178. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/isHidden.js +0 -13
  179. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rmargin.js +0 -3
  180. data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rnumnonpx.js +0 -5
  181. data/spec_app/vendor/assets/bower_components/jquery/src/css.js +0 -450
  182. data/spec_app/vendor/assets/bower_components/jquery/src/data/Data.js +0 -181
  183. data/spec_app/vendor/assets/bower_components/jquery/src/data/accepts.js +0 -20
  184. data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_priv.js +0 -5
  185. data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_user.js +0 -5
  186. data/spec_app/vendor/assets/bower_components/jquery/src/data.js +0 -178
  187. data/spec_app/vendor/assets/bower_components/jquery/src/deferred.js +0 -149
  188. data/spec_app/vendor/assets/bower_components/jquery/src/deprecated.js +0 -13
  189. data/spec_app/vendor/assets/bower_components/jquery/src/dimensions.js +0 -50
  190. data/spec_app/vendor/assets/bower_components/jquery/src/effects/Tween.js +0 -114
  191. data/spec_app/vendor/assets/bower_components/jquery/src/effects/animatedSelector.js +0 -13
  192. data/spec_app/vendor/assets/bower_components/jquery/src/effects.js +0 -648
  193. data/spec_app/vendor/assets/bower_components/jquery/src/event/ajax.js +0 -13
  194. data/spec_app/vendor/assets/bower_components/jquery/src/event/alias.js +0 -39
  195. data/spec_app/vendor/assets/bower_components/jquery/src/event/support.js +0 -9
  196. data/spec_app/vendor/assets/bower_components/jquery/src/event.js +0 -868
  197. data/spec_app/vendor/assets/bower_components/jquery/src/exports/amd.js +0 -24
  198. data/spec_app/vendor/assets/bower_components/jquery/src/exports/global.js +0 -32
  199. data/spec_app/vendor/assets/bower_components/jquery/src/intro.js +0 -44
  200. data/spec_app/vendor/assets/bower_components/jquery/src/jquery.js +0 -37
  201. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/_evalUrl.js +0 -18
  202. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/support.js +0 -32
  203. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/var/rcheckableType.js +0 -3
  204. data/spec_app/vendor/assets/bower_components/jquery/src/manipulation.js +0 -580
  205. data/spec_app/vendor/assets/bower_components/jquery/src/offset.js +0 -207
  206. data/spec_app/vendor/assets/bower_components/jquery/src/outro.js +0 -1
  207. data/spec_app/vendor/assets/bower_components/jquery/src/queue/delay.js +0 -22
  208. data/spec_app/vendor/assets/bower_components/jquery/src/queue.js +0 -142
  209. data/spec_app/vendor/assets/bower_components/jquery/src/selector-native.js +0 -172
  210. data/spec_app/vendor/assets/bower_components/jquery/src/selector-sizzle.js +0 -14
  211. data/spec_app/vendor/assets/bower_components/jquery/src/selector.js +0 -1
  212. data/spec_app/vendor/assets/bower_components/jquery/src/serialize.js +0 -111
  213. data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +0 -2067
  214. data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +0 -3
  215. data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +0 -1
  216. data/spec_app/vendor/assets/bower_components/jquery/src/traversing/findFilter.js +0 -100
  217. data/spec_app/vendor/assets/bower_components/jquery/src/traversing/var/rneedsContext.js +0 -6
  218. data/spec_app/vendor/assets/bower_components/jquery/src/traversing.js +0 -199
  219. data/spec_app/vendor/assets/bower_components/jquery/src/var/arr.js +0 -3
  220. data/spec_app/vendor/assets/bower_components/jquery/src/var/class2type.js +0 -4
  221. data/spec_app/vendor/assets/bower_components/jquery/src/var/concat.js +0 -5
  222. data/spec_app/vendor/assets/bower_components/jquery/src/var/hasOwn.js +0 -5
  223. data/spec_app/vendor/assets/bower_components/jquery/src/var/indexOf.js +0 -5
  224. data/spec_app/vendor/assets/bower_components/jquery/src/var/pnum.js +0 -3
  225. data/spec_app/vendor/assets/bower_components/jquery/src/var/push.js +0 -5
  226. data/spec_app/vendor/assets/bower_components/jquery/src/var/rnotwhite.js +0 -3
  227. data/spec_app/vendor/assets/bower_components/jquery/src/var/slice.js +0 -5
  228. data/spec_app/vendor/assets/bower_components/jquery/src/var/strundefined.js +0 -3
  229. data/spec_app/vendor/assets/bower_components/jquery/src/var/support.js +0 -4
  230. data/spec_app/vendor/assets/bower_components/jquery/src/var/toString.js +0 -5
  231. data/spec_app/vendor/assets/bower_components/jquery/src/wrap.js +0 -79
  232. data/spec_app/vendor/assets/stylesheets/.keep +0 -0
@@ -1,4 +1,4 @@
1
- describe 'up.flow', ->
1
+ describe 'up.dom', ->
2
2
 
3
3
  u = up.util
4
4
 
@@ -47,18 +47,33 @@ describe 'up.flow', ->
47
47
  expect(resolution).toHaveBeenCalled()
48
48
  expect($('.middle')).toHaveText('new-middle')
49
49
 
50
- it 'returns a promise that will be resolved once the server response was received and the swap animations have completed', (done) ->
51
- resolution = jasmine.createSpy()
52
- promise = up.replace('.middle', '/path', transition: 'cross-fade', duration: 50)
53
- promise.then(resolution)
54
- expect(resolution).not.toHaveBeenCalled()
55
- expect($('.middle')).toHaveText('old-middle')
56
- @respond()
57
- expect(resolution).not.toHaveBeenCalled()
58
- u.setTimer 20, ->
50
+ describe 'transitions', ->
51
+
52
+ it 'returns a promise that will be resolved once the server response was received and the swap transition has completed', (done) ->
53
+ resolution = jasmine.createSpy()
54
+ promise = up.replace('.middle', '/path', transition: 'cross-fade', duration: 50)
55
+ promise.then(resolution)
59
56
  expect(resolution).not.toHaveBeenCalled()
60
- u.setTimer 80, ->
61
- expect(resolution).toHaveBeenCalled()
57
+ expect($('.middle')).toHaveText('old-middle')
58
+ @respond()
59
+ expect(resolution).not.toHaveBeenCalled()
60
+ u.setTimer 20, ->
61
+ expect(resolution).not.toHaveBeenCalled()
62
+ u.setTimer 80, ->
63
+ expect(resolution).toHaveBeenCalled()
64
+ done()
65
+
66
+ it 'ignores a { transition } option when replacing the body element', (done) ->
67
+ up.dom.knife.mock('swapBody') # can't have the example replace the Jasmine test runner UI
68
+ up.dom.knife.mock('destroy') # if we don't swap the body, up.dom will destroy it
69
+ replaceCallback = jasmine.createSpy()
70
+ promise = up.replace('body', '/path', transition: 'cross-fade', duration: 50)
71
+ promise.then(replaceCallback)
72
+ expect(replaceCallback).not.toHaveBeenCalled()
73
+ @responseText = '<body>new text</body>'
74
+ @respond()
75
+ u.nextFrame ->
76
+ expect(replaceCallback).toHaveBeenCalled()
62
77
  done()
63
78
 
64
79
  describe 'when the server signals a redirect with X-Up-Location header (bugfix, logic should be moved to up.proxy)', ->
@@ -110,13 +125,14 @@ describe 'up.flow', ->
110
125
  up.replace('.middle', '/path', method: 'put')
111
126
  expect(@lastRequest()).toHaveRequestMethod('PUT')
112
127
 
113
- describe 'if the server responds with a non-200 status code', ->
128
+ describe 'when the server responds with a non-200 status code', ->
114
129
 
115
130
  it 'replaces the <body> instead of the given selector', ->
116
- implantSpy = up.flow.knife.mock('extract') # can't have the example replace the Jasmine test runner UI
131
+ # can't have the example replace the Jasmine test runner UI
132
+ extractSpy = up.dom.knife.mock('extract').and.returnValue(u.resolvedPromise())
117
133
  up.replace('.middle', '/path')
118
134
  @respond(status: 500)
119
- expect(implantSpy).toHaveBeenCalledWith('body', jasmine.any(String), jasmine.any(Object))
135
+ expect(extractSpy).toHaveBeenCalledWith('body', jasmine.any(String), jasmine.any(Object))
120
136
 
121
137
  it 'uses a target selector given as { failTarget } option', ->
122
138
  up.replace('.middle', '/path', failTarget: '.after')
@@ -124,6 +140,34 @@ describe 'up.flow', ->
124
140
  expect($('.middle')).toHaveText('old-middle')
125
141
  expect($('.after')).toHaveText('new-after')
126
142
 
143
+ it 'rejects the returned promise', ->
144
+ affix('.after')
145
+ promise = up.replace('.middle', '/path', failTarget: '.after')
146
+ expect(promise.state()).toEqual('pending')
147
+ @respond(status: 500)
148
+ expect(promise.state()).toEqual('rejected')
149
+
150
+ describe 'when the request times out', ->
151
+
152
+ it "doesn't crash and rejects the returned promise", (done) ->
153
+ jasmine.clock().install() # required by responseTimeout()
154
+ affix('.target')
155
+ promise = up.replace('.middle', '/path', timeout: 10 * 1000)
156
+ expect(promise.state()).toEqual('pending')
157
+ jasmine.clock().tick(11 * 1000)
158
+ expect(promise.state()).toEqual('rejected')
159
+ done()
160
+
161
+ describe 'when there is a network issue', ->
162
+
163
+ it "doesn't crash and rejects the returned promise", (done) ->
164
+ affix('.target')
165
+ promise = up.replace('.middle', '/path')
166
+ @lastRequest().responseError()
167
+ u.nextFrame ->
168
+ expect(promise.state()).toEqual('rejected')
169
+ done()
170
+
127
171
  describe 'history', ->
128
172
 
129
173
  it 'should set the browser location to the given URL', (done) ->
@@ -194,47 +238,29 @@ describe 'up.flow', ->
194
238
  up.replace('.middle', '/path', method: 'post')
195
239
  @respond()
196
240
  expect($('.middle')).toHaveText('new-middle')
197
- expect(up.flow.source('.middle')).toEndWith('/previous-source')
241
+ expect(up.dom.source('.middle')).toEndWith('/previous-source')
198
242
 
199
243
  describe 'if a URL is given as { source } option', ->
200
244
 
201
245
  it 'uses that URL as the source for a GET request', ->
202
246
  promise = up.replace('.middle', '/path', source: '/given-path')
203
247
  @respond()
204
- expect(up.flow.source('.middle')).toEndWith('/given-path')
248
+ expect(up.dom.source('.middle')).toEndWith('/given-path')
205
249
 
206
250
  it 'uses that URL as the source after a non-GET request', ->
207
251
  promise = up.replace('.middle', '/path', method: 'post', source: '/given-path')
208
252
  @respond()
209
- expect(up.flow.source('.middle')).toEndWith('/given-path')
253
+ expect(up.dom.source('.middle')).toEndWith('/given-path')
210
254
 
211
255
  it 'ignores the option and reuses the previous source after a failed non-GET request', ->
212
256
  @oldMiddle.attr('up-source', '/previous-source')
213
257
  promise = up.replace('.middle', '/path', method: 'post', source: '/given-path', failTarget: '.middle')
214
258
  @respond(status: 500)
215
- expect(up.flow.source('.middle')).toEndWith('/previous-source')
216
-
217
- it 'understands non-standard CSS selector extensions such as :has(...)', (done) ->
218
- $first = affix('.boxx#first')
219
- $firstChild = $('<span class="first-child">old first</span>').appendTo($first)
220
- $second = affix('.boxx#second')
221
- $secondChild = $('<span class="second-child">old second</span>').appendTo($second)
222
-
223
- promise = up.replace('.boxx:has(.first-child)', '/path')
224
- @respondWith """
225
- <div class="boxx" id="first">
226
- <span class="first-child">new first</span>
227
- </div>
228
- """
229
-
230
- promise.then ->
231
- expect($('#first span')).toHaveText('new first')
232
- expect($('#second span')).toHaveText('old second')
233
- done()
259
+ expect(up.dom.source('.middle')).toEndWith('/previous-source')
234
260
 
235
261
  describe 'document title', ->
236
262
 
237
- it "sets the document title to a 'title' tag in the response", ->
263
+ it "sets the document title to the response <title>", ->
238
264
  affix('.container').text('old container text')
239
265
  up.replace('.container', '/path')
240
266
  @respondWith """
@@ -266,6 +292,45 @@ describe 'up.flow', ->
266
292
  expect($('.container')).toHaveText('new container text')
267
293
  expect(document.title).toBe('Title from header')
268
294
 
295
+ it "prefers the X-Up-Title header to the response <title>", ->
296
+ affix('.container').text('old container text')
297
+ up.replace('.container', '/path')
298
+ @respondWith
299
+ responseHeaders:
300
+ 'X-Up-Title': 'Title from header'
301
+ responseText: """
302
+ <html>
303
+ <head>
304
+ <title>Title from HTML</title>
305
+ </head>
306
+ <body>
307
+ <div class='container'>
308
+ new container text
309
+ </div>
310
+ </body>
311
+ </html>
312
+ """
313
+ expect($('.container')).toHaveText('new container text')
314
+ expect(document.title).toBe('Title from header')
315
+
316
+ it "sets the document title to the response <title> with { history: false, title: true } options (bugfix)", ->
317
+ affix('.container').text('old container text')
318
+ up.replace('.container', '/path', history: false, title: true)
319
+ @respondWith """
320
+ <html>
321
+ <head>
322
+ <title>Title from HTML</title>
323
+ </head>
324
+ <body>
325
+ <div class='container'>
326
+ new container text
327
+ </div>
328
+ </body>
329
+ </html>
330
+ """
331
+ expect($('.container')).toHaveText('new container text')
332
+ expect(document.title).toBe('Title from HTML')
333
+
269
334
  it "does not extract the title from the response or HTTP header if history isn't updated", ->
270
335
  affix('.container').text('old container text')
271
336
  document.title = 'old document title'
@@ -345,6 +410,191 @@ describe 'up.flow', ->
345
410
  expect($('.after')).toHaveText('old-afternew-after')
346
411
  done()
347
412
 
413
+ it 'understands non-standard CSS selector extensions such as :has(...)', (done) ->
414
+ $first = affix('.boxx#first')
415
+ $firstChild = $('<span class="first-child">old first</span>').appendTo($first)
416
+ $second = affix('.boxx#second')
417
+ $secondChild = $('<span class="second-child">old second</span>').appendTo($second)
418
+
419
+ promise = up.replace('.boxx:has(.first-child)', '/path')
420
+ @respondWith """
421
+ <div class="boxx" id="first">
422
+ <span class="first-child">new first</span>
423
+ </div>
424
+ """
425
+
426
+ promise.then ->
427
+ expect($('#first span')).toHaveText('new first')
428
+ expect($('#second span')).toHaveText('old second')
429
+ done()
430
+
431
+ describe 'when selectors are missing on the page before the request was made', ->
432
+
433
+ beforeEach ->
434
+ up.dom.config.fallbacks = []
435
+
436
+ it 'tries selectors from options.fallback before making a request', ->
437
+ affix('.box').text('old box')
438
+ up.replace('.unknown', '/path', fallback: '.box')
439
+ @respondWith '<div class="box">new box</div>'
440
+ expect('.box').toHaveText('new box')
441
+
442
+ it 'throws an error if all alternatives are exhausted', ->
443
+ replacement = -> up.replace('.unknown', '/path', fallback: '.more-unknown')
444
+ expect(replacement).toThrowError(/Could not find target in current page/i)
445
+
446
+ it 'considers a union selector to be missing if one of its selector-atoms are missing', ->
447
+ affix('.target').text('old target')
448
+ affix('.fallback').text('old fallback')
449
+ up.replace('.target, .unknown', '/path', fallback: '.fallback')
450
+ @respondWith """
451
+ <div class="target">new target</div>
452
+ <div class="fallback">new fallback</div>
453
+ """
454
+ expect('.target').toHaveText('old target')
455
+ expect('.fallback').toHaveText('new fallback')
456
+
457
+ it 'tries a selector from up.dom.config.fallbacks if options.fallback is missing', ->
458
+ up.dom.config.fallbacks = ['.existing']
459
+ affix('.existing').text('old existing')
460
+ up.replace('.unknown', '/path')
461
+ @respondWith '<div class="existing">new existing</div>'
462
+ expect('.existing').toHaveText('new existing')
463
+
464
+ it 'does not try a selector from up.dom.config.fallbacks if options.fallback is false', ->
465
+ up.dom.config.fallbacks = ['.existing']
466
+ affix('.existing').text('old existing')
467
+ replacement = -> up.replace('.unknown', '/path', fallback: false)
468
+ expect(replacement).toThrowError(/Could not find target in current page/i)
469
+
470
+ describe 'when selectors are missing on the page after the request was made', ->
471
+
472
+ beforeEach ->
473
+ up.dom.config.fallbacks = []
474
+
475
+ it 'tries selectors from options.fallback before swapping elements', ->
476
+ $target = affix('.target').text('old target')
477
+ $fallback = affix('.fallback').text('old fallback')
478
+ up.replace('.target', '/path', fallback: '.fallback')
479
+ $target.remove()
480
+ @respondWith """
481
+ <div class="target">new target</div>
482
+ <div class="fallback">new fallback</div>
483
+ """
484
+ expect('.fallback').toHaveText('new fallback')
485
+
486
+ it 'throws an error if all alternatives are exhausted', ->
487
+ $target = affix('.target').text('old target')
488
+ $fallback = affix('.fallback').text('old fallback')
489
+ up.replace('.target', '/path', fallback: '.fallback')
490
+ $target.remove()
491
+ $fallback.remove()
492
+ respond = =>
493
+ @respondWith """
494
+ <div class="target">new target</div>
495
+ <div class="fallback">new fallback</div>
496
+ """
497
+ expect(respond).toThrowError(/Could not find target in current page/i)
498
+
499
+ it 'considers a union selector to be missing if one of its selector-atoms are missing', ->
500
+ $target = affix('.target').text('old target')
501
+ $target2 = affix('.target2').text('old target2')
502
+ $fallback = affix('.fallback').text('old fallback')
503
+ up.replace('.target, .target2', '/path', fallback: '.fallback')
504
+ $target2.remove()
505
+ @respondWith """
506
+ <div class="target">new target</div>
507
+ <div class="target2">new target2</div>
508
+ <div class="fallback">new fallback</div>
509
+ """
510
+ expect('.target').toHaveText('old target')
511
+ expect('.fallback').toHaveText('new fallback')
512
+
513
+ it 'tries a selector from up.dom.config.fallbacks if options.fallback is missing', ->
514
+ up.dom.config.fallbacks = ['.fallback']
515
+ $target = affix('.target').text('old target')
516
+ $fallback = affix('.fallback').text('old fallback')
517
+ up.replace('.target', '/path')
518
+ $target.remove()
519
+ @respondWith """
520
+ <div class="target">new target</div>
521
+ <div class="fallback">new fallback</div>
522
+ """
523
+ expect('.fallback').toHaveText('new fallback')
524
+
525
+ it 'does not try a selector from up.dom.config.fallbacks if options.fallback is false', ->
526
+ up.dom.config.fallbacks = ['.fallback']
527
+ $target = affix('.target').text('old target')
528
+ $fallback = affix('.fallback').text('old fallback')
529
+ up.replace('.target', '/path', fallback: false)
530
+ $target.remove()
531
+ respond = =>
532
+ @respondWith """
533
+ <div class="target">new target</div>
534
+ <div class="fallback">new fallback</div>
535
+ """
536
+ expect(respond).toThrowError(/Could not find target in current page/i)
537
+
538
+ describe 'when selectors are missing in the response', ->
539
+
540
+ beforeEach ->
541
+ up.dom.config.fallbacks = []
542
+
543
+ it 'tries selectors from options.fallback before swapping elements', ->
544
+ $target = affix('.target').text('old target')
545
+ $fallback = affix('.fallback').text('old fallback')
546
+ up.replace('.target', '/path', fallback: '.fallback')
547
+ @respondWith """
548
+ <div class="fallback">new fallback</div>
549
+ """
550
+ expect('.target').toHaveText('old target')
551
+ expect('.fallback').toHaveText('new fallback')
552
+
553
+ it 'throws an error if all alternatives are exhausted', ->
554
+ $target = affix('.target').text('old target')
555
+ $fallback = affix('.fallback').text('old fallback')
556
+ up.replace('.target', '/path', fallback: '.fallback')
557
+ respond = =>
558
+ @respondWith """
559
+ <div class="unexpected">new unexpected</div>
560
+ """
561
+ expect(respond).toThrowError(/Could not find target in response/i)
562
+
563
+ it 'considers a union selector to be missing if one of its selector-atoms are missing', ->
564
+ $target = affix('.target').text('old target')
565
+ $target2 = affix('.target2').text('old target2')
566
+ $fallback = affix('.fallback').text('old fallback')
567
+ up.replace('.target, .target2', '/path', fallback: '.fallback')
568
+ @respondWith """
569
+ <div class="target">new target</div>
570
+ <div class="fallback">new fallback</div>
571
+ """
572
+ expect('.target').toHaveText('old target')
573
+ expect('.target2').toHaveText('old target2')
574
+ expect('.fallback').toHaveText('new fallback')
575
+
576
+ it 'tries a selector from up.dom.config.fallbacks if options.fallback is missing', ->
577
+ up.dom.config.fallbacks = ['.fallback']
578
+ $target = affix('.target').text('old target')
579
+ $fallback = affix('.fallback').text('old fallback')
580
+ up.replace('.target', '/path')
581
+ @respondWith """
582
+ <div class="fallback">new fallback</div>
583
+ """
584
+ expect('.target').toHaveText('old target')
585
+ expect('.fallback').toHaveText('new fallback')
586
+
587
+ it 'does not try a selector from up.dom.config.fallbacks if options.fallback is false', ->
588
+ up.dom.config.fallbacks = ['.fallback']
589
+ $target = affix('.target').text('old target')
590
+ $fallback = affix('.fallback').text('old fallback')
591
+ up.replace('.target', '/path', fallback: false)
592
+ respond = =>
593
+ @respondWith """
594
+ <div class="fallback">new fallback</div>
595
+ """
596
+ expect(respond).toThrowError(/Could not find target in response/i)
597
+
348
598
  describe 'execution of script tags', ->
349
599
 
350
600
  beforeEach ->
@@ -377,8 +627,8 @@ describe 'up.flow', ->
377
627
  expect(window.scriptTagExecuted).toHaveBeenCalledWith('middle')
378
628
  done()
379
629
 
380
- it 'does not execute script-tags if up.flow.config.runInlineScripts is set to false', (done) ->
381
- up.flow.config.runInlineScripts = false
630
+ it 'does not execute script-tags if up.dom.config.runInlineScripts is set to false', (done) ->
631
+ up.dom.config.runInlineScripts = false
382
632
 
383
633
  @responseText = """
384
634
  <div class="middle">
@@ -429,8 +679,8 @@ describe 'up.flow', ->
429
679
  expect(window.scriptTagExecuted).not.toHaveBeenCalled()
430
680
  done()
431
681
 
432
- it 'does execute linked scripts if up.flow.config.runLinkedScripts is set to true', (done) ->
433
- up.flow.config.runLinkedScripts = true
682
+ it 'does execute linked scripts if up.dom.config.runLinkedScripts is set to true', (done) ->
683
+ up.dom.config.runLinkedScripts = true
434
684
 
435
685
  @responseText = """
436
686
  <div class="middle">
@@ -609,12 +859,12 @@ describe 'up.flow', ->
609
859
  it "throws an error if the selector can't be found on the current page", ->
610
860
  html = '<div class="foo-bar">text</div>'
611
861
  extract = -> up.extract('.foo-bar', html)
612
- expect(extract).toThrowError(/Could not find selector ".foo-bar"/i)
862
+ expect(extract).toThrowError(/Could not find selector in current page, modal or popup/i)
613
863
 
614
864
  it "throws an error if the selector can't be found in the given HTML string", ->
615
865
  affix('.foo-bar')
616
866
  extract = -> up.extract('.foo-bar', '')
617
- expect(extract).toThrowError(/Could not find selector ".foo-bar" in response/i)
867
+ expect(extract).toThrowError(/Could not find selector in response/i)
618
868
 
619
869
  it "ignores an element that matches the selector but also matches .up-destroying", ->
620
870
  html = '<div class="foo-bar">text</div>'
@@ -1,4 +1,4 @@
1
- describe 'up.navigation', ->
1
+ describe 'up.feedback', ->
2
2
 
3
3
  u = up.util
4
4
 
@@ -57,7 +57,7 @@ describe 'up.navigation', ->
57
57
  expect($otherLink).not.toHaveClass('up-current')
58
58
 
59
59
  it 'allows to configure a custom "current" class, but always also sets .up-current', ->
60
- up.navigation.config.currentClasses = ['highlight']
60
+ up.feedback.config.currentClasses = ['highlight']
61
61
  spyOn(up.browser, 'url').and.returnValue('/foo')
62
62
  $currentLink = up.hello(affix('a[href="/foo"]'))
63
63
  expect($currentLink).toHaveClass('highlight up-current')
@@ -422,6 +422,7 @@ describe 'up.form', ->
422
422
  it 'runs the JavaScript code in the attribute value when a change is observed in the field', (done) ->
423
423
  $form = affix('form')
424
424
  window.observeCallbackSpy = jasmine.createSpy('observe callback')
425
+ console.debug("*** Setting attribute: %o", 'window.observeCallbackSpy(value, $field.get(0))')
425
426
  $field = $form.affix('input[val="old-value"][up-observe="window.observeCallbackSpy(value, $field.get(0))"]')
426
427
  up.hello($form)
427
428
  $field.val('new-value')
@@ -54,6 +54,16 @@ describe 'up.layout', ->
54
54
  # ---------------------
55
55
  expect($(document).scrollTop()).toBe(@clientHeight + 50)
56
56
 
57
+ it "includes the element's top margin in the revealed area", ->
58
+ @$elements[1].css('margin-top': '20px')
59
+ up.reveal(@$elements[1])
60
+ expect($(document).scrollTop()).toBe(50 + 20)
61
+
62
+ it "includes the element's bottom margin in the revealed area", ->
63
+ @$elements[1].css('margin-bottom': '20px')
64
+ up.reveal(@$elements[2])
65
+ expect($(document).scrollTop()).toBe(@clientHeight + 50 + 20)
66
+
57
67
  it 'snaps to the top if the space above the future-visible area is smaller than the value of config.snap', ->
58
68
 
59
69
  up.layout.config.snap = 30
@@ -440,6 +440,34 @@ describe 'up.link', ->
440
440
  expect(u.opacity($newGhost)).toBeAround(0.5, 0.15)
441
441
  done()
442
442
 
443
+ describe 'wih a CSS selector in the [up-fallback] attribute', ->
444
+
445
+ it 'uses the fallback selector if the [up-target] CSS does not exist on the page', ->
446
+ affix('.fallback').text('old fallback')
447
+ $link = affix('a[href="/path"][up-target=".target"][up-fallback=".fallback"]')
448
+ Trigger.clickSequence($link)
449
+ u.nextFrame ->
450
+ @respondWith """
451
+ <div class="target">new target</div>
452
+ <div class="fallback">new fallback</div>
453
+ """
454
+ u.nextFrame ->
455
+ expect('.target').toHaveText('new fallback')
456
+
457
+ it 'ignores the fallback selector if the [up-target] CSS exists on the page', ->
458
+ affix('.target').text('old target')
459
+ affix('.fallback').text('old fallback')
460
+ $link = affix('a[href="/path"][up-target=".target"][up-fallback=".fallback"]')
461
+ Trigger.clickSequence($link)
462
+ u.nextFrame ->
463
+ @respondWith """
464
+ <div class="target">new target</div>
465
+ <div class="fallback">new fallback</div>
466
+ """
467
+ u.nextFrame ->
468
+ expect('.target').toHaveText('new target')
469
+ expect('.fallback').toHaveText('old fallback')
470
+
443
471
  it 'does not add a history entry when an up-history attribute is set to "false"', ->
444
472
  oldPathname = location.pathname
445
473
  affix('.target')
@@ -47,6 +47,39 @@ describe 'up.modal', ->
47
47
 
48
48
  describe 'up.modal.visit', ->
49
49
 
50
+ it "requests the given URL and places the given selector into a modal", ->
51
+ up.modal.visit '/foo', target: '.middle'
52
+
53
+ @respondWith """
54
+ <div class="before">new-before</div>
55
+ <div class="middle">new-middle</div>
56
+ <div class="after">new-after</div>
57
+ """
58
+
59
+ expect('.up-modal').toExist()
60
+ expect('.up-modal-dialog').toExist()
61
+ expect('.up-modal-dialog .middle').toExist()
62
+ expect('.up-modal-dialog .middle').toHaveText('new-middle')
63
+ expect('.up-modal-dialog .before').not.toExist()
64
+ expect('.up-modal-dialog .after').not.toExist()
65
+
66
+ expect(location.pathname).toEndWith('/foo')
67
+
68
+ it "doesn't create an .up-modal frame and replaces { failTarget } if the server returns a non-200 response", ->
69
+ affix('.error').text('old error')
70
+
71
+ up.modal.visit '/foo', target: '.target', failTarget: '.error'
72
+
73
+ @respondWith
74
+ status: 500
75
+ responseText: """
76
+ <div class="target">new target</div>
77
+ <div class="error">new error</div>
78
+ """
79
+
80
+ expect('.up-modal').not.toExist()
81
+ expect('.error').toHaveText('new error')
82
+
50
83
  describe 'preventing elements from jumping as scrollbars change', ->
51
84
 
52
85
  it "brings its own scrollbar, padding the body on the right", (done) ->
@@ -79,10 +112,11 @@ describe 'up.modal', ->
79
112
  openPromise.then ->
80
113
  expect($modal.css('overflow-y')).not.toEqual('scroll')
81
114
  expect($viewport.css('overflow-y')).toEqual('scroll')
82
- closePromise = up.modal.close(animation: 'fade-out', duration: 100)
83
- expect($modal.css('overflow-y')).toEqual('scroll')
84
- expect($viewport.css('overflow-y')).toEqual('hidden')
85
- done()
115
+ closePromise = up.modal.close(animation: 'fade-out', duration: 200)
116
+ u.nextFrame ->
117
+ expect($modal.css('overflow-y')).toEqual('scroll')
118
+ expect($viewport.css('overflow-y')).toEqual('hidden')
119
+ done()
86
120
 
87
121
  it 'does not add right padding to the body if the body has overflow-y: hidden', (done) ->
88
122
  restoreBody = u.temporaryCss($('body'), 'overflow-y': 'hidden')
@@ -138,7 +172,9 @@ describe 'up.modal', ->
138
172
  promise2 = up.modal.visit('/path2', target: '.container', animation: 'fade-in', duration: 50)
139
173
  @respondWith('<div class="container">response1</div>')
140
174
 
141
- u.setTimer 80, =>
175
+ u.setTimer 120, =>
176
+ # up.modal.visit (visitAsap) will start the request only after the last modal
177
+ # has finished opening and closing: 50 + 10 ms
142
178
  @respondWith('<div class="container">response2</div>')
143
179
  $.when(promise1, promise2).then ->
144
180
  expect($('.up-modal').length).toBe(1)
@@ -155,7 +191,7 @@ describe 'up.modal', ->
155
191
  up.modal.config.openAnimation = 'fade-in'
156
192
  up.modal.config.openDuration = 5
157
193
  up.modal.config.closeAnimation = 'fade-out'
158
- up.modal.config.closeDuration = 50
194
+ up.modal.config.closeDuration = 60
159
195
 
160
196
  events = []
161
197
  u.each ['up:modal:open', 'up:modal:opened', 'up:modal:close', 'up:modal:closed'], (event) ->
@@ -168,22 +204,23 @@ describe 'up.modal', ->
168
204
  expect(events).toEqual ['up:modal:open']
169
205
  expect($('.target')).toHaveText('response1')
170
206
 
171
- u.setTimer 40, ->
207
+ u.setTimer 80, ->
172
208
  # First modal has completed opening animation
173
209
  expect(events).toEqual ['up:modal:open', 'up:modal:opened']
174
210
  expect($('.target')).toHaveText('response1')
175
211
 
212
+ # We open another modal, which will cause the first modal to start closing
176
213
  up.modal.extract('.target', '<div class="target">response2</div>')
177
214
 
178
215
  expect($('.target')).toHaveText('response1')
179
216
 
180
- u.setTimer 40, ->
217
+ u.setTimer 20, ->
181
218
 
182
219
  # Second modal is still waiting for first modal's closing animaton to finish.
183
220
  expect(events).toEqual ['up:modal:open', 'up:modal:opened', 'up:modal:close']
184
221
  expect($('.target')).toHaveText('response1')
185
222
 
186
- u.setTimer 100, ->
223
+ u.setTimer 200, ->
187
224
 
188
225
  # First modal has finished closing, second modal has finished opening.
189
226
  expect(events).toEqual ['up:modal:open', 'up:modal:opened', 'up:modal:close', 'up:modal:closed', 'up:modal:open', 'up:modal:opened']