[Web Animations] Compute the progress and currentIteration properties on getComputedT...
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Jan 2018 19:29:53 +0000 (19:29 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Jan 2018 19:29:53 +0000 (19:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=182039
<rdar://problem/36813568>

Reviewed by Dean Jackson.

Source/WebCore:

Compute the "progress" and "currentIteration" properties on the dictionary returned by getComputedTiming().
To support this we implement several procedures from the specification implemented separately with links
and steps copied from the specification. There is one last procedure we don't implement, which is to obtain
the transformed time following the application of the provided easing, which will be the next patch.

* animation/AnimationEffect.cpp:
(WebCore::AnimationEffect::phase const):
(WebCore::AnimationEffect::activeTime const):
(WebCore::AnimationEffect::overallProgress const):
(WebCore::AnimationEffect::simpleIterationProgress const):
(WebCore::AnimationEffect::currentIteration const):
(WebCore::AnimationEffect::currentDirection const):
(WebCore::AnimationEffect::directedProgress const):
(WebCore::AnimationEffect::iterationProgress const):
(WebCore::AnimationEffect::getComputedTiming):
* animation/AnimationEffect.h:

LayoutTests:

Update expectations with progressions as we expose more of the API.

* http/wpt/web-animations/interfaces/AnimationEffectTiming/delay-expected.txt:
* http/wpt/web-animations/interfaces/AnimationEffectTiming/easing-expected.txt:
* http/wpt/web-animations/interfaces/AnimationEffectTiming/iterationStart-expected.txt:
* http/wpt/web-animations/timing-model/animation-effects/active-time-expected.txt:
* http/wpt/web-animations/timing-model/animation-effects/current-iteration-expected.txt:
* http/wpt/web-animations/timing-model/animation-effects/phases-and-states-expected.txt:
* http/wpt/web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt:
* http/wpt/web-animations/timing-model/animations/set-the-target-effect-of-an-animation-expected.txt:
* http/wpt/web-animations/timing-model/time-transformations/transformed-progress-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@227534 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
LayoutTests/ChangeLog
LayoutTests/http/wpt/web-animations/interfaces/AnimationEffectTiming/delay-expected.txt
LayoutTests/http/wpt/web-animations/interfaces/AnimationEffectTiming/easing-expected.txt
LayoutTests/http/wpt/web-animations/interfaces/AnimationEffectTiming/iterationStart-expected.txt
LayoutTests/http/wpt/web-animations/timing-model/animation-effects/active-time-expected.txt
LayoutTests/http/wpt/web-animations/timing-model/animation-effects/current-iteration-expected.txt
LayoutTests/http/wpt/web-animations/timing-model/animation-effects/phases-and-states-expected.txt
LayoutTests/http/wpt/web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt
LayoutTests/http/wpt/web-animations/timing-model/animations/set-the-target-effect-of-an-animation-expected.txt
LayoutTests/http/wpt/web-animations/timing-model/time-transformations/transformed-progress-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/animation/AnimationEffect.cpp
Source/WebCore/animation/AnimationEffect.h

index 70807ef..8154cca 100644 (file)
@@ -1,3 +1,23 @@
+2018-01-24  Antoine Quint  <graouts@apple.com>
+
+        [Web Animations] Compute the progress and currentIteration properties on getComputedTiming()
+        https://bugs.webkit.org/show_bug.cgi?id=182039
+        <rdar://problem/36813568>
+
+        Reviewed by Dean Jackson.
+
+        Update expectations with progressions as we expose more of the API.
+
+        * http/wpt/web-animations/interfaces/AnimationEffectTiming/delay-expected.txt:
+        * http/wpt/web-animations/interfaces/AnimationEffectTiming/easing-expected.txt:
+        * http/wpt/web-animations/interfaces/AnimationEffectTiming/iterationStart-expected.txt:
+        * http/wpt/web-animations/timing-model/animation-effects/active-time-expected.txt:
+        * http/wpt/web-animations/timing-model/animation-effects/current-iteration-expected.txt:
+        * http/wpt/web-animations/timing-model/animation-effects/phases-and-states-expected.txt:
+        * http/wpt/web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt:
+        * http/wpt/web-animations/timing-model/animations/set-the-target-effect-of-an-animation-expected.txt:
+        * http/wpt/web-animations/timing-model/time-transformations/transformed-progress-expected.txt:
+
 2018-01-24  Daniel Bates  <dabates@apple.com>
 
         REGRESSION (r226138): Selecting a line that ends with zero-width joiner (ZWJ) may cause text transformation
index 9584706..dc79462 100644 (file)
@@ -3,7 +3,7 @@ PASS Test default value
 PASS set delay 100 
 PASS set delay -100 
 PASS Test adding a positive delay to an animation without a backwards fill makes it no longer active 
-FAIL Test seeking an animation by setting a negative delay assert_equals: expected (number) 0.5 but got (object) null
-FAIL Test finishing an animation using a large negative delay assert_equals: expected (number) 1 but got (object) null
+PASS Test seeking an animation by setting a negative delay 
+PASS Test finishing an animation using a large negative delay 
 PASS Setting invalid values should throw TypeError 
 
index b1a6a7b..7ab211e 100644 (file)
@@ -1,20 +1,20 @@
 
 PASS Test default value 
-FAIL step-start function assert_approx_equals: The progress of the animation should be approximately 1 at 0ms expected a number but got a "object"
-FAIL steps(1, start) function assert_approx_equals: The progress of the animation should be approximately 1 at 0ms expected a number but got a "object"
-FAIL steps(2, start) function assert_approx_equals: The progress of the animation should be approximately 0.5 at 0ms expected a number but got a "object"
-FAIL step-end function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL steps(1) function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL steps(1, end) function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL steps(2, end) function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL frames function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL linear function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL ease function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL ease-in function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL ease-in-out function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL ease-out function assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL easing function which produces values greater than 1 assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
-FAIL easing function which produces values less than 1 assert_approx_equals: The progress of the animation should be approximately 0 at 0ms expected a number but got a "object"
+FAIL step-start function assert_approx_equals: The progress of the animation should be approximately 1 at 0ms expected 1 +/- 0.01 but got 0
+FAIL steps(1, start) function assert_approx_equals: The progress of the animation should be approximately 1 at 0ms expected 1 +/- 0.01 but got 0
+FAIL steps(2, start) function assert_approx_equals: The progress of the animation should be approximately 0.5 at 0ms expected 0.5 +/- 0.01 but got 0
+FAIL step-end function assert_approx_equals: The progress of the animation should be approximately 0 at 250000ms expected 0 +/- 0.01 but got 0.25
+FAIL steps(1) function assert_approx_equals: The progress of the animation should be approximately 0 at 250000ms expected 0 +/- 0.01 but got 0.25
+FAIL steps(1, end) function assert_approx_equals: The progress of the animation should be approximately 0 at 250000ms expected 0 +/- 0.01 but got 0.25
+FAIL steps(2, end) function assert_approx_equals: The progress of the animation should be approximately 0 at 250000ms expected 0 +/- 0.01 but got 0.25
+PASS frames function 
+PASS linear function 
+FAIL ease function assert_approx_equals: The progress of the animation should be approximately 0.40851059137130497 at 250000ms expected 0.40851059137130497 +/- 0.01 but got 0.25
+FAIL ease-in function assert_approx_equals: The progress of the animation should be approximately 0.09346465078656778 at 250000ms expected 0.09346465078656778 +/- 0.01 but got 0.25
+FAIL ease-in-out function assert_approx_equals: The progress of the animation should be approximately 0.129161930735705 at 250000ms expected 0.129161930735705 +/- 0.01 but got 0.25
+FAIL ease-out function assert_approx_equals: The progress of the animation should be approximately 0.37813813135508706 at 250000ms expected 0.37813813135508706 +/- 0.01 but got 0.25
+FAIL easing function which produces values greater than 1 assert_approx_equals: The progress of the animation should be approximately 1.0240666638411384 at 250000ms expected 1.0240666638411384 +/- 0.01 but got 0.25
+FAIL easing function which produces values less than 1 assert_approx_equals: The progress of the animation should be approximately -0.29501119758965655 at 250000ms expected -0.29501119758965655 +/- 0.01 but got 0.25
 PASS Invalid effect easing value test: '' 
 PASS Invalid effect easing value test: '7' 
 PASS Invalid effect easing value test: 'test' 
@@ -53,5 +53,5 @@ PASS Canonical easing 'cubic-bezier(0.1, 5, 0.23, 0)' is returned as set
 PASS Canonical easing 'steps(3, start)' is returned as set 
 PASS Canonical easing 'steps(3)' is returned as set 
 PASS Canonical easing 'frames(3)' is returned as set 
-FAIL Change the easing while the animation is running assert_equals: easing replace to steps(2, end) at before phase expected (number) 0 but got (object) null
+FAIL Change the easing while the animation is running assert_equals: change currentTime to active phase expected 0.5 but got 0.75
 
index 684df29..ecb11eb 100644 (file)
@@ -1,7 +1,7 @@
 
 PASS Test default value 
-FAIL Test that changing the iterationStart affects computed timing when backwards-filling assert_approx_equals: expected a number but got a "object"
-FAIL Test that changing the iterationStart affects computed timing during the active phase assert_approx_equals: expected a number but got a "object"
-FAIL Test that changing the iterationStart affects computed timing when forwards-filling assert_approx_equals: expected a number but got a "object"
+PASS Test that changing the iterationStart affects computed timing when backwards-filling 
+PASS Test that changing the iterationStart affects computed timing during the active phase 
+PASS Test that changing the iterationStart affects computed timing when forwards-filling 
 PASS Using invalid values should throw TypeError 
 
index d9e0fdf..a1efa46 100644 (file)
@@ -1,16 +1,16 @@
 
-FAIL Active time in before phase assert_equals: Progress in before phase when using 'backwards' fill expected (number) 0 but got (object) null
-FAIL Active time in active phase and no start delay is the local time assert_approx_equals: expected a number but got a "object"
-FAIL Active time in active phase and positive start delay is the local time minus the start delay assert_approx_equals: expected a number but got a "object"
-FAIL Active time in active phase and negative start delay is the local time minus the start delay assert_approx_equals: expected a number but got a "object"
+PASS Active time in before phase 
+PASS Active time in active phase and no start delay is the local time 
+PASS Active time in active phase and positive start delay is the local time minus the start delay 
+PASS Active time in active phase and negative start delay is the local time minus the start delay 
 PASS Active time in after phase with no fill is unresolved 
 PASS Active time in after phase with backwards-only fill is unresolved 
-FAIL Active time in after phase with forwards fill is the active duration assert_equals: expected (number) 2 but got (object) null
-FAIL Active time in after phase with forwards fill, zero-duration, and  infinite iteration count is the active duration assert_equals: expected (number) Infinity but got (object) null
-FAIL Active time in after phase with forwards fill and positive end delay is the active duration assert_equals: expected (number) 2 but got (object) null
-FAIL Active time in after phase with forwards fill and negative end delay is the active duration + end delay assert_equals: expected (number) 1 but got (object) null
-FAIL Active time in after phase with forwards fill and negative end delay greater in magnitude than the active duration is zero assert_equals: expected (number) 0 but got (object) null
-FAIL Active time in after phase with forwards fill and negative end delay greater in magnitude than the sum of the active duration and start delay is zero assert_equals: expected (number) 0 but got (object) null
-FAIL Active time in after phase with 'both' fill is the active duration assert_equals: expected (number) 2 but got (object) null
+PASS Active time in after phase with forwards fill is the active duration 
+PASS Active time in after phase with forwards fill, zero-duration, and  infinite iteration count is the active duration 
+PASS Active time in after phase with forwards fill and positive end delay is the active duration 
+PASS Active time in after phase with forwards fill and negative end delay is the active duration + end delay 
+PASS Active time in after phase with forwards fill and negative end delay greater in magnitude than the active duration is zero 
+PASS Active time in after phase with forwards fill and negative end delay greater in magnitude than the sum of the active duration and start delay is zero 
+PASS Active time in after phase with 'both' fill is the active duration 
 PASS Active time when the local time is unresolved, is unresolved 
 
index 2d2babd..7a22c39 100644 (file)
@@ -1,53 +1,53 @@
 
 PASS Test currentIteration during before and after phase when fill is none 
-FAIL Test zero iterations: iterations:0 iterationStart:0 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:0 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:0 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:2.5 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:2.5 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:2.5 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:3 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:3 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test zero iterations: iterations:0 iterationStart:3 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:0 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:0 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:0 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:2.5 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:2.5 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:2.5 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:3 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:3 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test integer iterations: iterations:3 iterationStart:3 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:0 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:0 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:0 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:3 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:3 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test fractional iterations: iterations:3.5 iterationStart:3 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:0 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:0 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:0 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:3 duration:0 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:3 duration:100 delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test infinity iterations: iterations:Infinity iterationStart:3 duration:Infinity delay:1 fill:both assert_equals: Value of currentIteration in the before phase expected (number) 3 but got (object) null
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:50 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:-50 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:-100 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:-200 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:50 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-50 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-100 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: iterations:2 duration:100 delay:1 fill:both endDelay:-100 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-50 assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-100 assert_equals: Value of currentIteration in the before phase expected (number) 2 but got (object) null
-FAIL Test negative playback rate: duration:1 delay:1 fill:both playbackRate:-1 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test negative playback rate: duration:1 delay:1 iterations:2 fill:both playbackRate:-1 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test negative playback rate: duration:0 delay:1 fill:both playbackRate:-1 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
-FAIL Test negative playback rate: duration:0 iterations:0 delay:1 fill:both playbackRate:-1 assert_equals: Value of currentIteration in the before phase expected (number) 0 but got (object) null
+PASS Test zero iterations: iterations:0 iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:50 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:-50 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:-100 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:-200 
+PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:50 
+PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-50 
+PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-100 
+PASS Test end delay: iterations:2 duration:100 delay:1 fill:both endDelay:-100 
+PASS Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-50 
+PASS Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-100 
+PASS Test negative playback rate: duration:1 delay:1 fill:both playbackRate:-1 
+PASS Test negative playback rate: duration:1 delay:1 iterations:2 fill:both playbackRate:-1 
+PASS Test negative playback rate: duration:0 delay:1 fill:both playbackRate:-1 
+PASS Test negative playback rate: duration:0 iterations:0 delay:1 fill:both playbackRate:-1 
 
index 284e03a..4f5d496 100644 (file)
@@ -1,13 +1,13 @@
 
-FAIL Phase calculation for a simple animation effect assert_not_equals: Animation effect is in before phase when current time is -1ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a positive start delay assert_not_equals: Animation effect is in before phase when current time is 0ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a negative start delay assert_not_equals: Animation effect is in before phase when current time is -2ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a positive end delay assert_not_equals: Animation effect is in before phase when current time is -1ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a negative end delay lesser in magnitude than the active duration assert_not_equals: Animation effect is in before phase when current time is -1ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a negative end delay equal in magnitude to the active duration assert_not_equals: Animation effect is in before phase when current time is -1ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a negative end delay greater in magnitude than the active duration assert_not_equals: Animation effect is in before phase when current time is -2ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a positive start delay and a negative end delay lesser in magnitude than the active duration assert_not_equals: Animation effect is in before phase when current time is 0ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a negative start delay and a negative end delay equal in magnitude to the active duration assert_not_equals: Animation effect is in before phase when current time is -2ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for an animation effect with a negative start delay and a negative end delay equal greater in magnitude than the active duration assert_not_equals: Animation effect is in before phase when current time is -3ms (progress is non-null with appropriate fill mode) got disallowed value null
-FAIL Phase calculation for a simple animation effect with negative playback rate assert_not_equals: Animation effect is in before phase when current time is -1ms (progress is non-null with appropriate fill mode) got disallowed value null
+PASS Phase calculation for a simple animation effect 
+PASS Phase calculation for an animation effect with a positive start delay 
+PASS Phase calculation for an animation effect with a negative start delay 
+PASS Phase calculation for an animation effect with a positive end delay 
+PASS Phase calculation for an animation effect with a negative end delay lesser in magnitude than the active duration 
+PASS Phase calculation for an animation effect with a negative end delay equal in magnitude to the active duration 
+PASS Phase calculation for an animation effect with a negative end delay greater in magnitude than the active duration 
+PASS Phase calculation for an animation effect with a positive start delay and a negative end delay lesser in magnitude than the active duration 
+PASS Phase calculation for an animation effect with a negative start delay and a negative end delay equal in magnitude to the active duration 
+PASS Phase calculation for an animation effect with a negative start delay and a negative end delay equal greater in magnitude than the active duration 
+PASS Phase calculation for a simple animation effect with negative playback rate 
 
index c18dc54..29ff9f0 100644 (file)
@@ -1,51 +1,51 @@
 
-FAIL Test zero iterations: iterations:0 iterationStart:0 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:0 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:0 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:2.5 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:2.5 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:2.5 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:3 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:3 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test zero iterations: iterations:0 iterationStart:3 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:0 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:0 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:0 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:2.5 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:2.5 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:2.5 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:3 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:3 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test integer iterations: iterations:3 iterationStart:3 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:0 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:0 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:0 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:3 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:3 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test fractional iterations: iterations:3.5 iterationStart:3 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:0 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:0 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:0 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:3 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:3 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test infinity iterations: iterations:Infinity iterationStart:3 duration:Infinity delay:1 fill:both assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:50 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:-50 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: duration:100 delay:1 fill:both endDelay:-200 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:50 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-50 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: iterations:2 duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-50 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test negative playback rate: duration:1 delay:1 fill:both playbackRate:-1 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test negative playback rate: duration:0 delay:1 fill:both playbackRate:-1 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
-FAIL Test negative playback rate: duration:0 iterations:0 delay:1 fill:both playbackRate:-1 assert_approx_equals: Value of progress in the before phase expected a number but got a "object"
+PASS Test zero iterations: iterations:0 iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test zero iterations: iterations:0 iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test integer iterations: iterations:3 iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:0 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:100 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:Infinity delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:0 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:100 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:Infinity delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:3 duration:0 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:3 duration:100 delay:1 fill:both 
+PASS Test infinity iterations: iterations:Infinity iterationStart:3 duration:Infinity delay:1 fill:both 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:50 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:-50 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:-100 
+PASS Test end delay: duration:100 delay:1 fill:both endDelay:-200 
+PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:50 
+PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-50 
+PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-100 
+PASS Test end delay: iterations:2 duration:100 delay:1 fill:both endDelay:-100 
+PASS Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-50 
+PASS Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-100 
+PASS Test negative playback rate: duration:1 delay:1 fill:both playbackRate:-1 
+PASS Test negative playback rate: duration:0 delay:1 fill:both playbackRate:-1 
+PASS Test negative playback rate: duration:0 iterations:0 delay:1 fill:both playbackRate:-1 
 
index da132d2..4090b39 100644 (file)
@@ -3,5 +3,5 @@ FAIL If new effect is null and old effect is not null, we reset the pending task
 FAIL If animation has a pending pause task, reschedule that task to run as soon as animation is ready. assert_equals: expected "pending" but got "paused"
 FAIL If animation has a pending play task, reschedule that task to run as soon as animation is ready to play new effect. assert_equals: expected "pending" but got "finished"
 PASS When setting the effect of an animation to the effect of an existing animation, the existing animation's target effect should be set to null. 
-FAIL After setting the target effect of animation to the target effect of an existing animation, the target effect's timing is updated to reflect the current time of the new animation. assert_equals: Original timing comes from first animation expected (number) 0.5 but got (object) null
+PASS After setting the target effect of animation to the target effect of an existing animation, the target effect's timing is updated to reflect the current time of the new animation. 
 
index 41015d8..f61349c 100644 (file)
@@ -1,30 +1,30 @@
 
-FAIL Transformed progress for step-start function assert_approx_equals: The progress should be approximately 1 at 0ms expected a number but got a "object"
-FAIL Transformed progress for steps(1, start) function assert_approx_equals: The progress should be approximately 1 at 0ms expected a number but got a "object"
-FAIL Transformed progress for steps(2, start) function assert_approx_equals: The progress should be approximately 0.5 at 0ms expected a number but got a "object"
-FAIL Transformed progress for step-end function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for steps(1) function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for steps(1, end) function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for steps(2, end) function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for frames function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for linear function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for ease function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for ease-in function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for ease-in-out function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for ease-out function assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for easing function which produces values greater than 1 assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Transformed progress for easing function which produces values less than 1 assert_approx_equals: The progress should be approximately 0 at 0ms expected a number but got a "object"
-FAIL Test bounds point of step-start easing assert_equals: Progress at 0ms expected (number) 0 but got (object) null
-FAIL Test bounds point of step-start easing with reverse direction assert_equals: Progress at 0ms expected (number) 1 but got (object) null
-FAIL Test bounds point of step-start easing with iterationStart not at a transition point assert_equals: Progress at 0ms expected (number) 0.5 but got (object) null
-FAIL Test bounds point of step-start easing with iterationStart and delay assert_equals: Progress at 0ms expected (number) 0.5 but got (object) null
-FAIL Test bounds point of step-start easing with iterationStart and reverse direction assert_equals: Progress at 0ms expected (number) 1 but got (object) null
-FAIL Test bounds point of step(4, start) easing with iterationStart 0.75 and delay assert_equals: Progress at 0ms expected (number) 0.75 but got (object) null
-FAIL Test bounds point of step-start easing with alternate direction assert_equals: Progress at 0ms expected (number) 1 but got (object) null
-FAIL Test bounds point of step-start easing with alternate-reverse direction assert_equals: Progress at 0ms expected (number) 1 but got (object) null
-FAIL Test bounds point of step-end easing assert_equals: Progress at 0ms expected (number) 0 but got (object) null
-FAIL Test bounds point of step-end easing with iterationStart and delay assert_equals: Progress at 0ms expected (number) 0 but got (object) null
-FAIL Test bounds point of step-end easing with iterationStart not at a transition point assert_equals: Progress at 0ms expected (number) 0.5 but got (object) null
-FAIL Test bounds point of frames easing assert_equals: Progress at 0ms expected (number) 0 but got (object) null
-FAIL Test bounds point of frames easing with iterationStart and delay assert_equals: Progress at 0ms expected (number) 1 but got (object) null
+FAIL Transformed progress for step-start function assert_approx_equals: The progress should be approximately 1 at 0ms expected 1 +/- 0.01 but got 0
+FAIL Transformed progress for steps(1, start) function assert_approx_equals: The progress should be approximately 1 at 0ms expected 1 +/- 0.01 but got 0
+FAIL Transformed progress for steps(2, start) function assert_approx_equals: The progress should be approximately 0.5 at 0ms expected 0.5 +/- 0.01 but got 0
+FAIL Transformed progress for step-end function assert_approx_equals: The progress should be approximately 0 at 250ms expected 0 +/- 0.01 but got 0.25
+FAIL Transformed progress for steps(1) function assert_approx_equals: The progress should be approximately 0 at 250ms expected 0 +/- 0.01 but got 0.25
+FAIL Transformed progress for steps(1, end) function assert_approx_equals: The progress should be approximately 0 at 250ms expected 0 +/- 0.01 but got 0.25
+FAIL Transformed progress for steps(2, end) function assert_approx_equals: The progress should be approximately 0 at 250ms expected 0 +/- 0.01 but got 0.25
+PASS Transformed progress for frames function 
+PASS Transformed progress for linear function 
+FAIL Transformed progress for ease function assert_approx_equals: The progress should be approximately 0.40851059137130497 at 250ms expected 0.40851059137130497 +/- 0.01 but got 0.25
+FAIL Transformed progress for ease-in function assert_approx_equals: The progress should be approximately 0.09346465078656778 at 250ms expected 0.09346465078656778 +/- 0.01 but got 0.25
+FAIL Transformed progress for ease-in-out function assert_approx_equals: The progress should be approximately 0.129161930735705 at 250ms expected 0.129161930735705 +/- 0.01 but got 0.25
+FAIL Transformed progress for ease-out function assert_approx_equals: The progress should be approximately 0.37813813135508706 at 250ms expected 0.37813813135508706 +/- 0.01 but got 0.25
+FAIL Transformed progress for easing function which produces values greater than 1 assert_approx_equals: The progress should be approximately 1.0240666638411384 at 250ms expected 1.0240666638411384 +/- 0.01 but got 0.25
+FAIL Transformed progress for easing function which produces values less than 1 assert_approx_equals: The progress should be approximately -0.29501119758965655 at 250ms expected -0.29501119758965655 +/- 0.01 but got 0.25
+FAIL Test bounds point of step-start easing assert_equals: Progress at 1000ms expected 0.5 but got 0
+FAIL Test bounds point of step-start easing with reverse direction assert_equals: Progress at 1001ms expected 1 but got 0.999
+FAIL Test bounds point of step-start easing with iterationStart not at a transition point assert_equals: Progress at 0ms expected 0.5 but got 0.25
+FAIL Test bounds point of step-start easing with iterationStart and delay assert_equals: Progress at 1000ms expected 1 but got 0.5
+FAIL Test bounds point of step-start easing with iterationStart and reverse direction assert_equals: Progress at 0ms expected 1 but got 0.5
+FAIL Test bounds point of step(4, start) easing with iterationStart 0.75 and delay assert_equals: Progress at 1000ms expected 1 but got 0.75
+FAIL Test bounds point of step-start easing with alternate direction assert_equals: Progress at 0ms expected 1 but got 0.5
+FAIL Test bounds point of step-start easing with alternate-reverse direction assert_equals: Progress at 0ms expected 1 but got 0.5
+FAIL Test bounds point of step-end easing assert_equals: Progress at 1499ms expected 0 but got 0.499
+FAIL Test bounds point of step-end easing with iterationStart and delay assert_equals: Progress at 0ms expected 0 but got 0.5
+FAIL Test bounds point of step-end easing with iterationStart not at a transition point assert_equals: Progress at 0ms expected 0.5 but got 0.75
+FAIL Test bounds point of frames easing assert_equals: Progress at 1499ms expected 0 but got 0.499
+FAIL Test bounds point of frames easing with iterationStart and delay assert_equals: Progress at 0ms expected 1 but got 0.5
 
index e7a7479..e9f2c42 100644 (file)
@@ -1,3 +1,28 @@
+2018-01-24  Antoine Quint  <graouts@apple.com>
+
+        [Web Animations] Compute the progress and currentIteration properties on getComputedTiming()
+        https://bugs.webkit.org/show_bug.cgi?id=182039
+        <rdar://problem/36813568>
+
+        Reviewed by Dean Jackson.
+
+        Compute the "progress" and "currentIteration" properties on the dictionary returned by getComputedTiming().
+        To support this we implement several procedures from the specification implemented separately with links
+        and steps copied from the specification. There is one last procedure we don't implement, which is to obtain
+        the transformed time following the application of the provided easing, which will be the next patch.
+
+        * animation/AnimationEffect.cpp:
+        (WebCore::AnimationEffect::phase const):
+        (WebCore::AnimationEffect::activeTime const):
+        (WebCore::AnimationEffect::overallProgress const):
+        (WebCore::AnimationEffect::simpleIterationProgress const):
+        (WebCore::AnimationEffect::currentIteration const):
+        (WebCore::AnimationEffect::currentDirection const):
+        (WebCore::AnimationEffect::directedProgress const):
+        (WebCore::AnimationEffect::iterationProgress const):
+        (WebCore::AnimationEffect::getComputedTiming):
+        * animation/AnimationEffect.h:
+
 2018-01-24  Daniel Bates  <dabates@apple.com>
 
         REGRESSION (r226138): Selecting a line that ends with zero-width joiner (ZWJ) may cause text transformation
index 9af17a8..30e2798 100644 (file)
@@ -33,6 +33,8 @@
 
 namespace WebCore {
 
+const auto timeEpsilon = Seconds::fromMilliseconds(0.001);
+
 AnimationEffect::AnimationEffect(ClassType classType)
     : m_classType(classType)
 {
@@ -46,6 +48,222 @@ std::optional<Seconds> AnimationEffect::localTime() const
     return std::nullopt;
 }
 
+auto AnimationEffect::phase() const -> Phase
+{
+    // 3.5.5. Animation effect phases and states
+    // https://drafts.csswg.org/web-animations-1/#animation-effect-phases-and-states
+
+    bool animationIsBackwards = m_animation && m_animation->playbackRate() < 0;
+    auto beforeActiveBoundaryTime = std::max(std::min(m_timing->delay(), m_timing->endTime()), 0_s);
+    auto activeAfterBoundaryTime = std::max(std::min(m_timing->delay() + m_timing->activeDuration(), m_timing->endTime()), 0_s);
+
+    // (This should be the last statement, but it's more efficient to cache the local time and return right away if it's not resolved.)
+    // Furthermore, it is often convenient to refer to the case when an animation effect is in none of the above phases
+    // as being in the idle phase.
+    auto effectLocalTime = localTime();
+    if (!effectLocalTime)
+        return Phase::Idle;
+
+    auto localTimeValue = effectLocalTime.value();
+
+    // An animation effect is in the before phase if the animation effect’s local time is not unresolved and
+    // either of the following conditions are met:
+    //     1. the local time is less than the before-active boundary time, or
+    //     2. the animation direction is ‘backwards’ and the local time is equal to the before-active boundary time.
+    if ((localTimeValue + timeEpsilon) < beforeActiveBoundaryTime || (animationIsBackwards && std::abs(localTimeValue.microseconds() - beforeActiveBoundaryTime.microseconds()) < timeEpsilon.microseconds()))
+        return Phase::Before;
+
+    // An animation effect is in the after phase if the animation effect’s local time is not unresolved and
+    // either of the following conditions are met:
+    //     1. the local time is greater than the active-after boundary time, or
+    //     2. the animation direction is ‘forwards’ and the local time is equal to the active-after boundary time.
+    if ((localTimeValue - timeEpsilon) > activeAfterBoundaryTime || (!animationIsBackwards && std::abs(localTimeValue.microseconds() - activeAfterBoundaryTime.microseconds()) < timeEpsilon.microseconds()))
+        return Phase::After;
+
+    // An animation effect is in the active phase if the animation effect’s local time is not unresolved and it is not
+    // in either the before phase nor the after phase.
+    // (No need to check, we've already established that local time was resolved).
+    return Phase::Active;
+}
+
+std::optional<Seconds> AnimationEffect::activeTime() const
+{
+    // 3.8.3.1. Calculating the active time
+    // https://drafts.csswg.org/web-animations-1/#calculating-the-active-time
+
+    // The active time is based on the local time and start delay. However, it is only defined
+    // when the animation effect should produce an output and hence depends on its fill mode
+    // and phase as follows,
+
+    auto effectPhase = phase();
+
+    // If the animation effect is in the before phase, the result depends on the first matching
+    // condition from the following,
+    if (effectPhase == Phase::Before) {
+        // If the fill mode is backwards or both, return the result of evaluating
+        // max(local time - start delay, 0).
+        if (m_timing->fill() == FillMode::Backwards || m_timing->fill() == FillMode::Both)
+            return std::max(localTime().value() - m_timing->delay(), 0_s);
+        // Otherwise, return an unresolved time value.
+        return std::nullopt;
+    }
+
+    // If the animation effect is in the active phase, return the result of evaluating local time - start delay.
+    if (effectPhase == Phase::Active)
+        return localTime().value() - m_timing->delay();
+
+    // If the animation effect is in the after phase, the result depends on the first matching
+    // condition from the following,
+    if (effectPhase == Phase::After) {
+        // If the fill mode is forwards or both, return the result of evaluating
+        // max(min(local time - start delay, active duration), 0).
+        if (m_timing->fill() == FillMode::Forwards || m_timing->fill() == FillMode::Both)
+            return std::max(std::min(localTime().value() - m_timing->delay(), m_timing->activeDuration()), 0_s);
+        // Otherwise, return an unresolved time value.
+        return std::nullopt;
+    }
+
+    // Otherwise (the local time is unresolved), return an unresolved time value.
+    return std::nullopt;
+}
+
+std::optional<double> AnimationEffect::overallProgress() const
+{
+    // 3.8.3.2. Calculating the overall progress
+    // https://drafts.csswg.org/web-animations-1/#calculating-the-overall-progress
+
+    // The overall progress describes the number of iterations that have completed (including partial iterations) and is defined as follows:
+
+    // 1. If the active time is unresolved, return unresolved.
+    auto effectActiveTime = activeTime();
+    if (!effectActiveTime)
+        return std::nullopt;
+
+    // 2. Calculate an initial value for overall progress based on the first matching condition from below,
+    double overallProgress;
+
+    if (!m_timing->iterationDuration()) {
+        // If the iteration duration is zero, if the animation effect is in the before phase, let overall progress be zero,
+        // otherwise, let it be equal to the iteration count.
+        overallProgress = phase() == Phase::Before ? 0 : m_timing->iterations();
+    } else {
+        // Otherwise, let overall progress be the result of calculating active time / iteration duration.
+        overallProgress = secondsToWebAnimationsAPITime(effectActiveTime.value()) / secondsToWebAnimationsAPITime(m_timing->iterationDuration());
+    }
+
+    // 3. Return the result of calculating overall progress + iteration start.
+    overallProgress += m_timing->iterationStart();
+    return std::abs(overallProgress);
+}
+
+std::optional<double> AnimationEffect::simpleIterationProgress() const
+{
+    // 3.8.3.3. Calculating the simple iteration progress
+    // https://drafts.csswg.org/web-animations-1/#calculating-the-simple-iteration-progress
+
+    // The simple iteration progress is a fraction of the progress through the current iteration that
+    // ignores transformations to the time introduced by the playback direction or timing functions
+    // applied to the effect, and is calculated as follows:
+
+    // 1. If the overall progress is unresolved, return unresolved.
+    auto effectOverallProgress = overallProgress();
+    if (!effectOverallProgress)
+        return std::nullopt;
+
+    // 2. If overall progress is infinity, let the simple iteration progress be iteration start % 1.0,
+    // otherwise, let the simple iteration progress be overall progress % 1.0.
+    double overallProgressValue = effectOverallProgress.value();
+    double simpleIterationProgress = std::isinf(overallProgressValue) ? fmod(m_timing->iterationStart(), 1) : fmod(overallProgressValue, 1);
+
+    // 3. If all of the following conditions are true,
+    //
+    // the simple iteration progress calculated above is zero, and
+    // the animation effect is in the active phase or the after phase, and
+    // the active time is equal to the active duration, and
+    // the iteration count is not equal to zero.
+    // let the simple iteration progress be 1.0.
+    auto effectPhase = phase();
+    if (!simpleIterationProgress && (effectPhase == Phase::Active || effectPhase == Phase::After) && std::abs(activeTime().value().microseconds() - m_timing->activeDuration().microseconds()) < timeEpsilon.microseconds() && m_timing->iterations())
+        return 1;
+
+    return simpleIterationProgress;
+}
+
+std::optional<double> AnimationEffect::currentIteration() const
+{
+    // 3.8.4. Calculating the current iteration
+    // https://drafts.csswg.org/web-animations-1/#calculating-the-current-iteration
+
+    // The current iteration can be calculated using the following steps:
+
+    // 1. If the active time is unresolved, return unresolved.
+    if (!activeTime())
+        return std::nullopt;
+
+    // 2. If the animation effect is in the after phase and the iteration count is infinity, return infinity.
+    if (phase() == Phase::After && std::isinf(m_timing->iterations()))
+        return std::numeric_limits<double>::infinity();
+
+    // 3. If the simple iteration progress is 1.0, return floor(overall progress) - 1.
+    if (simpleIterationProgress().value() == 1)
+        return floor(overallProgress().value()) - 1;
+
+    // 4. Otherwise, return floor(overall progress).
+    return floor(overallProgress().value());
+}
+
+AnimationEffect::ComputedDirection AnimationEffect::currentDirection() const
+{
+    // 3.9.1. Calculating the directed progress
+    // https://drafts.csswg.org/web-animations-1/#calculating-the-directed-progress
+
+    // If playback direction is normal, let the current direction be forwards.
+    if (m_timing->direction() == PlaybackDirection::Normal)
+        return AnimationEffect::ComputedDirection::Forwards;
+    
+    // If playback direction is reverse, let the current direction be reverse.
+    if (m_timing->direction() == PlaybackDirection::Reverse)
+        return AnimationEffect::ComputedDirection::Reverse;
+    
+    // Otherwise, let d be the current iteration.
+    auto d = currentIteration().value();
+    // If playback direction is alternate-reverse increment d by 1.
+    if (m_timing->direction() == PlaybackDirection::AlternateReverse)
+        d++;
+    // If d % 2 == 0, let the current direction be forwards, otherwise let the current direction be reverse.
+    // If d is infinity, let the current direction be forwards.
+    if (std::isinf(d) || !fmod(d, 2))
+        return AnimationEffect::ComputedDirection::Forwards;
+    return AnimationEffect::ComputedDirection::Reverse;
+}
+
+std::optional<double> AnimationEffect::directedProgress() const
+{
+    // 3.9.1. Calculating the directed progress
+    // https://drafts.csswg.org/web-animations-1/#calculating-the-directed-progress
+
+    // The directed progress is calculated from the simple iteration progress using the following steps:
+
+    // 1. If the simple iteration progress is unresolved, return unresolved.
+    auto effectSimpleIterationProgress = simpleIterationProgress();
+    if (!effectSimpleIterationProgress)
+        return std::nullopt;
+
+    // 2. Calculate the current direction (we implement this as a separate method).
+
+    // 3. If the current direction is forwards then return the simple iteration progress.
+    if (currentDirection() == AnimationEffect::ComputedDirection::Forwards)
+        return effectSimpleIterationProgress.value();
+
+    // Otherwise, return 1.0 - simple iteration progress.
+    return 1 - effectSimpleIterationProgress.value();
+}
+
+std::optional<double> AnimationEffect::iterationProgress() const
+{
+    return directedProgress();
+}
+
 ComputedTimingProperties AnimationEffect::getComputedTiming()
 {
     ComputedTimingProperties computedTiming;
@@ -62,6 +280,8 @@ ComputedTimingProperties AnimationEffect::getComputedTiming()
     computedTiming.activeDuration = secondsToWebAnimationsAPITime(m_timing->activeDuration());
     if (auto effectLocalTime = localTime())
         computedTiming.localTime = secondsToWebAnimationsAPITime(effectLocalTime.value());
+    computedTiming.progress = iterationProgress();
+    computedTiming.currentIteration = currentIteration();
     return computedTiming;
 }
 
index 03d3536..d8f177d 100644 (file)
@@ -48,6 +48,11 @@ public:
     void setAnimation(RefPtr<WebAnimation>&& animation) { m_animation = animation; }
 
     std::optional<Seconds> localTime() const;
+    std::optional<Seconds> activeTime() const;
+    std::optional<double> iterationProgress() const;
+
+    enum class Phase { Before, Active, After, Idle };
+    Phase phase() const;
 
 protected:
     enum ClassType {
@@ -59,6 +64,14 @@ protected:
     explicit AnimationEffect(ClassType);
 
 private:
+    enum class ComputedDirection { Forwards, Reverse };
+
+    std::optional<double> overallProgress() const;
+    std::optional<double> simpleIterationProgress() const;
+    std::optional<double> currentIteration() const;
+    AnimationEffect::ComputedDirection currentDirection() const;
+    std::optional<double> directedProgress() const;
+
     ClassType m_classType;
     RefPtr<WebAnimation> m_animation;
     RefPtr<AnimationEffectTiming> m_timing;