Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / dom / Microtask.cpp
index a70aed8..d2ffaed 100644 (file)
 #include "config.h"
 #include "core/dom/Microtask.h"
 
-#include "bindings/v8/V8PerIsolateData.h"
-#include "wtf/Vector.h"
+#include "bindings/core/v8/V8PerIsolateData.h"
+#include "platform/Task.h"
+#include "public/platform/WebThread.h"
+#include <v8.h>
 
-namespace WebCore {
-
-typedef Vector<MicrotaskCallback> MicrotaskQueue;
-
-static MicrotaskQueue& microtaskQueue()
-{
-    DEFINE_STATIC_LOCAL(MicrotaskQueue, microtaskQueue, ());
-    return microtaskQueue;
-}
+namespace blink {
 
 void Microtask::performCheckpoint()
 {
-    V8PerIsolateData* isolateData = V8PerIsolateData::current();
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+    V8PerIsolateData* isolateData = V8PerIsolateData::from(isolate);
     ASSERT(isolateData);
     if (isolateData->recursionLevel() || isolateData->performingMicrotaskCheckpoint())
         return;
     isolateData->setPerformingMicrotaskCheckpoint(true);
+    isolate->RunMicrotasks();
+    isolateData->setPerformingMicrotaskCheckpoint(false);
+}
 
-    while (!microtaskQueue().isEmpty()) {
-        Vector<MicrotaskCallback> microtasks;
-        microtasks.swap(microtaskQueue());
-        for (size_t i = 0; i < microtasks.size(); ++i) {
-            microtasks[i]();
-        }
-    }
+static void microtaskFunctionCallback(void* data)
+{
+    OwnPtr<WebThread::Task> task = adoptPtr(static_cast<WebThread::Task*>(data));
+    task->run();
+}
 
-    isolateData->setPerformingMicrotaskCheckpoint(false);
+void Microtask::enqueueMicrotask(PassOwnPtr<WebThread::Task> callback)
+{
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+    isolate->EnqueueMicrotask(&microtaskFunctionCallback, callback.leakPtr());
 }
 
-void Microtask::enqueueMicrotask(MicrotaskCallback callback)
+void Microtask::enqueueMicrotask(const Closure& callback)
 {
-    microtaskQueue().append(callback);
+    enqueueMicrotask(adoptPtr(new Task(callback)));
 }
 
-} // namespace WebCore
+} // namespace blink