OnProcessMessageReceived not being called from JS cefQuery

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.

OnProcessMessageReceived not being called from JS cefQuery

Postby exit » Thu Jan 21, 2021 10:08 pm

I'm relatively new to CEF and I'm just trying to get a template project up and running for future projects.

As the title says, CefRenderProcessHandler::OnProcessMessageReceived is not being triggered when window.cefQuery is called.

I've followed the short tutorial in cef_message_router.h to set up the CefMessageRouterRendererSide and CefMessageRouterBrowserSide objects, making sure to call their respective callbacks from various other callbacks.

window.cefQuery in JS executes with no errors in console and returns a code of 1, which I'm optimistically assuming means success, despite which CefRenderProcessHandler::OnProcessMessageReceived never triggers; nor any other OnProcessMessageReceived-callbacks for that matter.

I am absolutely positive I'm being dumb somehow though I can't figure out how. Any help is much appreciated.

app.h (CefApp)

Code: Select all
#pragma once

class app : public CefApp, public CefBrowserProcessHandler, public CefRenderProcessHandler
{
public:
   app();

   // CefApp overrides

   cef_ptr<CefBrowserProcessHandler> GetBrowserProcessHandler() override { return this; }
   cef_ptr<CefRenderProcessHandler>  GetRenderProcessHandler()  override { return this; }

   // CefBrowserProcessHandler overrides

   void OnContextInitialized() override;

   // CefRenderProcessHandler overrides

   void OnBrowserCreated(cef_ptr<CefBrowser> browser, cef_ptr<CefDictionaryValue> extra_info) override;
   void OnContextCreated(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, cef_ptr<CefV8Context> context) override;
   void OnContextReleased(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, cef_ptr<CefV8Context> context) override;
   bool OnProcessMessageReceived(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, CefProcessId source_process, cef_ptr<CefProcessMessage> message) override;

private:
   CefMessageRouterConfig m_router_config;
   cef_ptr<CefMessageRouterRendererSide> m_router;

   IMPLEMENT_REFCOUNTING(app);
};


app.cpp

Code: Select all
#include "pch.h"

app::app()
{
   m_router_config.js_query_function = "cefQuery";
   m_router_config.js_cancel_function = "cefQueryCancel";
}

void app::OnContextInitialized()
{
   CEF_REQUIRE_UI_THREAD();

   LOG(ERROR) << "++ app::OnContextInitialized";

   cef_ptr<handler> handler(new handler(m_router_config));

   CefBrowserSettings settings;

   const std::string url = "file:///ui/index.html";

   CefWindowInfo info;

#if defined(_WIN32)
   info.SetAsPopup(NULL, "cefsimple");
#endif

   CefBrowserHost::CreateBrowser(info, handler, url, settings, nullptr, nullptr);
}

void app::OnBrowserCreated(cef_ptr<CefBrowser> browser, cef_ptr<CefDictionaryValue> extra_info)
{
   CEF_REQUIRE_RENDERER_THREAD();

   LOG(ERROR) << "++ app::OnBrowserCreated";
   m_router = CefMessageRouterRendererSide::Create(m_router_config);
}

void app::OnContextCreated(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, cef_ptr<CefV8Context> context)
{
   CEF_REQUIRE_RENDERER_THREAD();

   LOG(ERROR) << "++ app::OnContextCreated";
   m_router->OnContextCreated(browser, frame, context);
}

void app::OnContextReleased(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, cef_ptr<CefV8Context> context)
{
   CEF_REQUIRE_RENDERER_THREAD();

   LOG(ERROR) << "++ app::OnContextReleased";
   m_router->OnContextReleased(browser, frame, context);
}

bool app::OnProcessMessageReceived(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, CefProcessId source_process, cef_ptr<CefProcessMessage> message)
{
   CEF_REQUIRE_RENDERER_THREAD();
   
   LOG(ERROR) << "++ app::OnProcessMessageReceived";
   return m_router->OnProcessMessageReceived(browser, frame, source_process, message);
}


handler.h (CefClient)

Code: Select all
#pragma once

#define HANDLERS public CefDisplayHandler,                   \
                 public CefLifeSpanHandler,                  \
                 public CefContextMenuHandler,               \
                 public CefDialogHandler,                    \
                 public CefKeyboardHandler,                  \
                 public CefRequestHandler,                   \
                 public CefMessageRouterBrowserSide::Handler

class handler : public CefClient, HANDLERS
{
public:
   handler(CefMessageRouterConfig& config);

   // CefClient overrides

