Help me make OnQuery / callback->Success work!

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.

Help me make OnQuery / callback->Success work!

Postby hyzerfool » Thu Sep 24, 2015 10:32 pm

I'm trying to handle javascript calling C++ functions and sending results back from C++ to javascript.

I've read all the comments in cef_message_router.h and, as far as I can tell, I've implemented it all.
I've looked at the cefclient binding_test stuff, and it works as it should
I've copied the html / javascript from that to my app.

OnQuery does get called in my CefMessageRouterBrowserSide::Handler class, and I call callback->Success and return true from the OnQuery function, but I never get results back to javascript.

In the cefclient example, after calling callback->success, ClientApp::OnProcessMessageReceived is called (which is CefRenderProcessHandler::OnProcessMessageReceived, I believe).
In my app, that does not happen.

Presumably that's why my data isn't making its way back into javascript, but I can't figure out the problem.

In CefRenderProcessHandler I have functions for:

OnProcessMessageReceived
OnContextReleased
OnContextCreated
OnWebKitInitialized

OnWebKitInitialized and OnContextCreated are definitely being called, as I hit breakpoints when I set them there.

What could I be doing wrong that OnProcessMessageReceived is not being called? I feel like I must be missing something obvious but haven't been able to figure it out.

Help?!
hyzerfool
Techie
 
Posts: 23
Joined: Wed May 13, 2015 2:37 pm

Re: Help me make OnQuery / callback->Success work!

Postby hyzerfool » Fri Sep 25, 2015 12:30 pm

The problem with posting for help is it usually happens at the end of a long day. Here's some code.

Here's CefRenderProcessHandler:
Code: Select all
class CVPChromiumRenderApp :
      public CefApp,
      public CefRenderProcessHandler
{
public:
   CVPChromiumRenderApp ();
   CVPChromiumRenderApp (HWND hWnd);
   ~CVPChromiumRenderApp () {}

   virtual CefRefPtr<CefRenderProcessHandler>   GetRenderProcessHandler   () OVERRIDE{ return this; };

   virtual void   OnContextCreated      (CefRefPtr<CefBrowser > browser, CefRefPtr< CefFrame > frame, CefRefPtr< CefV8Context > context ) OVERRIDE;
   virtual void   OnContextReleased      (CefRefPtr<CVPChromiumRenderApp> app, CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context);
   virtual bool   OnProcessMessageReceived (CefRefPtr<CVPChromiumRenderApp> app, CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message);

   virtual void   OnWebKitInitialized() OVERRIDE;

   virtual bool   OnBeforeNavigation (CefRefPtr<CefBrowser> browser, CefRefPtr< CefFrame > frame, CefRefPtr< CefRequest > request, CefRenderProcessHandler::NavigationType navigation_type, bool is_redirect );


protected:
   CefRefPtr<CefMessageRouterRendererSide>      m_pMessageRouterRenderer;

private:
   // Include the default reference counting implementation.
   IMPLEMENT_REFCOUNTING(CVPChromiumRenderApp);
};



Here's CefClient and CefMessageRouterBrowserSide::Handler:
Code: Select all

class CVPChromiumBrowserHandler :
   public CefClient,
   public CefLifeSpanHandler,
   public CefMessageRouterBrowserSide::Handler,
   public CefRequestHandler,
   public CObject
{
public:
   CVPChromiumBrowserHandler();
   ~CVPChromiumBrowserHandler();

   virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE{ return this; }
   virtual CefRefPtr<CefRequestHandler> GetRequestHandler() OVERRIDE {return this; }

   virtual bool OnProcessMessageReceived (CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) OVERRIDE;
   virtual void OnAfterCreated (CefRefPtr<CefBrowser> browser) OVERRIDE;

   virtual bool OnQuery (CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int64 query_id, const CefString& request, bool persistent, CefRefPtr<Callback> callback) OVERRIDE;
   virtual void OnQueryCanceled(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int64 query_id) OVERRIDE;

   virtual void OnRenderProcessTerminated (CefRefPtr<CefBrowser> browser, cef_termination_status_t status);
   virtual void OnBeforeClose (CefRefPtr<CefBrowser> browser) OVERRIDE;
   virtual bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool is_redirect);

protected:
   CefRefPtr<CefMessageRouterBrowserSide>      m_pMessageRouterBrowser;

private:
   // Include the default reference counting implementation.
   IMPLEMENT_REFCOUNTING(CVPChromiumBrowserHandler);

};



hyzerfool
Techie
 
Posts: 23
Joined: Wed May 13, 2015 2:37 pm

Re: Help me make OnQuery / callback->Success work!

Postby hyzerfool » Fri Sep 25, 2015 1:13 pm

Figured it out.

Problem was function signature was wrong for CefRenderProcessHandler's OnProcessMessageReceived.

I should have realized it when I got a compiler error for having OVERRIDE in there, but I just removed override and moved on. Once function signature was correct, it worked.
hyzerfool
Techie
 
Posts: 23
Joined: Wed May 13, 2015 2:37 pm


Return to Support Forum

Who is online

Users browsing this forum: No registered users and 102 guests