Index: Source/core/animation/AnimationClock.cpp |
diff --git a/Source/core/animation/AnimationClock.cpp b/Source/core/animation/AnimationClock.cpp |
index 649220690e67a27adf18592ac5d9a46d000c9ff2..d51c95e7aed188da489a296342619fdac98b2841 100644 |
--- a/Source/core/animation/AnimationClock.cpp |
+++ b/Source/core/animation/AnimationClock.cpp |
@@ -31,23 +31,52 @@ |
#include "config.h" |
#include "core/animation/AnimationClock.h" |
+#include "wtf/CurrentTime.h" |
+#include <math.h> |
+ |
+namespace { |
+ |
+// FIXME: This is an approximation of time between frames, used when |
+// ticking the animation clock outside of animation frame callbacks. |
+// Ideally this would be generated by the compositor. |
+const double approximateFrameTime = 1 / 60.0; |
+ |
+} |
+ |
namespace WebCore { |
+unsigned AnimationClock::s_currentTask = 0; |
+ |
void AnimationClock::updateTime(double time) |
{ |
if (time > m_time) |
m_time = time; |
- m_frozen = true; |
+ m_currentTask = s_currentTask; |
} |
double AnimationClock::currentTime() |
{ |
- if (!m_frozen) { |
- double newTime = m_monotonicallyIncreasingTime(); |
- if (newTime >= m_time + minTimeBeforeUnsynchronizedAnimationClockTick) |
- m_time = newTime; |
+ if (m_currentTask != s_currentTask) { |
+ const double currentTime = m_monotonicallyIncreasingTime(); |
+ if (m_time < currentTime) { |
+ // Advance to the first estimated frame after the current time. |
+ const double frameShift = fmod(currentTime - m_time, approximateFrameTime); |
+ const double newTime = currentTime + (approximateFrameTime - frameShift); |
+ ASSERT(newTime >= currentTime); |
+ ASSERT(newTime <= currentTime + approximateFrameTime); |
+ updateTime(newTime); |
+ } else { |
+ m_currentTask = s_currentTask; |
+ } |
} |
return m_time; |
} |
+void AnimationClock::resetTimeForTesting() |
+{ |
+ m_time = 0; |
+ m_currentTask = 0; |
+ s_currentTask = 0; |
+} |
+ |
} |