Bringup with updated chromium-efl(m56.0.2924)
[platform/framework/web/crosswalk-tizen.git] / extensions / renderer / xwalk_v8tools_module.cc
index 72e1a4d..4fcad37 100755 (executable)
@@ -21,43 +21,48 @@ void ForceSetPropertyCallback(
   info[0].As<v8::Object>()->ForceSet(info[1], info[2]);
 }
 
+// ================
+// lifecycleTracker
+// ================
+struct LifecycleTrackerWrapper {
+  v8::Global<v8::Object> handle;
+  v8::Global<v8::Function> destructor;
+};
+
 void LifecycleTrackerCleanup(
-    const v8::WeakCallbackData<v8::Object,
-                               v8::Persistent<v8::Object> >& data) {
-  v8::Isolate* isolate = data.GetIsolate();
-  v8::HandleScope handle_scope(isolate);
+    const v8::WeakCallbackInfo<LifecycleTrackerWrapper>& data) {
+  LifecycleTrackerWrapper* wrapper = data.GetParameter();
 
-  v8::Local<v8::Object> tracker = data.GetValue();
-  v8::Handle<v8::Value> function =
-      tracker->Get(v8::String::NewFromUtf8(isolate, "destructor"));
+  if (!wrapper->destructor.IsEmpty()) {
+    v8::HandleScope handle_scope(data.GetIsolate());
+    v8::Local<v8::Context> context = v8::Context::New(data.GetIsolate());
+    v8::Context::Scope scope(context);
 
-  if (function.IsEmpty() || !function->IsFunction()) {
-    LOGGER(WARN) << "Destructor function not set for LifecycleTracker.";
-    data.GetParameter()->Reset();
-    delete data.GetParameter();
-    return;
-  }
+    v8::Local<v8::Function> destructor =
+      wrapper->destructor.Get(data.GetIsolate());
 
-  v8::Handle<v8::Context> context = v8::Context::New(isolate);
+    v8::MicrotasksScope microtasks(
+        data.GetIsolate(), v8::MicrotasksScope::kDoNotRunMicrotasks);
 
-  v8::TryCatch try_catch;
-  v8::Handle<v8::Function>::Cast(function)->Call(context->Global(), 0, NULL);
-  if (try_catch.HasCaught())
-    LOGGER(WARN) << "Exception when running LifecycleTracker destructor";
+    v8::TryCatch try_catch(data.GetIsolate());
+    destructor->Call(context->Global(), 0, nullptr);
 
-  data.GetParameter()->Reset();
-  delete data.GetParameter();
+    if (try_catch.HasCaught()) {
+      LOGGER(WARN) << "Exception when running LifecycleTracker destructor";
+    }
+  }
 }
 
 void LifecycleTracker(const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
-  v8::HandleScope handle_scope(isolate);
-
-  v8::Persistent<v8::Object>* tracker =
-      new v8::Persistent<v8::Object>(isolate, v8::Object::New(isolate));
-  tracker->SetWeak(tracker, &LifecycleTrackerCleanup);
-
-  info.GetReturnValue().Set(*tracker);
+  v8::Isolate* isolate = info.GetIsolate();
+       v8::HandleScope handle_scope(info.GetIsolate());
+
+  v8::Local<v8::Object> tracker = v8::Object::New(isolate);
+  LifecycleTrackerWrapper* wrapper = new LifecycleTrackerWrapper;
+  wrapper->handle.Reset(isolate, tracker);
+  wrapper->handle.SetWeak(wrapper, LifecycleTrackerCleanup,
+                          v8::WeakCallbackType::kParameter);
+  info.GetReturnValue().Set(wrapper->handle);
 }
 
 }  // namespace