Title: [228537] trunk
Revision
228537
Author
[email protected]
Date
2018-02-15 15:33:44 -0800 (Thu, 15 Feb 2018)

Log Message

[Web Animations] Ensure that changing the timing model updates styles synchronously
https://bugs.webkit.org/show_bug.cgi?id=182836

Reviewed by Dean Jackson.

LayoutTests/imported/w3c:

Update test expectations for progressions.

* web-platform-tests/css-timing-1/cubic-bezier-timing-functions-output-expected.txt:
* web-platform-tests/css-timing-1/frames-timing-functions-output-expected.txt:
* web-platform-tests/css-timing-1/step-timing-functions-output-expected.txt:
* web-platform-tests/css/css-multicol/multicol-gap-animation-001-expected.txt:
* web-platform-tests/web-animations/animation-model/animation-types/discrete-expected.txt:
* web-platform-tests/web-animations/animation-model/animation-types/visibility-expected.txt:
* web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-iteration-composite-operation-expected.txt:
* web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-transformed-distance-expected.txt:
* web-platform-tests/web-animations/interfaces/Animation/cancel-expected.txt:
* web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite-expected.txt:

Source/WebCore:

We did not invalidate the timing model when properties of an effect's timing object changed
and even when we did invalidate the timing model, we did not update styles on effect targets
synchronously, only scheduling such updates for the next animation frame.

In this patch we expose the effect on the timing object such that changing timing properties
can notify the effect of a change in the timing model, which can then be forwarded to the
animation (which already informs its timeline, if any).

Additionally, when an animation's timing model has changed, we now invalidate the effect, which
will update styles synchronously.

This produces a number of progressions in WPT tests.

* animation/AnimationEffectReadOnly.cpp:
(WebCore::AnimationEffectReadOnly::AnimationEffectReadOnly): Set the timing object's effect upon
effect construction.
(WebCore::AnimationEffectReadOnly::~AnimationEffectReadOnly): Set the timing object's effect to
null upon effect destruction.
(WebCore::AnimationEffectReadOnly::timingDidChange): Notify the animation (if any) that its timing
model changed following a change in the timing properties.
* animation/AnimationEffectReadOnly.h: Add a new virtual invalidate() method that subclasses can
override to implement invalidation behavior when the animation finds out its timing model changed.
* animation/AnimationEffectTimingReadOnly.cpp: Notify the effect when a property changes such
that it may notify its animation of a timing model change.
(WebCore::AnimationEffectTimingReadOnly::propertyDidChange):
(WebCore::AnimationEffectTimingReadOnly::setIterationStart):
(WebCore::AnimationEffectTimingReadOnly::setIterations):
(WebCore::AnimationEffectTimingReadOnly::setBindingsDuration):
(WebCore::AnimationEffectTimingReadOnly::setEasing):
(WebCore::AnimationEffectTimingReadOnly::setDelay):
(WebCore::AnimationEffectTimingReadOnly::setEndDelay):
(WebCore::AnimationEffectTimingReadOnly::setFill):
(WebCore::AnimationEffectTimingReadOnly::setIterationDuration):
(WebCore::AnimationEffectTimingReadOnly::setDirection):
* animation/AnimationEffectTimingReadOnly.h:
(WebCore::AnimationEffectTimingReadOnly::setEffect):
(WebCore::AnimationEffectTimingReadOnly::setBindingsDelay):
(WebCore::AnimationEffectTimingReadOnly::setBindingsEndDelay):
(WebCore::AnimationEffectTimingReadOnly::setDelay): Deleted.
(WebCore::AnimationEffectTimingReadOnly::setEndDelay): Deleted.
(WebCore::AnimationEffectTimingReadOnly::setFill): Deleted.
(WebCore::AnimationEffectTimingReadOnly::setIterationDuration): Deleted.
(WebCore::AnimationEffectTimingReadOnly::setDirection): Deleted.
* animation/AnimationTimeline.cpp: Rename animationTimingModelDidChange() to timingModelDidChange()
to align it with the new WebAnimation::timingModelDidChange() method.
(WebCore::AnimationTimeline::addAnimation):
(WebCore::AnimationTimeline::removeAnimation):
(WebCore::AnimationTimeline::setCurrentTime):
* animation/AnimationTimeline.h:
(WebCore::AnimationTimeline::timingModelDidChange):
(WebCore::AnimationTimeline::animationTimingModelDidChange): Deleted.
* animation/DocumentTimeline.cpp:
(WebCore::DocumentTimeline::timingModelDidChange):
(WebCore::DocumentTimeline::updateAnimations):
(WebCore::DocumentTimeline::animationTimingModelDidChange): Deleted.
* animation/DocumentTimeline.h:
* animation/KeyframeEffectReadOnly.cpp:
(WebCore::KeyframeEffectReadOnly::invalidate): Override the invalidate() method to perform a synchronous
style update in order to ensure that timing properties are accounted for right as they change.
* animation/KeyframeEffectReadOnly.h:
* animation/WebAnimation.cpp:
(WebCore::WebAnimation::timingModelDidChange): Invalidate the effect and notify the timeline of a timing
model change when an animation is notified that its timing model has changed.
(WebCore::WebAnimation::setStartTime):
* animation/WebAnimation.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,3 +1,23 @@
+2018-02-15  Antoine Quint  <[email protected]>
+
+        [Web Animations] Ensure that changing the timing model updates styles synchronously
+        https://bugs.webkit.org/show_bug.cgi?id=182836
+
+        Reviewed by Dean Jackson.
+
+        Update test expectations for progressions.
+
+        * web-platform-tests/css-timing-1/cubic-bezier-timing-functions-output-expected.txt:
+        * web-platform-tests/css-timing-1/frames-timing-functions-output-expected.txt:
+        * web-platform-tests/css-timing-1/step-timing-functions-output-expected.txt:
+        * web-platform-tests/css/css-multicol/multicol-gap-animation-001-expected.txt:
+        * web-platform-tests/web-animations/animation-model/animation-types/discrete-expected.txt:
+        * web-platform-tests/web-animations/animation-model/animation-types/visibility-expected.txt:
+        * web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-iteration-composite-operation-expected.txt:
+        * web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-transformed-distance-expected.txt:
+        * web-platform-tests/web-animations/interfaces/Animation/cancel-expected.txt:
+        * web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite-expected.txt:
+
 2018-02-14  Ryan Haddad  <[email protected]>
 
         Unreviewed, rolling out r228444.

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-multicol/multicol-gap-animation-001-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-multicol/multicol-gap-animation-001-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-multicol/multicol-gap-animation-001-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,3 +1,3 @@
 
