#include "atom_cef_render_process_handler.h" #import "native/v8_extensions/atom.h" #import "native/v8_extensions/native.h" #import "native/v8_extensions/onig_reg_exp.h" #import "native/v8_extensions/onig_scanner.h" #import "native/v8_extensions/git.h" #import "native/message_translation.h" #include void AtomCefRenderProcessHandler::OnWebKitInitialized() { new v8_extensions::Atom(); new v8_extensions::Native(); new v8_extensions::OnigRegExp(); new v8_extensions::OnigScanner(); new v8_extensions::Git(); } void AtomCefRenderProcessHandler::OnContextCreated(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) { } bool AtomCefRenderProcessHandler::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) { std::string name = message->GetName().ToString(); if (name == "reload") { Reload(browser); return true; } else if (name == "shutdown") { Shutdown(browser); return true; } else { return CallMessageReceivedHandler(browser->GetMainFrame()->GetV8Context(), message); } } void AtomCefRenderProcessHandler::Reload(CefRefPtr browser) { CefRefPtr context = browser->GetMainFrame()->GetV8Context(); CefRefPtr global = context->GetGlobal(); context->Enter(); CefV8ValueList arguments; CefRefPtr reloadFunction = global->GetValue("reload"); reloadFunction->ExecuteFunction(global, arguments); if (!reloadFunction->IsFunction() || reloadFunction->HasException()) { browser->ReloadIgnoreCache(); } context->Exit(); } void AtomCefRenderProcessHandler::Shutdown(CefRefPtr browser) { CefRefPtr context = browser->GetMainFrame()->GetV8Context(); CefRefPtr global = context->GetGlobal(); context->Enter(); CefV8ValueList arguments; CefRefPtr shutdownFunction = global->GetValue("shutdown"); shutdownFunction->ExecuteFunction(global, arguments); context->Exit(); } bool AtomCefRenderProcessHandler::CallMessageReceivedHandler(CefRefPtr context, CefRefPtr message) { context->Enter(); CefRefPtr atom = context->GetGlobal()->GetValue("atom"); CefRefPtr receiveFn = atom->GetValue("receiveMessageFromBrowserProcess"); CefV8ValueList arguments; arguments.push_back(CefV8Value::CreateString(message->GetName().ToString())); CefRefPtr messageArguments = message->GetArgumentList(); if (messageArguments->GetSize() > 0) { CefRefPtr data = CefV8Value::CreateArray(messageArguments->GetSize()); TranslateList(messageArguments, data); arguments.push_back(data); } receiveFn->ExecuteFunction(atom, arguments); context->Exit(); if (receiveFn->HasException()) { std::cout << "ERROR: Exception in JS receiving message " << message->GetName().ToString() << "\n"; return false; } else { return true; } }