diff --git a/Userland/Libraries/LibWeb/Animations/Animation.cpp b/Userland/Libraries/LibWeb/Animations/Animation.cpp index 28400128a7..d608edf8e2 100644 --- a/Userland/Libraries/LibWeb/Animations/Animation.cpp +++ b/Userland/Libraries/LibWeb/Animations/Animation.cpp @@ -54,10 +54,14 @@ void Animation::set_effect(JS::GCPtr new_effect) if (new_effect == old_effect) return; - // FIXME: 3. If animation has a pending pause task, reschedule that task to run as soon as animation is ready. + // 3. If animation has a pending pause task, reschedule that task to run as soon as animation is ready. + if (m_pending_pause_task == TaskState::Pending) + m_pending_pause_task = TaskState::RunAsSoonAsReady; - // FIXME: 4. If animation has a pending play task, reschedule that task to run as soon as animation is ready to play - // new effect. + // 4. If animation has a pending play task, reschedule that task to run as soon as animation is ready to play ne + // effect. + if (m_pending_play_task == TaskState::Pending) + m_pending_play_task = TaskState::RunAsSoonAsReady; // 5. If new effect is not null and if new effect is the associated effect of another animation, previous animation, // run the procedure to set the associated effect of an animation (this procedure) on previous animation passing @@ -143,8 +147,13 @@ void Animation::set_start_time(Optional const& new_start_time) m_hold_time = previous_current_time; } - // FIXME: 7. If animation has a pending play task or a pending pause task, cancel that task and resolve animation’s - // current ready promise with animation. + // 7. If animation has a pending play task or a pending pause task, cancel that task and resolve animation’s current + // ready promise with animation. + if (m_pending_play_task == TaskState::Pending || m_pending_pause_task == TaskState::Pending) { + m_pending_play_task = TaskState::None; + m_pending_pause_task = TaskState::None; + WebIDL::resolve_promise(realm(), current_ready_promise(), this); + } // FIXME: 8. Run the procedure to update an animation’s finished state for animation with the did seek flag set to // true, and the synchronously notify flag set to false. diff --git a/Userland/Libraries/LibWeb/Animations/Animation.h b/Userland/Libraries/LibWeb/Animations/Animation.h index ad89882825..37fe50099f 100644 --- a/Userland/Libraries/LibWeb/Animations/Animation.h +++ b/Userland/Libraries/LibWeb/Animations/Animation.h @@ -55,6 +55,12 @@ protected: virtual void visit_edges(Cell::Visitor&) override; private: + enum class TaskState { + None, + Pending, + RunAsSoonAsReady, + }; + void apply_any_pending_playback_rate(); JS::NonnullGCPtr current_ready_promise() const; @@ -90,6 +96,12 @@ private: // https://www.w3.org/TR/web-animations-1/#current-finished-promise mutable JS::GCPtr m_current_finished_promise; + + // https://www.w3.org/TR/web-animations-1/#pending-play-task + TaskState m_pending_play_task { TaskState::None }; + + // https://www.w3.org/TR/web-animations-1/#pending-pause-task + TaskState m_pending_pause_task { TaskState::None }; }; }