Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / dom / Microtasks.cpp
1 /*
2  * Copyright (C) 2014 Yoav Weiss (yoav@yoav.ws)
3  * Copyright (C) 2015 Akamai Technologies Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #include "config.h"
23 #include "Microtasks.h"
24
25 #include <wtf/MainThread.h>
26 #include <wtf/TemporaryChange.h>
27
28 namespace WebCore {
29
30 void Microtask::removeSelfFromQueue(MicrotaskQueue& queue)
31 {
32     queue.remove(*this);
33 }
34
35 MicrotaskQueue::MicrotaskQueue()
36     : m_timer(*this, &MicrotaskQueue::timerFired)
37 {
38 }
39
40 MicrotaskQueue::~MicrotaskQueue()
41 {
42 }
43
44 MicrotaskQueue& MicrotaskQueue::mainThreadQueue()
45 {
46     ASSERT(isMainThread());
47     static NeverDestroyed<MicrotaskQueue> queue;
48     return queue;
49 }
50
51 void MicrotaskQueue::append(std::unique_ptr<Microtask>&& task)
52 {
53     if (m_performingMicrotaskCheckpoint)
54         m_tasksAppendedDuringMicrotaskCheckpoint.append(WTFMove(task));
55     else
56         m_microtaskQueue.append(WTFMove(task));
57
58     m_timer.startOneShot(0);
59 }
60
61 void MicrotaskQueue::remove(const Microtask& task)
62 {
63     for (size_t i = 0; i < m_microtaskQueue.size(); ++i) {
64         if (m_microtaskQueue[i].get() == &task) {
65             m_microtaskQueue.remove(i);
66             return;
67         }
68     }
69     for (size_t i = 0; i < m_tasksAppendedDuringMicrotaskCheckpoint.size(); ++i) {
70         if (m_tasksAppendedDuringMicrotaskCheckpoint[i].get() == &task) {
71             m_tasksAppendedDuringMicrotaskCheckpoint.remove(i);
72             return;
73         }
74     }
75 }
76
77 void MicrotaskQueue::timerFired()
78 {
79     performMicrotaskCheckpoint();
80 }
81
82 void MicrotaskQueue::performMicrotaskCheckpoint()
83 {
84     if (m_performingMicrotaskCheckpoint)
85         return;
86
87     TemporaryChange<bool> change(m_performingMicrotaskCheckpoint, true);
88
89     Vector<std::unique_ptr<Microtask>> queue = WTFMove(m_microtaskQueue);
90     for (auto& task : queue) {
91         auto result = task->run();
92         switch (result) {
93         case Microtask::Result::Done:
94             break;
95         case Microtask::Result::KeepInQueue:
96             m_microtaskQueue.append(WTFMove(task));
97             break;
98         }
99     }
100
101     for (auto& task : m_tasksAppendedDuringMicrotaskCheckpoint)
102         m_microtaskQueue.append(WTFMove(task));
103     m_tasksAppendedDuringMicrotaskCheckpoint.clear();
104 }
105
106 } // namespace WebCore