Hi, I am creating one MFC application using CEF version73.0.3683.75. In this application I want value of javascript variable in my CView derived class. But the problem is I can not access value evaluated in render process outside the render process class.
I have found that to get value in CView derived class I have to send message from the render process to browser process. After receiving value in browser process I have stored this value in one variable which is accessible from the CView derived class, but when I access this variable just after calling getValue method It is showing null. And when after some time when I print value of that variable It is showing properly. How can I get the value immediately??
CView class code:
frame->ExecuteJavaScript("var a=10;",frame->getURL(),0);
getValue(_T("a"));
AfxmessageBox(m_clientHandler->m_sAnswer);//m_clientHandler->m_sAnswer is CString variable which has value after evaluation
Code for getValue function is shown below:
void getValue(CString sScript)
{
CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create("Evaluate");
CefRefPtr<CefListValue> args=msg->GetArgumentList();
args->SetSize(1);
args->SetString(CefString(sScript));
m_browser->sendProcessMessage(PID_RENDER,msg);
}
code for OnProcessMessageRecieved on render process side is shown below:
bool OnProcessMessageRecieved(CefRefPtr<CefBrowser> browser,CefProcessId source_process,CefRefPtr<CefProcessMessage> message) override
{
CefRefPtr<CefV8Context> context=browser->GetMainFrame()->GetV8Context();
if(message->GetName()=="Evaluate")
{
CefString sScript=message->GetArgumentList()->GetString(0);
CefRefPtr<CefV8Value> value;
CefRefPtr<CefV8Exception> exception;
if(context->Eval(sScript,browser->GetMainFrame()->GetURL(),0,value,exception)
{
CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create("ReturnValue");
CefRefPtr<CefListValue> args=msg->GetArgumentList();
args->SetSize(1);
args->SetString(value->GetStringValue());
browser->sendProcessMessage(PID_BROWSER,msg);
}
}
}
code for OnProcessMessageRecieved on browser process side is shown below:
bool OnProcessMessageRecieved(CefRefPtr<CefBrowser> browser,CefProcessId source_process,CefRefPtr<CefProcessMessage> message) override
{
if(message->GetName()=="ReturnValue")
{
CefString sScriptAns=message->GetArgumentList()->GetString(0);
m_sAnswer=sScriptAns.c_str();//m_sAnswer can be accessible from the CView derived class
}
}