From 4ca715d2ef2615186ebe013fd30dcc15a8d0adc0 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Fri, 5 Apr 2024 16:00:14 +0200 Subject: [PATCH] LibWeb: Skip SHTQ processing if ongoing task form queue is not finished Fixes a bug when session history traversal queue task could be interrupted by another SHTQ task execution. For example: 1. SHTQ timer callback starts executing a task from the queue. 2. spin_until() is invoked during task execution. 3. SHTQ timer callback starts executing a task from the queue. --- .../Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h b/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h index 88dace3641e..e54b0893ba4 100644 --- a/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h +++ b/Userland/Libraries/LibWeb/HTML/SessionHistoryTraversalQueue.h @@ -25,9 +25,15 @@ public: SessionHistoryTraversalQueue() { m_timer = Core::Timer::create_single_shot(0, [this] { + if (m_is_task_running && m_queue.size() > 0) { + m_timer->start(); + return; + } while (m_queue.size() > 0) { + m_is_task_running = true; auto entry = m_queue.take_first(); entry.steps(); + m_is_task_running = false; } }).release_value_but_fixme_should_propagate_errors(); } @@ -60,6 +66,7 @@ public: private: Vector m_queue; RefPtr m_timer; + bool m_is_task_running { false }; }; }