diff --git a/Libraries/LibGC/Timer.cpp b/Libraries/LibGC/Timer.cpp index c6b42772f1..b508e6671d 100644 --- a/Libraries/LibGC/Timer.cpp +++ b/Libraries/LibGC/Timer.cpp @@ -48,6 +48,25 @@ void Timer::start(u64 timeout_ms, GC::Ref> on_timeout) m_timer->start(); } +void Timer::start_repeating(u64 interval_ms, GC::Ref> on_timeout) +{ + m_on_timeout = on_timeout; + + m_timer->on_timeout = [this]() { + if (m_on_timeout) + m_on_timeout->function()(); + }; + + m_timer->set_interval(static_cast(interval_ms)); + m_timer->set_single_shot(false); + m_timer->start(); +} + +void Timer::restart() +{ + m_timer->restart(); +} + void Timer::stop_and_fire_timeout_handler() { auto on_timeout = m_on_timeout; diff --git a/Libraries/LibGC/Timer.h b/Libraries/LibGC/Timer.h index a1e4e7e41a..302c516497 100644 --- a/Libraries/LibGC/Timer.h +++ b/Libraries/LibGC/Timer.h @@ -25,6 +25,8 @@ public: virtual void finalize() override; void start(u64 timeout_ms, GC::Ref> on_timeout); + void start_repeating(u64 interval_ms, GC::Ref> on_timeout); + void restart(); void stop_and_fire_timeout_handler(); void stop(); diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 96d31a9e68..46756399ec 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -544,7 +545,8 @@ Document::Document(JS::Realm& realm, URL::URL const& url, TemporaryDocumentForFr m_is_decoded_svg = m_page->client().is_svg_page_client(); - m_cursor_blink_timer = Core::Timer::create_repeating(500, [this] { + m_cursor_blink_timer = heap().allocate(); + m_cursor_blink_timer->start_repeating(500, GC::create_function(heap(), [this] { auto cursor_position = this->cursor_position(); if (!cursor_position) return; @@ -558,7 +560,7 @@ Document::Document(JS::Realm& realm, URL::URL const& url, TemporaryDocumentForFr m_cursor_blink_state = !m_cursor_blink_state; node->set_needs_repaint(); } - }); + })); HTML::main_thread_event_loop().register_document({}, *this); } @@ -747,6 +749,7 @@ void Document::visit_edges(Cell::Visitor& visitor) visitor.visit(m_open_dialogs_list); visitor.visit(m_dialog_pointerdown_target); visitor.visit(m_console_client); + visitor.visit(m_cursor_blink_timer); visitor.visit(m_editing_host_manager); visitor.visit(m_local_storage_holder); visitor.visit(m_session_storage_holder); diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index 5122b67fa0..038fcdf3b8 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -1477,7 +1477,7 @@ private: GC::Ptr m_console_client; - RefPtr m_cursor_blink_timer; + GC::Ptr m_cursor_blink_timer; bool m_cursor_blink_state { false }; // NOTE: This is GC::Weak, not GC::Ptr, on purpose. We don't want the document to keep some old detached navigable alive.