   cef_ptr<CefLifeSpanHandler>    GetLifeSpanHandler()    override { return this; }
   cef_ptr<CefDisplayHandler>     GetDisplayHandler()     override { return this; }
   cef_ptr<CefContextMenuHandler> GetContextMenuHandler() override { return this; }
   cef_ptr<CefDialogHandler>      GetDialogHandler()      override { return this; }
   cef_ptr<CefKeyboardHandler>    GetKeyboardHandler()    override { return this; }
   cef_ptr<CefRequestHandler>     GetRequestHandler()     override { return this; };

   bool OnProcessMessageRecieved(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, CefProcessId source_process, cef_ptr<CefProcessMessage> message);

   // CefDisplayHandler overrides

   void OnTitleChange(cef_ptr<CefBrowser> browser, const CefString& title) override;

   // CefLifeSpanHandler

   void OnAfterCreated(cef_ptr<CefBrowser> browser) override;
   bool DoClose(cef_ptr<CefBrowser> browser) override;
   void OnBeforeClose(cef_ptr<CefBrowser> browser) override;

   // CefRequestHandler overrides

   void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser, TerminationStatus status) override;
   bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool user_gesture, bool is_redirect) override;

   // CefMessageRouterBrowserSide::Handler overrides

   bool OnQuery(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, int64 query_id, const CefString& request, bool persistent, cef_ptr<Callback> callback) override;

private:
   cef_ptr<CefBrowser> m_browser;
   cef_ptr<CefMessageRouterBrowserSide> m_router;

   IMPLEMENT_REFCOUNTING(handler);
};


handler.cpp

Code: Select all
#include "pch.h"

handler::handler(CefMessageRouterConfig& config)
{
   CEF_REQUIRE_UI_THREAD();

   m_router = CefMessageRouterBrowserSide::Create(config);
   m_router->AddHandler(this, true);

   m_browser = nullptr;
}

bool handler::OnProcessMessageRecieved(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, CefProcessId source_process, cef_ptr<CefProcessMessage> message)
{
   CEF_REQUIRE_UI_THREAD();

   LOG(ERROR) << "++ handler::OnProcessMessageRecieved";
   return m_router->OnProcessMessageReceived(browser, frame, source_process, message);
}

void handler::OnTitleChange(cef_ptr<CefBrowser> browser, const CefString& title)
{
   CEF_REQUIRE_UI_THREAD();

   #ifdef _WIN32

   #endif
}

void handler::OnAfterCreated(cef_ptr<CefBrowser> browser)
{
   CEF_REQUIRE_UI_THREAD();

   LOG(ERROR) << "++ handler::OnAfterCreated";
   m_browser = browser;
}

bool handler::DoClose(cef_ptr<CefBrowser> browser)
{
   CEF_REQUIRE_UI_THREAD();

   return 0;
}

void handler::OnBeforeClose(cef_ptr<CefBrowser> browser)
{
   CEF_REQUIRE_UI_THREAD();

   m_router->OnBeforeClose(browser);
   m_browser = nullptr;

   CefQuitMessageLoop();
}

void handler::OnRenderProcessTerminated(cef_ptr<CefBrowser> browser, TerminationStatus status)
{
   CEF_REQUIRE_UI_THREAD();

   m_router->OnRenderProcessTerminated(browser);
}

bool handler::OnBeforeBrowse(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, cef_ptr<CefRequest> request, bool user_gesture, bool is_redirect)
{
   CEF_REQUIRE_UI_THREAD();

   LOG(ERROR) << "++ handler::OnBeforeBrowse";
   m_router->OnBeforeBrowse(browser, frame);
   return 0;
}

bool handler::OnQuery(cef_ptr<CefBrowser> browser, cef_ptr<CefFrame> frame, int64 query_id, const CefString& request, bool persistent, cef_ptr<Callback> callback)
{
   CEF_REQUIRE_UI_THREAD();

   LOG(ERROR) << "++ handler::OnQuery";
   callback->Success("asdf");
   return true;
}


Budget stack-trace:

Code: Select all
[0122/033047.051:ERROR:app.cpp(13)] ++ app::OnContextInitialized
[0122/033047.088:ERROR:handler.cpp(34)] ++ handler::OnAfterCreated
[0122/033047.102:ERROR:handler.cpp(66)] ++ handler::OnBeforeBrowse
[0122/033047.218:ERROR:app.cpp(34)] ++ app::OnBrowserCreated
[0122/033047.227:ERROR:app.cpp(42)] ++ app::OnContextCreated
exit
Newbie
 
Posts: 1
Joined: Thu Jan 21, 2021 9:35 pm

Re: OnProcessMessageReceived not being called from JS cefQue

Postby magreenblatt » Thu Jan 21, 2021 10:25 pm

You can compare your code to the guide at https://bitbucket.org/chromiumembedded/ ... ge_router/
magreenblatt
Site Admin
 
Posts: 12382
Joined: Fri May 29, 2009 6:57 pm


Return to Support Forum

Who is online

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