// https://w3c.github.io/web-animations/#cancel-an-animation void Animation::DoCancel() { if (mPendingState != PendingState::NotPending) { CancelPendingTasks(); if (mReady) { mReady->MaybeReject(NS_ERROR_DOM_ABORT_ERR); } } if (mFinished) { mFinished->MaybeReject(NS_ERROR_DOM_ABORT_ERR); } ResetFinishedPromise(); DispatchPlaybackEvent(NS_LITERAL_STRING("cancel")); mHoldTime.SetNull(); mStartTime.SetNull(); UpdateTiming(SeekFlag::NoSeek, SyncNotifyFlag::Async); if (mTimeline) { mTimeline->RemoveAnimation(this); } }
void Animation::UpdateFinishedState(SeekFlag aSeekFlag, SyncNotifyFlag aSyncNotifyFlag) { Nullable<TimeDuration> currentTime = GetCurrentTime(); TimeDuration effectEnd = TimeDuration(EffectEnd()); if (!mStartTime.IsNull() && mPendingState == PendingState::NotPending) { if (mPlaybackRate > 0.0 && !currentTime.IsNull() && currentTime.Value() >= effectEnd) { if (aSeekFlag == SeekFlag::DidSeek) { mHoldTime = currentTime; } else if (!mPreviousCurrentTime.IsNull()) { mHoldTime.SetValue(std::max(mPreviousCurrentTime.Value(), effectEnd)); } else { mHoldTime.SetValue(effectEnd); } } else if (mPlaybackRate < 0.0 && !currentTime.IsNull() && currentTime.Value().ToMilliseconds() <= 0.0) { if (aSeekFlag == SeekFlag::DidSeek) { mHoldTime = currentTime; } else { mHoldTime.SetValue(0); } } else if (mPlaybackRate != 0.0 && !currentTime.IsNull() && mTimeline && !mTimeline->GetCurrentTime().IsNull()) { if (aSeekFlag == SeekFlag::DidSeek && !mHoldTime.IsNull()) { mStartTime.SetValue(mTimeline->GetCurrentTime().Value() - (mHoldTime.Value().MultDouble(1 / mPlaybackRate))); } mHoldTime.SetNull(); } } bool currentFinishedState = PlayState() == AnimationPlayState::Finished; if (currentFinishedState && !mFinishedIsResolved) { DoFinishNotification(aSyncNotifyFlag); } else if (!currentFinishedState && mFinishedIsResolved) { ResetFinishedPromise(); if (mEffect->AsTransition()) { mEffect->SetIsFinishedTransition(false); } } // We must recalculate the current time to take account of any mHoldTime // changes the code above made. mPreviousCurrentTime = GetCurrentTime(); }