Chromium Code Reviews| Index: Source/core/dom/custom/CustomElementMicrotaskImportStep.cpp |
| diff --git a/Source/core/dom/custom/CustomElementMicrotaskImportStep.cpp b/Source/core/dom/custom/CustomElementMicrotaskImportStep.cpp |
| index 02b2728232e70460b851db2cd82eec3ac9cdf09f..e20b3d80b89987242046d6bdfc6c7ca0d367c37e 100644 |
| --- a/Source/core/dom/custom/CustomElementMicrotaskImportStep.cpp |
| +++ b/Source/core/dom/custom/CustomElementMicrotaskImportStep.cpp |
| @@ -33,16 +33,18 @@ |
| #include "core/dom/custom/CustomElementMicrotaskDispatcher.h" |
| #include "core/dom/custom/CustomElementMicrotaskQueue.h" |
| +#include "core/html/imports/HTMLImportChild.h" |
| namespace WebCore { |
| -PassOwnPtr<CustomElementMicrotaskImportStep> CustomElementMicrotaskImportStep::create(PassRefPtr<CustomElementMicrotaskQueue> queue) |
| +PassOwnPtr<CustomElementMicrotaskImportStep> CustomElementMicrotaskImportStep::create(PassRefPtr<CustomElementMicrotaskQueue> queue, bool shouldStopProcessing) |
| { |
| - return adoptPtr(new CustomElementMicrotaskImportStep(queue)); |
| + return adoptPtr(new CustomElementMicrotaskImportStep(queue, shouldStopProcessing)); |
| } |
| -CustomElementMicrotaskImportStep::CustomElementMicrotaskImportStep(PassRefPtr<CustomElementMicrotaskQueue> queue) |
| - : m_importFinished(false) |
| +CustomElementMicrotaskImportStep::CustomElementMicrotaskImportStep(PassRefPtr<CustomElementMicrotaskQueue> queue, bool shouldStopProcessing) |
| + : m_shouldStopProcessing(shouldStopProcessing) |
| + , m_importWaitingFinish(0) |
| , m_queue(queue) |
| { |
| } |
| @@ -51,20 +53,54 @@ CustomElementMicrotaskImportStep::~CustomElementMicrotaskImportStep() |
| { |
| } |
| -void CustomElementMicrotaskImportStep::importDidFinish() |
| +void CustomElementMicrotaskImportStep::importWasDestroyed() |
| { |
| - // imports should only "finish" once |
| - ASSERT(!m_importFinished); |
| - m_importFinished = true; |
| + m_importWaitingFinish = 0; |
| + m_queue.clear(); |
| +} |
| + |
| +void CustomElementMicrotaskImportStep::importDidLoad(HTMLImportChild* importWaitingFinish) |
| +{ |
| + ASSERT(!m_importWaitingFinish); |
| + m_importWaitingFinish = importWaitingFinish; |
| CustomElementMicrotaskDispatcher::instance().importDidFinish(this); |
| } |
| CustomElementMicrotaskStep::Result CustomElementMicrotaskImportStep::process() |
| { |
| + if (!m_queue) |
| + return Continue; |
| + |
| Result result = m_queue->dispatch(); |
| - if (!m_importFinished) |
| + |
| + if (m_importWaitingFinish) { |
| + if (m_queue->isEmpty()) { |
| + ASSERT(result == Continue); |
| + m_importWaitingFinish->didFinishMicrotask(); |
| + m_importWaitingFinish = 0; |
| + m_queue.clear(); |
| + } |
| + |
| + return result; |
| + } |
| + |
| + result = Result(result | ShouldRemain); |
|
dominicc (has gone to gerrit)
2014/04/30 23:57:20
It seems bad to have a microtask queue whose impor
|
| + if (m_shouldStopProcessing) |
| result = Result(result | ShouldStop); |
| + |
| return result; |
| } |
| +#if !defined(NDEBUG) |
| + |
| +void CustomElementMicrotaskImportStep::show(unsigned indent) |
| +{ |
| + for (unsigned i = 0; i < indent; ++i) |
| + fprintf(stderr, " "); |
| + fprintf(stderr, "Import(stop=%d, finish=%p): \n", m_shouldStopProcessing, m_importWaitingFinish); |
| + m_queue->show(indent + 1); |
| +} |
| + |
| +#endif |
| + |
| } // namespace WebCore |