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.
6 #include "extensions/renderer/xwalk_v8tools_module.h"
10 #include "common/logger.h"
12 namespace extensions {
16 void ForceSetPropertyCallback(
17 const v8::FunctionCallbackInfo<v8::Value>& info) {
18 if (info.Length() != 3 || !info[0]->IsObject() || !info[1]->IsString()) {
21 info[0].As<v8::Object>()->ForceSet(info[1], info[2]);
27 struct LifecycleTrackerWrapper {
28 v8::Global<v8::Object> handle;
29 v8::Global<v8::Function> destructor;
32 void LifecycleTrackerCleanup(
33 const v8::WeakCallbackInfo<LifecycleTrackerWrapper>& data) {
34 LifecycleTrackerWrapper* wrapper = data.GetParameter();
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);
41 v8::Local<v8::Function> destructor =
42 wrapper->destructor.Get(data.GetIsolate());
44 v8::MicrotasksScope microtasks(
45 data.GetIsolate(), v8::MicrotasksScope::kDoNotRunMicrotasks);
47 v8::TryCatch try_catch(data.GetIsolate());
48 destructor->Call(context->Global(), 0, nullptr);
50 if (try_catch.HasCaught()) {
51 LOGGER(WARN) << "Exception when running LifecycleTracker destructor";
56 void LifecycleTracker(const v8::FunctionCallbackInfo<v8::Value>& info) {
57 v8::Isolate* isolate = info.GetIsolate();
58 v8::HandleScope handle_scope(info.GetIsolate());
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);
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();
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));
83 object_template_.Reset(isolate, object_template);
86 XWalkV8ToolsModule::~XWalkV8ToolsModule() {
87 object_template_.Reset();
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());
98 } // namespace extensions