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;