-FAIL column-gap property is animatable assert_equals: expected "100px" but got "0px"
+FAIL column-gap property is animatable assert_equals: expected "150px" but got "100px"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/cubic-bezier-timing-functions-output-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/cubic-bezier-timing-functions-output-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/cubic-bezier-timing-functions-output-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,6 +1,6 @@
 
-FAIL cubic-bezier easing with input progress greater than 1 assert_approx_equals: The left of the animation should be approximately 98.8706654939602 at 230ms expected 98.8706654939602 +/- 0.01 but got 0
-FAIL cubic-bezier easing with input progress greater than 1 and where the tangent on the upper boundary is infinity assert_approx_equals: The left of the animation should be approximately 106.31755608768113 at 230ms expected 106.31755608768113 +/- 0.01 but got 0
-FAIL cubic-bezier easing with input progress less than 0 assert_approx_equals: The left of the animation should be approximately -16.589193103032184 at 10ms expected -16.589193103032184 +/- 0.01 but got 0
-FAIL cubic-bezier easing with input progress less than 0 and where the tangent on the lower boundary is infinity assert_approx_equals: The left of the animation should be approximately -6.317556087681108 at 770ms expected -6.317556087681108 +/- 0.01 but got 0
+FAIL cubic-bezier easing with input progress greater than 1 assert_approx_equals: The left of the animation should be approximately 98.8706654939602 at 230ms expected 98.8706654939602 +/- 0.01 but got 98.890625
+FAIL cubic-bezier easing with input progress greater than 1 and where the tangent on the upper boundary is infinity assert_approx_equals: The left of the animation should be approximately 106.31755608768113 at 230ms expected 106.31755608768113 +/- 0.01 but got 106.359375
+FAIL cubic-bezier easing with input progress less than 0 assert_approx_equals: The left of the animation should be approximately -16.589193103032184 at 10ms expected -16.589193103032184 +/- 0.01 but got -17.5
+FAIL cubic-bezier easing with input progress less than 0 and where the tangent on the lower boundary is infinity assert_approx_equals: The left of the animation should be approximately 0 at 300ms expected 0 +/- 0.01 but got 512.0625
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/frames-timing-functions-output-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/frames-timing-functions-output-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/frames-timing-functions-output-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -4,7 +4,7 @@
 FAIL For an input progress of 1.0, the output of a frames timing function is the final frame assert_equals: expected "100px" but got "0px"
 FAIL The number of frames is correctly reflected in the frames timing function output assert_equals: expected "10px" but got "0px"
 FAIL The number of frames is correctly reflected in the frames timing function output on CSS Transitions assert_equals: expected "10px" but got "0px"
-FAIL frames easing with input progress greater than 1 assert_equals: expected "100px" but got "0px"
-FAIL frames easing with input progress greater than 1.5 assert_equals: expected "300px" but got "0px"
-FAIL frames easing with input progress less than 0 assert_equals: expected "-100px" but got "0px"
+PASS frames easing with input progress greater than 1 
+PASS frames easing with input progress greater than 1.5 
+PASS frames easing with input progress less than 0 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/step-timing-functions-output-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/step-timing-functions-output-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css-timing-1/step-timing-functions-output-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,8 +1,8 @@
 
-FAIL step-start easing with input progress greater than 1 assert_equals: expected "200px" but got "100px"
-FAIL step-end easing with input progress greater than 1 assert_equals: expected "100px" but got "0px"
-FAIL step-end easing with input progress greater than 2 assert_equals: expected "200px" but got "0px"
-FAIL step-start easing with input progress less than 0 assert_equals: expected "0px" but got "100px"
-FAIL step-start easing with input progress less than -1 assert_equals: expected "0px" but got "100px"
-FAIL step-end easing with input progress less than 0 assert_equals: expected "-100px" but got "0px"
+PASS step-start easing with input progress greater than 1 
+PASS step-end easing with input progress greater than 1 
+PASS step-end easing with input progress greater than 2 
+PASS step-start easing with input progress less than 0 
+PASS step-start easing with input progress less than -1 
+PASS step-end easing with input progress less than 0 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/discrete-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/discrete-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/discrete-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,7 +1,7 @@
 
