- Code: Select all
bool ClientHandler::OnProcessMessageReceived(
CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
// Check for messages from the client renderer.
std::string message_name = message->GetName();
if (message_name == client_renderer::kFocusedNodeChangedMessage)
{
// A message is sent from ClientRenderDelegate to tell us whether the
// currently focused DOM node is editable. Use of |m_bFocusOnEditableField|
// is redundant with CefKeyEvent.focus_on_editable_field in OnPreKeyEvent
// but is useful for demonstration purposes.
m_bFocusOnEditableField = message->GetArgumentList()->GetBool(0);
return true;
}
// my code
//---------------------------------------------------------------------
else if (message_name == "my_message")
{
CefString url = message->GetArgumentList()->GetString(0);
browser->GetMainFrame()->LoadURL(url);
}
//---------------------------------------------------------------------
bool handled = false;
// Execute delegate callbacks.
ProcessMessageDelegateSet::iterator it = process_message_delegates_.begin();
for (; it != process_message_delegates_.end() && !handled; ++it)
{
handled = (*it)->OnProcessMessageReceived(
this, browser, source_process, message);
}
return handled;
}
url is valid but application crashes when i call LoadUrl() method.
I also tried to do it via CefPostTask like this:
- Code: Select all
bool ClientHandler::OnProcessMessageReceived(
CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
// Check for messages from the client renderer.
std::string message_name = message->GetName();
if (message_name == client_renderer::kFocusedNodeChangedMessage)
{
// A message is sent from ClientRenderDelegate to tell us whether the
// currently focused DOM node is editable. Use of |m_bFocusOnEditableField|
// is redundant with CefKeyEvent.focus_on_editable_field in OnPreKeyEvent
// but is useful for demonstration purposes.
m_bFocusOnEditableField = message->GetArgumentList()->GetBool(0);
return true;
}
// my code
//---------------------------------------------------------------------
else if (message_name == "my_message")
{
CefString url = message->GetArgumentList()->GetString(0);
CefRefPtr<CefTask> loadUrlTask =
NewCefRunnableMethod(this, &ClientHandler::OpenURL, url);
CefPostTask(TID_UI, loadUrlTask);
}
//---------------------------------------------------------------------
bool handled = false;
// Execute delegate callbacks.
ProcessMessageDelegateSet::iterator it = process_message_delegates_.begin();
for (; it != process_message_delegates_.end() && !handled; ++it)
{
handled = (*it)->OnProcessMessageReceived(
this, browser, source_process, message);
}
return handled;
}
// my code
//---------------------------------------------------------------------
void ClientHandler::OpenURL(const CefString& _url)
{
this->GetBrowser()->GetMainFrame()->LoadURL(_url);
}
//---------------------------------------------------------------------
But application still crashes right after LoadURL() being called.
Am i doing it wrong?
And what is the right way to load URL when some message from render process arrieved to browser porcess?