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