-FAIL Test animating discrete values assert_equals: Animation produces 'to' value at exact middle of the interval expected "italic" but got "normal"
-FAIL Test discrete animation is used when interpolation fails assert_equals: Animation produces 'to' value at exact middle of the interval expected "200px" but got "0px"
-FAIL Test discrete animation is used only for pairs of values that cannot be interpolated assert_equals: First non-interpolable pair uses discrete interpolation expected "200px" but got "0px"
-FAIL Test the 50% switch point for discrete animation is based on the effect easing assert_equals: Animation produces 'to' value at 96% of the iteration time expected "italic" but got "normal"
-FAIL Test the 50% switch point for discrete animation is based on the keyframe easing assert_equals: Animation produces 'to' value at 96% of the iteration time expected "italic" but got "normal"
+FAIL Test animating discrete values assert_equals: Animation produces 'from' value just before the middle of the interval expected "normal" but got "oblique 9.75deg"
+FAIL Test discrete animation is used when interpolation fails assert_equals: Animation produces 'from' value at start of interval expected "0px" but got "200px"
+FAIL Test discrete animation is used only for pairs of values that cannot be interpolated assert_equals: Animation produces 'from' value at start of interval expected "0px" but got "200px"
+FAIL Test the 50% switch point for discrete animation is based on the effect easing assert_equals: Animation produces 'from' value at 94% of the iteration time expected "normal" but got "oblique 8.5deg"
+FAIL Test the 50% switch point for discrete animation is based on the keyframe easing assert_equals: Animation produces 'from' value at 94% of the iteration time expected "normal" but got "oblique 8.5deg"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/visibility-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/visibility-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/visibility-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,4 +1,4 @@
 
-FAIL Visibility clamping behavior assert_equals: Visibility when progress > 0 due to linear easing expected "visible" but got "hidden"
-FAIL Visibility clamping behavior with an easing that has a negative component assert_equals: Visibility when progress > 0 due to cubic-bezier easing expected "visible" but got "hidden"
+PASS Visibility clamping behavior 
+PASS Visibility clamping behavior with an easing that has a negative component 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-iteration-composite-operation-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-iteration-composite-operation-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-iteration-composite-operation-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,15 +1,15 @@
 
 FAIL iteration composition of discrete type animation (align-content) assert_equals: Animated align-content style at 50s of the first iteration expected "flex-end" but got "normal"
-FAIL iteration composition of <length> type animation assert_equals: Animated margin-left style at 0s of the third iteration expected "20px" but got "5px"
-FAIL iteration composition of <percentage> type animation assert_equals: Animated width style at 0s of the third iteration expected "100px" but got "25px"
-FAIL iteration composition of <color> type animation assert_equals: Animated color style at 0s of the third iteration expected "rgb(240, 240, 240)" but got "rgb(60, 60, 60)"
-FAIL iteration composition of <color> type animation that green component is decreasing assert_equals: Animated color style at 0s of the third iteration expected "rgb(120, 240, 120)" but got "rgb(30, 90, 30)"
+FAIL iteration composition of <length> type animation assert_equals: Animated margin-left style at 50s of the first iteration expected "5px" but got "0px"
+FAIL iteration composition of <percentage> type animation assert_equals: Animated width style at 50s of the first iteration expected "25px" but got "0px"
+FAIL iteration composition of <color> type animation assert_equals: Animated color style at 50s of the first iteration expected "rgb(60, 60, 60)" but got "rgb(0, 0, 0)"
+FAIL iteration composition of <color> type animation that green component is decreasing assert_equals: Animated color style at 50s of the first iteration expected "rgb(30, 90, 30)" but got "rgb(0, 120, 0)"
 FAIL iteration composition of <number> type animation assert_equals: Animated flex-grow style at 50s of the first iteration expected "5" but got "0"
 FAIL iteration composition of <shape> type animation assert_equals: Animated clip style at 50s of the first iteration expected "rect(5px, 5px, 5px, 5px)" but got "auto"
-FAIL iteration composition of <calc()> value animation assert_equals: Animated calc width style at 0s of the third iteration expected "20px" but got "5px"
-FAIL iteration composition of <calc()> value animation that the values can'tbe reduced assert_equals: Animated calc width style at 0s of the third iteration expected "40px" but got "10px"
+FAIL iteration composition of <calc()> value animation assert_equals: Animated calc width style at 50s of the first iteration expected "5px" but got "0px"
+FAIL iteration composition of <calc()> value animation that the values can'tbe reduced assert_equals: Animated calc width style at 50s of the first iteration expected "10px" but got "0px"
 FAIL iteration composition of opacity animation assert_equals: Animated opacity style at 50s of the first iteration expected "0.2" but got "0.20000000298023224"
