#pragma once #if defined(_WIN32) || defined(_WIN64) #define NOMINMAX #endif #include #include #include #include #include "browser_callbacks.h" #include "frame.h" #include "include/cef_browser.h" #include "include/cef_client.h" #include "include/wrapper/cef_message_router.h" #include "utils.h" struct WefBrowser; enum class BrowserState { Creating, Created, Closing, Closed, }; class BrowserCallbacksTarget { private: bool disable_; BrowserCallbacks callbacks_; void* userdata_; DestroyFn destroy_userdata_; public: BrowserCallbacksTarget(BrowserCallbacks callbacks, void* userdata, DestroyFn destroy_userdata) : disable_(false), callbacks_(callbacks), userdata_(userdata), destroy_userdata_(destroy_userdata) {} BrowserCallbacksTarget(const BrowserCallbacksTarget& other) = delete; BrowserCallbacksTarget& operator=(const BrowserCallbacksTarget& other) = delete; BrowserCallbacksTarget(BrowserCallbacksTarget&& other) : disable_(other.disable_), callbacks_(std::move(other.callbacks_)), userdata_(other.userdata_), destroy_userdata_(other.destroy_userdata_) { other.disable_ = true; other.userdata_ = nullptr; other.destroy_userdata_ = nullptr; } ~BrowserCallbacksTarget() { if (destroy_userdata_) { destroy_userdata_(userdata_); } } void disable() { disable_ = true; } template void call(Callable func) const { if (disable_) { return; } func(callbacks_, userdata_); } }; struct BrowserSharedState { bool focus; int cursorX, cursorY; BrowserState browser_state; std::optional> browser; int width, height; float device_scale_factor; BrowserCallbacksTarget callbacks_target; BrowserSharedState(BrowserCallbacksTarget&& other) : focus(false), cursorX(0), cursorY(0), browser_state(BrowserState::Creating), width(800), height(600), device_scale_factor(1.0f), callbacks_target(std::move(other)) {} BrowserSharedState(const BrowserSharedState& other) = delete; BrowserSharedState& operator=(const BrowserSharedState& other) = delete; }; class WefClient : public CefClient, public CefRenderHandler, public CefDisplayHandler, public CefLifeSpanHandler, public CefLoadHandler, public CefDialogHandler, public CefFindHandler, public CefContextMenuHandler, public CefRequestHandler, public CefJSDialogHandler, public CefFocusHandler, public CefPermissionHandler, public CefMessageRouterBrowserSide::Handler { IMPLEMENT_REFCOUNTING(WefClient); private: std::shared_ptr state_; CefRefPtr message_router_; public: WefClient(std::shared_ptr state); virtual ~WefClient(); ///////////////////////////////////////////////////////////////// // CefClient methods ///////////////////////////////////////////////////////////////// bool GetScreenInfo(CefRefPtr browser, CefScreenInfo& screen_info) override { screen_info.device_scale_factor = state_->device_scale_factor; return true; } void GetViewRect(CefRefPtr browser, CefRect& rect) override { rect.Set(0, 0, static_cast(static_cast(state_->width) / state_->device_scale_factor), static_cast(static_cast(state_->height) / state_->device_scale_factor)); } CefRefPtr GetRenderHandler() override { return this; } CefRefPtr GetDisplayHandler() override { return this; } CefRefPtr GetLifeSpanHandler() override { return this; } CefRefPtr GetLoadHandler() override { return this; } CefRefPtr GetDialogHandler() override { return this; } CefRefPtr GetContextMenuHandler() override { return this; } CefRefPtr GetFindHandler() override { return this; } CefRefPtr GetJSDialogHandler() override { return this; } CefRefPtr GetFocusHandler() override { return this; } CefRefPtr GetPermissionHandler() override { return this; } bool OnProcessMessageReceived(CefRefPtr browser, CefRefPtr frame, CefProcessId source_process, CefRefPtr message) override { return message_router_->OnProcessMessageReceived(browser, frame, source_process, message); } ///////////////////////////////////////////////////////////////// // CefRenderHandler methods ///////////////////////////////////////////////////////////////// void OnPopupShow(CefRefPtr browser, bool show) override; void OnPopupSize(CefRefPtr browser, const CefRect& rect) override; void OnPaint(CefRefPtr browser, PaintElementType type, const RectList& dirtyRects, const void* buffer, int width, int height) override; void OnImeCompositionRangeChanged(CefRefPtr browser, const CefRange& selected_range, const RectList& character_bounds) override; bool OnCursorChange(CefRefPtr browser, CefCursorHandle cursor, cef_cursor_type_t type, const CefCursorInfo& custom_cursor_info) override; ///////////////////////////////////////////////////////////////// // CefDisplayHandler methods ///////////////////////////////////////////////////////////////// void OnAddressChange(CefRefPtr browser, CefRefPtr frame, const CefString& url) override; void OnTitleChange(CefRefPtr browser, const CefString& title) override; void OnFaviconURLChange(CefRefPtr browser, const std::vector& icon_urls) override; bool OnTooltip(CefRefPtr browser, CefString& text) override; void OnStatusMessage(CefRefPtr browser, const CefString& value) override; bool OnConsoleMessage(CefRefPtr browser, cef_log_severity_t level, const CefString& message, const CefString& source, int line) override; void OnLoadingProgressChange(CefRefPtr browser, double progress) override; ///////////////////////////////////////////////////////////////// // CefLifeSpanHandler methods ///////////////////////////////////////////////////////////////// void OnAfterCreated(CefRefPtr browser) override; bool OnBeforePopup( CefRefPtr browser, CefRefPtr frame, int popup_id, const CefString& target_url, const CefString& target_frame_name, CefLifeSpanHandler::WindowOpenDisposition target_disposition, bool user_gesture, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, CefRefPtr& client, CefBrowserSettings& settings, CefRefPtr& extra_info, bool* no_javascript_access) override; bool DoClose(CefRefPtr browser) override; void OnBeforeClose(CefRefPtr browser) override; ///////////////////////////////////////////////////////////////// // CefLoadHandler methods ///////////////////////////////////////////////////////////////// void OnLoadingStateChange(CefRefPtr browser, bool isLoading, bool canGoBack, bool canGoForward) override; void OnLoadStart(CefRefPtr browser, CefRefPtr frame, TransitionType transition_type) override; void OnLoadEnd(CefRefPtr browser, CefRefPtr frame, int httpStatusCode) override; void OnLoadError(CefRefPtr browser, CefRefPtr frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl) override; ///////////////////////////////////////////////////////////////// // CefDialogHandler methods ///////////////////////////////////////////////////////////////// bool OnFileDialog(CefRefPtr browser, FileDialogMode mode, const CefString& title, const CefString& default_file_path, const std::vector& accept_filters, const std::vector& accept_extensions, const std::vector& accept_descriptions, CefRefPtr callback) override; ///////////////////////////////////////////////////////////////// // CefContextMenuHandler methods ///////////////////////////////////////////////////////////////// bool RunContextMenu(CefRefPtr browser, CefRefPtr frame, CefRefPtr params, CefRefPtr model, CefRefPtr callback) override; ///////////////////////////////////////////////////////////////// // CefFindHandler methods ///////////////////////////////////////////////////////////////// void OnFindResult(CefRefPtr browser, int identifier, int count, const CefRect& selectionRect, int activeMatchOrdinal, bool finalUpdate) override; ///////////////////////////////////////////////////////////////// // CefJSDialogHandler methods ///////////////////////////////////////////////////////////////// bool OnJSDialog(CefRefPtr browser, const CefString& origin_url, JSDialogType dialog_type, const CefString& message_text, const CefString& default_prompt_text, CefRefPtr callback, bool& suppress_message) override; bool OnBeforeUnloadDialog(CefRefPtr browser, const CefString& message_text, bool is_reload, CefRefPtr callback) override; ///////////////////////////////////////////////////////////////// // CefRequestHandler methods ///////////////////////////////////////////////////////////////// void OnRenderProcessTerminated(CefRefPtr browser, TerminationStatus status, int error_code, const CefString& error_string) override; bool OnBeforeBrowse(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, bool user_gesture, bool is_redirect) override; ///////////////////////////////////////////////////////////////// // CefFocusHandler methods ///////////////////////////////////////////////////////////////// void OnTakeFocus(CefRefPtr browser, bool next) override; bool OnSetFocus(CefRefPtr browser, FocusSource source) override; ///////////////////////////////////////////////////////////////// // CefPermissionHandler methods ///////////////////////////////////////////////////////////////// bool OnRequestMediaAccessPermission( CefRefPtr browser, CefRefPtr frame, const CefString& requesting_origin, uint32_t requested_permissions, CefRefPtr callback) override; ///////////////////////////////////////////////////////////////// // CefMessageRouterBrowserSide::Handler methods ///////////////////////////////////////////////////////////////// bool OnQuery(CefRefPtr browser, CefRefPtr frame, int64_t query_id, const CefString& request, bool persistent, CefRefPtr callback) override; };