diff --git a/Userland/Libraries/LibWeb/HTML/EventLoop/EventLoop.h b/Userland/Libraries/LibWeb/HTML/EventLoop/EventLoop.h index e77f0e066e0..3827297abe6 100644 --- a/Userland/Libraries/LibWeb/HTML/EventLoop/EventLoop.h +++ b/Userland/Libraries/LibWeb/HTML/EventLoop/EventLoop.h @@ -73,6 +73,10 @@ public: double compute_deadline() const; + // https://html.spec.whatwg.org/multipage/webappapis.html#pause + void set_execution_paused(bool execution_paused) { m_execution_paused = execution_paused; } + bool execution_paused() const { return m_execution_paused; } + private: Type m_type { Type::Window }; @@ -104,6 +108,8 @@ private: // https://html.spec.whatwg.org/multipage/browsing-the-web.html#termination-nesting-level size_t m_termination_nesting_level { 0 }; + + bool m_execution_paused { false }; }; EventLoop& main_thread_event_loop(); diff --git a/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp b/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp index 1431b739529..a8c8a51905d 100644 --- a/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp +++ b/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp @@ -24,6 +24,9 @@ void TaskQueue::add(NonnullOwnPtr task) OwnPtr TaskQueue::take_first_runnable() { + if (m_event_loop.execution_paused()) + return nullptr; + for (size_t i = 0; i < m_tasks.size(); ++i) { if (m_tasks[i]->is_runnable()) return m_tasks.take(i); @@ -33,6 +36,9 @@ OwnPtr TaskQueue::take_first_runnable() bool TaskQueue::has_runnable_tasks() const { + if (m_event_loop.execution_paused()) + return false; + for (auto& task : m_tasks) { if (task->is_runnable()) return true;