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;