diff options
Diffstat (limited to 'Userland/Libraries/LibWeb/DOM/Window.cpp')
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Window.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Window.cpp b/Userland/Libraries/LibWeb/DOM/Window.cpp index 4983e85ced..45e544f140 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.cpp +++ b/Userland/Libraries/LibWeb/DOM/Window.cpp @@ -146,20 +146,21 @@ i32 Window::set_timeout(JS::FunctionObject& callback, i32 interval) void Window::timer_did_fire(Badge<Timer>, Timer& timer) { - // We should not be here if there's no JS wrapper for the Window object. - VERIFY(wrapper()); - auto& vm = wrapper()->vm(); - - // NOTE: This protector pointer keeps the timer alive until the end of this function no matter what. - NonnullRefPtr protector(timer); + NonnullRefPtr<Timer> strong_timer { timer }; if (timer.type() == Timer::Type::Timeout) { m_timers.remove(timer.id()); } - [[maybe_unused]] auto rc = vm.call(timer.callback(), wrapper()); - if (vm.exception()) - vm.clear_exception(); + HTML::queue_global_task(HTML::Task::Source::TimerTask, associated_document(), [this, strong_this = NonnullRefPtr(*this), strong_timer = NonnullRefPtr(timer)]() mutable { + // We should not be here if there's no JS wrapper for the Window object. + VERIFY(wrapper()); + auto& vm = wrapper()->vm(); + + [[maybe_unused]] auto rc = vm.call(strong_timer->callback(), wrapper()); + if (vm.exception()) + vm.clear_exception(); + }); } i32 Window::allocate_timer_id(Badge<Timer>) |