Chromium Code Reviews| Index: Source/core/dom/custom/CustomElementMicrotaskQueue.cpp |
| diff --git a/Source/core/dom/custom/CustomElementMicrotaskQueue.cpp b/Source/core/dom/custom/CustomElementMicrotaskQueue.cpp |
| index 9afa0e00922d1116dd18f6d5d0879b99c07df2a7..d0abbc34e5efad963f5c89e3ef437aed5e6885da 100644 |
| --- a/Source/core/dom/custom/CustomElementMicrotaskQueue.cpp |
| +++ b/Source/core/dom/custom/CustomElementMicrotaskQueue.cpp |
| @@ -83,23 +83,42 @@ void CustomElementMicrotaskQueue::enqueue(PassOwnPtr<CustomElementMicrotaskStep> |
| CustomElementMicrotaskStep::Result CustomElementMicrotaskQueue::dispatch() |
| { |
| MicrotaskQueueInvocationScope scope(this); |
| - Result result = Result(0); |
| + Vector<OwnPtr<CustomElementMicrotaskStep> > remaining; |
|
dominicc (has gone to gerrit)
2014/04/30 23:57:20
I think you should avoid this "remain" thing. It j
|
| + Result accumulatedResult = Result(CustomElementMicrotaskStep::Continue); |
| unsigned i; |
| for (i = 0; i < m_queue.size(); ++i) { |
| - result = Result(result | m_queue[i]->process()); |
| - |
| - if (result & CustomElementMicrotaskStep::ShouldStop) |
| + Result result = m_queue[i]->process(); |
| + accumulatedResult = Result(result | accumulatedResult); |
| + |
| + bool shouldStop = result & CustomElementMicrotaskStep::ShouldStop; |
| + bool shouldRemain = result & CustomElementMicrotaskStep::ShouldRemain; |
| + ASSERT(!shouldStop || shouldStop == shouldRemain); |
| + if (shouldRemain) |
| + remaining.append(m_queue[i].release()); |
| + if (shouldStop) |
| break; |
| } |
| - bool wasStopped = i < m_queue.size(); |
| - if (wasStopped) |
| - m_queue.remove(0, i); |
| - else |
| - m_queue.resize(0); |
| + for (++i; i < m_queue.size(); ++i) |
| + remaining.append(m_queue[i].release()); |
| + m_queue.swap(remaining); |
| + return accumulatedResult; |
| +} |
| - return result; |
| +#if !defined(NDEBUG) |
| +void CustomElementMicrotaskQueue::show(unsigned indent) |
| +{ |
| + for (unsigned i = 0; i < m_queue.size(); ++i) { |
| + if (m_queue[i]) { |
| + m_queue[i]->show(indent); |
| + } else { |
| + for (unsigned j = 0; j < indent; ++j) |
| + fprintf(stderr, " "); |
| + fprintf(stderr, "null\n"); |
| + } |
| + } |
| } |
| +#endif |
| } // namespace WebCore |