unpoly-rails 0.26.2 → 0.27.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -1
  3. data/dist/unpoly.js +704 -446
  4. data/dist/unpoly.min.js +3 -3
  5. data/lib/assets/javascripts/unpoly/browser.js.coffee +18 -9
  6. data/lib/assets/javascripts/unpoly/bus.js.coffee +28 -1
  7. data/lib/assets/javascripts/unpoly/flow.js.coffee +1 -1
  8. data/lib/assets/javascripts/unpoly/history.js.coffee +54 -22
  9. data/lib/assets/javascripts/unpoly/link.js.coffee +1 -1
  10. data/lib/assets/javascripts/unpoly/log.js.coffee +19 -12
  11. data/lib/assets/javascripts/unpoly/modal.js.coffee +119 -124
  12. data/lib/assets/javascripts/unpoly/motion.js.coffee +1 -0
  13. data/lib/assets/javascripts/unpoly/navigation.js.coffee +2 -6
  14. data/lib/assets/javascripts/unpoly/popup.js.coffee +136 -126
  15. data/lib/assets/javascripts/unpoly/proxy.js.coffee +0 -2
  16. data/lib/assets/javascripts/unpoly/syntax.js.coffee +1 -1
  17. data/lib/assets/javascripts/unpoly/tooltip.js.coffee +101 -46
  18. data/lib/assets/javascripts/unpoly/util.js.coffee +76 -7
  19. data/lib/unpoly/rails/version.rb +1 -1
  20. data/spec_app/Gemfile.lock +1 -1
  21. data/spec_app/app/assets/stylesheets/integration_test.sass +4 -0
  22. data/spec_app/app/assets/stylesheets/jasmine_specs.sass +5 -0
  23. data/spec_app/app/views/css_test/modal.erb +3 -0
  24. data/spec_app/app/views/css_test/modal_contents.erb +5 -0
  25. data/spec_app/app/views/css_test/popup.erb +11 -11
  26. data/spec_app/app/views/css_test/tooltip.erb +12 -5
  27. data/spec_app/app/views/pages/start.erb +4 -0
  28. data/spec_app/spec/javascripts/helpers/reset_up.js.coffee +2 -3
  29. data/spec_app/spec/javascripts/up/flow_spec.js.coffee +97 -88
  30. data/spec_app/spec/javascripts/up/history_spec.js.coffee +100 -1
  31. data/spec_app/spec/javascripts/up/link_spec.js.coffee +18 -16
  32. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +102 -97
  33. data/spec_app/spec/javascripts/up/motion_spec.js.coffee +89 -75
  34. data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +17 -5
  35. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +89 -70
  36. data/spec_app/spec/javascripts/up/util_spec.js.coffee +23 -0
  37. metadata +4 -2
