pulsar/native/atom_cef_render_process_handler.mm
Kevin Sawicki 6e4d9508aa Close browser instead of sending shutdown message
CEF now supports calling the beforeunload handler when closed
so we no longer need to send a shutdown message on the native
side.
2013-04-05 08:34:04 -07:00

86 lines
3.1 KiB
Plaintext

#import <iostream>
#import "native/v8_extensions/atom.h"
#import "native/v8_extensions/native.h"
#import "native/message_translation.h"
#import "path_watcher.h"
#import "atom_cef_render_process_handler.h"
void AtomCefRenderProcessHandler::OnWebKitInitialized() {
}
void AtomCefRenderProcessHandler::OnContextCreated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context) {
InjectExtensionsIntoV8Context(context);
}
void AtomCefRenderProcessHandler::OnContextReleased(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context) {
[PathWatcher removePathWatcherForContext:context];
}
bool AtomCefRenderProcessHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) {
std::string name = message->GetName().ToString();
if (name == "reload") {
Reload(browser);
return true;
}
else {
return CallMessageReceivedHandler(browser->GetMainFrame()->GetV8Context(), message);
}
}
void AtomCefRenderProcessHandler::Reload(CefRefPtr<CefBrowser> browser) {
CefRefPtr<CefV8Context> context = browser->GetMainFrame()->GetV8Context();
CefRefPtr<CefV8Value> global = context->GetGlobal();
context->Enter();
CefV8ValueList arguments;
CefRefPtr<CefV8Value> reloadFunction = global->GetValue("reload");
reloadFunction->ExecuteFunction(global, arguments);
if (!reloadFunction->IsFunction() || reloadFunction->HasException()) {
browser->ReloadIgnoreCache();
}
context->Exit();
}
bool AtomCefRenderProcessHandler::CallMessageReceivedHandler(CefRefPtr<CefV8Context> context, CefRefPtr<CefProcessMessage> message) {
context->Enter();
CefRefPtr<CefV8Value> atom = context->GetGlobal()->GetValue("atom");
CefRefPtr<CefV8Value> receiveFn = atom->GetValue("receiveMessageFromBrowserProcess");
CefV8ValueList arguments;
arguments.push_back(CefV8Value::CreateString(message->GetName().ToString()));
CefRefPtr<CefListValue> messageArguments = message->GetArgumentList();
if (messageArguments->GetSize() > 0) {
CefRefPtr<CefV8Value> 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;
}
}
void AtomCefRenderProcessHandler::InjectExtensionsIntoV8Context(CefRefPtr<CefV8Context> context) {
// these objects are deleted when the context removes all references to them
(new v8_extensions::Atom())->CreateContextBinding(context);
(new v8_extensions::Native())->CreateContextBinding(context);
}