-FAIL iteration composition of box-shadow animation assert_equals: Animated box-shadow style at 0s of the third iteration expected "rgb(240, 240, 240) 20px 20px 20px 0px" but got "rgb(60, 60, 60) 5px 5px 5px 0px"
+FAIL iteration composition of box-shadow animation assert_equals: Animated box-shadow style at 50s of the first iteration expected "rgb(60, 60, 60) 5px 5px 5px 0px" but got "rgb(0, 0, 0) 0px 0px 0px 0px"
 FAIL iteration composition of filter blur animation assert_equals: Animated filter blur style at 50s of the first iteration expected "blur(5px)" but got "blur(10px)"
 FAIL iteration composition of filter brightness for different unit animation assert_equals: Animated filter brightness style at 50s of the first iteration expected "brightness(1.4)" but got "brightness(1.8)"
 FAIL iteration composition of filter brightness animation assert_equals: Animated filter brightness style at 50s of the first iteration expected "brightness(0.5)" but got "brightness(1)"
@@ -28,7 +28,7 @@
 FAIL iteration composition of transform from none to translate assert_regexp_match: Actual value is not a matrix expected object "/^matrix(?:3d)*\((.+)\)/" but got "none"
 FAIL iteration composition of transform of matrix3d function assert_regexp_match: Actual value is not a matrix expected object "/^matrix(?:3d)*\((.+)\)/" but got "none"
 FAIL iteration composition of transform of rotate3d function assert_regexp_match: Actual value is not a matrix expected object "/^matrix(?:3d)*\((.+)\)/" but got "none"
-FAIL iteration composition starts with non-zero value animation assert_equals: Animated margin-left style at 0s of the third iteration expected "50px" but got "15px"
-FAIL iteration composition with negative final value animation assert_equals: Animated margin-left style at 0s of the third iteration expected "-10px" but got "0px"
-FAIL duration changes with an iteration composition operation of accumulate assert_equals: Animated style at 50s of the third iteration expected "25px" but got "5px"
+FAIL iteration composition starts with non-zero value animation assert_equals: Animated margin-left style at 50s of the first iteration expected "15px" but got "10px"
+FAIL iteration composition with negative final value animation assert_equals: Animated margin-left style at 50s of the first iteration expected "0px" but got "10px"
+FAIL duration changes with an iteration composition operation of accumulate assert_equals: Animated style at 50s of the third iteration expected "25px" but got "0px"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-transformed-distance-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-transformed-distance-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-transformed-distance-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,19 +1,19 @@
 
-FAIL A step-start function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A steps(1, start) function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A steps(2, start) function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A step-end function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A steps(1) function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A steps(1, end) function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A steps(2, end) function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A frames function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A linear function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A ease function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A ease-in function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A ease-in-out function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A ease-out function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A easing function which produces values greater than 1 on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
-FAIL A easing function which produces values less than 1 on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 99.9 at 999ms expected 99.9 +/- 0.01 but got 0
+PASS A step-start function on a keyframe affects the resulting style 
+PASS A steps(1, start) function on a keyframe affects the resulting style 
+PASS A steps(2, start) function on a keyframe affects the resulting style 
+PASS A step-end function on a keyframe affects the resulting style 
+PASS A steps(1) function on a keyframe affects the resulting style 
+PASS A steps(1, end) function on a keyframe affects the resulting style 
+PASS A steps(2, end) function on a keyframe affects the resulting style 
+PASS A frames function on a keyframe affects the resulting style 
+PASS A linear function on a keyframe affects the resulting style 
+FAIL A ease function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 109.47963055884654 at 1100ms expected 109.47963055884654 +/- 0.01 but got 109.46875
+PASS A ease-in function on a keyframe affects the resulting style 
+FAIL A ease-in-out function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 101.97224534417684 at 1100ms expected 101.97224534417684 +/- 0.01 but got 101.953125
+FAIL A ease-out function on a keyframe affects the resulting style assert_approx_equals: The width should be approximately 116.05721544376388 at 1100ms expected 116.05721544376388 +/- 0.01 but got 116.078125
+PASS A easing function which produces values greater than 1 on a keyframe affects the resulting style 
+PASS A easing function which produces values less than 1 on a keyframe affects the resulting style 
 PASS Linear-equivalent cubic-bezier keyframe easing applied to an effect with a step-start function does not alter the result 
 PASS Linear-equivalent cubic-bezier keyframe easing applied to an effect with a steps(1, start) function does not alter the result 
 PASS Linear-equivalent cubic-bezier keyframe easing applied to an effect with a steps(2, start) function does not alter the result 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/Animation/cancel-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/Animation/cancel-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/Animation/cancel-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,5 +1,5 @@
 
 FAIL Animated style is cleared after calling Animation.cancel() assert_not_equals: transform style is animated before cancelling got disallowed value "none"
 FAIL After cancelling an animation, it can still be seeked assert_equals: margin-left style is updated when cancelled animation is seeked expected "150px" but got "0px"
-FAIL After cancelling an animation, it can still be re-used assert_equals: margin-left style is animated after re-starting animation expected "100px" but got "0px"
+PASS After cancelling an animation, it can still be re-used 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite-expected.txt (228536 => 228537)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite-expected.txt	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite-expected.txt	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,3 +1,3 @@
 
-FAIL iterationComposite can be updated while an animation is in progress assert_equals: Animated style at 50s of the third iteration expected "25px" but got "5px"
+FAIL iterationComposite can be updated while an animation is in progress assert_equals: Animated style at 50s of the third iteration expected "25px" but got "0px"
 

Modified: trunk/Source/WebCore/ChangeLog (228536 => 228537)


