remote/handlers/app/HelperApp.cpp (116 lines of code) (raw):

#include "HelperApp.h" #include <fstream> #include "../../Utils.h" //#define LOG_VIA_THRIFT HelperApp::HelperApp() { #ifdef LOG_VIA_THRIFT myTransport = std::make_shared<TBufferedTransport>(std::make_shared<TSocket>("localhost", 9090)); myService = std::make_shared<ServerClient>(std::make_shared<TBinaryProtocol>(myTransport)); myTransport->open(); log("Helper process connected."); #endif // LOG_VIA_THRIFT } void HelperApp::OnRegisterCustomSchemes(CefRawPtr<CefSchemeRegistrar> registrar) { std::fstream fStream; std::string fName = utils::GetTempFile("scheme", true); char schemeName[512] = ""; int options; fStream.open(fName.c_str(), std::fstream::in); while (fStream.is_open() && !fStream.eof()) { fStream.getline(schemeName, 512, ','); if (strlen(schemeName) == 0) break; fStream >> options; registrar->AddCustomScheme(schemeName, options); } fStream.close(); } void HelperApp::OnBrowserCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDictionaryValue> extra_info) { #ifdef LOG_VIA_THRIFT log("OnBrowserCreated"); #endif // LOG_VIA_THRIFT if (!extra_info) { return; } auto router_configs = extra_info->GetList("router_configs"); if (router_configs) { // Configuration from BrowserProcessHandler::GetMessageRouterConfigs. for (size_t idx = 0; idx < router_configs->GetSize(); idx++) { CefRefPtr<CefDictionaryValue> dict = router_configs->GetDictionary((int)idx); // Create the renderer-side router for query handling. CefMessageRouterConfig config; config.js_query_function = dict->GetString("js_query_function"); config.js_cancel_function = dict->GetString("js_cancel_function"); CefRefPtr<CefMessageRouterRendererSide> router = CefMessageRouterRendererSide::Create(config); message_router_.insert(std::make_pair(config, router)); #ifdef LOG_VIA_THRIFT log(string_format("\t add router <%s,%s>", config.js_query_function.ToString().c_str(), config.js_cancel_function.ToString().c_str())); #endif // LOG_VIA_THRIFT } } } void HelperApp::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) { #ifdef LOG_VIA_THRIFT log("OnContextCreated"); #endif // LOG_VIA_THRIFT std::map<CefMessageRouterConfig, CefRefPtr<CefMessageRouterRendererSide>, cmpCfg>::iterator iter; for (iter = message_router_.begin(); iter != message_router_.end(); iter++) { iter->second->OnContextCreated(browser, frame, context); } } void HelperApp::OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) { #ifdef LOG_VIA_THRIFT log("OnContextReleased"); #endif // LOG_VIA_THRIFT std::map<CefMessageRouterConfig, CefRefPtr<CefMessageRouterRendererSide>, cmpCfg>::iterator iter; for (iter = message_router_.begin(); iter != message_router_.end(); iter++) { iter->second->OnContextReleased(browser, frame, context); } } bool HelperApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) { #ifdef LOG_VIA_THRIFT log(string_format("OnProcessMessageReceived: %s", message->GetName().c_str())); #endif // LOG_VIA_THRIFT if (message->GetName() == "AddMessageRouter") { CefRefPtr<CefListValue> args = message->GetArgumentList(); CefMessageRouterConfig config; config.js_query_function = args->GetString(0); config.js_cancel_function = args->GetString(1); // only add a new message router if it wasn't already created if (message_router_.find(config) != message_router_.end()) { return true; } CefRefPtr<CefMessageRouterRendererSide> router = CefMessageRouterRendererSide::Create(config); message_router_.insert(std::make_pair(config, router)); return true; } else if (message->GetName() == "RemoveMessageRouter") { CefRefPtr<CefListValue> args = message->GetArgumentList(); CefMessageRouterConfig config; config.js_query_function = args->GetString(0); config.js_cancel_function = args->GetString(1); message_router_.erase(config); return true; } bool handled = false; std::map<CefMessageRouterConfig, CefRefPtr<CefMessageRouterRendererSide>, cmpCfg>::iterator iter; for (iter = message_router_.begin(); iter != message_router_.end(); iter++) { handled = iter->second->OnProcessMessageReceived(browser, frame, source_process, message); if (handled) break; } return handled; }