(windows x32, cef/chromium 73.0.3683.75, VS 21015)
As specified in cef_message_router.h
1. Updated simple_app.h
- Code: Select all
...
#include "include/wrapper/cef_message_router.h" // Add cefQuery
...
class SimpleApp : public CefApp,
public CefRenderProcessHandler, // Add cefQuery
public CefBrowserProcessHandler {
...
// Add cefQuery
virtual void OnRenderProcessThreadCreated(CefRefPtr<CefListValue> extra_info) OVERRIDE {
CefMessageRouterConfig config; // YES
renderer_side_router_ = CefMessageRouterRendererSide::Create(config);
}
// CefApp methods:
CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() OVERRIDE {
return this;
}
// CefRenderProcessHandler methods:
void OnWebKitInitialized() OVERRIDE {
// Create the renderer-side router for query handling.
//CefMessageRouterConfig config;
//message_router_ = CefMessageRouterRendererSide::Create(config);
}
void OnContextCreated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context) OVERRIDE {
renderer_side_router_->OnContextCreated(browser, frame, context); //+
}
void OnContextReleased(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context) OVERRIDE {
renderer_side_router_->OnContextReleased(browser, frame, context); //+
}
bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) OVERRIDE {
return renderer_side_router_->OnProcessMessageReceived(browser, source_process, message); //+
}
...
private:
CefRefPtr<CefMessageRouterRendererSide> renderer_side_router_; // Add cefQuery
...
}
2. Updated simple_handler.h
- Code: Select all
...
#include "include/wrapper/cef_message_router.h" // Add cefQuery
...
// Add cefQuery
const char kPrompt[] = "SendCommand";
class TestHandler : public CefMessageRouterBrowserSide::Handler {
public:
TestHandler() {}
// Called due to cefQuery execution.
virtual bool OnQuery(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
int64 query_id,
const CefString& request,
bool persistent,
CefRefPtr<Callback> callback) OVERRIDE {
// Parse |request| which takes the form "Prompt.[type]:[value]".
LOG(ERROR) << "++++ OnQuery start";
const std::string& request_str = request;
if (request_str.find(kPrompt) != 0)
return false;
// Nothing is done with the response.
callback->Success(CefString());
return true;
}
};
...
class SimpleHandler : public CefClient,
...
public CefLoadHandler {
public:
...
bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, // Add cefQuery
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) OVERRIDE;
bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser, // Add cefQuery
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request,
bool user_gesture,
bool is_redirect) OVERRIDE;
void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser, // Add cefQuery
TerminationStatus status) OVERRIDE;
...
private:
CefRefPtr<CefMessageRouterBrowserSide> browser_side_router_; // Add cefQuery
scoped_ptr<CefMessageRouterBrowserSide::Handler> testHandler_; // Add cefQuery
...
}
3. Updated simple_handler.cc
- Code: Select all
...
void SimpleHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
CEF_REQUIRE_UI_THREAD();
// Add cefQuery
if (!browser_side_router_) { //+ YES
// как в описании
CefMessageRouterConfig config;
config.js_query_function = "cefQuery";
config.js_cancel_function = "cefQueryCancel";
browser_side_router_ = CefMessageRouterBrowserSide::Create(config);
//testHandler_ = new TestHandler();
testHandler_.reset(new TestHandler());
browser_side_router_->AddHandler(testHandler_.get(), true);
}
// Add to the list of existing browsers.
browser_list_.push_back(browser);
}
...
bool SimpleHandler::OnProcessMessageReceived( // Add cefQuery
CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) {
CEF_REQUIRE_UI_THREAD();
browser_side_router_->OnProcessMessageReceived(browser, source_process, message); //+
return false;
}
bool SimpleHandler::OnBeforeBrowse(CefRefPtr<CefBrowser> browser, // Add cefQuery
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request,
bool user_gesture,
bool is_redirect) {
CEF_REQUIRE_UI_THREAD();
browser_side_router_->OnBeforeBrowse(browser, frame); //+ YES
return false;
}
void SimpleHandler::OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser, // Add cefQuery
TerminationStatus status) {
CEF_REQUIRE_UI_THREAD();
browser_side_router_->OnRenderProcessTerminated(browser); //+
}
...
In debug mode, I can see that they are running
1. SimpleHandler::OnAfterCreated
2. SimpleHandler::OnBeforeBrowse
3. OnRenderProcessThreadCreated /*SimpleApp*/
When you call the JavaScript
- Code: Select all
function sendMessage() {
window.cefQuery({
request: 'TestWeb: Test string',
onSuccess: function(response) {
console.log("++++ work cefQuery");
},
onFailure: function(error_code, error_message) {}
});
}
I'm getting a message "Uncaught TypeError: window.cefQuery is not a function"
This does not call any other functions of the SimpleApp class containing renderer_side_router_ ->..., or of the SimpleHandler class containing browser_side_router_->... and the OnQuery function.
What am I wrong about?
Why window.cefQuery is missing for JavaScript?