#ifndef JCEF_REMOTEBROWSER_H #define JCEF_REMOTEBROWSER_H #include #include #include "../handlers/SharedBufferManager.h" #include "include/internal/cef_ptr.h" #include "include/wrapper/cef_message_router.h" class CefRequestContext; class RemoteClient; class CefBrowser; class RemoteBrowser { public: static std::shared_ptr create(std::shared_ptr owner, CefRefPtr requestContext); std::shared_ptr getOwner() const { return myOwner; } int getBid() const { return myBid; } int getCid() const; CefRefPtr getRequestContext() const; CefRefPtr getCefBrowser() const; void startNativeBrowserCreation(const std::string& url); void openDevTools(int x, int y); void close(); bool isClosing() const { return myIsClosing; } SharedBufferManager &page() { return myPage; } SharedBufferManager &popup() { return myPopup; } static std::shared_ptr find(int bid); static std::shared_ptr findByCefBrowser(CefRefPtr browser); static bool closeAllBrowsers(); // returns true when no browsers presented (i.e. all browsers are already closed) static std::vector enumAllBrowsers(); static unsigned int getAllBrowsersCount(); static void AddMessageRouterConfig(const CefMessageRouterConfig& cfg); static void RemoveMessageRouterConfig(const CefMessageRouterConfig& cfg); explicit RemoteBrowser(int bid, std::shared_ptr owner, CefRefPtr requestContext); // TODO: make private std::string getDebugInfo(int tabs); private: const int myBid; const std::shared_ptr myOwner; const CefRefPtr myRequestContext; SharedBufferManager myPage; SharedBufferManager myPopup; CefRefPtr myCefBrowser; bool myIsClosing = false; static std::mutex ourBid2BrowserMutex; static std::map> ourBid2Browser; static std::mutex ourCef2RemoteMutex; static std::map> ourCef2Remote; friend class RemoteLifespanHandler; friend class RemoteClient; void onBeforeClose(); void setCefBrowser(CefRefPtr browser); static void linkCefBrowser(CefRefPtr browser, std::shared_ptr remoteBrowser); static void unlinkCefBrowser(CefRefPtr browser); }; #define FIND_BID_OR_RETURN() \ if (!browser) \ return; \ const auto & rb = RemoteBrowser::findByCefBrowser(browser);\ if (!rb) \ return; \ const int bid = rb->getBid() #define FIND_BID_OR_RETURN_VAL(x) \ if (!browser) \ return x; \ const auto & rb = RemoteBrowser::findByCefBrowser(browser);\ if (!rb) \ return x; \ const int bid = rb->getBid() #endif //JCEF_REMOTEBROWSER_H