SMILTimeContainer::~SMILTimeContainer()
{
- m_timer.stop();
+ cancelAnimationFrame();
ASSERT(!m_timer.isActive());
#ifndef NDEBUG
ASSERT(!m_preventScheduledAnimationsChanges);
#endif
ElementAttributePair key(target, attributeName);
- OwnPtr<AnimationsVector>& scheduled = m_scheduledAnimations.add(key, nullptr).iterator->value;
+ OwnPtr<AnimationsVector>& scheduled = m_scheduledAnimations.add(key, nullptr).storedValue->value;
if (!scheduled)
scheduled = adoptPtr(new AnimationsVector);
ASSERT(!scheduled->contains(animation));
{
// Schedule updateAnimations() to be called asynchronously so multiple intervals
// can change with updateAnimations() only called once at the end.
- startTimer(0);
+ scheduleAnimationFrame();
}
SMILTime SMILTimeContainer::elapsed() const
if (m_pauseTime) {
m_pauseTime = now;
- m_timer.stop();
+ cancelAnimationFrame();
}
}
if (m_beginTime) {
m_accumulatedActiveTime += m_pauseTime - lastResumeTime();
- m_timer.stop();
+ cancelAnimationFrame();
}
m_resumeTime = 0;
}
m_resumeTime = currentTime();
m_pauseTime = 0;
- startTimer(0);
+ scheduleAnimationFrame();
}
void SMILTimeContainer::setElapsed(SMILTime time)
}
if (m_beginTime)
- m_timer.stop();
+ cancelAnimationFrame();
double now = currentTime();
m_beginTime = now - time.value();
updateAnimations(time, true);
}
-void SMILTimeContainer::startTimer(SMILTime fireTime, SMILTime minimumDelay)
+bool SMILTimeContainer::isTimelineRunning() const
+{
+ return m_beginTime && !isPaused();
+}
+
+void SMILTimeContainer::scheduleAnimationFrame(SMILTime fireTime)
{
- if (!m_beginTime || isPaused())
+ if (!isTimelineRunning())
return;
if (!fireTime.isFinite())
return;
- SMILTime delay = max(fireTime - elapsed(), minimumDelay);
+ SMILTime delay = max(fireTime - elapsed(), SMILTime(animationFrameDelay));
m_timer.startOneShot(delay.value());
}
+void SMILTimeContainer::scheduleAnimationFrame()
+{
+ if (!isTimelineRunning())
+ return;
+
+ m_timer.startOneShot(0);
+}
+
+void SMILTimeContainer::cancelAnimationFrame()
+{
+ m_timer.stop();
+}
+
void SMILTimeContainer::timerFired(Timer<SMILTimeContainer>*)
{
- ASSERT(m_beginTime);
- ASSERT(!m_pauseTime);
+ ASSERT(isTimelineRunning());
updateAnimations(elapsed());
}
#ifndef NDEBUG
m_preventScheduledAnimationsChanges = false;
#endif
- startTimer(earliestFireTime, animationFrameDelay);
+ scheduleAnimationFrame(earliestFireTime);
return;
}
m_preventScheduledAnimationsChanges = false;
#endif
- startTimer(earliestFireTime, animationFrameDelay);
+ scheduleAnimationFrame(earliestFireTime);
for (unsigned i = 0; i < animationsToApplySize; ++i) {
if (animationsToApply[i]->inDocument() && animationsToApply[i]->isSVGDiscardElement()) {