Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / dom / Microtask.cpp
index 27cd217..d26cde4 100644 (file)
 #include "config.h"
 #include "core/dom/Microtask.h"
 
-#include "core/dom/MutationObserver.h"
-#include "core/dom/custom/CustomElementCallbackDispatcher.h"
+#include "bindings/v8/V8PerIsolateData.h"
 #include "wtf/Vector.h"
 
 namespace WebCore {
 
+typedef Vector<MicrotaskCallback> MicrotaskQueue;
+
+static MicrotaskQueue& microtaskQueue()
+{
+    DEFINE_STATIC_LOCAL(MicrotaskQueue, microtaskQueue, ());
+    return microtaskQueue;
+}
+
 void Microtask::performCheckpoint()
 {
-    static bool performingCheckpoint = false;
-    if (performingCheckpoint)
+    V8PerIsolateData* isolateData = V8PerIsolateData::current();
+    ASSERT(isolateData);
+    if (isolateData->performingMicrotaskCheckpoint())
         return;
-    performingCheckpoint = true;
+    isolateData->setPerformingMicrotaskCheckpoint(true);
 
-    bool anyWorkDone;
-    do {
-        MutationObserver::deliverAllMutations();
-        anyWorkDone = CustomElementCallbackDispatcher::instance().dispatch();
-    } while (anyWorkDone);
+    while (!microtaskQueue().isEmpty()) {
+        Vector<MicrotaskCallback> microtasks;
+        microtasks.swap(microtaskQueue());
+        for (size_t i = 0; i < microtasks.size(); ++i) {
+            microtasks[i]();
+        }
+    }
 
-    performingCheckpoint = false;
+    isolateData->setPerformingMicrotaskCheckpoint(false);
+}
+
+void Microtask::enqueueMicrotask(MicrotaskCallback callback)
+{
+    microtaskQueue().append(callback);
 }
 
 } // namespace WebCore