Wef is a Rust library for embedding WebView functionality using Chromium Embedded Framework (CEF3) with offscreen rendering support.
74 lines
No EOL
2.5 KiB
C++
74 lines
No EOL
2.5 KiB
C++
#pragma once
|
|
|
|
#include <iostream>
|
|
|
|
#include "include/cef_app.h"
|
|
#include "include/wrapper/cef_message_router.h"
|
|
|
|
class WefRenderProcessHandler : public CefRenderProcessHandler {
|
|
IMPLEMENT_REFCOUNTING(WefRenderProcessHandler);
|
|
|
|
private:
|
|
CefRefPtr<CefMessageRouterRendererSide> message_router_;
|
|
std::map<int, CefString> inject_javascript_map_;
|
|
|
|
public:
|
|
WefRenderProcessHandler() {
|
|
CefMessageRouterConfig config;
|
|
message_router_ = CefMessageRouterRendererSide::Create(config);
|
|
}
|
|
|
|
void OnBrowserCreated(CefRefPtr<CefBrowser> browser,
|
|
CefRefPtr<CefDictionaryValue> extra_info) override {
|
|
auto inject_javascript = extra_info->GetString("__wef_inject_javascript");
|
|
inject_javascript_map_[browser->GetIdentifier()] = inject_javascript;
|
|
}
|
|
|
|
void OnBrowserDestroyed(CefRefPtr<CefBrowser> browser) override {
|
|
inject_javascript_map_.erase(browser->GetIdentifier());
|
|
}
|
|
|
|
void OnContextCreated(CefRefPtr<CefBrowser> browser,
|
|
CefRefPtr<CefFrame> frame,
|
|
CefRefPtr<CefV8Context> context) override {
|
|
if (frame->IsMain()) {
|
|
auto it = inject_javascript_map_.find(browser->GetIdentifier());
|
|
if (it != inject_javascript_map_.end()) {
|
|
auto inject_javascript = it->second;
|
|
if (!inject_javascript.empty()) {
|
|
frame->ExecuteJavaScript(inject_javascript, frame->GetURL(), 0);
|
|
}
|
|
}
|
|
}
|
|
message_router_->OnContextCreated(browser, frame, context);
|
|
}
|
|
|
|
void OnContextReleased(CefRefPtr<CefBrowser> browser,
|
|
CefRefPtr<CefFrame> frame,
|
|
CefRefPtr<CefV8Context> context) override {
|
|
message_router_->OnContextReleased(browser, frame, context);
|
|
}
|
|
|
|
bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
|
|
CefRefPtr<CefFrame> frame,
|
|
CefProcessId source_process,
|
|
CefRefPtr<CefProcessMessage> message) override {
|
|
return message_router_->OnProcessMessageReceived(browser, frame,
|
|
source_process, message);
|
|
}
|
|
};
|
|
|
|
class WefRenderProcessApp : public CefApp, public CefRenderProcessHandler {
|
|
IMPLEMENT_REFCOUNTING(WefRenderProcessApp);
|
|
|
|
private:
|
|
CefRefPtr<CefRenderProcessHandler> render_process_handler_;
|
|
|
|
public:
|
|
WefRenderProcessApp()
|
|
: render_process_handler_(new WefRenderProcessHandler()) {}
|
|
|
|
CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() {
|
|
return render_process_handler_;
|
|
}
|
|
}; |