params->Set(v8::Integer::New(isolate, 1), entry);
// FIXME(cmarcelo): ensure that trampoline is readonly.
- value.As<v8::Object>()->SetAccessor(context,
+ value.As<v8::Object>()->SetAccessor(
v8::String::NewFromUtf8(isolate, basename.c_str()),
TrampolineCallback, TrampolineSetterCallback, params);
return true;
return false;
}
- std::vector<std::string>::const_iterator it = entry->entry_points.begin();
+ auto it = entry->entry_points.begin();
for (; it != entry->entry_points.end(); ++it) {
ret = SetTrampolineAccessorForEntryPoint(context, *it, entry_ptr);
if (!ret) {
MarkModulesWithTrampoline();
- ExtensionModules::iterator it = extension_modules_.begin();
+ auto it = extension_modules_.begin();
for (; it != extension_modules_.end(); ++it) {
if (it->use_trampoline && InstallTrampoline(context, &*it))
continue;
void XWalkModuleSystem::LoadExtensionForTrampoline(
v8::Isolate* isolate,
v8::Local<v8::Value> data) {
- v8::HandleScope handle_scope(isolate);
v8::Local<v8::Array> params = data.As<v8::Array>();
void* ptr = params->Get(
v8::Integer::New(isolate, 0)).As<v8::External>()->Value();
isolate,
module_system->require_native_template_);
+
XWalkExtensionModule* module = entry->module;
module->LoadExtensionCode(module_system->GetV8Context(),
require_native_template->GetFunction());
// static
void XWalkModuleSystem::TrampolineCallback(
- v8::Local<v8::Name> property,
+ v8::Local<v8::String> property,
const v8::PropertyCallbackInfo<v8::Value>& info) {
XWalkModuleSystem::LoadExtensionForTrampoline(info.GetIsolate(), info.Data());
v8::Handle<v8::Value> holder = RefetchHolder(info.GetIsolate(), info.Data());
// static
void XWalkModuleSystem::TrampolineSetterCallback(
- v8::Local<v8::Name> property,
+ v8::Local<v8::String> property,
v8::Local<v8::Value> value,
const v8::PropertyCallbackInfo<void>& info) {
XWalkModuleSystem::LoadExtensionForTrampoline(info.GetIsolate(), info.Data());
ExtensionModuleEntry* entry);
static void TrampolineCallback(
- v8::Local<v8::Name> property,
+ v8::Local<v8::String> property,
const v8::PropertyCallbackInfo<v8::Value>& info);
static void TrampolineSetterCallback(
- v8::Local<v8::Name> property,
+ v8::Local<v8::String> property,
v8::Local<v8::Value> value,
const v8::PropertyCallbackInfo<void>& info);
static void LoadExtensionForTrampoline(
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::WeakCallbackInfo<LifecycleTrackerWrapper>& data) {
- LifecycleTrackerWrapper* wrapper = data.GetParameter();
+ const v8::WeakCallbackData<v8::Object,
+ v8::Persistent<v8::Object> >& data) {
+ v8::Isolate* isolate = data.GetIsolate();
+ v8::HandleScope handle_scope(isolate);
- 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);
+ v8::Local<v8::Object> tracker = data.GetValue();
+ v8::Handle<v8::Value> function =
+ tracker->Get(v8::String::NewFromUtf8(isolate, "destructor"));
- v8::Local<v8::Function> destructor =
- wrapper->destructor.Get(data.GetIsolate());
+ if (function.IsEmpty() || !function->IsFunction()) {
+ LOGGER(WARN) << "Destructor function not set for LifecycleTracker.";
+ data.GetParameter()->Reset();
+ delete data.GetParameter();
+ return;
+ }
- v8::MicrotasksScope microtasks(
- data.GetIsolate(), v8::MicrotasksScope::kDoNotRunMicrotasks);
+ v8::Handle<v8::Context> context = v8::Context::New(isolate);
- v8::TryCatch try_catch(data.GetIsolate());
- destructor->Call(context->Global(), 0, nullptr);
+ 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";
- if (try_catch.HasCaught()) {
- LOGGER(WARN) << "Exception when running LifecycleTracker destructor";
- }
- }
+ data.GetParameter()->Reset();
+ delete data.GetParameter();
}
void LifecycleTracker(const v8::FunctionCallbackInfo<v8::Value>& info) {
- 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);
+ 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);
}
} // namespace