void AnimationPlayer::setStartTime(double newStartTime) { if (!std::isfinite(newStartTime)) return; updateCurrentTimingState(); // Update the value of held m_startTime = newStartTime; if (m_held) return; updateCurrentTimingState(); setOutdated(); }
void AnimationPlayer::setStartTimeInternal(double newStartTime) { ASSERT(!m_paused); ASSERT(std::isfinite(newStartTime)); ASSERT(newStartTime != m_startTime); bool hadStartTime = hasStartTime(); double previousCurrentTime = currentTimeInternal(); m_startTime = newStartTime; if (m_held && m_playbackRate) { // If held, the start time would still be derrived from the hold time. // Force a new, limited, current time. m_held = false; double currentTime = calculateCurrentTime(); if (m_playbackRate > 0 && currentTime > sourceEnd()) { currentTime = sourceEnd(); } else if (m_playbackRate < 0 && currentTime < 0) { currentTime = 0; } setCurrentTimeInternal(currentTime, TimingUpdateOnDemand); } updateCurrentTimingState(TimingUpdateOnDemand); double newCurrentTime = currentTimeInternal(); if (previousCurrentTime != newCurrentTime) { setOutdated(); } else if (!hadStartTime && m_timeline) { // Even though this player is not outdated, time to effect change is // infinity until start time is set. m_timeline->wake(); } }
bool AnimationPlayer::update(TimingUpdateReason reason) { if (!m_timeline) return false; updateCurrentTimingState(reason); m_outdated = false; if (m_content) { double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullValue() : currentTimeInternal(); m_content->updateInheritedTime(inheritedTime, reason); } if (finished() && !m_finished) { if (reason == TimingUpdateForAnimationFrame && hasStartTime()) { const AtomicString& eventType = EventTypeNames::finish; if (executionContext() && hasEventListeners(eventType)) { m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType, currentTime(), timeline()->currentTime()); m_pendingFinishedEvent->setTarget(this); m_pendingFinishedEvent->setCurrentTarget(this); m_timeline->document()->enqueueAnimationFrameEvent(m_pendingFinishedEvent); } m_finished = true; } } ASSERT(!m_outdated); return !m_finished || !finished(); }
double AnimationPlayer::currentTime() { updateCurrentTimingState(); if (m_held) return m_holdTime; return currentTimeWithLag(); }
double AnimationPlayer::currentTimeInternal() { updateCurrentTimingState(TimingUpdateOnDemand); if (m_held) return m_holdTime; return calculateCurrentTime(); }