From 9802995de8b2a4477e0ebc8708f0eb2935c6777c Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Sat, 4 Nov 2023 12:05:49 -0700 Subject: [PATCH] LibWeb: Track an Animation's play/pause task state This only tracks whether the relevant steps should be executed at some future (but very soon) time. This time will eventually be whenever the "update animations and send events" procedure is invoked. --- .../Libraries/LibWeb/Animations/Animation.cpp | 19 ++++++++++++++----- .../Libraries/LibWeb/Animations/Animation.h | 12 ++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) 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 }; }; }