wef 0.6.0

Wef is a Rust library for embedding WebView functionality using Chromium Embedded Framework (CEF3) with offscreen rendering support.
#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_;
  }
};