[Web Animations] com.apple.WebKit.WebContent.Development at com.apple.WebCore: WebCor...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Mar 2019 13:46:56 +0000 (13:46 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Mar 2019 13:46:56 +0000 (13:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=196125
<rdar://problem/46520059>

Patch by Antoine Quint <graouts@apple.com> on 2019-03-22
Reviewed by Dean Jackson.

Because of floating point math in playState() that wouldn't account for timeEpsilon, we would get into a state where the animation phase
was "after" but the play state was "running" when the current time was about a microsecond away from the active time boundary. This meant
that the early return statement in WebAnimation::timeToNextTick() would not be hit while we would not handle the possibility of being in
the "after" phase in the rest of the function, therefore eventually hitting the ASSERT_NOT_REACHED() at the end of the function.

We now account for timeEpsilon in playState() and correctly report we're in the "finished" play state when in the "after" phase also.

* animation/WebAnimation.cpp:
(WebCore::WebAnimation::playState const):

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

Source/WebCore/ChangeLog
Source/WebCore/animation/WebAnimation.cpp

index b6335a7..4183090 100644 (file)
@@ -1,3 +1,21 @@
+2019-03-22  Antoine Quint  <graouts@apple.com>
+
+        [Web Animations] com.apple.WebKit.WebContent.Development at com.apple.WebCore: WebCore::WebAnimation::timeToNextTick const + 757
+        https://bugs.webkit.org/show_bug.cgi?id=196125
+        <rdar://problem/46520059>
+
+        Reviewed by Dean Jackson.
+
+        Because of floating point math in playState() that wouldn't account for timeEpsilon, we would get into a state where the animation phase
+        was "after" but the play state was "running" when the current time was about a microsecond away from the active time boundary. This meant
+        that the early return statement in WebAnimation::timeToNextTick() would not be hit while we would not handle the possibility of being in
+        the "after" phase in the rest of the function, therefore eventually hitting the ASSERT_NOT_REACHED() at the end of the function.
+
+        We now account for timeEpsilon in playState() and correctly report we're in the "finished" play state when in the "after" phase also.
+
+        * animation/WebAnimation.cpp:
+        (WebCore::WebAnimation::playState const):
+
 2019-03-22  Alicia Boya García  <aboya@igalia.com>
 
         [MSE][GStreamer] Don't construct segments on PlaybackPipeline::flush
index 2ea323b..796ca92 100644 (file)
@@ -528,7 +528,7 @@ auto WebAnimation::playState() const -> PlayState
     // animation's effective playback rate > 0 and current time ≥ target effect end; or
     // animation's effective playback rate < 0 and current time ≤ 0,
     // → finished
-    if (animationCurrentTime && ((effectivePlaybackRate() > 0 && animationCurrentTime.value() >= effectEndTime()) || (effectivePlaybackRate() < 0 && animationCurrentTime.value() <= 0_s)))
+    if (animationCurrentTime && ((effectivePlaybackRate() > 0 && (*animationCurrentTime + timeEpsilon) >= effectEndTime()) || (effectivePlaybackRate() < 0 && (*animationCurrentTime - timeEpsilon) <= 0_s)))
         return PlayState::Finished;
 
     // Otherwise → running