getting results from Eval and post result back to view class

Having problems with building or using CEF's C/C++ APIs? This forum is here to help. Please do not post bug reports or feature requests here.

getting results from Eval and post result back to view class

Postby shalini » Thu Oct 01, 2020 12:10 am

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
}
}
shalini
Newbie
 
Posts: 1
Joined: Wed Sep 30, 2020 11:54 pm

Re: getting results from Eval and post result back to view c

Postby magreenblatt » Thu Oct 01, 2020 11:49 am

magreenblatt
Site Admin
 
Posts: 12409
Joined: Fri May 29, 2009 6:57 pm


Return to Support Forum

Who is online

Users browsing this forum: Google [Bot] and 111 guests