@@ -52,7 +52,7 @@ up.util = (($) ->
52
52
  Whether to include an `#hash` anchor in the normalized URL
53
53
  @param {Boolean} [options.search=true]
54
54
  Whether to include a `?query` string in the normalized URL
55
- @param {Boolean} [options.stripTrailingSlash=false]
55
+ @param {Boolean} [options.stripTrailingSlash=true]
56
56
  Whether to strip a trailing slash from the pathname
57
57
  @internal
58
58
  ###
@@ -65,7 +65,7 @@ up.util = (($) ->
65
65
  # We have seen this in IE11 and W3Schools claims it happens in IE9 or earlier
66
66
  # http://www.w3schools.com/jsref/prop_anchor_pathname.asp
67
67
  pathname = "/#{pathname}" unless pathname[0] == '/'
68
- pathname = pathname.replace(/\/$/, '') if options?.stripTrailingSlash == true
68
+ pathname = pathname.replace(/\/$/, '') unless options?.stripTrailingSlash == false
69
69
  normalized += pathname
70
70
  normalized += anchor.hash if options?.hash == true
71
71
  normalized += anchor.search unless options?.search == false
@@ -566,7 +566,7 @@ up.util = (($) ->
566
566
  copy = (object) ->
567
567
  if isArray(object)
568
568
  object.slice()
569
- else
569
+ else if isHash(object)
570
570
  extend({}, object)
571
571
 
572
572
  ###*
@@ -827,7 +827,9 @@ up.util = (($) ->
827
827
  scrollbarWidth = memoize ->
828
828
  # This is how Bootstrap does it also:
829
829
  # https://github.com/twbs/bootstrap/blob/c591227602996c542b9fd0cb65cff3cc9519bdd5/dist/js/bootstrap.js#L1187
830
- $outer = $('<div>').css
830
+ $outer = $('<div>')
831
+ $outer.attr('up-viewport', '')
832
+ $outer.css
831
833
  position: 'absolute'
832
834
  top: '0'
833
835
  left: '0'
@@ -948,7 +950,7 @@ up.util = (($) ->
948
950
  The timing function that controls the animation's acceleration.
949
951
  See [W3C documentation](http://www.w3.org/TR/css3-transitions/#transition-timing-function)
950
952
  for a list of pre-defined timing functions.
951
- @return
953
+ @return {Deferred}
952
954
  A promise for the animation's end.
953
955
  @internal
954
956
  ###
@@ -963,6 +965,13 @@ up.util = (($) ->
963
965
  easing: 'ease'
964
966
  )
965
967
 
968
+ if opts.duration == 0
969
+ # In case the duration is zero we 1) spare ourselves all the trouble below,
970
+ # and 2) return a deferred that actually resolve, since a CSS transition with
971
+ # a zero duration never fires a transitionEnd event.
972
+ $element.css(lastFrame)
973
+ return resolvedDeferred()
974
+
966
975
  # We don't finish an existing animation here, since the public API
967
976
  # we expose as `up.motion.animate` already does this.
968
977
  deferred = $.Deferred()
@@ -1497,9 +1506,12 @@ up.util = (($) ->
1497
1506
  @function up.util.config
1498
1507
  @internal
1499
1508
  ###
1500
- config = (factoryOptions = {}) ->
1509
+ config = (blueprint = {}) ->
1501
1510
  hash = {}
1502
- hash.reset = -> extend(hash, factoryOptions)
1511
+ hash.reset = ->
1512
+ newOptions = blueprint
1513
+ newOptions = newOptions() if isFunction(newOptions)
1514
+ extend(hash, newOptions)
1503
1515
  hash.reset()
1504
1516
  Object.preventExtensions(hash)
1505
1517
  hash
@@ -1748,6 +1760,62 @@ up.util = (($) ->
1748
1760
  # This is by far the fastest way to do this
1749
1761
  not jQuery.contains(document.documentElement, element)
1750
1762
 
1763
+ ###*
1764
+ Given a function that will return a promise, returns a proxy function
1765
+ with an additional `.promise` attribute.
1766
+
1767
+ When the proxy is called, the inner function is called.
1768
+ The proxy's `.promise` attribute is available even before the function is called
1769
+ and will resolve when the inner function's returned promise resolves.
1770
+
1771
+ @function up.util.previewable
1772
+ @internal
1773
+ ###
1774
+ previewable = (fun) ->
1775
+ deferred = $.Deferred()
1776
+ preview = (args...) ->
1777
+ fun(args...).then ->
1778
+ deferred.resolve()
1779
+ preview.promise = deferred.promise()
1780
+ preview
1781
+
1782
+ ###*
1783
+ A linear task queue whose (2..n)th tasks can be changed at any time.
1784
+
1785
+ @function up.util.DivertibleChain
1786
+ @internal
1787
+ ###
1788
+ class DivertibleChain
1789
+
1790
+ constructor: ->
1791
+ @reset()
1792
+
1793
+ reset: =>
1794
+ @queue = []
1795
+ @currentTask = undefined
1796
+
1797
+ promise: =>
1798
+ promises = map @allTasks(), (task) -> task.promise
1799
+ $.when(promises...)
1800
+
1801
+ allTasks: =>
1802
+ tasks = []
1803
+ tasks.push(@currentTask) if @currentTask
1804
+ tasks = tasks.concat(@queue)
1805
+ tasks
1806
+
1807
+ poke: =>
1808
+ unless @currentTask # don't start a new task while we're still running one
1809
+ if @currentTask = @queue.shift()
1810
+ promise = @currentTask()
1811
+ promise.always =>
1812
+ @currentTask = undefined
1813
+ @poke()
1814
+
1815
+ asap: (newTasks...) =>
1816
+ @queue = map(newTasks, previewable)
1817
+ @poke()
1818
+
1751
1819
  isDetached: isDetached
1752
1820
  requestDataAsArray: requestDataAsArray
1753
1821
  requestDataAsQuery: requestDataAsQuery
@@ -1853,6 +1921,7 @@ up.util = (($) ->
1853
1921
  whenReady: whenReady
1854
1922
  identity: identity
1855
1923
  escapeHtml: escapeHtml
1924
+ DivertibleChain: DivertibleChain
1856
1925
 
1857
1926
  )($)
1858
1927
 
@@ -4,6 +4,6 @@ module Unpoly
4
4
  # The current version of the unpoly-rails gem.
5
5
  # This version number is also used for releases of the Unpoly
6
6
  # frontend code.
7
- VERSION = '0.26.2'
7
+ VERSION = '0.27.0'
8
8
  end
9
9
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- unpoly-rails (0.26.1)
4
+ unpoly-rails (0.26.2)
5
5
  rails (>= 3)
6
6
 
7
7
  GEM
@@ -33,8 +33,12 @@ body
33
33
  background-color: #e21
34
34
  color: white
35
35
  text-decoration: none
36
+ &.up-current
37
+ background-color: #921
36
38
  &:hover
37
39
  background-color: #fa1
40
+ &.up-active
41
+ background-color: #ff0
38
42
 
39
43
  dt
40
44
  font-weight: bold
@@ -1 +1,6 @@
1
1
  //= require unpoly
2
+
3
+ // Reduce the backdrop flashing during modal specs
4
+ .up-modal-backdrop
5
+ background-color: rgba(90, 90, 90, 0.05)
6
+
@@ -0,0 +1,3 @@
1
+ <div class="example">
2
+ <a class="button" href="/css_test/modal_contents" up-modal=".contents">Modal</a>
3
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="contents">
2
+ Line 1: Foo bar baz bam qux foo bar baz bam qux<br>
3
+ Line 2: Foo bar baz bam qux foo bar baz bam qux<br>
4
+ Line 3: Foo bar baz bam qux foo bar baz bam qux
5
+ </div>
@@ -1,25 +1,25 @@
1
- <div class="spacer">
1
+ <div class="fixed-top-bar">
2
+ <a class="button" href="/css_test/popup_contents?1" up-popup=".contents" up-position="top-left">Top-left popup</a>
3
+ <a class="button" href="/css_test/popup_contents?2" up-popup=".contents" up-position="top-right">Top-right popup</a>
4
+ <a class="button" href="/css_test/popup_contents?3" up-popup=".contents" up-position="bottom-right">Bottom-right popup</a>
5
+ <a class="button" href="/css_test/popup_contents?4" up-popup=".contents" up-position="bottom-left">Bottom-left popup</a>
2
6
  </div>
3
7
 
4
- <div class="example">
5
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-left">Top-left popup</a>
8
+ <div class="spacer">
6
9
  </div>
7
10
 
8
11
  <div class="example">
9
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-right">Top-right popup</a>
12
+ <a class="button" href="/css_test/popup_contents?5" up-popup=".contents" up-position="top-left">Top-left popup</a>
10
13
  </div>
11
14
 
12
15
  <div class="example">
13
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-right">Bottom-right popup</a>
16
+ <a class="button" href="/css_test/popup_contents?6" up-popup=".contents" up-position="top-right">Top-right popup</a>
14
17
  </div>
15
18
 
16
19
  <div class="example">
17
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-left">Bottom-left popup</a>
20
+ <a class="button" href="/css_test/popup_contents?7" up-popup=".contents" up-position="bottom-right">Bottom-right popup</a>
18
21
  </div>
19
22
 
20
- <div class="fixed-top-bar">
21
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-left">Top-left popup</a>
22
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-right">Top-right popup</a>
23
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-right">Bottom-right popup</a>
24
- <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-left">Bottom-left popup</a>
23
+ <div class="example">
24
+ <a class="button" href="/css_test/popup_contents?8" up-popup=".contents" up-position="bottom-left">Bottom-left popup</a>
25
25
  </div>
@@ -1,3 +1,13 @@
1
+ <div class="fixed-top-bar">
2
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="top">Top tooltip</a>
3
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="bottom">Bottom tooltip</a>
4
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="left">Left tooltip</a>
5
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="right">Right tooltip</a>
6
+ </div>
7
+
8
+ <div class="spacer">
9
+ </div>
10
+
1
11
  <div class="example">
2
12
  <a class="button" href="#" up-tooltip="Tooltip text" up-position="top">Top tooltip</a>
3
13
  </div>
@@ -14,9 +24,6 @@
14
24
  <a class="button" href="#" up-tooltip="Tooltip text" up-position="right">Right tooltip</a>
15
25
  </div>
16
26
 
17
- <div class="fixed-top-bar">
18
- <a class="button" href="#" up-tooltip="Tooltip text" up-position="top">Top tooltip</a>
19
- <a class="button" href="#" up-tooltip="Tooltip text" up-position="bottom">Bottom tooltip</a>
20
- <a class="button" href="#" up-tooltip="Tooltip text" up-position="left">Left tooltip</a>
21
- <a class="button" href="#" up-tooltip="Tooltip text" up-position="right">Right tooltip</a>
27
+ <div class="example">
28
+ <% 1.upto(100) do |i| %><a class="button" href="#" up-tooltip="Tooltip <%= i %>"><%= i %></a><% end %>
22
29
  </div>
@@ -18,6 +18,10 @@
18
18
  <li><%= link_to 'Popup', '/css_test/popup' %></li>
19
19
  </ul>
20
20
 
21
+ <ul>
22
+ <li><%= link_to 'Modal', '/css_test/modal' %></li>
23
+ </ul>
24
+
21
25
  <ul>
22
26
  <li><%= link_to 'Form (basic)', '/form_test/basic/new' %></li>
23
27
  </ul>
@@ -1,6 +1,5 @@
1
1
  afterEach ->
2
- console.debug('--- Resetting Unpoly after example ---')
3
- up.motion.finish()
4
2
  up.reset()
5
3
  $('.up-error').remove()
6
- console.debug('--- Unpoly was reset after example ---')
4
+
5
+
@@ -161,7 +161,6 @@ describe 'up.flow', ->
161
161
  it 'adds params from a { data } option to the URL of a GET request', ->
162
162
  promise = up.replace('.middle', '/path', data: { 'foo-key': 'foo value', 'bar-key': 'bar value' })
163
163
  @respond()
164
- console.log("EXPECTATION COMING UP AGAINST %o", location.pathname)
165
164
  expect(location.href).toEndWith('/path?foo-key=foo%20value&bar-key=bar%20value')
166
165
 
167
166
  describe 'if a URL is given as { history } option', ->
@@ -599,75 +598,85 @@ describe 'up.flow', ->
599
598
 
600
599
  describe 'with { transition } option', ->
601
600
 
602
- it 'morphs between the old and new element', (done) ->
603
- affix('.element').text('version 1')
604
- up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 200)
601
+ describeCapability 'canCssTransition', ->
605
602
 
606
- $ghost1 = $('.element.up-ghost:contains("version 1")')
607
- expect($ghost1).toHaveLength(1)
608
- expect(u.opacity($ghost1)).toBeAround(1.0, 0.1)
603
+ it 'morphs between the old and new element', (done) ->
604
+ affix('.element').text('version 1')
605
+ up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 200)
609
606
 
610
- $ghost2 = $('.element.up-ghost:contains("version 2")')
611
- expect($ghost2).toHaveLength(1)
612
- expect(u.opacity($ghost2)).toBeAround(0.0, 0.1)
607
+ $ghost1 = $('.element.up-ghost:contains("version 1")')
608
+ expect($ghost1).toHaveLength(1)
609
+ expect(u.opacity($ghost1)).toBeAround(1.0, 0.1)
613
610
 
614
- u.setTimer 190, ->
615
- expect(u.opacity($ghost1)).toBeAround(0.0, 0.3)
616
- expect(u.opacity($ghost2)).toBeAround(1.0, 0.3)
617
- done()
618
-
619
- it 'marks the old fragment and its ghost as .up-destroying during the transition', ->
620
- affix('.element').text('version 1')
621
- up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 200)
622
-
623
- $version1 = $('.element:not(.up-ghost):contains("version 1")')
624
- $version1Ghost = $('.element.up-ghost:contains("version 1")')
625
- expect($version1).toHaveLength(1)
626
- expect($version1Ghost).toHaveLength(1)
627
- expect($version1).toHaveClass('up-destroying')
628
- expect($version1Ghost).toHaveClass('up-destroying')
629
-
630
- $version2 = $('.element:not(.up-ghost):contains("version 2")')
631
- $version2Ghost = $('.element.up-ghost:contains("version 2")')
632
- expect($version2).toHaveLength(1)
633
- expect($version2Ghost).toHaveLength(1)
634
- expect($version2).not.toHaveClass('up-destroying')
635
- expect($version2Ghost).not.toHaveClass('up-destroying')
636
-
637
- it 'cancels an existing transition by instantly jumping to the last frame', ->
638
- affix('.element').text('version 1')
639
- up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 200)
640
-
641
- $ghost1 = $('.element.up-ghost:contains("version 1")')
642
- expect($ghost1).toHaveLength(1)
643
- expect($ghost1.css('opacity')).toBeAround(1.0, 0.1)
644
-
645
- $ghost2 = $('.element.up-ghost:contains("version 2")')
646
- expect($ghost2).toHaveLength(1)
647
- expect($ghost2.css('opacity')).toBeAround(0.0, 0.1)
648
-
649
- up.extract('.element', '<div class="element">version 3</div>', transition: 'cross-fade', duration: 200)
611
+ $ghost2 = $('.element.up-ghost:contains("version 2")')
612
+ expect($ghost2).toHaveLength(1)
613
+ expect(u.opacity($ghost2)).toBeAround(0.0, 0.1)
650
614
 
651
- $ghost1 = $('.element.up-ghost:contains("version 1")')
652
- expect($ghost1).toHaveLength(0)
615
+ u.setTimer 190, ->
616
+ expect(u.opacity($ghost1)).toBeAround(0.0, 0.3)
617
+ expect(u.opacity($ghost2)).toBeAround(1.0, 0.3)
618
+ done()
653
619
 
654
- $ghost2 = $('.element.up-ghost:contains("version 2")')
655
- expect($ghost2).toHaveLength(1)
656
- expect($ghost2.css('opacity')).toBeAround(1.0, 0.1)
620
+ it 'marks the old fragment and its ghost as .up-destroying during the transition', ->
621
+ affix('.element').text('version 1')
622
+ up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 200)
623
+
624
+ $version1 = $('.element:not(.up-ghost):contains("version 1")')
625
+ $version1Ghost = $('.element.up-ghost:contains("version 1")')
626
+ expect($version1).toHaveLength(1)
627
+ expect($version1Ghost).toHaveLength(1)
628
+ expect($version1).toHaveClass('up-destroying')
629
+ expect($version1Ghost).toHaveClass('up-destroying')
630
+
631
+ $version2 = $('.element:not(.up-ghost):contains("version 2")')
632
+ $version2Ghost = $('.element.up-ghost:contains("version 2")')
633
+ expect($version2).toHaveLength(1)
634
+ expect($version2Ghost).toHaveLength(1)
635
+ expect($version2).not.toHaveClass('up-destroying')
636
+ expect($version2Ghost).not.toHaveClass('up-destroying')
637
+
638
+ it 'cancels an existing transition by instantly jumping to the last frame', ->
639
+ affix('.element').text('version 1')
640
+ up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 200)
641
+
642
+ $ghost1 = $('.element.up-ghost:contains("version 1")')
643
+ expect($ghost1).toHaveLength(1)
644
+ expect($ghost1.css('opacity')).toBeAround(1.0, 0.1)
645
+
646
+ $ghost2 = $('.element.up-ghost:contains("version 2")')
647
+ expect($ghost2).toHaveLength(1)
648
+ expect($ghost2.css('opacity')).toBeAround(0.0, 0.1)
649
+
650
+ up.extract('.element', '<div class="element">version 3</div>', transition: 'cross-fade', duration: 200)
651
+
652
+ $ghost1 = $('.element.up-ghost:contains("version 1")')
653
+ expect($ghost1).toHaveLength(0)
654
+
655
+ $ghost2 = $('.element.up-ghost:contains("version 2")')
656
+ expect($ghost2).toHaveLength(1)
657
+ expect($ghost2.css('opacity')).toBeAround(1.0, 0.1)
658
+
659
+ $ghost3 = $('.element.up-ghost:contains("version 3")')
660
+ expect($ghost3).toHaveLength(1)
661
+ expect($ghost3.css('opacity')).toBeAround(0.0, 0.1)
662
+
663
+ it 'delays the resolution of the returned promise until the transition is over', (done) ->
664
+ affix('.element').text('version 1')
665
+ resolution = jasmine.createSpy()
666
+ promise = up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 30)
667
+ promise.then(resolution)
668
+ expect(resolution).not.toHaveBeenCalled()
669
+ u.setTimer 70, ->
670
+ expect(resolution).toHaveBeenCalled()
671
+ done()
657
672
 
658
- $ghost3 = $('.element.up-ghost:contains("version 3")')
659
- expect($ghost3).toHaveLength(1)
660
- expect($ghost3.css('opacity')).toBeAround(0.0, 0.1)
673
+ describeFallback 'canCssTransition', ->
661
674
 
662
- it 'delays the resolution of the returned promise until the transition is over', (done) ->
663
- affix('.element').text('version 1')
664
- resolution = jasmine.createSpy()
665
- promise = up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 30)
666
- promise.then(resolution)
667
- expect(resolution).not.toHaveBeenCalled()
668
- u.setTimer 70, ->
669
- expect(resolution).toHaveBeenCalled()
670
- done()
675
+ it 'immediately swaps the old and new elements', ->
676
+ affix('.element').text('version 1')
677
+ up.extract('.element', '<div class="element">version 2</div>', transition: 'cross-fade', duration: 200)
678
+ expect($('.element')).toHaveText('version 2')
679
+ expect($('.up-ghost')).toHaveLength(0)
671
680
 