--- trunk/Source/WebCore/ChangeLog	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/ChangeLog	2018-02-15 23:33:44 UTC (rev 228537)
@@ -1,3 +1,76 @@
+2018-02-15  Antoine Quint  <[email protected]>
+
+        [Web Animations] Ensure that changing the timing model updates styles synchronously
+        https://bugs.webkit.org/show_bug.cgi?id=182836
+
+        Reviewed by Dean Jackson.
+
+        We did not invalidate the timing model when properties of an effect's timing object changed
+        and even when we did invalidate the timing model, we did not update styles on effect targets
+        synchronously, only scheduling such updates for the next animation frame.
+
+        In this patch we expose the effect on the timing object such that changing timing properties
+        can notify the effect of a change in the timing model, which can then be forwarded to the
+        animation (which already informs its timeline, if any).
+
+        Additionally, when an animation's timing model has changed, we now invalidate the effect, which
+        will update styles synchronously.
+
+        This produces a number of progressions in WPT tests.
+
+        * animation/AnimationEffectReadOnly.cpp:
+        (WebCore::AnimationEffectReadOnly::AnimationEffectReadOnly): Set the timing object's effect upon
+        effect construction.
+        (WebCore::AnimationEffectReadOnly::~AnimationEffectReadOnly): Set the timing object's effect to
+        null upon effect destruction.
+        (WebCore::AnimationEffectReadOnly::timingDidChange): Notify the animation (if any) that its timing
+        model changed following a change in the timing properties.
+        * animation/AnimationEffectReadOnly.h: Add a new virtual invalidate() method that subclasses can
+        override to implement invalidation behavior when the animation finds out its timing model changed.
+        * animation/AnimationEffectTimingReadOnly.cpp: Notify the effect when a property changes such
+        that it may notify its animation of a timing model change.
+        (WebCore::AnimationEffectTimingReadOnly::propertyDidChange):
+        (WebCore::AnimationEffectTimingReadOnly::setIterationStart):
+        (WebCore::AnimationEffectTimingReadOnly::setIterations):
+        (WebCore::AnimationEffectTimingReadOnly::setBindingsDuration):
+        (WebCore::AnimationEffectTimingReadOnly::setEasing):
+        (WebCore::AnimationEffectTimingReadOnly::setDelay):
+        (WebCore::AnimationEffectTimingReadOnly::setEndDelay):
+        (WebCore::AnimationEffectTimingReadOnly::setFill):
+        (WebCore::AnimationEffectTimingReadOnly::setIterationDuration):
+        (WebCore::AnimationEffectTimingReadOnly::setDirection):
+        * animation/AnimationEffectTimingReadOnly.h:
+        (WebCore::AnimationEffectTimingReadOnly::setEffect):
+        (WebCore::AnimationEffectTimingReadOnly::setBindingsDelay):
+        (WebCore::AnimationEffectTimingReadOnly::setBindingsEndDelay):
+        (WebCore::AnimationEffectTimingReadOnly::setDelay): Deleted.
+        (WebCore::AnimationEffectTimingReadOnly::setEndDelay): Deleted.
+        (WebCore::AnimationEffectTimingReadOnly::setFill): Deleted.
+        (WebCore::AnimationEffectTimingReadOnly::setIterationDuration): Deleted.
+        (WebCore::AnimationEffectTimingReadOnly::setDirection): Deleted.
+        * animation/AnimationTimeline.cpp: Rename animationTimingModelDidChange() to timingModelDidChange()
+        to align it with the new WebAnimation::timingModelDidChange() method.
+        (WebCore::AnimationTimeline::addAnimation):
+        (WebCore::AnimationTimeline::removeAnimation):
+        (WebCore::AnimationTimeline::setCurrentTime):
+        * animation/AnimationTimeline.h:
+        (WebCore::AnimationTimeline::timingModelDidChange):
+        (WebCore::AnimationTimeline::animationTimingModelDidChange): Deleted.
+        * animation/DocumentTimeline.cpp:
+        (WebCore::DocumentTimeline::timingModelDidChange):
+        (WebCore::DocumentTimeline::updateAnimations):
+        (WebCore::DocumentTimeline::animationTimingModelDidChange): Deleted.
+        * animation/DocumentTimeline.h:
+        * animation/KeyframeEffectReadOnly.cpp:
+        (WebCore::KeyframeEffectReadOnly::invalidate): Override the invalidate() method to perform a synchronous
+        style update in order to ensure that timing properties are accounted for right as they change.
+        * animation/KeyframeEffectReadOnly.h:
+        * animation/WebAnimation.cpp:
+        (WebCore::WebAnimation::timingModelDidChange): Invalidate the effect and notify the timeline of a timing
+        model change when an animation is notified that its timing model has changed.
+        (WebCore::WebAnimation::setStartTime):
+        * animation/WebAnimation.h:
+
 2018-02-15  Timothy Horton  <[email protected]>
 
         Fix the build.

Modified: trunk/Source/WebCore/animation/AnimationEffectReadOnly.cpp (228536 => 228537)


--- trunk/Source/WebCore/animation/AnimationEffectReadOnly.cpp	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/AnimationEffectReadOnly.cpp	2018-02-15 23:33:44 UTC (rev 228537)
@@ -39,8 +39,20 @@
     : m_classType(classType)
     , m_timing(WTFMove(timing))
 {
+    m_timing->setEffect(this);
 }
 
