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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +106 -76
- data/README.md +8 -5
- data/README_RAILS.md +1 -1
- data/design/test_rejected_promise.txt +5 -0
- data/dist/unpoly-bootstrap3.js +1 -1
- data/dist/unpoly-bootstrap3.min.js +1 -1
- data/dist/unpoly.js +814 -417
- data/dist/unpoly.min.js +3 -3
- data/lib/assets/javascripts/unpoly/{browser.js.coffee → browser.coffee} +15 -6
- data/lib/assets/javascripts/unpoly/{bus.js.coffee → bus.coffee} +13 -13
- data/lib/assets/javascripts/unpoly/dom/extract_cascade.coffee +73 -0
- data/lib/assets/javascripts/unpoly/dom/extract_plan.coffee +65 -0
- data/lib/assets/javascripts/unpoly/{flow.js.coffee → dom.coffee} +109 -114
- data/lib/assets/javascripts/unpoly/{navigation.js.coffee → feedback.coffee} +11 -11
- data/lib/assets/javascripts/unpoly/{form.js.coffee → form.coffee} +35 -24
- data/lib/assets/javascripts/unpoly/{history.js.coffee → history.coffee} +9 -10
- data/lib/assets/javascripts/unpoly/{layout.js.coffee → layout.coffee} +53 -21
- data/lib/assets/javascripts/unpoly/{link.js.coffee → link.coffee} +46 -40
- data/lib/assets/javascripts/unpoly/{log.js.coffee → log.coffee} +2 -2
- data/lib/assets/javascripts/unpoly/{modal.js.coffee → modal.coffee} +17 -14
- data/lib/assets/javascripts/unpoly/{motion.js.coffee → motion.coffee} +28 -31
- data/lib/assets/javascripts/unpoly/namespace.coffee.erb +10 -0
- data/lib/assets/javascripts/unpoly/{popup.js.coffee → popup.coffee} +22 -10
- data/lib/assets/javascripts/unpoly/{proxy.js.coffee → proxy.coffee} +34 -12
- data/lib/assets/javascripts/unpoly/{rails.js.coffee → rails.coffee} +0 -0
- data/lib/assets/javascripts/unpoly/{syntax.js.coffee → syntax.coffee} +32 -21
- data/lib/assets/javascripts/unpoly/{toast.js.coffee → toast.coffee} +0 -0
- data/lib/assets/javascripts/unpoly/{tooltip.js.coffee → tooltip.coffee} +2 -2
- data/lib/assets/javascripts/unpoly/{util.js.coffee → util.coffee} +122 -35
- data/lib/assets/javascripts/unpoly-bootstrap3/{form-ext.js.coffee → form-ext.coffee} +0 -0
- data/lib/assets/javascripts/unpoly-bootstrap3/{layout-ext.js.coffee → layout-ext.coffee} +0 -0
- data/lib/assets/javascripts/unpoly-bootstrap3/{modal-ext.js.coffee → modal-ext.coffee} +0 -0
- data/lib/assets/javascripts/unpoly-bootstrap3/{navigation-ext.js.coffee → navigation-ext.coffee} +1 -1
- data/lib/assets/javascripts/{unpoly-bootstrap3.js.coffee → unpoly-bootstrap3.coffee} +0 -0
- data/lib/assets/javascripts/unpoly.coffee +22 -0
- data/lib/assets/stylesheets/unpoly/{close.css.sass → close.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{flow.css.sass → flow.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{link.css.sass → link.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{modal.css.sass → modal.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{popup.css.sass → popup.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{toast.css.sass → toast.sass} +0 -0
- data/lib/assets/stylesheets/unpoly/{tooltip.css.sass → tooltip.sass} +0 -0
- data/lib/assets/stylesheets/unpoly-bootstrap3/{modal-ext.css.sass → modal-ext.sass} +0 -0
- data/lib/assets/stylesheets/{unpoly-bootstrap3.css.sass → unpoly-bootstrap3.sass} +0 -0
- data/lib/assets/stylesheets/{unpoly.css.sass → unpoly.sass} +0 -0
- data/lib/unpoly/rails/version.rb +1 -1
- data/package.json +1 -1
- data/spec_app/Gemfile.lock +11 -13
- data/spec_app/app/assets/javascripts/jasmine_specs.coffee +1 -1
- data/spec_app/app/assets/stylesheets/_helpers.sass +1 -1
- data/spec_app/config/initializers/assets.rb +1 -5
- data/spec_app/spec/javascripts/up/{flow_spec.js.coffee → dom_spec.js.coffee} +294 -44
- data/spec_app/spec/javascripts/up/{navigation_spec.js.coffee → feedback_spec.js.coffee} +2 -2
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +1 -0
- data/spec_app/spec/javascripts/up/layout_spec.js.coffee +10 -0
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +28 -0
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +46 -9
- data/spec_app/spec/javascripts/up/motion_spec.js.coffee +32 -2
- data/spec_app/spec/javascripts/up/popup_spec.js.coffee +5 -4
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +75 -0
- data/spec_app/vendor/{assets/bower_components/jasmine-ajax → asset-libs/jasmine-ajax-3.3.1}/.bower.json +0 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.gitignore +6 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.npmignore +10 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.pairs +6 -0
- data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.travis.yml +56 -0
- 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
- data/spec_app/vendor/{assets/bower_components/jasmine-fixture/dist → asset-libs/jasmine-fixture-1.3.4}/jasmine-fixture.js +13 -13
- data/spec_app/vendor/{assets/bower_components/jasmine-jquery → asset-libs/jasmine-jquery-2.1.1}/.bower.json +0 -0
- data/spec_app/vendor/{assets/bower_components/jasmine-jquery/lib → asset-libs/jasmine-jquery-2.1.1}/jasmine-jquery.js +0 -0
- data/spec_app/vendor/assets/{javascripts/.keep → .keep} +0 -0
- metadata +52 -203
- data/lib/assets/javascripts/unpoly/module.js.coffee.erb +0 -8
- data/lib/assets/javascripts/unpoly.js.coffee +0 -21
- data/spec_app/Bowerfile +0 -3
- data/spec_app/vendor/assets/.bowerrc +0 -3
- data/spec_app/vendor/assets/bower.json +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine/.bower.json +0 -50
- data/spec_app/vendor/assets/bower_components/jasmine/CONTRIBUTING.md +0 -130
- data/spec_app/vendor/assets/bower_components/jasmine/GOALS_2.0.md +0 -64
- data/spec_app/vendor/assets/bower_components/jasmine/MANIFEST.in +0 -5
- data/spec_app/vendor/assets/bower_components/jasmine/MIT.LICENSE +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine/README.md +0 -73
- data/spec_app/vendor/assets/bower_components/jasmine/RELEASE.md +0 -73
- data/spec_app/vendor/assets/bower_components/jasmine/bower.json +0 -41
- data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.png +0 -0
- data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine-horizontal.svg +0 -102
- data/spec_app/vendor/assets/bower_components/jasmine/images/jasmine_favicon.png +0 -0
- data/spec_app/vendor/assets/bower_components/jasmine/lib/console/console.js +0 -190
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/boot.js +0 -143
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Player.js +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Song.js +0 -9
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine-html.js +0 -446
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.css +0 -58
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/jasmine.js +0 -3298
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/json2.js +0 -489
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core/node_boot.js +0 -41
- data/spec_app/vendor/assets/bower_components/jasmine/lib/jasmine-core.js +0 -37
- data/spec_app/vendor/assets/bower_components/jasmine/package.json +0 -34
- data/spec_app/vendor/assets/bower_components/jasmine/requirements.txt +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/MIT.LICENSE +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/README.markdown +0 -289
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/bower.json +0 -35
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/package.json +0 -26
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.0.2.md +0 -50
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/2.99.md +0 -14
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.0.md +0 -28
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.0.md +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.1.1.md +0 -23
- data/spec_app/vendor/assets/bower_components/jasmine-ajax/release_notes/3.2.0.md +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/.bower.json +0 -27
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/.gitignore +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/.npmignore +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/LICENSE.txt +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/README.md +0 -118
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/bower.json +0 -17
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/dist/jasmine-fixture.min.js +0 -5
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/basic-usage-spec.coffee +0 -14
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/invariants.coffee +0 -17
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/spec-within-a-spec.coffee +0 -24
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/helpers/tmp-files.coffee +0 -8
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine1-testem-config.json +0 -11
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/spec-e2e/support/jasmine2-testem-config.json +0 -11
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.11.0.js +0 -10337
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-1.8.3.js +0 -9472
- data/spec_app/vendor/assets/bower_components/jasmine-fixture/vendor/js/jquery-2.1.0.js +0 -9111
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/CONTRIBUTING.md +0 -28
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/Gruntfile.js +0 -49
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/LICENSE +0 -20
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/README.md +0 -367
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/bower.json +0 -15
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/package.json +0 -35
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_checkbox_with_checked.html +0 -6
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript.html +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/fixture_with_javascript_block.html +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_click.js +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/javascripts/jasmine_javascript_hover.js +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/json/jasmine_json_test.json +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture.html +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/fixtures/real_non_mocked_fixture_style.css +0 -1
- data/spec_app/vendor/assets/bower_components/jasmine-jquery/spec/suites/jasmine-jquery-spec.js +0 -1842
- data/spec_app/vendor/assets/bower_components/jquery/.bower.json +0 -38
- data/spec_app/vendor/assets/bower_components/jquery/MIT-LICENSE.txt +0 -21
- data/spec_app/vendor/assets/bower_components/jquery/bower.json +0 -28
- data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.js +0 -9210
- data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/dist/jquery.min.map +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/jsonp.js +0 -89
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/load.js +0 -75
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseJSON.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/parseXML.js +0 -28
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/script.js +0 -64
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/nonce.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/var/rquery.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax/xhr.js +0 -136
- data/spec_app/vendor/assets/bower_components/jquery/src/ajax.js +0 -786
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -141
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/classes.js +0 -158
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/prop.js +0 -94
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/support.js +0 -35
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes/val.js +0 -161
- data/spec_app/vendor/assets/bower_components/jquery/src/attributes.js +0 -11
- data/spec_app/vendor/assets/bower_components/jquery/src/callbacks.js +0 -205
- data/spec_app/vendor/assets/bower_components/jquery/src/core/access.js +0 -60
- data/spec_app/vendor/assets/bower_components/jquery/src/core/init.js +0 -123
- data/spec_app/vendor/assets/bower_components/jquery/src/core/parseHTML.js +0 -39
- data/spec_app/vendor/assets/bower_components/jquery/src/core/ready.js +0 -97
- data/spec_app/vendor/assets/bower_components/jquery/src/core/var/rsingleTag.js +0 -4
- data/spec_app/vendor/assets/bower_components/jquery/src/core.js +0 -502
- data/spec_app/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +0 -22
- data/spec_app/vendor/assets/bower_components/jquery/src/css/curCSS.js +0 -57
- data/spec_app/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +0 -70
- data/spec_app/vendor/assets/bower_components/jquery/src/css/hiddenVisibleSelectors.js +0 -15
- data/spec_app/vendor/assets/bower_components/jquery/src/css/support.js +0 -96
- data/spec_app/vendor/assets/bower_components/jquery/src/css/swap.js +0 -28
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/cssExpand.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +0 -12
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/isHidden.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rmargin.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/css/var/rnumnonpx.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/css.js +0 -450
- data/spec_app/vendor/assets/bower_components/jquery/src/data/Data.js +0 -181
- data/spec_app/vendor/assets/bower_components/jquery/src/data/accepts.js +0 -20
- data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_priv.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/data/var/data_user.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/data.js +0 -178
- data/spec_app/vendor/assets/bower_components/jquery/src/deferred.js +0 -149
- data/spec_app/vendor/assets/bower_components/jquery/src/deprecated.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/dimensions.js +0 -50
- data/spec_app/vendor/assets/bower_components/jquery/src/effects/Tween.js +0 -114
- data/spec_app/vendor/assets/bower_components/jquery/src/effects/animatedSelector.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/effects.js +0 -648
- data/spec_app/vendor/assets/bower_components/jquery/src/event/ajax.js +0 -13
- data/spec_app/vendor/assets/bower_components/jquery/src/event/alias.js +0 -39
- data/spec_app/vendor/assets/bower_components/jquery/src/event/support.js +0 -9
- data/spec_app/vendor/assets/bower_components/jquery/src/event.js +0 -868
- data/spec_app/vendor/assets/bower_components/jquery/src/exports/amd.js +0 -24
- data/spec_app/vendor/assets/bower_components/jquery/src/exports/global.js +0 -32
- data/spec_app/vendor/assets/bower_components/jquery/src/intro.js +0 -44
- data/spec_app/vendor/assets/bower_components/jquery/src/jquery.js +0 -37
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/_evalUrl.js +0 -18
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/support.js +0 -32
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation/var/rcheckableType.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/manipulation.js +0 -580
- data/spec_app/vendor/assets/bower_components/jquery/src/offset.js +0 -207
- data/spec_app/vendor/assets/bower_components/jquery/src/outro.js +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/queue/delay.js +0 -22
- data/spec_app/vendor/assets/bower_components/jquery/src/queue.js +0 -142
- data/spec_app/vendor/assets/bower_components/jquery/src/selector-native.js +0 -172
- data/spec_app/vendor/assets/bower_components/jquery/src/selector-sizzle.js +0 -14
- data/spec_app/vendor/assets/bower_components/jquery/src/selector.js +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/serialize.js +0 -111
- data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +0 -2067
- data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +0 -1
- data/spec_app/vendor/assets/bower_components/jquery/src/traversing/findFilter.js +0 -100
- data/spec_app/vendor/assets/bower_components/jquery/src/traversing/var/rneedsContext.js +0 -6
- data/spec_app/vendor/assets/bower_components/jquery/src/traversing.js +0 -199
- data/spec_app/vendor/assets/bower_components/jquery/src/var/arr.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/class2type.js +0 -4
- data/spec_app/vendor/assets/bower_components/jquery/src/var/concat.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/hasOwn.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/indexOf.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/pnum.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/push.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/rnotwhite.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/slice.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/var/strundefined.js +0 -3
- data/spec_app/vendor/assets/bower_components/jquery/src/var/support.js +0 -4
- data/spec_app/vendor/assets/bower_components/jquery/src/var/toString.js +0 -5
- data/spec_app/vendor/assets/bower_components/jquery/src/wrap.js +0 -79
- data/spec_app/vendor/assets/stylesheets/.keep +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
describe 'up.
|
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
|
-
|
51
|
-
|
52
|
-
promise
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
61
|
-
|
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 '
|
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
|
-
|
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(
|
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.
|
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.
|
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.
|
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.
|
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
|
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.
|
381
|
-
up.
|
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.
|
433
|
-
up.
|
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
|
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
|
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.
|
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.
|
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:
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
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 =
|
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
|
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
|
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
|
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']
|