Bringup with updated chromium-efl(m56.0.2924)
[platform/framework/web/crosswalk-tizen.git] / extensions / renderer / xwalk_v8tools_module.cc
1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5
6 #include "extensions/renderer/xwalk_v8tools_module.h"
7
8 #include <v8/v8.h>
9
10 #include "common/logger.h"
11
12 namespace extensions {
13
14 namespace {
15
16 void ForceSetPropertyCallback(
17     const v8::FunctionCallbackInfo<v8::Value>& info) {
18   if (info.Length() != 3 || !info[0]->IsObject() || !info[1]->IsString()) {
19     return;
20   }
21   info[0].As<v8::Object>()->ForceSet(info[1], info[2]);
22 }
23
24 // ================
25 // lifecycleTracker
26 // ================
27 struct LifecycleTrackerWrapper {
28   v8::Global<v8::Object> handle;
29   v8::Global<v8::Function> destructor;
30 };
31
32 void LifecycleTrackerCleanup(
33     const v8::WeakCallbackInfo<LifecycleTrackerWrapper>& data) {
34   LifecycleTrackerWrapper* wrapper = data.GetParameter();
35
36   if (!wrapper->destructor.IsEmpty()) {
37     v8::HandleScope handle_scope(data.GetIsolate());
38     v8::Local<v8::Context> context = v8::Context::New(data.GetIsolate());
39     v8::Context::Scope scope(context);
40
41     v8::Local<v8::Function> destructor =
42       wrapper->destructor.Get(data.GetIsolate());
43
44     v8::MicrotasksScope microtasks(
45         data.GetIsolate(), v8::MicrotasksScope::kDoNotRunMicrotasks);
46
47     v8::TryCatch try_catch(data.GetIsolate());
48     destructor->Call(context->Global(), 0, nullptr);
49
50     if (try_catch.HasCaught()) {
51       LOGGER(WARN) << "Exception when running LifecycleTracker destructor";
52     }
53   }
54 }
55
56 void LifecycleTracker(const v8::FunctionCallbackInfo<v8::Value>& info) {
57   v8::Isolate* isolate = info.GetIsolate();
58         v8::HandleScope handle_scope(info.GetIsolate());
59
60   v8::Local<v8::Object> tracker = v8::Object::New(isolate);
61   LifecycleTrackerWrapper* wrapper = new LifecycleTrackerWrapper;
62   wrapper->handle.Reset(isolate, tracker);
63   wrapper->handle.SetWeak(wrapper, LifecycleTrackerCleanup,
64                           v8::WeakCallbackType::kParameter);
65   info.GetReturnValue().Set(wrapper->handle);
66 }
67
68 }  // namespace
69
70 XWalkV8ToolsModule::XWalkV8ToolsModule() {
71   v8::Isolate* isolate = v8::Isolate::GetCurrent();
72   v8::HandleScope handle_scope(isolate);
73   v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New();
74
75   // TODO(cmarcelo): Use Template::Set() function that takes isolate, once we
76   // update the Chromium (and V8) version.
77   object_template->Set(v8::String::NewFromUtf8(isolate, "forceSetProperty"),
78                        v8::FunctionTemplate::New(
79                           isolate, ForceSetPropertyCallback));
80   object_template->Set(v8::String::NewFromUtf8(isolate, "lifecycleTracker"),
81                        v8::FunctionTemplate::New(isolate, LifecycleTracker));
82
83   object_template_.Reset(isolate, object_template);
84 }
85
86 XWalkV8ToolsModule::~XWalkV8ToolsModule() {
87   object_template_.Reset();
88 }
89
90 v8::Handle<v8::Object> XWalkV8ToolsModule::NewInstance() {
91   v8::Isolate* isolate = v8::Isolate::GetCurrent();
92   v8::EscapableHandleScope handle_scope(isolate);
93   v8::Handle<v8::ObjectTemplate> object_template =
94       v8::Local<v8::ObjectTemplate>::New(isolate, object_template_);
95   return handle_scope.Escape(object_template->NewInstance());
96 }
97
98 }  // namespace extensions