+AnimationEffectReadOnly::~AnimationEffectReadOnly()
+{
+    m_timing->setEffect(nullptr);
+}
+
+void AnimationEffectReadOnly::timingDidChange()
+{
+    if (m_animation)
+        m_animation->timingModelDidChange();
+}
+
 std::optional<Seconds> AnimationEffectReadOnly::localTime() const
 {
     if (m_animation)

Modified: trunk/Source/WebCore/animation/AnimationEffectReadOnly.h (228536 => 228537)


--- trunk/Source/WebCore/animation/AnimationEffectReadOnly.h	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/AnimationEffectReadOnly.h	2018-02-15 23:33:44 UTC (rev 228537)
@@ -25,7 +25,6 @@
 
 #pragma once
 
-#include "AnimationEffectTiming.h"
 #include "ComputedTimingProperties.h"
 #include "WebAnimation.h"
 #include <wtf/Forward.h>
@@ -35,9 +34,11 @@
 
 namespace WebCore {
 
+class AnimationEffectTimingReadOnly;
+
 class AnimationEffectReadOnly : public RefCounted<AnimationEffectReadOnly> {
 public:
-    virtual ~AnimationEffectReadOnly() = default;
+    virtual ~AnimationEffectReadOnly();
 
     bool isKeyframeEffect() const { return m_classType == KeyframeEffectClass; }
     bool isKeyframeEffectReadOnly() const { return m_classType == KeyframeEffectReadOnlyClass; }
@@ -44,6 +45,7 @@
     AnimationEffectTimingReadOnly* timing() const { return m_timing.get(); }
     ComputedTimingProperties getComputedTiming();
     virtual void apply(RenderStyle&) = 0;
+    virtual void invalidate() = 0;
 
     WebAnimation* animation() const { return m_animation.get(); }
     void setAnimation(RefPtr<WebAnimation>&& animation) { m_animation = animation; }
@@ -55,6 +57,8 @@
     enum class Phase { Before, Active, After, Idle };
     Phase phase() const;
 
+    void timingDidChange();
+
 protected:
     enum ClassType {
         KeyframeEffectClass,

Modified: trunk/Source/WebCore/animation/AnimationEffectTimingReadOnly.cpp (228536 => 228537)


--- trunk/Source/WebCore/animation/AnimationEffectTimingReadOnly.cpp	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/AnimationEffectTimingReadOnly.cpp	2018-02-15 23:33:44 UTC (rev 228537)
@@ -26,6 +26,8 @@
 #include "config.h"
 #include "AnimationEffectTimingReadOnly.h"
 
+#include "AnimationEffectReadOnly.h"
+
 namespace WebCore {
 
 Ref<AnimationEffectTimingReadOnly> AnimationEffectTimingReadOnly::create()
@@ -43,6 +45,11 @@
 {
 }
 
+void AnimationEffectTimingReadOnly::propertyDidChange()
+{
+    m_effect->timingDidChange();
+}
+
 ExceptionOr<void> AnimationEffectTimingReadOnly::setProperties(std::optional<Variant<double, KeyframeEffectOptions>>&& options)
 {
     if (!options)
@@ -100,7 +107,12 @@
     if (iterationStart < 0)
         return Exception { TypeError };
 
+    if (m_iterationStart == iterationStart)
+        return { };
+
     m_iterationStart = iterationStart;
+    propertyDidChange();
+
     return { };
 }
 
@@ -112,7 +124,12 @@
     if (iterations < 0 || std::isnan(iterations))
         return Exception { TypeError };
 
+    if (m_iterations == iterations)
+        return { };
+        
     m_iterations = iterations;
+    propertyDidChange();
+
     return { };
 }
 
@@ -136,7 +153,7 @@
         auto durationAsDouble = WTF::get<double>(duration);
         if (durationAsDouble < 0 || std::isnan(durationAsDouble))
             return Exception { TypeError };
-        m_iterationDuration = Seconds::fromMilliseconds(durationAsDouble);
+        setIterationDuration(Seconds::fromMilliseconds(durationAsDouble));
         return { };
     }
 
@@ -143,7 +160,7 @@
     if (WTF::get<String>(duration) != "auto")
         return Exception { TypeError };
 
-    m_iterationDuration = 0_s;
+    setIterationDuration(0_s);
 
     return { };
 }
@@ -154,6 +171,7 @@
     if (timingFunctionResult.hasException())
         return timingFunctionResult.releaseException();
     m_timingFunction = timingFunctionResult.returnValue();
+    propertyDidChange();
     return { };
 }
 
@@ -167,6 +185,51 @@
     return endTime > 0_s ? endTime : 0_s;
 }
 
