diff --git a/Userland/Libraries/LibWeb/HTML/Timer.cpp b/Userland/Libraries/LibWeb/HTML/Timer.cpp index 1ea86148f6..b2e75fbdbc 100644 --- a/Userland/Libraries/LibWeb/HTML/Timer.cpp +++ b/Userland/Libraries/LibWeb/HTML/Timer.cpp @@ -10,24 +10,29 @@ namespace Web::HTML { -NonnullRefPtr Timer::create(Window& window, i32 milliseconds, Function callback, i32 id) +JS::NonnullGCPtr Timer::create(Window& window, i32 milliseconds, Function callback, i32 id) { - return adopt_ref(*new Timer(window, milliseconds, move(callback), id)); + return *window.heap().allocate_without_realm(window, milliseconds, move(callback), id); } Timer::Timer(Window& window, i32 milliseconds, Function callback, i32 id) : m_window(window) + , m_callback(move(callback)) , m_id(id) { - m_timer = Core::Timer::create_single_shot(milliseconds, [this, callback = move(callback)] { - NonnullRefPtr strong_timer { *this }; - callback(); + m_timer = Core::Timer::create_single_shot(milliseconds, [this] { + m_callback(); }); } +void Timer::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_window.ptr()); +} + Timer::~Timer() { - m_window.deallocate_timer_id({}, m_id); } void Timer::start() diff --git a/Userland/Libraries/LibWeb/HTML/Timer.h b/Userland/Libraries/LibWeb/HTML/Timer.h index 66553028a8..aa2edfb3f5 100644 --- a/Userland/Libraries/LibWeb/HTML/Timer.h +++ b/Userland/Libraries/LibWeb/HTML/Timer.h @@ -8,23 +8,31 @@ #include #include +#include #include +#include +#include #include namespace Web::HTML { -class Timer final : public RefCounted { +class Timer final : public JS::Cell { + JS_CELL(Timer, JS::Cell); + public: - static NonnullRefPtr create(Window& window, i32 milliseconds, Function callback, i32 id); - ~Timer(); + static JS::NonnullGCPtr create(Window&, i32 milliseconds, Function callback, i32 id); + virtual ~Timer() override; void start(); private: Timer(Window& window, i32 milliseconds, Function callback, i32 id); + virtual void visit_edges(Cell::Visitor&) override; + RefPtr m_timer; - Window& m_window; + JS::NonnullGCPtr m_window; + Function m_callback; i32 m_id { 0 }; }; diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index 942ac9be98..b03ae4d6a1 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -118,6 +118,8 @@ void Window::visit_edges(JS::Cell::Visitor& visitor) visitor.visit(it.value); for (auto& it : m_constructors) visitor.visit(it.value); + for (auto& it : m_timers) + visitor.visit(it.value.ptr()); } Window::~Window() = default; diff --git a/Userland/Libraries/LibWeb/HTML/Window.h b/Userland/Libraries/LibWeb/HTML/Window.h index 463eb28e51..32b9899f79 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.h +++ b/Userland/Libraries/LibWeb/HTML/Window.h @@ -144,7 +144,7 @@ private: JS::GCPtr m_current_event; IDAllocator m_timer_id_allocator; - HashMap> m_timers; + HashMap> m_timers; JS::GCPtr m_performance; NonnullRefPtr m_crypto;