Index: Source/core/animation/AnimationClock.cpp |
diff --git a/Source/core/animation/AnimationClock.cpp b/Source/core/animation/AnimationClock.cpp |
index d51c95e7aed188da489a296342619fdac98b2841..d373f02cfe2aff1c49c42ec5265d4e8b440c323d 100644 |
--- a/Source/core/animation/AnimationClock.cpp |
+++ b/Source/core/animation/AnimationClock.cpp |
@@ -34,49 +34,61 @@ |
#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) |
+void AnimationClock::updateTime(blink::WebFrameTime frameTime) |
{ |
- if (time > m_time) |
- m_time = time; |
+ ASSERT(!frameTime.isNull()); |
+ ASSERT(internalCurrentTime() <= frameTime.displayFrameTime); |
+ m_frameTime = frameTime; |
m_currentTask = s_currentTask; |
} |
double AnimationClock::currentTime() |
{ |
+ ASSERT(!m_frameTime.isNull()); |
+ ASSERT(m_frameTime.displayFrameTime >= 0); |
+ ASSERT(m_frameTime.predictedNextDisplayFrameTime >= 0); |
+ return internalCurrentTime(); |
+} |
+ |
+double AnimationClock::internalCurrentTime() |
+{ |
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_frameTime.predictedNextDisplayFrameTime; |
} |
- return m_time; |
+ return m_frameTime.displayFrameTime; |
jamesr
2014/07/08 05:00:35
in particular this value...
|
} |
-void AnimationClock::resetTimeForTesting() |
+void AnimationClock::clearTimeForTesting() |
{ |
- m_time = 0; |
+ m_frameTime = blink::WebFrameTime(); |
m_currentTask = 0; |
s_currentTask = 0; |
} |
+void AnimationClock::tickTimeForTesting() |
+{ |
+ double nextTime = m_frameTime.predictedNextDisplayFrameTime; |
+ if (nextTime == blink::WebFrameTime::Undefined()) { |
+ nextTime = WTF::monotonicallyIncreasingTime(); |
+ } |
+ |
+ // AnimationClock doesn't use lastFrameTime or renderDeadline so we just |
+ // use dummy values when testing. |
+ updateTime( |
+ blink::WebFrameTime( |
+ blink::WebFrameTime::Undefined(), |
+ blink::WebFrameTime::Undefined(), |
+ nextTime, |
+ nextTime + (1 / 60.0))); |
+} |
+ |
+void AnimationClock::resetTimeForTesting() |
+{ |
+ clearTimeForTesting(); |
+ tickTimeForTesting(); |
+} |
} |