1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 18:08:12 +00:00

LibWeb: Implement Animation::play_state

This commit is contained in:
Matthew Olsson 2023-11-04 12:15:18 -07:00 committed by Andreas Kling
parent 8039fe78cd
commit fe40bdfc01
3 changed files with 46 additions and 4 deletions

View file

@ -257,8 +257,39 @@ WebIDL::ExceptionOr<void> Animation::set_playback_rate(double new_playback_rate)
// https://www.w3.org/TR/web-animations-1/#animation-play-state
Bindings::AnimationPlayState Animation::play_state() const
{
// FIXME: Implement
return Bindings::AnimationPlayState::Idle;
// The play state of animation, animation, at a given moment is the state corresponding to the first matching
// condition from the following:
// -> All of the following conditions are true:
// - The current time of animation is unresolved, and
// - the start time of animation is unresolved, and
// - animation does not have either a pending play task or a pending pause task,
auto current_time = this->current_time();
if (!current_time.has_value() && !m_start_time.has_value() && !pending()) {
// → idle
return Bindings::AnimationPlayState::Idle;
}
// -> Either of the following conditions are true:
// - animation has a pending pause task, or
// - both the start time of animation is unresolved and it does not have a pending play task,
if (m_pending_pause_task == TaskState::Pending || (!m_start_time.has_value() && m_pending_play_task == TaskState::None)) {
// → paused
return Bindings::AnimationPlayState::Paused;
}
// -> For animation, current time is resolved and either of the following conditions are true:
// - animations effective playback rate > 0 and current time ≥ associated effect end; or
// - animations effective playback rate < 0 and current time ≤ 0,
auto effective_playback_rate = this->effective_playback_rate();
if (current_time.has_value() && ((effective_playback_rate > 0.0 && current_time.value() >= associated_effect_end()) || (effective_playback_rate < 0.0 && current_time.value() <= 0.0))) {
// → finished
return Bindings::AnimationPlayState::Finished;
}
// -> Otherwise,
// → running
return Bindings::AnimationPlayState::Running;
}
// https://www.w3.org/TR/web-animations-1/#associated-effect-end
@ -269,6 +300,14 @@ double Animation::associated_effect_end() const
return m_effect ? m_effect->end_time() : 0.0;
}
// https://www.w3.org/TR/web-animations-1/#effective-playback-rate
double Animation::effective_playback_rate() const
{
// The effective playback rate of an animation is its pending playback rate, if set, otherwise it is the animations
// playback rate.
return m_pending_playback_rate.has_value() ? m_pending_playback_rate.value() : m_playback_rate;
}
// https://www.w3.org/TR/web-animations-1/#apply-any-pending-playback-rate
void Animation::apply_any_pending_playback_rate()
{