Serenity Operating System
1/*
2 * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibWeb/HTML/EventLoop/EventLoop.h>
8#include <LibWeb/HTML/EventLoop/TaskQueue.h>
9
10namespace Web::HTML {
11
12TaskQueue::TaskQueue(HTML::EventLoop& event_loop)
13 : m_event_loop(event_loop)
14{
15}
16
17TaskQueue::~TaskQueue() = default;
18
19void TaskQueue::add(NonnullOwnPtr<Task> task)
20{
21 m_tasks.append(move(task));
22 m_event_loop.schedule();
23}
24
25OwnPtr<Task> TaskQueue::take_first_runnable()
26{
27 if (m_event_loop.execution_paused())
28 return nullptr;
29
30 for (size_t i = 0; i < m_tasks.size(); ++i) {
31 if (m_tasks[i]->is_runnable())
32 return m_tasks.take(i);
33 }
34 return nullptr;
35}
36
37bool TaskQueue::has_runnable_tasks() const
38{
39 if (m_event_loop.execution_paused())
40 return false;
41
42 for (auto& task : m_tasks) {
43 if (task->is_runnable())
44 return true;
45 }
46 return false;
47}
48
49void TaskQueue::remove_tasks_matching(Function<bool(HTML::Task const&)> filter)
50{
51 m_tasks.remove_all_matching([&](auto& task) {
52 return filter(*task);
53 });
54}
55
56}