Chromium Code Reviews| Index: Source/core/dom/MutationObserver.cpp |
| diff --git a/Source/core/dom/MutationObserver.cpp b/Source/core/dom/MutationObserver.cpp |
| index 4402477d9e6fc8674f65f8df1b94c70a8dda4f40..d84544267c3e28d251ccbecdd91efbb21924bef6 100644 |
| --- a/Source/core/dom/MutationObserver.cpp |
| +++ b/Source/core/dom/MutationObserver.cpp |
| @@ -36,6 +36,7 @@ |
| #include "bindings/v8/ExceptionState.h" |
| #include "core/dom/Document.h" |
| #include "core/dom/ExceptionCode.h" |
| +#include "core/dom/Microtask.h" |
| #include "core/dom/MutationCallback.h" |
| #include "core/dom/MutationObserverRegistration.h" |
| #include "core/dom/MutationRecord.h" |
| @@ -182,18 +183,27 @@ static MutationObserverSet& suspendedMutationObservers() |
| return suspendedObservers; |
| } |
| +static void activateObserver(PassRefPtr<MutationObserver> observer) |
| +{ |
| + MutationObserverSet& active = activeMutationObservers(); |
|
adamk
2014/01/29 22:58:24
Nit: No need to save this into a local, you can ju
rafaelw
2014/01/29 23:18:52
Done.
|
| + if (active.isEmpty()) |
| + Microtask::enqueueMicrotask(&MutationObserver::deliverMutations); |
| + |
| + activeMutationObservers().add(observer); |
| +} |
| + |
| void MutationObserver::enqueueMutationRecord(PassRefPtr<MutationRecord> mutation) |
| { |
| ASSERT(isMainThread()); |
| m_records.append(mutation); |
| - activeMutationObservers().add(this); |
| + activateObserver(this); |
| InspectorInstrumentation::didEnqueueMutationRecord(m_callback->executionContext(), this); |
| } |
| void MutationObserver::setHasTransientRegistration() |
| { |
| ASSERT(isMainThread()); |
| - activeMutationObservers().add(this); |
| + activateObserver(this); |
| } |
| HashSet<Node*> MutationObserver::getObservedNodes() const |
| @@ -234,7 +244,7 @@ void MutationObserver::deliver() |
| InspectorInstrumentation::didDeliverMutationRecords(m_callback->executionContext()); |
| } |
| -void MutationObserver::deliverAllMutations() |
| +void MutationObserver::deliverMutations() |
| { |
| ASSERT(isMainThread()); |
| static bool deliveryInProgress = false; |
|
adamk
2014/01/29 22:58:24
Can you remove this bool while you're at it?
rafaelw
2014/01/29 23:18:52
Sorry. Yes. Had this is my prototype, but failed t
|
| @@ -250,21 +260,19 @@ void MutationObserver::deliverAllMutations() |
| continue; |
| suspendedMutationObservers().remove(suspended[i]); |
| - activeMutationObservers().add(suspended[i]); |
| + activateObserver(suspended[i]); |
| } |
| } |
| - while (!activeMutationObservers().isEmpty()) { |
| - Vector<RefPtr<MutationObserver> > observers; |
| - copyToVector(activeMutationObservers(), observers); |
| - activeMutationObservers().clear(); |
| - std::sort(observers.begin(), observers.end(), ObserverLessThan()); |
| - for (size_t i = 0; i < observers.size(); ++i) { |
| - if (observers[i]->canDeliver()) |
| - observers[i]->deliver(); |
| - else |
| - suspendedMutationObservers().add(observers[i]); |
| - } |
| + Vector<RefPtr<MutationObserver> > observers; |
| + copyToVector(activeMutationObservers(), observers); |
| + activeMutationObservers().clear(); |
| + std::sort(observers.begin(), observers.end(), ObserverLessThan()); |
| + for (size_t i = 0; i < observers.size(); ++i) { |
| + if (observers[i]->canDeliver()) |
| + observers[i]->deliver(); |
| + else |
| + suspendedMutationObservers().add(observers[i]); |
| } |
| deliveryInProgress = false; |