#pragma once #include #include "include/cef_app.h" #include "include/wrapper/cef_message_router.h" class WefRenderProcessHandler : public CefRenderProcessHandler { IMPLEMENT_REFCOUNTING(WefRenderProcessHandler); private: CefRefPtr message_router_; std::map inject_javascript_map_; public: WefRenderProcessHandler() { CefMessageRouterConfig config; message_router_ = CefMessageRouterRendererSide::Create(config); } void OnBrowserCreated(CefRefPtr browser, CefRefPtr extra_info) override { auto inject_javascript = extra_info->GetString("__wef_inject_javascript"); inject_javascript_map_[browser->GetIdentifier()] = inject_javascript; } void OnBrowserDestroyed(CefRefPtr browser) override { inject_javascript_map_.erase(browser->GetIdentifier()); } void OnContextCreated(CefRefPtr browser, CefRefPtr frame, CefRefPtr 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 browser, CefRefPtr frame, CefRefPtr context) override { message_router_->OnContextReleased(browser, frame, context); } bool OnProcessMessageReceived(CefRefPtr browser, CefRefPtr frame, CefProcessId source_process, CefRefPtr message) override { return message_router_->OnProcessMessageReceived(browser, frame, source_process, message); } }; class WefRenderProcessApp : public CefApp, public CefRenderProcessHandler { IMPLEMENT_REFCOUNTING(WefRenderProcessApp); private: CefRefPtr render_process_handler_; public: WefRenderProcessApp() : render_process_handler_(new WefRenderProcessHandler()) {} CefRefPtr GetRenderProcessHandler() { return render_process_handler_; } };