672
681
  describe 'handling of [up-keep] elements', ->
673
682
 
@@ -802,9 +811,7 @@ describe 'up.flow', ->
802
811
  <div class="keeper" up-keep>old-text</div>
803
812
  """
804
813
 
805
- console.log '*** before hello ***'
806
814
  up.hello($container)
807
- console.log '*** after hello ***'
808
815
  expect(compiler.calls.count()).toEqual(1)
809
816
 
810
817
  up.extract '.container', """
@@ -893,29 +900,31 @@ describe 'up.flow', ->
893
900
  expect(keptListener).toHaveBeenCalledWith($keeper, { key: 'value1' })
894
901
  expect(keptListener).toHaveBeenCalledWith($keeper, { key: 'value2' })
895
902
 
896
- it "doesn't let the discarded element appear in a transition", (done) ->
897
- oldTextDuringTransition = undefined
898
- newTextDuringTransition = undefined
899
- transition = ($old, $new) ->
900
- oldTextDuringTransition = squish($old.text())
901
- newTextDuringTransition = squish($new.text())
902
- u.resolvedDeferred()
903
- $container = affix('.container')
904
- $container.html """
905
- <div class='foo'>old-foo</div>
906
- <div class='bar' up-keep>old-bar</div>
907
- """
908
- newHtml = """
909
- <div class='container'>
910
- <div class='foo'>new-foo</div>
911
- <div class='bar' up-keep>new-bar</div>
912
- </div>
913
- """
914
- promise = up.extract('.container', newHtml, transition: transition)
915
- promise.then ->
916
- expect(oldTextDuringTransition).toEqual('old-foo old-bar')
917
- expect(newTextDuringTransition).toEqual('new-foo old-bar')
918
- done()
903
+ describeCapability 'canCssTransition', ->
904
+
905
+ it "doesn't let the discarded element appear in a transition", (done) ->
906
+ oldTextDuringTransition = undefined
907
+ newTextDuringTransition = undefined
908
+ transition = ($old, $new) ->
909
+ oldTextDuringTransition = squish($old.text())
910
+ newTextDuringTransition = squish($new.text())
911
+ u.resolvedDeferred()
912
+ $container = affix('.container')
913
+ $container.html """
914
+ <div class='foo'>old-foo</div>
915
+ <div class='bar' up-keep>old-bar</div>
916
+ """
917
+ newHtml = """
918
+ <div class='container'>
919
+ <div class='foo'>new-foo</div>
920
+ <div class='bar' up-keep>new-bar</div>
921
+ </div>
922
+ """
923
+ promise = up.extract('.container', newHtml, transition: transition)
924
+ promise.then ->
925
+ expect(oldTextDuringTransition).toEqual('old-foo old-bar')
926
+ expect(newTextDuringTransition).toEqual('new-foo old-bar')
927
+ done()
919
928
 
920
929
  describe 'up.destroy', ->
921
930