| Index: Source/core/dom/MutationObserver.cpp
 | 
| diff --git a/Source/core/dom/MutationObserver.cpp b/Source/core/dom/MutationObserver.cpp
 | 
| index 4402477d9e6fc8674f65f8df1b94c70a8dda4f40..21bdd693b54f76cd875ed58e981969bdc9814b58 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,26 @@ static MutationObserverSet& suspendedMutationObservers()
 | 
|      return suspendedObservers;
 | 
|  }
 | 
|  
 | 
| +static void activateObserver(PassRefPtr<MutationObserver> observer)
 | 
| +{
 | 
| +    if (activeMutationObservers().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,40 +243,35 @@ void MutationObserver::deliver()
 | 
|      InspectorInstrumentation::didDeliverMutationRecords(m_callback->executionContext());
 | 
|  }
 | 
|  
 | 
| -void MutationObserver::deliverAllMutations()
 | 
| +void MutationObserver::resumeSuspendedObservers()
 | 
|  {
 | 
|      ASSERT(isMainThread());
 | 
| -    static bool deliveryInProgress = false;
 | 
| -    if (deliveryInProgress)
 | 
| +    if (suspendedMutationObservers().isEmpty())
 | 
|          return;
 | 
| -    deliveryInProgress = true;
 | 
| -
 | 
| -    if (!suspendedMutationObservers().isEmpty()) {
 | 
| -        Vector<RefPtr<MutationObserver> > suspended;
 | 
| -        copyToVector(suspendedMutationObservers(), suspended);
 | 
| -        for (size_t i = 0; i < suspended.size(); ++i) {
 | 
| -            if (!suspended[i]->canDeliver())
 | 
| -                continue;
 | 
|  
 | 
| +    Vector<RefPtr<MutationObserver> > suspended;
 | 
| +    copyToVector(suspendedMutationObservers(), suspended);
 | 
| +    for (size_t i = 0; i < suspended.size(); ++i) {
 | 
| +        if (suspended[i]->canDeliver()) {
 | 
|              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]);
 | 
| -        }
 | 
| +void MutationObserver::deliverMutations()
 | 
| +{
 | 
| +    ASSERT(isMainThread());
 | 
| +    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;
 | 
|  }
 | 
|  
 | 
|  } // namespace WebCore
 | 
| 
 |