From 915a240944390fffb7a69793ab8e7fe9d9725cc0 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 4 Sep 2022 13:26:36 +0200 Subject: [PATCH] LibWeb: Make IdleDeadline GC-allocated --- Userland/Libraries/LibWeb/Forward.h | 1 - Userland/Libraries/LibWeb/HTML/Window.cpp | 11 +++++------ .../RequestIdleCallback/IdleDeadline.cpp | 11 +++++++---- .../LibWeb/RequestIdleCallback/IdleDeadline.h | 19 +++++++++---------- Userland/Libraries/LibWeb/idl_files.cmake | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 992bd9e15f..7fe753490b 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -449,7 +449,6 @@ class URLSearchParamsIterator; namespace Web::Bindings { class DOMExceptionWrapper; -class IdleDeadlineWrapper; class IntersectionObserverWrapper; class LocationObject; class OptionConstructor; diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index e01ec222a1..aa5c471d57 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -63,18 +62,18 @@ void run_animation_frame_callbacks(DOM::Document& document, double) class IdleCallback : public RefCounted { public: - explicit IdleCallback(Function)> handler, u32 handle) + explicit IdleCallback(Function)> handler, u32 handle) : m_handler(move(handler)) , m_handle(handle) { } ~IdleCallback() = default; - JS::Completion invoke(NonnullRefPtr deadline) { return m_handler(move(deadline)); } + JS::Completion invoke(JS::NonnullGCPtr deadline) { return m_handler(deadline); } u32 handle() const { return m_handle; } private: - Function)> m_handler; + Function)> m_handler; u32 m_handle { 0 }; }; @@ -666,7 +665,7 @@ void Window::invoke_idle_callbacks() // 1. Pop the top callback from window's list of runnable idle callbacks. auto callback = m_runnable_idle_callbacks.take_first(); // 2. Let deadlineArg be a new IdleDeadline whose [get deadline time algorithm] is getDeadline. - auto deadline_arg = RequestIdleCallback::IdleDeadline::create(); + auto deadline_arg = RequestIdleCallback::IdleDeadline::create(*this); // 3. Call callback with deadlineArg as its argument. If an uncaught runtime script error occurs, then report the exception. auto result = callback->invoke(deadline_arg); if (result.is_error()) @@ -689,7 +688,7 @@ u32 Window::request_idle_callback_impl(Bindings::CallbackType& callback) // 3. Let handle be the current value of window's idle callback identifier. auto handle = window.m_idle_callback_identifier; // 4. Push callback to the end of window's list of idle request callbacks, associated with handle. - auto handler = [callback = JS::make_handle(callback)](NonnullRefPtr deadline) -> JS::Completion { + auto handler = [callback = JS::make_handle(callback)](JS::NonnullGCPtr deadline) -> JS::Completion { auto& realm = callback->callback.shape().realm(); auto* wrapped_deadline = Bindings::wrap(realm, *deadline); return Bindings::IDL::invoke_callback(const_cast(*callback), {}, JS::Value(wrapped_deadline)); diff --git a/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.cpp b/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.cpp index 2c296598f6..2012c50ac6 100644 --- a/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.cpp +++ b/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.cpp @@ -6,18 +6,21 @@ */ #include +#include #include namespace Web::RequestIdleCallback { -NonnullRefPtr IdleDeadline::create(bool did_timeout) +JS::NonnullGCPtr IdleDeadline::create(HTML::Window& window, bool did_timeout) { - return adopt_ref(*new IdleDeadline(did_timeout)); + return *window.heap().allocate(window.realm(), window, did_timeout); } -IdleDeadline::IdleDeadline(bool did_timeout) - : m_did_timeout(did_timeout) +IdleDeadline::IdleDeadline(HTML::Window& window, bool did_timeout) + : PlatformObject(window.realm()) + , m_did_timeout(did_timeout) { + set_prototype(&window.cached_web_prototype("IdleDeadline")); } IdleDeadline::~IdleDeadline() = default; diff --git a/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.h b/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.h index 3ceda83407..f587ecab38 100644 --- a/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.h +++ b/Userland/Libraries/LibWeb/RequestIdleCallback/IdleDeadline.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Andreas Kling + * Copyright (c) 2021-2022, Andreas Kling * Copyright (c) 2022, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause @@ -8,27 +8,26 @@ #pragma once #include -#include +#include namespace Web::RequestIdleCallback { -class IdleDeadline final - : public RefCounted - , public Bindings::Wrappable { -public: - using WrapperType = Bindings::IdleDeadlineWrapper; - using AllowOwnPtr = TrueType; +class IdleDeadline final : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(IdleDeadline, Bindings::PlatformObject); - static NonnullRefPtr create(bool did_timeout = false); +public: + static JS::NonnullGCPtr create(HTML::Window&, bool did_timeout = false); virtual ~IdleDeadline() override; double time_remaining() const; bool did_timeout() const { return m_did_timeout; } private: - IdleDeadline(bool did_timeout); + IdleDeadline(HTML::Window&, bool did_timeout); bool m_did_timeout { false }; }; } + +WRAPPER_HACK(IdleDeadline, Web::RequestIdleCallback) diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index a9875eddde..891aae9490 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -157,7 +157,7 @@ libweb_js_wrapper(HTML/WorkerNavigator) libweb_js_wrapper(HighResolutionTime/Performance NO_INSTANCE) libweb_js_wrapper(IntersectionObserver/IntersectionObserver) libweb_js_wrapper(NavigationTiming/PerformanceTiming NO_INSTANCE) -libweb_js_wrapper(RequestIdleCallback/IdleDeadline) +libweb_js_wrapper(RequestIdleCallback/IdleDeadline NO_INSTANCE) libweb_js_wrapper(ResizeObserver/ResizeObserver) libweb_js_wrapper(SVG/SVGAnimatedLength NO_INSTANCE) libweb_js_wrapper(SVG/SVGClipPathElement NO_INSTANCE)