+void AnimationEffectTimingReadOnly::setDelay(const Seconds& delay)
+{
+    if (m_delay == delay)
+        return;
+
+    m_delay = delay;
+    propertyDidChange();
+}
+
+void AnimationEffectTimingReadOnly::setEndDelay(const Seconds& endDelay)
+{
+    if (m_endDelay == endDelay)
+        return;
+
+    m_endDelay = endDelay;
+    propertyDidChange();
+}
+
+void AnimationEffectTimingReadOnly::setFill(FillMode fill)
+{
+    if (m_fill == fill)
+        return;
+
+    m_fill = fill;
+    propertyDidChange();
+}
+
+void AnimationEffectTimingReadOnly::setIterationDuration(const Seconds& duration)
+{
+    if (m_iterationDuration == duration)
+        return;
+
+    m_iterationDuration = duration;
+    propertyDidChange();
+}
+
+void AnimationEffectTimingReadOnly::setDirection(PlaybackDirection direction)
+{
+    if (m_direction == direction)
+        return;
+
+    m_direction = direction;
+    propertyDidChange();
+}
+
 Seconds AnimationEffectTimingReadOnly::activeDuration() const
 {
     // 3.8.2. Calculating the active duration

Modified: trunk/Source/WebCore/animation/AnimationEffectTimingReadOnly.h (228536 => 228537)


--- trunk/Source/WebCore/animation/AnimationEffectTimingReadOnly.h	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/AnimationEffectTimingReadOnly.h	2018-02-15 23:33:44 UTC (rev 228537)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "AnimationEffectReadOnly.h"
 #include "ExceptionOr.h"
 #include "FillMode.h"
 #include "KeyframeEffectOptions.h"
@@ -47,26 +48,28 @@
 
     bool isAnimationEffectTiming() const { return m_classType == AnimationEffectTimingClass; }
 
+    void setEffect(AnimationEffectReadOnly* effect) { m_effect = effect; }
+
     ExceptionOr<void> setProperties(std::optional<Variant<double, KeyframeEffectOptions>>&&);
     void copyPropertiesFromSource(AnimationEffectTimingReadOnly*);
 
     double bindingsDelay() const { return secondsToWebAnimationsAPITime(m_delay); }
-    void setBindingsDelay(double delay) { m_delay = Seconds::fromMilliseconds(delay); }
+    void setBindingsDelay(double delay) { setDelay(Seconds::fromMilliseconds(delay)); }
 
     double bindingsEndDelay() const { return secondsToWebAnimationsAPITime(m_endDelay); }
-    void setBindingsEndDelay(double endDelay) { m_endDelay = Seconds::fromMilliseconds(endDelay); }
+    void setBindingsEndDelay(double endDelay) { setEndDelay(Seconds::fromMilliseconds(endDelay)); }
 
     Variant<double, String> bindingsDuration() const;
     ExceptionOr<void> setBindingsDuration(Variant<double, String>&&);
 
     Seconds delay() const { return m_delay; }
-    void setDelay(Seconds& delay) { m_delay = delay; }
+    void setDelay(const Seconds&);
 
     Seconds endDelay() const { return m_endDelay; }
-    void setEndDelay(Seconds& endDelay) { m_endDelay = endDelay; }
+    void setEndDelay(const Seconds&);
 
     FillMode fill() const { return m_fill; }
-    void setFill(FillMode fill) { m_fill = fill; }
+    void setFill(FillMode);
 
     double iterationStart() const { return m_iterationStart; }
     ExceptionOr<void> setIterationStart(double);
@@ -75,10 +78,10 @@
     ExceptionOr<void> setIterations(double);
 
     Seconds iterationDuration() const { return m_iterationDuration; }
-    void setIterationDuration(Seconds& duration) { m_iterationDuration = duration; }
+    void setIterationDuration(const Seconds&);
 
     PlaybackDirection direction() const { return m_direction; }
-    void setDirection(PlaybackDirection direction) { m_direction = direction; }
+    void setDirection(PlaybackDirection);
 
     String easing() const { return m_timingFunction->cssText(); }
     ExceptionOr<void> setEasing(const String&);
@@ -97,9 +100,11 @@
 
     explicit AnimationEffectTimingReadOnly(ClassType);
 
+private:
+    void propertyDidChange();
 
-private:
     ClassType m_classType;
+    AnimationEffectReadOnly* m_effect;
     Seconds m_delay { 0_s };
     Seconds m_endDelay { 0_s };
     FillMode m_fill { FillMode::Auto };

Modified: trunk/Source/WebCore/animation/AnimationTimeline.cpp (228536 => 228537)


--- trunk/Source/WebCore/animation/AnimationTimeline.cpp	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/AnimationTimeline.cpp	2018-02-15 23:33:44 UTC (rev 228537)
@@ -46,13 +46,13 @@
 void AnimationTimeline::addAnimation(Ref<WebAnimation>&& animation)
 {
     m_animations.add(WTFMove(animation));
-    animationTimingModelDidChange();
+    timingModelDidChange();
 }
 
 void AnimationTimeline::removeAnimation(Ref<WebAnimation>&& animation)
 {
     m_animations.remove(WTFMove(animation));
-    animationTimingModelDidChange();
+    timingModelDidChange();
 }
 
 std::optional<double> AnimationTimeline::bindingsCurrentTime()
@@ -66,7 +66,7 @@
 void AnimationTimeline::setCurrentTime(Seconds currentTime)
 {
     m_currentTime = currentTime;
-    animationTimingModelDidChange();
+    timingModelDidChange();
 }
 
 void AnimationTimeline::animationWasAddedToElement(WebAnimation& animation, Element& element)

Modified: trunk/Source/WebCore/animation/AnimationTimeline.h (228536 => 228537)


--- trunk/Source/WebCore/animation/AnimationTimeline.h	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/AnimationTimeline.h	2018-02-15 23:33:44 UTC (rev 228537)
@@ -51,7 +51,7 @@
     WEBCORE_EXPORT String description();
     WEBCORE_EXPORT virtual void pause() { };
 
-    virtual void animationTimingModelDidChange() { };
+    virtual void timingModelDidChange() { };
 
     const HashSet<RefPtr<WebAnimation>>& animations() const { return m_animations; }
     Vector<RefPtr<WebAnimation>> animationsForElement(Element&);

Modified: trunk/Source/WebCore/animation/DocumentTimeline.cpp (228536 => 228537)


--- trunk/Source/WebCore/animation/DocumentTimeline.cpp	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/DocumentTimeline.cpp	2018-02-15 23:33:44 UTC (rev 228537)
@@ -84,7 +84,7 @@
     m_paused = true;
 }
 
