Javascript->Renderer->Browser->Main Application
I've been able to pass the message all the way down to the browser thread but not sure how to get out of the browser and over to my main (non cef) application thread.
Expose function to javascript:
- Code: Select all
class MyCefApp : public CefApp, public CefRenderProcessHandler
{
public:
bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message)
{
printf("[CEF] CefAPP:ProcessMessage %s\n", message->GetName().ToString().c_str());
return false;
}
CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler()
{
return this;
}
void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
{
CefRefPtr<CefV8Value> object = context->GetGlobal();
CefRefPtr<CefV8Handler> handler = new MyV8Handler();
object->SetValue("register", CefV8Value::CreateFunction("register", handler), V8_PROPERTY_ATTRIBUTE_NONE);
}
void OnWebKitInitialized()
{
printf("WEBKIT\n");
std::string extensionCode =
"var test;"
"if (!test)"
"test = {};"
"(function() {"
"test.myfunc = function(RemoteAddr, RemotePort) {"
"native function myfunc(RemoteAddr, RemotePort);"
"return myfunc(RemoteAddr, RemotePort);"
"};"
"})();";
CefRefPtr<CefV8Handler> handler = new MyV8Handler();
CefRegisterExtension("v8/test", extensionCode, handler);
}
IMPLEMENT_REFCOUNTING(MyCefApp);
};
Handle javascript function execution in render thread:
- Code: Select all
class MyV8Handler : public CefV8Handler {
public:
bool Execute(const CefString& name, CefRefPtr<CefV8Value> object, const CefV8ValueList& arguments, CefRefPtr<CefV8Value>& retval, CefString& exception)
{
printf("[CEF] V8Handler:Execute %S\n", name.c_str());
if (name == "myfunc")
{
if (arguments.size() == 2)
{
std::string RemoteIP = arguments[0]->GetStringValue().ToString();
unsigned int RemotePort = arguments[1]->GetUIntValue();
printf("MYFUNC %s %u\n", RemoteIP.c_str(), RemotePort);
CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create("My_Message");
CefRefPtr<CefListValue> args = msg->GetArgumentList();
args->SetString(0, arguments[0]->GetStringValue());
args->SetInt(1, arguments[1]->GetIntValue());
CefRefPtr<CefV8Context> context = CefV8Context::GetCurrentContext();
context->GetBrowser()->GetMainFrame()->SendProcessMessage(PID_BROWSER, msg);
return true;
}
}
// Function does not exist.
return false;
}
// Provide the reference counting implementation for this class.
IMPLEMENT_REFCOUNTING(MyV8Handler);
};
handle ipc message in browser thread:
- Code: Select all
class BrowserClient : public CefClient
{
public:
BrowserClient(RenderHandler* renderHandler)
: m_renderHandler(renderHandler)
{}
virtual CefRefPtr<CefRenderHandler> GetRenderHandler()
{
return m_renderHandler;
}
bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId process, CefRefPtr<CefProcessMessage> message)
{
printf("[CEF] BrowserClient:ProcessMessage %s\n", message->GetName().ToString().c_str());
if (message->GetName() == "My_Message")
{
std::string RemoteIP = message->GetArgumentList()->GetString(0).ToString();
unsigned int RemotePort = message->GetArgumentList()->GetInt(1);
printf("My_Message %s %u\n", RemoteIP.c_str(), RemotePort);
WorldEngine::NetCode::ConnectToServer(RemoteIP.c_str(), RemotePort);
return true;
}
return false;
}
CefRefPtr<CefRenderHandler> m_renderHandler;
IMPLEMENT_REFCOUNTING(BrowserClient);
};
What's the best way to kick this over to my main (non cef) application thread from here?
WorldEngine::NetCode::ConnectToServer(RemoteIP.c_str(), RemotePort); returns an access violation because I'm trying to call a winsock function inside a thread that hasn't had winsock initialized in, so that lead me to realize I haven't quite gotten back down to my applications thread yet..