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