1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/dom/custom/CustomElementMicrotaskRunQueue.h"
7
8 #include "core/dom/Microtask.h"
9 #include "core/dom/custom/CustomElementAsyncImportMicrotaskQueue.h"
10 #include "core/dom/custom/CustomElementSyncMicrotaskQueue.h"
11 #include "core/html/imports/HTMLImportLoader.h"
12
13 #include <stdio.h>
14
15 namespace blink {
16
DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(CustomElementMicrotaskRunQueue)17 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(CustomElementMicrotaskRunQueue)
18
19 CustomElementMicrotaskRunQueue::CustomElementMicrotaskRunQueue()
20 : m_weakFactory(this)
21 , m_syncQueue(CustomElementSyncMicrotaskQueue::create())
22 , m_asyncQueue(CustomElementAsyncImportMicrotaskQueue::create())
23 , m_dispatchIsPending(false)
24 {
25 }
26
enqueue(HTMLImportLoader * parentLoader,PassOwnPtrWillBeRawPtr<CustomElementMicrotaskStep> step,bool importIsSync)27 void CustomElementMicrotaskRunQueue::enqueue(HTMLImportLoader* parentLoader, PassOwnPtrWillBeRawPtr<CustomElementMicrotaskStep> step, bool importIsSync)
28 {
29 if (importIsSync) {
30 if (parentLoader)
31 parentLoader->microtaskQueue()->enqueue(step);
32 else
33 m_syncQueue->enqueue(step);
34 } else {
35 m_asyncQueue->enqueue(step);
36 }
37
38 requestDispatchIfNeeded();
39 }
40
dispatchIfAlive(WeakPtr<CustomElementMicrotaskRunQueue> self)41 void CustomElementMicrotaskRunQueue::dispatchIfAlive(WeakPtr<CustomElementMicrotaskRunQueue> self)
42 {
43 if (self.get())
44 self->dispatch();
45 }
46
requestDispatchIfNeeded()47 void CustomElementMicrotaskRunQueue::requestDispatchIfNeeded()
48 {
49 if (m_dispatchIsPending || isEmpty())
50 return;
51 Microtask::enqueueMicrotask(WTF::bind(&CustomElementMicrotaskRunQueue::dispatchIfAlive, m_weakFactory.createWeakPtr()));
52 m_dispatchIsPending = true;
53 }
54
trace(Visitor * visitor)55 void CustomElementMicrotaskRunQueue::trace(Visitor* visitor)
56 {
57 visitor->trace(m_syncQueue);
58 visitor->trace(m_asyncQueue);
59 }
60
dispatch()61 void CustomElementMicrotaskRunQueue::dispatch()
62 {
63 m_dispatchIsPending = false;
64 m_syncQueue->dispatch();
65 if (m_syncQueue->isEmpty())
66 m_asyncQueue->dispatch();
67 }
68
isEmpty() const69 bool CustomElementMicrotaskRunQueue::isEmpty() const
70 {
71 return m_syncQueue->isEmpty() && m_asyncQueue->isEmpty();
72 }
73
74 #if !defined(NDEBUG)
show(unsigned indent)75 void CustomElementMicrotaskRunQueue::show(unsigned indent)
76 {
77 fprintf(stderr, "Sync:\n");
78 m_syncQueue->show(indent);
79 fprintf(stderr, "Async:\n");
80 m_asyncQueue->show(indent);
81 }
82 #endif
83
84 } // namespace blink
85