unpoly-rails 0.57.0 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of unpoly-rails might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +393 -1
- data/Gemfile.lock +5 -2
- data/README.md +1 -1
- data/README_RAILS.md +1 -1
- data/Rakefile +10 -1
- data/design/es6.js +32 -0
- data/design/ie11.txt +9 -0
- data/design/measure_jquery/element_list.js +41 -0
- data/design/measure_jquery/up.on_vs_addEventListener.js +56 -0
- data/design/todo_jquery.txt +13 -0
- data/dist/unpoly-bootstrap3.js +8 -8
- data/dist/unpoly-bootstrap3.min.js +1 -1
- data/dist/unpoly.css +22 -20
- data/dist/unpoly.js +6990 -5336
- data/dist/unpoly.min.css +1 -1
- data/dist/unpoly.min.js +4 -4
- data/lib/assets/javascripts/unpoly-bootstrap3/viewport-ext.coffee +5 -0
- data/lib/assets/javascripts/unpoly.coffee +8 -6
- data/lib/assets/javascripts/unpoly/browser.coffee.erb +23 -118
- data/lib/assets/javascripts/unpoly/classes/body_shifter.coffee +36 -0
- data/lib/assets/javascripts/unpoly/classes/cache.coffee +4 -4
- data/lib/assets/javascripts/unpoly/classes/compile_pass.coffee +45 -39
- data/lib/assets/javascripts/unpoly/classes/config.coffee +9 -0
- data/lib/assets/javascripts/unpoly/classes/css_transition.coffee +18 -27
- data/lib/assets/javascripts/unpoly/classes/divertible_chain.coffee +39 -0
- data/lib/assets/javascripts/unpoly/classes/event_listener.coffee +116 -0
- data/lib/assets/javascripts/unpoly/classes/extract_cascade.coffee +8 -8
- data/lib/assets/javascripts/unpoly/classes/extract_plan.coffee +19 -19
- data/lib/assets/javascripts/unpoly/classes/field_observer.coffee +54 -31
- data/lib/assets/javascripts/unpoly/classes/{focus_tracker.coffee → focus_follower.coffee} +2 -2
- data/lib/assets/javascripts/unpoly/classes/follow_variant.coffee +25 -25
- data/lib/assets/javascripts/unpoly/classes/html_parser.coffee +4 -11
- data/lib/assets/javascripts/unpoly/classes/motion_controller.coffee +157 -0
- data/lib/assets/javascripts/unpoly/classes/params.coffee.erb +525 -0
- data/lib/assets/javascripts/unpoly/classes/record.coffee +8 -2
- data/lib/assets/javascripts/unpoly/classes/rect.js +21 -0
- data/lib/assets/javascripts/unpoly/classes/request.coffee +41 -35
- data/lib/assets/javascripts/unpoly/classes/response.coffee +7 -3
- data/lib/assets/javascripts/unpoly/classes/reveal_motion.coffee +102 -0
- data/lib/assets/javascripts/unpoly/classes/scroll_motion.coffee +67 -0
- data/lib/assets/javascripts/unpoly/classes/selector.coffee +60 -0
- data/lib/assets/javascripts/unpoly/classes/tether.coffee +105 -0
- data/lib/assets/javascripts/unpoly/classes/url_set.coffee +12 -7
- data/lib/assets/javascripts/unpoly/element.coffee.erb +1126 -0
- data/lib/assets/javascripts/unpoly/event.coffee.erb +437 -0
- data/lib/assets/javascripts/unpoly/feedback.coffee +73 -94
- data/lib/assets/javascripts/unpoly/form.coffee.erb +188 -181
- data/lib/assets/javascripts/unpoly/{dom.coffee.erb → fragment.coffee.erb} +250 -283
- data/lib/assets/javascripts/unpoly/framework.coffee +67 -0
- data/lib/assets/javascripts/unpoly/history.coffee +29 -28
- data/lib/assets/javascripts/unpoly/legacy.coffee +60 -0
- data/lib/assets/javascripts/unpoly/link.coffee.erb +127 -119
- data/lib/assets/javascripts/unpoly/log.coffee +99 -19
- data/lib/assets/javascripts/unpoly/modal.coffee.erb +95 -118
- data/lib/assets/javascripts/unpoly/motion.coffee.erb +158 -138
- data/lib/assets/javascripts/unpoly/namespace.coffee.erb +0 -5
- data/lib/assets/javascripts/unpoly/popup.coffee.erb +119 -102
- data/lib/assets/javascripts/unpoly/protocol.coffee +11 -15
- data/lib/assets/javascripts/unpoly/proxy.coffee +62 -65
- data/lib/assets/javascripts/unpoly/radio.coffee +3 -5
- data/lib/assets/javascripts/unpoly/rails.coffee +8 -9
- data/lib/assets/javascripts/unpoly/syntax.coffee.erb +173 -125
- data/lib/assets/javascripts/unpoly/toast.coffee +25 -24
- data/lib/assets/javascripts/unpoly/tooltip.coffee +89 -79
- data/lib/assets/javascripts/unpoly/util.coffee.erb +579 -1074
- data/lib/assets/javascripts/unpoly/{layout.coffee.erb → viewport.coffee.erb} +334 -264
- data/lib/assets/stylesheets/unpoly/dom.sass +1 -1
- data/lib/assets/stylesheets/unpoly/layout.sass +2 -0
- data/lib/assets/stylesheets/unpoly/popup.sass +0 -1
- data/lib/assets/stylesheets/unpoly/tooltip.sass +17 -12
- data/lib/unpoly/rails/version.rb +1 -1
- data/package.json +1 -2
- data/spec_app/Gemfile +2 -1
- data/spec_app/Gemfile.lock +38 -27
- data/spec_app/app/assets/javascripts/integration_test.coffee +1 -0
- data/spec_app/app/assets/javascripts/jasmine_specs.coffee +1 -2
- data/spec_app/app/assets/stylesheets/integration_test.sass +14 -1
- data/spec_app/app/controllers/scroll_test_controller.rb +5 -0
- data/spec_app/app/views/css_test/modal.erb +6 -6
- data/spec_app/app/views/css_test/popup.erb +44 -18
- data/spec_app/app/views/css_test/tooltip.erb +23 -4
- data/spec_app/app/views/error_test/trigger.erb +1 -1
- data/spec_app/app/views/form_test/basics/new.erb +1 -3
- data/spec_app/app/views/pages/start.erb +9 -2
- data/spec_app/app/views/reveal_test/long1.erb +1 -1
- data/spec_app/app/views/reveal_test/long2.erb +1 -1
- data/spec_app/app/views/reveal_test/within_document_viewport.erb +24 -0
- data/spec_app/app/views/reveal_test/within_overflowing_div_viewport.erb +28 -0
- data/spec_app/app/views/scroll_test/long1.erb +30 -0
- data/spec_app/config/routes.rb +1 -0
- data/spec_app/spec/javascripts/helpers/agent_detector.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/async_sequence.js.coffee +1 -0
- data/spec_app/spec/javascripts/helpers/browser_switches.js.coffee +17 -5
- data/spec_app/spec/javascripts/helpers/enable_logging.js.coffee +1 -1
- data/spec_app/spec/javascripts/helpers/fixture.js.coffee +25 -0
- data/spec_app/spec/javascripts/helpers/jquery_no_conflict.js +1 -0
- data/spec_app/spec/javascripts/helpers/last_request.js.coffee +1 -0
- data/spec_app/spec/javascripts/helpers/mock_ajax.js.coffee +1 -1
- data/spec_app/spec/javascripts/helpers/parse_form_data.js.coffee +2 -2
- data/spec_app/spec/javascripts/helpers/protect_jasmine_runner.coffee +4 -1
- data/spec_app/spec/javascripts/helpers/remove_body_margin.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/reset_history.js.coffee +2 -1
- data/spec_app/spec/javascripts/helpers/reset_knife.js.coffee +2 -2
- data/spec_app/spec/javascripts/helpers/reset_up.js.coffee +18 -11
- data/spec_app/spec/javascripts/helpers/restore_body_scroll.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/show_lib_versions.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/spec_util.coffee +47 -0
- data/spec_app/spec/javascripts/helpers/to_be_around.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_array.coffee +5 -0
- data/spec_app/spec/javascripts/helpers/to_be_attached.coffee +6 -2
- data/spec_app/spec/javascripts/helpers/to_be_blank.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_detached.coffee +6 -2
- data/spec_app/spec/javascripts/helpers/to_be_element.js.coffee +8 -0
- data/spec_app/spec/javascripts/helpers/to_be_error.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_given.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_hidden.js.coffee +8 -0
- data/spec_app/spec/javascripts/helpers/to_be_missing.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_present.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_scrolled_to.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_visible.js.coffee +9 -0
- data/spec_app/spec/javascripts/helpers/to_contain.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_end_with.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_equal_jquery.js.coffee +1 -2
- data/spec_app/spec/javascripts/helpers/to_equal_node_list.coffee +7 -0
- data/spec_app/spec/javascripts/helpers/to_equal_via_is_equal.js.coffee +7 -0
- data/spec_app/spec/javascripts/helpers/to_have_class.js.coffee +10 -0
- data/spec_app/spec/javascripts/helpers/to_have_descendant.js.coffee +10 -0
- data/spec_app/spec/javascripts/helpers/to_have_length.js.coffee +8 -0
- data/spec_app/spec/javascripts/helpers/to_have_opacity.coffee +7 -3
- data/spec_app/spec/javascripts/helpers/to_have_own_property.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_have_request_method.js.coffee +1 -0
- data/spec_app/spec/javascripts/helpers/to_have_text.js.coffee +9 -0
- data/spec_app/spec/javascripts/helpers/to_have_unhandled_rejections.coffee +0 -21
- data/spec_app/spec/javascripts/helpers/to_match_list.coffee +14 -0
- data/spec_app/spec/javascripts/helpers/to_match_selector.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_match_text.js.coffee +4 -1
- data/spec_app/spec/javascripts/helpers/to_match_url.coffee +1 -0
- data/spec_app/spec/javascripts/helpers/trigger.js.coffee +91 -7
- data/spec_app/spec/javascripts/helpers/wait_until_dom_ready.js.coffee +3 -0
- data/spec_app/spec/javascripts/up/browser_spec.js.coffee +23 -90
- data/spec_app/spec/javascripts/up/classes/cache_spec.js.coffee +3 -0
- data/spec_app/spec/javascripts/up/classes/config_spec.coffee +24 -0
- data/spec_app/spec/javascripts/up/classes/divertible_chain_spec.coffee +45 -0
- data/spec_app/spec/javascripts/up/classes/focus_tracker_spec.coffee +5 -2
- data/spec_app/spec/javascripts/up/classes/params_spec.coffee +557 -0
- data/spec_app/spec/javascripts/up/classes/request_spec.coffee +7 -4
- data/spec_app/spec/javascripts/up/classes/scroll_motion_spec.js.coffee +51 -0
- data/spec_app/spec/javascripts/up/classes/store/memory_spec.js.coffee +3 -0
- data/spec_app/spec/javascripts/up/classes/store/session_spec.js.coffee +3 -2
- data/spec_app/spec/javascripts/up/element_spec.coffee +897 -0
- data/spec_app/spec/javascripts/up/event_spec.js.coffee +496 -0
- data/spec_app/spec/javascripts/up/feedback_spec.js.coffee +69 -48
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +252 -194
- data/spec_app/spec/javascripts/up/{dom_spec.js.coffee → fragment_spec.js.coffee} +381 -388
- data/spec_app/spec/javascripts/up/history_spec.js.coffee +21 -19
- data/spec_app/spec/javascripts/up/jquery_spec.js.coffee +4 -0
- data/spec_app/spec/javascripts/up/legacy_spec.js.coffee +27 -0
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +163 -160
- data/spec_app/spec/javascripts/up/log_spec.js.coffee +85 -12
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +141 -123
- data/spec_app/spec/javascripts/up/motion_spec.js.coffee +117 -113
- data/spec_app/spec/javascripts/up/popup_spec.js.coffee +60 -77
- data/spec_app/spec/javascripts/up/protocol_spec.js.coffee +1 -0
- data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +85 -78
- data/spec_app/spec/javascripts/up/radio_spec.js.coffee +29 -22
- data/spec_app/spec/javascripts/up/rails_spec.js.coffee +14 -13
- data/spec_app/spec/javascripts/up/spec_spec.js.coffee +9 -0
- data/spec_app/spec/javascripts/up/syntax_spec.js.coffee +96 -66
- data/spec_app/spec/javascripts/up/toast_spec.js.coffee +37 -0
- data/spec_app/spec/javascripts/up/tooltip_spec.js.coffee +31 -47
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +725 -562
- data/spec_app/spec/javascripts/up/{layout_spec.js.coffee → viewport_spec.js.coffee} +175 -149
- metadata +57 -19
- data/lib/assets/javascripts/unpoly-bootstrap3/layout-ext.coffee +0 -5
- data/lib/assets/javascripts/unpoly/bus.coffee.erb +0 -518
- data/lib/assets/javascripts/unpoly/classes/extract_step.coffee +0 -4
- data/lib/assets/javascripts/unpoly/classes/motion_tracker.coffee +0 -125
- data/lib/assets/javascripts/unpoly/params.coffee.erb +0 -522
- data/spec_app/spec/javascripts/helpers/append_fixture.js.coffee +0 -8
- data/spec_app/spec/javascripts/up/bus_spec.js.coffee +0 -210
- data/spec_app/spec/javascripts/up/namespace_spec.js.coffee +0 -9
- data/spec_app/spec/javascripts/up/params_spec.coffee +0 -768
- data/spec_app/vendor/asset-libs/jasmine-fixture-1.3.4/jasmine-fixture.js +0 -433
- data/spec_app/vendor/asset-libs/jasmine-jquery-2.1.1/.bower.json +0 -26
- data/spec_app/vendor/asset-libs/jasmine-jquery-2.1.1/jasmine-jquery.js +0 -838
@@ -1,3 +1,7 @@
|
|
1
|
+
u = up.util
|
2
|
+
e = up.element
|
3
|
+
$ = jQuery
|
4
|
+
|
1
5
|
describe 'up.popup', ->
|
2
6
|
|
3
7
|
u = up.util
|
@@ -13,16 +17,16 @@ describe 'up.popup', ->
|
|
13
17
|
popupDims = $popup.get(0).getBoundingClientRect()
|
14
18
|
linkDims = $link.get(0).getBoundingClientRect()
|
15
19
|
pass:
|
16
|
-
Math.abs(popupDims.
|
20
|
+
Math.abs(popupDims.left - linkDims.left) < 1.0 && Math.abs(popupDims.top - linkDims.bottom) < 1.0
|
17
21
|
|
18
22
|
beforeEach ->
|
19
|
-
@restoreBodyHeight =
|
23
|
+
@restoreBodyHeight = e.setTemporaryStyle(document.body, minHeight: '3000px')
|
20
24
|
|
21
25
|
afterEach ->
|
22
26
|
@restoreBodyHeight()
|
23
27
|
|
24
28
|
it "loads this link's destination in a popup positioned under the given link", asyncSpec (next) ->
|
25
|
-
$container =
|
29
|
+
$container = $fixture('.container')
|
26
30
|
$container.css
|
27
31
|
position: 'absolute'
|
28
32
|
left: '100px'
|
@@ -42,15 +46,14 @@ describe 'up.popup', ->
|
|
42
46
|
|
43
47
|
next =>
|
44
48
|
$popup = $('.up-popup')
|
45
|
-
expect($popup).
|
49
|
+
expect($popup).toBeAttached()
|
46
50
|
expect($popup.find('.middle')).toHaveText('new-middle')
|
47
|
-
expect($popup.find('.before')).not.
|
48
|
-
expect($popup.find('.after')).not.
|
49
|
-
expect($popup.css('position')).toEqual('absolute')
|
51
|
+
expect($popup.find('.before')).not.toBeAttached()
|
52
|
+
expect($popup.find('.after')).not.toBeAttached()
|
50
53
|
expect($popup).toSitBelow($link)
|
51
54
|
|
52
55
|
it 'always makes a request for the given selector, and does not "improve" the selector with a fallback', asyncSpec (next) ->
|
53
|
-
$container =
|
56
|
+
$container = $fixture('.container')
|
54
57
|
$link = $container.affix('a[href="/path/to"][up-popup=".content"]').text('link')
|
55
58
|
up.popup.attach($link)
|
56
59
|
next =>
|
@@ -58,28 +61,8 @@ describe 'up.popup', ->
|
|
58
61
|
headers = @lastRequest().requestHeaders
|
59
62
|
expect(headers['X-Up-Target']).toEqual('.content')
|
60
63
|
|
61
|
-
it 'gives the popup { position: "fixed" } if the given link is fixed', asyncSpec (next) ->
|
62
|
-
# Let's test the harder case where the document is scrolled
|
63
|
-
up.layout.scroll(document, 50)
|
64
|
-
$container = affix('.container')
|
65
|
-
$container.css
|
66
|
-
position: 'fixed'
|
67
|
-
left: '100px'
|
68
|
-
top: '50px'
|
69
|
-
$link = $container.affix('a[href="/path/to"][up-popup=".content"]').text('link')
|
70
|
-
|
71
|
-
up.popup.attach($link)
|
72
|
-
|
73
|
-
next =>
|
74
|
-
@respondWith('<div class="content">popup-content</div>')
|
75
|
-
|
76
|
-
next =>
|
77
|
-
$popup = $('.up-popup')
|
78
|
-
expect($popup.css('position')).toEqual('fixed')
|
79
|
-
expect($popup).toSitBelow($link)
|
80
|
-
|
81
64
|
it 'never resolves the open() promise and shows no error if close() was called before the response was received', asyncSpec (next) ->
|
82
|
-
$span =
|
65
|
+
$span = $fixture('span')
|
83
66
|
openPromise = up.popup.attach($span, url: '/foo', target: '.container')
|
84
67
|
|
85
68
|
next =>
|
@@ -90,21 +73,21 @@ describe 'up.popup', ->
|
|
90
73
|
expect(respond).not.toThrowError()
|
91
74
|
|
92
75
|
next.await =>
|
93
|
-
expect($('.up-toast')).not.
|
76
|
+
expect($('.up-toast')).not.toBeAttached()
|
94
77
|
promise = promiseState(openPromise)
|
95
78
|
promise.then (result) => expect(result.state).toEqual('pending')
|
96
79
|
|
97
80
|
describe 'with { html } option', ->
|
98
81
|
|
99
82
|
it 'extracts the selector from the given HTML string', asyncSpec (next) ->
|
100
|
-
$span =
|
83
|
+
$span = $fixture('span')
|
101
84
|
next.await up.popup.attach($span, target: '.container', html: "<div class='container'>container contents</div>")
|
102
85
|
next => expect($('.up-popup')).toHaveText('container contents')
|
103
86
|
|
104
87
|
describe 'opening a popup while another modal is open', ->
|
105
88
|
|
106
89
|
it 'closes the current popup and wait for its close animation to finish before starting the open animation of a second popup', asyncSpec (next) ->
|
107
|
-
$span =
|
90
|
+
$span = $fixture('span')
|
108
91
|
up.popup.config.openAnimation = 'fade-in'
|
109
92
|
up.popup.config.openDuration = 5
|
110
93
|
up.popup.config.closeAnimation = 'fade-out'
|
@@ -148,7 +131,7 @@ describe 'up.popup', ->
|
|
148
131
|
up.history.replace('/foo')
|
149
132
|
expect(up.popup.coveredUrl()).toBeMissing()
|
150
133
|
|
151
|
-
$popupLink =
|
134
|
+
$popupLink = $fixture('a[href="/bar"][up-popup=".container"][up-history="true"]')
|
152
135
|
Trigger.clickSequence($popupLink)
|
153
136
|
|
154
137
|
next =>
|
@@ -174,14 +157,14 @@ describe 'up.popup', ->
|
|
174
157
|
|
175
158
|
beforeEach ->
|
176
159
|
@stubAttach = =>
|
177
|
-
@$link =
|
160
|
+
@$link = $fixture('a[href="/path"][up-popup=".target"]')
|
178
161
|
@attachSpy = up.popup.knife.mock('attachAsap').and.returnValue(Promise.resolve())
|
179
162
|
@defaultSpy = spyOn(up.link, 'allowDefault').and.callFake((event) -> event.preventDefault())
|
180
163
|
|
181
164
|
it 'opens the clicked link in a popup', asyncSpec (next) ->
|
182
165
|
@stubAttach()
|
183
166
|
Trigger.click(@$link)
|
184
|
-
next => expect(@attachSpy).toHaveBeenCalledWith(@$link, {})
|
167
|
+
next => expect(@attachSpy).toHaveBeenCalledWith(@$link[0], {})
|
185
168
|
|
186
169
|
# IE does not call JavaScript and always performs the default action on right clicks
|
187
170
|
unless AgentDetector.isIE() || AgentDetector.isEdge()
|
@@ -209,8 +192,8 @@ describe 'up.popup', ->
|
|
209
192
|
up.popup.config.openDuration = 0
|
210
193
|
up.popup.config.closeDuration = 0
|
211
194
|
|
212
|
-
$link1 =
|
213
|
-
$link2 =
|
195
|
+
$link1 = $fixture('a[href="/path1"][up-popup=".target"]')
|
196
|
+
$link2 = $fixture('a[href="/path2"][up-popup=".target"]')
|
214
197
|
|
215
198
|
events = []
|
216
199
|
u.each ['up:popup:open', 'up:popup:opened', 'up:popup:close', 'up:popup:closed'], (event) ->
|
@@ -242,7 +225,7 @@ describe 'up.popup', ->
|
|
242
225
|
|
243
226
|
it 'opens the modal on mousedown (instead of on click)', asyncSpec (next) ->
|
244
227
|
Trigger.mousedown(@$link)
|
245
|
-
next => expect(@attachSpy.calls.mostRecent().args[0]).toEqual(@$link)
|
228
|
+
next => expect(@attachSpy.calls.mostRecent().args[0]).toEqual(@$link[0])
|
246
229
|
|
247
230
|
it 'does nothing on mouseup', asyncSpec (next) ->
|
248
231
|
Trigger.mouseup(@$link)
|
@@ -273,7 +256,7 @@ describe 'up.popup', ->
|
|
273
256
|
describe 'with [up-method] modifier', ->
|
274
257
|
|
275
258
|
it 'honours the given method', asyncSpec (next) ->
|
276
|
-
$link =
|
259
|
+
$link = $fixture('a[href="/path"][up-popup=".target"][up-method="post"]')
|
277
260
|
Trigger.click($link)
|
278
261
|
|
279
262
|
next =>
|
@@ -291,11 +274,11 @@ describe 'up.popup', ->
|
|
291
274
|
describe 'when clicked inside a popup', ->
|
292
275
|
|
293
276
|
it 'closes the open popup and halts the event chain', asyncSpec (next) ->
|
294
|
-
$opener =
|
277
|
+
$opener = $fixture('a')
|
295
278
|
up.popup.attach($opener, html: '<div class="target">text</div>', target: '.target')
|
296
279
|
|
297
280
|
next =>
|
298
|
-
$popup =
|
281
|
+
$popup = $fixture('.up-popup')
|
299
282
|
$closer = $popup.affix('a[up-close]') # link is within the popup
|
300
283
|
up.hello($closer)
|
301
284
|
Trigger.clickSequence($closer)
|
@@ -328,7 +311,7 @@ describe 'up.popup', ->
|
|
328
311
|
describe 'when no popup is open', ->
|
329
312
|
|
330
313
|
it 'does nothing and allows the event chain to continue', asyncSpec (next) ->
|
331
|
-
$link =
|
314
|
+
$link = $fixture('a[up-close]') # link is outside the popup
|
332
315
|
up.hello($link)
|
333
316
|
Trigger.clickSequence($link)
|
334
317
|
|
@@ -342,21 +325,21 @@ describe 'up.popup', ->
|
|
342
325
|
up.motion.config.enabled = false
|
343
326
|
|
344
327
|
it 'prefers to replace a selector within the popup', asyncSpec (next) ->
|
345
|
-
$outside =
|
346
|
-
$link =
|
328
|
+
$outside = $fixture('.foo').text('old outside')
|
329
|
+
$link = $fixture('.link')
|
347
330
|
up.popup.attach($link, target: '.foo', html: "<div class='foo'>old inside</div>")
|
348
331
|
|
349
332
|
next =>
|
350
333
|
up.extract('.foo', "<div class='foo'>new text</div>")
|
351
334
|
|
352
335
|
next =>
|
353
|
-
expect($outside).
|
336
|
+
expect($outside).toBeAttached()
|
354
337
|
expect($outside).toHaveText('old outside')
|
355
338
|
expect($('.up-popup')).toHaveText('new text')
|
356
339
|
|
357
340
|
it 'auto-closes the popup when a replacement from inside the popup affects a selector behind the popup', asyncSpec (next) ->
|
358
|
-
|
359
|
-
$link =
|
341
|
+
$fixture('.outside').text('old outside')
|
342
|
+
$link = $fixture('.link')
|
360
343
|
up.popup.attach($link, target: '.inside', html: "<div class='inside'>old inside</div>")
|
361
344
|
|
362
345
|
next =>
|
@@ -364,7 +347,7 @@ describe 'up.popup', ->
|
|
364
347
|
|
365
348
|
next =>
|
366
349
|
expect($('.outside')).toHaveText('new outside')
|
367
|
-
expect($('.up-popup')).not.
|
350
|
+
expect($('.up-popup')).not.toBeAttached()
|
368
351
|
|
369
352
|
it 'does not restore the covered URL when auto-closing (since it would override the URL from the triggering update)', asyncSpec (next) ->
|
370
353
|
up.history.config.enabled = true
|
@@ -373,8 +356,8 @@ describe 'up.popup', ->
|
|
373
356
|
up.popup.config.closeDuration = 20
|
374
357
|
up.popup.config.history = true
|
375
358
|
|
376
|
-
|
377
|
-
$link =
|
359
|
+
$fixture('.outside').text('old outside')
|
360
|
+
$link = $fixture('.link')
|
378
361
|
up.popup.attach($link, url: '/path', target: '.inside')
|
379
362
|
|
380
363
|
next =>
|
@@ -388,8 +371,8 @@ describe 'up.popup', ->
|
|
388
371
|
expect(location.href).toMatchUrl '/new-location'
|
389
372
|
|
390
373
|
it 'does not auto-close the popup when a replacement from inside the popup affects a selector inside the popup', asyncSpec (next) ->
|
391
|
-
|
392
|
-
$link =
|
374
|
+
$fixture('.outside').text('old outside')
|
375
|
+
$link = $fixture('.link')
|
393
376
|
up.popup.attach($link, html: "<div class='inside'>old inside</div>", target: '.inside')
|
394
377
|
|
395
378
|
next =>
|
@@ -397,11 +380,11 @@ describe 'up.popup', ->
|
|
397
380
|
|
398
381
|
next =>
|
399
382
|
expect($('.inside')).toHaveText('new inside')
|
400
|
-
expect($('.up-popup')).
|
383
|
+
expect($('.up-popup')).toBeAttached()
|
401
384
|
|
402
385
|
it 'does not auto-close the popup when a replacement from outside the popup affects a selector outside the popup', asyncSpec (next) ->
|
403
|
-
|
404
|
-
$link =
|
386
|
+
$fixture('.outside').text('old outside')
|
387
|
+
$link = $fixture('.link')
|
405
388
|
up.popup.attach($link, target: '.inside', html: "<div class='inside'>old inside</div>")
|
406
389
|
|
407
390
|
next =>
|
@@ -409,11 +392,11 @@ describe 'up.popup', ->
|
|
409
392
|
|
410
393
|
next =>
|
411
394
|
expect($('.outside')).toHaveText('new outside')
|
412
|
-
expect($('.up-popup')).
|
395
|
+
expect($('.up-popup')).toBeAttached()
|
413
396
|
|
414
397
|
it 'does not auto-close the popup when a replacement from outside the popup affects a selector inside the popup', asyncSpec (next) ->
|
415
|
-
|
416
|
-
$link =
|
398
|
+
$fixture('.outside').text('old outside')
|
399
|
+
$link = $fixture('.link')
|
417
400
|
up.popup.attach($link, target: '.inside', html: "<div class='inside'>old inside</div>")
|
418
401
|
|
419
402
|
next =>
|
@@ -421,7 +404,7 @@ describe 'up.popup', ->
|
|
421
404
|
|
422
405
|
next =>
|
423
406
|
expect($('.inside')).toHaveText('new inside')
|
424
|
-
expect($('.up-popup')).
|
407
|
+
expect($('.up-popup')).toBeAttached()
|
425
408
|
|
426
409
|
describe 'when clicking on the body', ->
|
427
410
|
|
@@ -429,8 +412,8 @@ describe 'up.popup', ->
|
|
429
412
|
up.motion.config.enabled = false
|
430
413
|
|
431
414
|
it 'closes the popup', asyncSpec (next) ->
|
432
|
-
|
433
|
-
$link =
|
415
|
+
$fixture('.outside').text('old outside')
|
416
|
+
$link = $fixture('.link')
|
434
417
|
up.popup.attach($link, target: '.inside', html: "<div class='inside'>inside</div>")
|
435
418
|
|
436
419
|
next =>
|
@@ -441,9 +424,9 @@ describe 'up.popup', ->
|
|
441
424
|
expect(up.popup.isOpen()).toBe(false)
|
442
425
|
|
443
426
|
it 'closes the popup when a an [up-instant] link removes its parent (and thus a click event never bubbles up to the document)', asyncSpec (next) ->
|
444
|
-
$parent =
|
427
|
+
$parent = $fixture('.parent')
|
445
428
|
$parentReplacingLink = $parent.affix('a[href="/foo"][up-target=".parent"][up-instant]')
|
446
|
-
$popupOpener =
|
429
|
+
$popupOpener = $fixture('.link')
|
447
430
|
up.popup.attach($popupOpener, target: '.inside', html: "<div class='inside'>inside</div>")
|
448
431
|
|
449
432
|
next =>
|
@@ -454,9 +437,9 @@ describe 'up.popup', ->
|
|
454
437
|
expect(up.popup.isOpen()).toBe(false)
|
455
438
|
|
456
439
|
it 'closes the popup when the user clicks on an [up-target] link outside the popup', asyncSpec (next) ->
|
457
|
-
$target =
|
458
|
-
$outsideLink =
|
459
|
-
$popupOpener =
|
440
|
+
$target = $fixture('.target')
|
441
|
+
$outsideLink = $fixture('a[href="/foo"][up-target=".target"]')
|
442
|
+
$popupOpener = $fixture('.link')
|
460
443
|
up.popup.attach($popupOpener, target: '.inside', html: "<div class='inside'>inside</div>")
|
461
444
|
|
462
445
|
next =>
|
@@ -467,9 +450,9 @@ describe 'up.popup', ->
|
|
467
450
|
expect(up.popup.isOpen()).toBe(false)
|
468
451
|
|
469
452
|
it 'closes the popup when the user clicks on an [up-instant] link outside the popup', asyncSpec (next) ->
|
470
|
-
$target =
|
471
|
-
$outsideLink =
|
472
|
-
$popupOpener =
|
453
|
+
$target = $fixture('.target')
|
454
|
+
$outsideLink = $fixture('a[href="/foo"][up-target=".target"][up-instant]')
|
455
|
+
$popupOpener = $fixture('.link')
|
473
456
|
up.popup.attach($popupOpener, target: '.inside', html: "<div class='inside'>inside</div>")
|
474
457
|
|
475
458
|
next =>
|
@@ -480,8 +463,8 @@ describe 'up.popup', ->
|
|
480
463
|
expect(up.popup.isOpen()).toBe(false)
|
481
464
|
|
482
465
|
it 'does not close the popup if #preventDefault() is called on up:popup:close event', asyncSpec (next) ->
|
483
|
-
|
484
|
-
$link =
|
466
|
+
$fixture('.outside').text('old outside')
|
467
|
+
$link = $fixture('.link')
|
485
468
|
up.popup.attach($link, target: '.inside', html: "<div class='inside'>inside</div>")
|
486
469
|
|
487
470
|
up.on 'up:popup:close', (e) -> e.preventDefault()
|
@@ -498,9 +481,9 @@ describe 'up.popup', ->
|
|
498
481
|
expect(window).not.toHaveUnhandledRejections()
|
499
482
|
|
500
483
|
it 'does not close the popup if a link outside the popup is followed with the up.follow function (bugfix)', asyncSpec (next) ->
|
501
|
-
$target =
|
502
|
-
$outsideLink =
|
503
|
-
$popupOpener =
|
484
|
+
$target = $fixture('.target')
|
485
|
+
$outsideLink = $fixture('a[href="/foo"][up-target=".target"]')
|
486
|
+
$popupOpener = $fixture('.link')
|
504
487
|
up.popup.attach($popupOpener, target: '.inside', html: "<div class='inside'>inside</div>")
|
505
488
|
|
506
489
|
next =>
|
@@ -511,9 +494,9 @@ describe 'up.popup', ->
|
|
511
494
|
expect(up.popup.isOpen()).toBe(true)
|
512
495
|
|
513
496
|
it 'does not close the popup if a form outside the popup is followed with the up.submit function (bugfix)', asyncSpec (next) ->
|
514
|
-
$target =
|
515
|
-
$outsideForm =
|
516
|
-
$popupOpener =
|
497
|
+
$target = $fixture('.target')
|
498
|
+
$outsideForm = $fixture('form[action="/foo"][up-target=".target"]')
|
499
|
+
$popupOpener = $fixture('.link')
|
517
500
|
up.popup.attach($popupOpener, target: '.inside', html: "<div class='inside'>inside</div>")
|
518
501
|
|
519
502
|
next =>
|
@@ -1,6 +1,7 @@
|
|
1
|
-
|
1
|
+
u = up.util
|
2
|
+
$ = jQuery
|
2
3
|
|
3
|
-
|
4
|
+
describe 'up.proxy', ->
|
4
5
|
|
5
6
|
describe 'JavaScript functions', ->
|
6
7
|
|
@@ -45,7 +46,7 @@ describe 'up.proxy', ->
|
|
45
46
|
target: '.target'
|
46
47
|
)
|
47
48
|
|
48
|
-
u.
|
49
|
+
u.task =>
|
49
50
|
@respondWith(
|
50
51
|
status: 201,
|
51
52
|
responseText: 'response-text'
|
@@ -53,7 +54,7 @@ describe 'up.proxy', ->
|
|
53
54
|
|
54
55
|
promise.then (response) ->
|
55
56
|
expect(response.request.url).toMatchUrl('/url')
|
56
|
-
expect(response.request.params).toEqual(key: 'value')
|
57
|
+
expect(response.request.params).toEqual(new up.Params(key: 'value'))
|
57
58
|
expect(response.request.method).toEqual('POST')
|
58
59
|
expect(response.request.target).toEqual('.target')
|
59
60
|
expect(response.request.hash).toBeBlank()
|
@@ -69,7 +70,7 @@ describe 'up.proxy', ->
|
|
69
70
|
it 'resolves to a Response that contains the response headers', (done) ->
|
70
71
|
promise = up.request(url: '/url')
|
71
72
|
|
72
|
-
u.
|
73
|
+
u.task =>
|
73
74
|
@respondWith
|
74
75
|
responseHeaders: { 'foo': 'bar', 'baz': 'bam' }
|
75
76
|
responseText: 'hello'
|
@@ -85,7 +86,7 @@ describe 'up.proxy', ->
|
|
85
86
|
it "preserves the URL hash in a separate { hash } property, since although it isn't sent to server, code might need it to process the response", (done) ->
|
86
87
|
promise = up.request('/url#hash')
|
87
88
|
|
88
|
-
u.
|
89
|
+
u.task =>
|
89
90
|
request = @lastRequest()
|
90
91
|
expect(request.url).toMatchUrl('/url')
|
91
92
|
|
@@ -107,7 +108,7 @@ describe 'up.proxy', ->
|
|
107
108
|
target: '.target'
|
108
109
|
)
|
109
110
|
|
110
|
-
u.
|
111
|
+
u.task =>
|
111
112
|
@respondWith(
|
112
113
|
responseHeaders:
|
113
114
|
'X-Up-Location': '/redirect'
|
@@ -126,7 +127,7 @@ describe 'up.proxy', ->
|
|
126
127
|
it 'sets the { url } property on the response object', (done) ->
|
127
128
|
promise = up.request('/request-url#request-hash')
|
128
129
|
|
129
|
-
u.
|
130
|
+
u.task =>
|
130
131
|
@respondWith
|
131
132
|
responseHeaders:
|
132
133
|
'X-Up-Location': '/response-url'
|
@@ -189,23 +190,25 @@ describe 'up.proxy', ->
|
|
189
190
|
# See that an additional request was made
|
190
191
|
expect(jasmine.Ajax.requests.count()).toEqual(2)
|
191
192
|
|
192
|
-
|
193
|
-
up.request('/foo', method: 'post', params: new FormData()) # POST requests are not cached
|
193
|
+
describeCapability 'canInspectFormData', ->
|
194
194
|
|
195
|
-
next
|
196
|
-
|
197
|
-
@respondWith
|
198
|
-
responseHeaders:
|
199
|
-
'X-Up-Location': '/bar'
|
200
|
-
'X-Up-Method': 'GET'
|
195
|
+
it "does not explode if the original request's { params } is a FormData object", asyncSpec (next) ->
|
196
|
+
up.request('/foo', method: 'post', params: new FormData()) # POST requests are not cached
|
201
197
|
|
202
|
-
|
203
|
-
|
198
|
+
next =>
|
199
|
+
expect(jasmine.Ajax.requests.count()).toEqual(1)
|
200
|
+
@respondWith
|
201
|
+
responseHeaders:
|
202
|
+
'X-Up-Location': '/bar'
|
203
|
+
'X-Up-Method': 'GET'
|
204
|
+
|
205
|
+
next =>
|
206
|
+
@secondAjaxPromise = up.request('/bar')
|
204
207
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
208
|
+
next.await =>
|
209
|
+
promiseState(@secondAjaxPromise).then (result) ->
|
210
|
+
# See that the promise was not rejected due to an internal error.
|
211
|
+
expect(result.state).toEqual('pending')
|
209
212
|
|
210
213
|
|
211
214
|
describe 'when the XHR object has a { responseURL } property', ->
|
@@ -213,7 +216,7 @@ describe 'up.proxy', ->
|
|
213
216
|
it 'sets the { url } property on the response object', (done) ->
|
214
217
|
promise = up.request('/request-url#request-hash')
|
215
218
|
|
216
|
-
u.
|
219
|
+
u.task =>
|
217
220
|
@respondWith
|
218
221
|
responseURL: '/response-url'
|
219
222
|
|
@@ -325,7 +328,7 @@ describe 'up.proxy', ->
|
|
325
328
|
givenParams = { 'foo-key': 'foo-value', 'bar-key': 'bar-value' }
|
326
329
|
promise = up.request(url: '/path', method: 'get', params: givenParams)
|
327
330
|
|
328
|
-
u.
|
331
|
+
u.task =>
|
329
332
|
expect(@lastRequest().url).toMatchUrl('/path?foo-key=foo-value&bar-key=bar-value')
|
330
333
|
expect(@lastRequest().data()).toBeBlank()
|
331
334
|
|
@@ -333,7 +336,7 @@ describe 'up.proxy', ->
|
|
333
336
|
|
334
337
|
promise.then (response) ->
|
335
338
|
# See that the response object has been updated by moving the data options
|
336
|
-
# to the URL. This is important for up.
|
339
|
+
# to the URL. This is important for up.fragment code that works on response.request.
|
337
340
|
expect(response.request.url).toMatchUrl('/path?foo-key=foo-value&bar-key=bar-value')
|
338
341
|
expect(response.request.params).toBeBlank()
|
339
342
|
done()
|
@@ -554,7 +557,7 @@ describe 'up.proxy', ->
|
|
554
557
|
|
555
558
|
promise = up.request('/bar')
|
556
559
|
|
557
|
-
u.
|
560
|
+
u.task ->
|
558
561
|
expect(listener).toHaveBeenCalled()
|
559
562
|
expect(jasmine.Ajax.requests.count()).toEqual(0)
|
560
563
|
|
@@ -576,7 +579,7 @@ describe 'up.proxy', ->
|
|
576
579
|
promise1 = up.request('/path1')
|
577
580
|
promise2 = up.request('/path2')
|
578
581
|
|
579
|
-
u.
|
582
|
+
u.task =>
|
580
583
|
expect(listener.calls.count()).toBe(2)
|
581
584
|
expect(jasmine.Ajax.requests.count()).toEqual(1)
|
582
585
|
expect(@lastRequest().url).toMatchUrl('/path2')
|
@@ -590,7 +593,7 @@ describe 'up.proxy', ->
|
|
590
593
|
|
591
594
|
up.request('/path1')
|
592
595
|
|
593
|
-
u.
|
596
|
+
u.task =>
|
594
597
|
expect(@lastRequest().requestHeaders['X-From-Listener']).toEqual('foo')
|
595
598
|
done()
|
596
599
|
|
@@ -757,7 +760,7 @@ describe 'up.proxy', ->
|
|
757
760
|
it 'fulfills to the response text in order to match the $.ajax() API as good as possible', (done) ->
|
758
761
|
promise = up.ajax('/url')
|
759
762
|
|
760
|
-
u.
|
763
|
+
u.timer 100, =>
|
761
764
|
@respondWith('response-text')
|
762
765
|
|
763
766
|
promise.then (text) ->
|
@@ -773,8 +776,8 @@ describe 'up.proxy', ->
|
|
773
776
|
@requestTarget = => @lastRequest().requestHeaders['X-Up-Target']
|
774
777
|
|
775
778
|
it "loads and caches the given link's destination", asyncSpec (next) ->
|
776
|
-
|
777
|
-
$link =
|
779
|
+
$fixture('.target')
|
780
|
+
$link = $fixture('a[href="/path"][up-target=".target"]')
|
778
781
|
|
779
782
|
up.proxy.preload($link)
|
780
783
|
|
@@ -783,8 +786,8 @@ describe 'up.proxy', ->
|
|
783
786
|
expect(u.isPromise(cachedPromise)).toBe(true)
|
784
787
|
|
785
788
|
it "does not load a link whose method has side-effects", (done) ->
|
786
|
-
|
787
|
-
$link =
|
789
|
+
$fixture('.target')
|
790
|
+
$link = $fixture('a[href="/path"][up-target=".target"][data-method="post"]')
|
788
791
|
preloadPromise = up.proxy.preload($link)
|
789
792
|
|
790
793
|
promiseState(preloadPromise).then (result) ->
|
@@ -793,8 +796,8 @@ describe 'up.proxy', ->
|
|
793
796
|
done()
|
794
797
|
|
795
798
|
it 'accepts options', asyncSpec (next) ->
|
796
|
-
|
797
|
-
$link =
|
799
|
+
$fixture('.target')
|
800
|
+
$link = $fixture('a[href="/path"][up-target=".target"]')
|
798
801
|
up.proxy.preload($link, url: '/options-path')
|
799
802
|
|
800
803
|
next =>
|
@@ -804,13 +807,13 @@ describe 'up.proxy', ->
|
|
804
807
|
describe 'for an [up-target] link', ->
|
805
808
|
|
806
809
|
it 'includes the [up-target] selector as an X-Up-Target header if the targeted element is currently on the page', asyncSpec (next) ->
|
807
|
-
|
808
|
-
$link =
|
810
|
+
$fixture('.target')
|
811
|
+
$link = $fixture('a[href="/path"][up-target=".target"]')
|
809
812
|
up.proxy.preload($link)
|
810
813
|
next => expect(@requestTarget()).toEqual('.target')
|
811
814
|
|
812
815
|
it 'replaces the [up-target] selector as with a fallback and uses that as an X-Up-Target header if the targeted element is not currently on the page', asyncSpec (next) ->
|
813
|
-
$link =
|
816
|
+
$link = $fixture('a[href="/path"][up-target=".target"]')
|
814
817
|
up.proxy.preload($link)
|
815
818
|
# The default fallback would usually be `body`, but in Jasmine specs we change
|
816
819
|
# it to protect the test runner during failures.
|
@@ -819,7 +822,7 @@ describe 'up.proxy', ->
|
|
819
822
|
it 'calls up.request() with a { preload: true } option so it bypasses the concurrency limit', asyncSpec (next) ->
|
820
823
|
requestSpy = spyOn(up, 'request')
|
821
824
|
|
822
|
-
$link =
|
825
|
+
$link = $fixture('a[href="/path"][up-target=".target"]')
|
823
826
|
up.proxy.preload($link)
|
824
827
|
|
825
828
|
next =>
|
@@ -831,18 +834,18 @@ describe 'up.proxy', ->
|
|
831
834
|
up.motion.config.enabled = false
|
832
835
|
|
833
836
|
it 'includes the [up-modal] selector as an X-Up-Target header and does not replace it with a fallback, since the modal frame always exists', asyncSpec (next) ->
|
834
|
-
$link =
|
837
|
+
$link = $fixture('a[href="/path"][up-modal=".target"]')
|
835
838
|
up.proxy.preload($link)
|
836
839
|
next => expect(@requestTarget()).toEqual('.target')
|
837
840
|
|
838
841
|
it 'does not create a modal frame', asyncSpec (next) ->
|
839
|
-
$link =
|
842
|
+
$link = $fixture('a[href="/path"][up-modal=".target"]')
|
840
843
|
up.proxy.preload($link)
|
841
844
|
next =>
|
842
|
-
expect('.up-modal').not.
|
845
|
+
expect('.up-modal').not.toBeAttached()
|
843
846
|
|
844
847
|
it 'does not emit an up:modal:open event', asyncSpec (next) ->
|
845
|
-
$link =
|
848
|
+
$link = $fixture('a[href="/path"][up-modal=".target"]')
|
846
849
|
openListener = jasmine.createSpy('listener')
|
847
850
|
up.on('up:modal:open', openListener)
|
848
851
|
up.proxy.preload($link)
|
@@ -850,43 +853,43 @@ describe 'up.proxy', ->
|
|
850
853
|
expect(openListener).not.toHaveBeenCalled()
|
851
854
|
|
852
855
|
it 'does not close a currently open modal', asyncSpec (next) ->
|
853
|
-
$link =
|
856
|
+
$link = $fixture('a[href="/path"][up-modal=".target"]')
|
854
857
|
closeListener = jasmine.createSpy('listener')
|
855
858
|
up.on('up:modal:close', closeListener)
|
856
859
|
|
857
860
|
up.modal.extract('.content', '<div class="content">Modal content</div>')
|
858
861
|
|
859
862
|
next =>
|
860
|
-
expect('.up-modal .content').
|
863
|
+
expect('.up-modal .content').toBeAttached()
|
861
864
|
|
862
865
|
next =>
|
863
866
|
up.proxy.preload($link)
|
864
867
|
|
865
868
|
next =>
|
866
|
-
expect('.up-modal .content').
|
869
|
+
expect('.up-modal .content').toBeAttached()
|
867
870
|
expect(closeListener).not.toHaveBeenCalled()
|
868
871
|
|
869
872
|
next =>
|
870
873
|
up.modal.close()
|
871
874
|
|
872
875
|
next =>
|
873
|
-
expect('.up-modal .content').not.
|
876
|
+
expect('.up-modal .content').not.toBeAttached()
|
874
877
|
expect(closeListener).toHaveBeenCalled()
|
875
878
|
|
876
879
|
it 'does not prevent the opening of other modals while the request is still pending', asyncSpec (next) ->
|
877
|
-
$link =
|
880
|
+
$link = $fixture('a[href="/path"][up-modal=".target"]')
|
878
881
|
up.proxy.preload($link)
|
879
882
|
|
880
883
|
next =>
|
881
884
|
up.modal.extract('.content', '<div class="content">Modal content</div>')
|
882
885
|
|
883
886
|
next =>
|
884
|
-
expect('.up-modal .content').
|
887
|
+
expect('.up-modal .content').toBeAttached()
|
885
888
|
|
886
889
|
it 'calls up.request() with a { preload: true } option so it bypasses the concurrency limit', asyncSpec (next) ->
|
887
890
|
requestSpy = spyOn(up, 'request')
|
888
891
|
|
889
|
-
$link =
|
892
|
+
$link = $fixture('a[href="/path"][up-modal=".target"]')
|
890
893
|
up.proxy.preload($link)
|
891
894
|
|
892
895
|
next =>
|
@@ -898,19 +901,19 @@ describe 'up.proxy', ->
|
|
898
901
|
up.motion.config.enabled = false
|
899
902
|
|
900
903
|
it 'includes the [up-popup] selector as an X-Up-Target header and does not replace it with a fallback, since the popup frame always exists', asyncSpec (next) ->
|
901
|
-
$link =
|
904
|
+
$link = $fixture('a[href="/path"][up-popup=".target"]')
|
902
905
|
up.proxy.preload($link)
|
903
906
|
next => expect(@requestTarget()).toEqual('.target')
|
904
907
|
|
905
908
|
|
906
909
|
it 'does not create a popup frame', asyncSpec (next) ->
|
907
|
-
$link =
|
910
|
+
$link = $fixture('a[href="/path"][up-popup=".target"]')
|
908
911
|
up.proxy.preload($link)
|
909
912
|
next =>
|
910
|
-
expect('.up-popup').not.
|
913
|
+
expect('.up-popup').not.toBeAttached()
|
911
914
|
|
912
915
|
it 'does not emit an up:popup:open event', asyncSpec (next) ->
|
913
|
-
$link =
|
916
|
+
$link = $fixture('a[href="/path"][up-popup=".target"]')
|
914
917
|
openListener = jasmine.createSpy('listener')
|
915
918
|
up.on('up:popup:open', openListener)
|
916
919
|
up.proxy.preload($link)
|
@@ -918,45 +921,45 @@ describe 'up.proxy', ->
|
|
918
921
|
expect(openListener).not.toHaveBeenCalled()
|
919
922
|
|
920
923
|
it 'does not close a currently open popup', asyncSpec (next) ->
|
921
|
-
$link =
|
924
|
+
$link = $fixture('a[href="/path"][up-popup=".target"]')
|
922
925
|
closeListener = jasmine.createSpy('listener')
|
923
926
|
up.on('up:popup:close', closeListener)
|
924
927
|
|
925
|
-
$existingAnchor =
|
928
|
+
$existingAnchor = $fixture('.existing-anchor')
|
926
929
|
up.popup.attach($existingAnchor, target: '.content', html: '<div class="content">popup content</div>')
|
927
930
|
|
928
931
|
next =>
|
929
|
-
expect('.up-popup .content').
|
932
|
+
expect('.up-popup .content').toBeAttached()
|
930
933
|
|
931
934
|
next =>
|
932
935
|
up.proxy.preload($link)
|
933
936
|
|
934
937
|
next =>
|
935
|
-
expect('.up-popup .content').
|
938
|
+
expect('.up-popup .content').toBeAttached()
|
936
939
|
expect(closeListener).not.toHaveBeenCalled()
|
937
940
|
|
938
941
|
next =>
|
939
942
|
up.popup.close()
|
940
943
|
|
941
944
|
next =>
|
942
|
-
expect('.up-popup .content').not.
|
945
|
+
expect('.up-popup .content').not.toBeAttached()
|
943
946
|
expect(closeListener).toHaveBeenCalled()
|
944
947
|
|
945
948
|
it 'does not prevent the opening of other popups while the request is still pending', asyncSpec (next) ->
|
946
|
-
$link =
|
949
|
+
$link = $fixture('a[href="/path"][up-popup=".target"]')
|
947
950
|
up.proxy.preload($link)
|
948
951
|
|
949
952
|
next =>
|
950
|
-
$anchor =
|
953
|
+
$anchor = $fixture('.existing-anchor')
|
951
954
|
up.popup.attach($anchor, target: '.content', html: '<div class="content">popup content</div>')
|
952
955
|
|
953
956
|
next =>
|
954
|
-
expect('.up-popup .content').
|
957
|
+
expect('.up-popup .content').toBeAttached()
|
955
958
|
|
956
959
|
it 'calls up.request() with a { preload: true } option so it bypasses the concurrency limit', asyncSpec (next) ->
|
957
960
|
requestSpy = spyOn(up, 'request')
|
958
961
|
|
959
|
-
$link =
|
962
|
+
$link = $fixture('a[href="/path"][up-popup=".target"]')
|
960
963
|
up.proxy.preload($link)
|
961
964
|
|
962
965
|
next =>
|
@@ -965,8 +968,8 @@ describe 'up.proxy', ->
|
|
965
968
|
describeFallback 'canPushState', ->
|
966
969
|
|
967
970
|
it "does nothing", asyncSpec (next) ->
|
968
|
-
|
969
|
-
$link =
|
971
|
+
$fixture('.target')
|
972
|
+
$link = $fixture('a[href="/path"][up-target=".target"]')
|
970
973
|
up.proxy.preload($link)
|
971
974
|
next =>
|
972
975
|
expect(jasmine.Ajax.requests.count()).toBe(0)
|
@@ -982,9 +985,11 @@ describe 'up.proxy', ->
|
|
982
985
|
promise = up.proxy.get(url: '/foo', params: { key: 'value' })
|
983
986
|
expect(promise).toBeUndefined()
|
984
987
|
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
+
describeCapability 'canInspectFormData', ->
|
989
|
+
|
990
|
+
it "returns undefined if the given request's { params } is a FormData object", ->
|
991
|
+
promise = up.proxy.get(url: '/foo', params: new FormData())
|
992
|
+
expect(promise).toBeUndefined()
|
988
993
|
|
989
994
|
describe 'up.proxy.set', ->
|
990
995
|
|
@@ -1000,9 +1005,11 @@ describe 'up.proxy', ->
|
|
1000
1005
|
|
1001
1006
|
it 'does nothing if the given request is not cached'
|
1002
1007
|
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1008
|
+
describeCapability 'canInspectFormData', ->
|
1009
|
+
|
1010
|
+
it 'does not crash when passed a request with FormData (bugfix)', ->
|
1011
|
+
removal = -> up.proxy.remove(url: '/path', params: new FormData())
|
1012
|
+
expect(removal).not.toThrowError()
|
1006
1013
|
|
1007
1014
|
describe 'up.proxy.clear', ->
|
1008
1015
|
|
@@ -1015,9 +1022,9 @@ describe 'up.proxy', ->
|
|
1015
1022
|
it 'preloads the link destination when hovering, after a delay', asyncSpec (next) ->
|
1016
1023
|
up.proxy.config.preloadDelay = 100
|
1017
1024
|
|
1018
|
-
|
1025
|
+
$fixture('.target').text('old text')
|
1019
1026
|
|
1020
|
-
$link =
|
1027
|
+
$link = $fixture('a[href="/foo"][up-target=".target"][up-preload]')
|
1021
1028
|
up.hello($link)
|
1022
1029
|
|
1023
1030
|
Trigger.hoverSequence($link)
|
@@ -1054,9 +1061,9 @@ describe 'up.proxy', ->
|
|
1054
1061
|
it 'does not send a request if the user stops hovering before the delay is over', asyncSpec (next) ->
|
1055
1062
|
up.proxy.config.preloadDelay = 100
|
1056
1063
|
|
1057
|
-
|
1064
|
+
$fixture('.target').text('old text')
|
1058
1065
|
|
1059
|
-
$link =
|
1066
|
+
$link = $fixture('a[href="/foo"][up-target=".target"][up-preload]')
|
1060
1067
|
up.hello($link)
|
1061
1068
|
|
1062
1069
|
Trigger.hoverSequence($link)
|
@@ -1073,9 +1080,9 @@ describe 'up.proxy', ->
|
|
1073
1080
|
it 'does not cache a failed response', asyncSpec (next) ->
|
1074
1081
|
up.proxy.config.preloadDelay = 0
|
1075
1082
|
|
1076
|
-
|
1083
|
+
$fixture('.target').text('old text')
|
1077
1084
|
|
1078
|
-
$link =
|
1085
|
+
$link = $fixture('a[href="/foo"][up-target=".target"][up-preload]')
|
1079
1086
|
up.hello($link)
|
1080
1087
|
|
1081
1088
|
Trigger.hoverSequence($link)
|
@@ -1109,7 +1116,7 @@ describe 'up.proxy', ->
|
|
1109
1116
|
up.proxy.config.cacheExpiry = 100
|
1110
1117
|
up.proxy.config.preloadDelay = 0
|
1111
1118
|
|
1112
|
-
$element =
|
1119
|
+
$element = $fixture('a[href="/foo"][up-preload]')
|
1113
1120
|
up.hello($element)
|
1114
1121
|
|
1115
1122
|
Trigger.hoverSequence($element)
|