From 38855de829148099d53370de360ed161551fd20c Mon Sep 17 00:00:00 2001 From: MacDue Date: Sun, 4 Feb 2024 21:08:10 +0000 Subject: [PATCH] LibWeb: Use 'now' from EventLoop for animation frame callbacks Previously, 'now' was set to the time `requestAnimationFrame()` was called, and the EventLoop's 'now' was ignored. This was a little odd and meant the time was always in the past. --- .../Libraries/LibWeb/HTML/AnimationFrameCallbackDriver.h | 4 ++-- Userland/Libraries/LibWeb/HTML/Window.cpp | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/AnimationFrameCallbackDriver.h b/Userland/Libraries/LibWeb/HTML/AnimationFrameCallbackDriver.h index 05bdc5daac..3c5b07811a 100644 --- a/Userland/Libraries/LibWeb/HTML/AnimationFrameCallbackDriver.h +++ b/Userland/Libraries/LibWeb/HTML/AnimationFrameCallbackDriver.h @@ -43,11 +43,11 @@ struct AnimationFrameCallbackDriver { return true; } - void run() + void run(double now) { auto taken_callbacks = move(m_callbacks); for (auto& [id, callback] : taken_callbacks) - callback(id); + callback(now); } bool has_callbacks() const diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index 50f4c1394c..fbe87a7e24 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -76,10 +76,10 @@ namespace Web::HTML { JS_DEFINE_ALLOCATOR(Window); // https://html.spec.whatwg.org/#run-the-animation-frame-callbacks -void run_animation_frame_callbacks(DOM::Document& document, double) +void run_animation_frame_callbacks(DOM::Document& document, double now) { // FIXME: Bring this closer to the spec. - document.window().animation_frame_callback_driver().run(); + document.window().animation_frame_callback_driver().run(now); } class IdleCallback : public RefCounted { @@ -1409,8 +1409,7 @@ double Window::device_pixel_ratio() const i32 Window::request_animation_frame(WebIDL::CallbackType& callback) { // FIXME: Make this fully spec compliant. Currently implements a mix of 'requestAnimationFrame()' and 'run the animation frame callbacks'. - auto now = HighResolutionTime::unsafe_shared_current_time(); - return m_animation_frame_callback_driver.add([this, now, callback = JS::make_handle(callback)](auto) { + return m_animation_frame_callback_driver.add([this, callback = JS::make_handle(callback)](double now) { // 3. Invoke callback, passing now as the only argument, and if an exception is thrown, report the exception. auto result = WebIDL::invoke_callback(*callback, {}, JS::Value(now)); if (result.is_error())