From 87a0f9314986d6eb48a72f014b463d6e4bb2e368 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 28 Aug 2012 16:42:11 -0500 Subject: [PATCH] Add `atom.sendMessageToBrowserProcess` to atom v8 extension --- native/v8_extensions/atom.js | 2 + native/v8_extensions/atom.mm | 111 +++++++++++++++++++++++++++++++++-- 2 files changed, 108 insertions(+), 5 deletions(-) diff --git a/native/v8_extensions/atom.js b/native/v8_extensions/atom.js index a01621df7..c2c144bfd 100644 --- a/native/v8_extensions/atom.js +++ b/native/v8_extensions/atom.js @@ -1,8 +1,10 @@ (function () { +native function sendMessageToBrowserProcess(name, array); native function open(path); this.atom = { + sendMessageToBrowserProcess: sendMessageToBrowserProcess, open: open }; diff --git a/native/v8_extensions/atom.mm b/native/v8_extensions/atom.mm index b4de5eaea..9e1e4548a 100644 --- a/native/v8_extensions/atom.mm +++ b/native/v8_extensions/atom.mm @@ -7,28 +7,129 @@ namespace v8_extensions { + // IPC data translation functions: translate a V8 array to a List, and vice versa + void TranslateList(CefRefPtr source, CefRefPtr target); + void TranslateList(CefRefPtr source, CefRefPtr target); + v8_extensions::Atom::Atom() : CefV8Handler() { NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"v8_extensions/atom.js"]; NSString *extensionCode = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; CefRegisterExtension("v8/atom", [extensionCode UTF8String], this); } - + bool v8_extensions::Atom::Execute(const CefString& name, CefRefPtr object, const CefV8ValueList& arguments, CefRefPtr& retval, CefString& exception) { - CefRefPtr browser = CefV8Context::GetCurrentContext()->GetBrowser(); - + + if (name == "sendMessageToBrowserProcess") { + if (arguments.size() == 0 || !arguments[0]->IsString()) { + exception = "You must supply a message name"; + return false; + } + + CefString name = arguments[0]->GetStringValue(); + CefRefPtr message = CefProcessMessage::Create(name); + + if (arguments.size() > 1 && arguments[1]->IsArray()) { + TranslateList(arguments[1], message->GetArgumentList()); + } + + browser->SendProcessMessage(PID_BROWSER, message); + return true; + } if (name == "open") { CefRefPtr message = CefProcessMessage::Create("open"); - CefRefPtr messageArgs = message->GetArgumentList(); + CefRefPtr messageArgs = message->GetArgumentList(); if (arguments.size() >= 1) { messageArgs->SetSize(1); messageArgs->SetString(0, arguments[0]->GetStringValue()); } browser->SendProcessMessage(PID_BROWSER, message); + return true; } + return false; }; -} \ No newline at end of file + + // Transfer a V8 value to a List index. + void TranslateListValue(CefRefPtr list, int index, CefRefPtr value) { + if (value->IsArray()) { + CefRefPtr new_list = CefListValue::Create(); + TranslateList(value, new_list); + list->SetList(index, new_list); + } else if (value->IsString()) { + list->SetString(index, value->GetStringValue()); + } else if (value->IsBool()) { + list->SetBool(index, value->GetBoolValue()); + } else if (value->IsInt()) { + list->SetInt(index, value->GetIntValue()); + } else if (value->IsDouble()) { + list->SetDouble(index, value->GetDoubleValue()); + } + } + + // Transfer a V8 array to a List. + void TranslateList(CefRefPtr source, CefRefPtr target) { + ASSERT(source->IsArray()); + + int arg_length = source->GetArrayLength(); + if (arg_length == 0) + return; + + // Start with null types in all spaces. + target->SetSize(arg_length); + + for (int i = 0; i < arg_length; ++i) { + TranslateListValue(target, i, source->GetValue(i)); + } + } + + // Transfer a List value to a V8 array index. + void TranslateListValue(CefRefPtr list, int index, CefRefPtr value) { + CefRefPtr new_value; + + CefValueType type = value->GetType(index); + switch (type) { + case VTYPE_LIST: { + CefRefPtr list = value->GetList(index); + new_value = CefV8Value::CreateArray(list->GetSize()); + TranslateList(list, new_value); + } break; + case VTYPE_BOOL: + new_value = CefV8Value::CreateBool(value->GetBool(index)); + break; + case VTYPE_DOUBLE: + new_value = CefV8Value::CreateDouble(value->GetDouble(index)); + break; + case VTYPE_INT: + new_value = CefV8Value::CreateInt(value->GetInt(index)); + break; + case VTYPE_STRING: + new_value = CefV8Value::CreateString(value->GetString(index)); + break; + default: + break; + } + + if (new_value.get()) { + list->SetValue(index, new_value); + } else { + list->SetValue(index, CefV8Value::CreateNull()); + } + } + + // Transfer a List to a V8 array. + void TranslateList(CefRefPtr source, CefRefPtr target) { + ASSERT(target->IsArray()); + + int arg_length = source->GetSize(); + if (arg_length == 0) + return; + + for (int i = 0; i < arg_length; ++i) { + TranslateListValue(target, i, source); + } + } +}