diff --git a/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp b/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp
index a8c8a51905..dcfa458baf 100644
--- a/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp
+++ b/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.cpp
@@ -53,4 +53,22 @@ void TaskQueue::remove_tasks_matching(Function filter)
});
}
+ErrorOr>> TaskQueue::take_tasks_matching(Function filter)
+{
+ Vector> matching_tasks;
+
+ for (size_t i = 0; i < m_tasks.size();) {
+ auto& task = m_tasks.at(i);
+
+ if (filter(*task)) {
+ TRY(matching_tasks.try_append(move(task)));
+ m_tasks.remove(i);
+ } else {
+ ++i;
+ }
+ }
+
+ return matching_tasks;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.h b/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.h
index f3e31c4fac..59454efa5a 100644
--- a/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.h
+++ b/Userland/Libraries/LibWeb/HTML/EventLoop/TaskQueue.h
@@ -32,6 +32,7 @@ public:
}
void remove_tasks_matching(Function);
+ ErrorOr>> take_tasks_matching(Function);
private:
HTML::EventLoop& m_event_loop;