#ifndef CEF_LIBCEF_RENDERER_RENDER_MANAGER_H_
#define CEF_LIBCEF_RENDERER_RENDER_MANAGER_H_
#pragma once
#include <map>
#include <memory>
#include "include/internal/cef_ptr.h"
#include "cef/libcef/common/mojom/cef.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace blink {
class WebFrame;
class WebView;
}
namespace content {
class RenderFrame;
class RenderView;
}
namespace mojo {
class BinderMap;
}
class CefBrowserImpl;
class CefGuestView;
class CefRenderFrameObserver;
class CefRenderManager : public cef::mojom::RenderManager {
public:
CefRenderManager();
CefRenderManager(const CefRenderManager&) = delete;
CefRenderManager& operator=(const CefRenderManager&) = delete;
~CefRenderManager();
static CefRenderManager* Get();
void RenderThreadConnected();
void RenderFrameCreated(content::RenderFrame* render_frame,
CefRenderFrameObserver* render_frame_observer,
bool& browser_created,
absl::optional<bool>& is_windowless);
void WebViewCreated(blink::WebView* web_view,
bool& browser_created,
absl::optional<bool>& is_windowless);
void DevToolsAgentAttached();
void DevToolsAgentDetached();
void ExposeInterfacesToBrowser(mojo::BinderMap* binders);
CefRefPtr<CefBrowserImpl> GetBrowserForView(content::RenderView* view);
CefRefPtr<CefBrowserImpl> GetBrowserForMainFrame(blink::WebFrame* frame);
mojo::Remote<cef::mojom::BrowserManager>& GetBrowserManager();
static bool IsExtensionProcess();
static bool IsPdfProcess();
private:
friend class CefBrowserImpl;
friend class CefGuestView;
void BindReceiver(mojo::PendingReceiver<cef::mojom::RenderManager> receiver);
void ModifyCrossOriginWhitelistEntry(
bool add,
cef::mojom::CrossOriginWhiteListEntryPtr entry) override;
void ClearCrossOriginWhitelist() override;
void WebKitInitialized();
CefRefPtr<CefBrowserImpl> MaybeCreateBrowser(
content::RenderView* render_view,
content::RenderFrame* render_frame,
bool* browser_created,
absl::optional<bool>* is_windowless);
void OnBrowserDestroyed(CefBrowserImpl* browser);
CefGuestView* GetGuestViewForView(content::RenderView* view);
void OnGuestViewDestroyed(CefGuestView* guest_view);
using BrowserMap = std::map<content::RenderView*, CefRefPtr<CefBrowserImpl>>;
BrowserMap browsers_;
using GuestViewMap =
std::map<content::RenderView*, std::unique_ptr<CefGuestView>>;
GuestViewMap guest_views_;
std::vector<cef::mojom::CrossOriginWhiteListEntryPtr>
cross_origin_whitelist_entries_;
int devtools_agent_count_ = 0;
int uncaught_exception_stack_size_ = 0;
mojo::ReceiverSet<cef::mojom::RenderManager> receivers_;
mojo::Remote<cef::mojom::BrowserManager> browser_manager_;
};
#endif