-void DocumentTimeline::animationTimingModelDidChange()
+void DocumentTimeline::timingModelDidChange()
 {
     if (m_needsUpdateAnimationSchedule)
         return;
@@ -176,7 +176,7 @@
         animation->updateFinishedState(WebAnimation::DidSeek::No, WebAnimation::SynchronouslyNotify::No);
 
     // Time has advanced, the timing model requires invalidation now.
-    animationTimingModelDidChange();
+    timingModelDidChange();
 }
 
 std::unique_ptr<RenderStyle> DocumentTimeline::animatedStyleForRenderer(RenderElement& renderer)

Modified: trunk/Source/WebCore/animation/DocumentTimeline.h (228536 => 228537)


--- trunk/Source/WebCore/animation/DocumentTimeline.h	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/DocumentTimeline.h	2018-02-15 23:33:44 UTC (rev 228537)
@@ -52,7 +52,7 @@
     std::optional<Seconds> currentTime() override;
     void pause() override;
 
-    void animationTimingModelDidChange() override;
+    void timingModelDidChange() override;
     void windowScreenDidChange(PlatformDisplayID);
 
     std::unique_ptr<RenderStyle> animatedStyleForRenderer(RenderElement& renderer);

Modified: trunk/Source/WebCore/animation/KeyframeEffectReadOnly.cpp (228536 => 228537)


--- trunk/Source/WebCore/animation/KeyframeEffectReadOnly.cpp	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/KeyframeEffectReadOnly.cpp	2018-02-15 23:33:44 UTC (rev 228537)
@@ -653,6 +653,15 @@
         targetStyle.setZIndex(0);
 }
 
+void KeyframeEffectReadOnly::invalidate()
+{
+    if (!m_target)
+        return;
+
+    m_target->invalidateStyleAndLayerComposition();
+    m_target->document().updateStyleIfNeeded();
+}
+
 bool KeyframeEffectReadOnly::shouldRunAccelerated()
 {
     for (auto cssPropertyId : m_keyframes.properties()) {

Modified: trunk/Source/WebCore/animation/KeyframeEffectReadOnly.h (228536 => 228537)


--- trunk/Source/WebCore/animation/KeyframeEffectReadOnly.h	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/KeyframeEffectReadOnly.h	2018-02-15 23:33:44 UTC (rev 228537)
@@ -86,6 +86,7 @@
 
     void getAnimatedStyle(std::unique_ptr<RenderStyle>& animatedStyle);
     void apply(RenderStyle&) override;
+    void invalidate() override;
     void startOrStopAccelerated();
     bool isRunningAccelerated() const { return m_startedAccelerated; }
 

Modified: trunk/Source/WebCore/animation/WebAnimation.cpp (228536 => 228537)


--- trunk/Source/WebCore/animation/WebAnimation.cpp	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/WebAnimation.cpp	2018-02-15 23:33:44 UTC (rev 228537)
@@ -27,6 +27,7 @@
 #include "WebAnimation.h"
 
 #include "AnimationEffectReadOnly.h"
+#include "AnimationEffectTimingReadOnly.h"
 #include "AnimationPlaybackEvent.h"
 #include "AnimationTimeline.h"
 #include "Document.h"
@@ -71,6 +72,14 @@
         m_timeline->removeAnimation(*this);
 }
 
+void WebAnimation::timingModelDidChange()
+{
+    if (m_effect)
+        m_effect->invalidate();
+    if (m_timeline)
+        m_timeline->timingModelDidChange();
+}
+
 void WebAnimation::setEffect(RefPtr<AnimationEffectReadOnly>&& effect)
 {
     // 3.4.3. Setting the target effect of an animation
@@ -179,9 +188,7 @@
         return;
 
     m_startTime = startTime;
-    
-    if (m_timeline)
-        m_timeline->animationTimingModelDidChange();
+    timingModelDidChange();
 }
 
 std::optional<double> WebAnimation::bindingsCurrentTime() const

Modified: trunk/Source/WebCore/animation/WebAnimation.h (228536 => 228537)


--- trunk/Source/WebCore/animation/WebAnimation.h	2018-02-15 23:24:14 UTC (rev 228536)
+++ trunk/Source/WebCore/animation/WebAnimation.h	2018-02-15 23:33:44 UTC (rev 228537)
@@ -98,6 +98,8 @@
     enum class SynchronouslyNotify { Yes, No };
     void updateFinishedState(DidSeek, SynchronouslyNotify);
 
+    void timingModelDidChange();
+
     String description();
 
     using RefCounted::ref;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to