// Engine/Source/Runtime/WebBrowser/Private/CEF/CEFBrowserHandler.h #pragma once #include "CoreMinimal.h" #if WITH_CEF3 #include "CEFInterfaceLibCefIncludes.h" #include "IWebInterfaceBrowserWindow.h" #endif class IWebInterfaceBrowserWindow; struct Rect; class FCEFWebInterfaceBrowserWindow; class FCEFInterfaceBrowserPopupFeatures; #if WITH_CEF3 /** * Implements CEF Client and other Browser level interfaces. */ class FCEFInterfaceBrowserHandler : public CefClient , public CefDisplayHandler , public CefLifeSpanHandler , public CefLoadHandler , public CefRenderHandler , public CefRequestHandler , public CefKeyboardHandler , public CefJSDialogHandler , public CefContextMenuHandler , public CefDragHandler , public CefResourceRequestHandler , public CefRequestContextHandler , public CefCookieAccessFilter { public: /** Default constructor. */ FCEFInterfaceBrowserHandler(bool InUseTransparency, bool InInterceptLoadRequests, const TArray& AltRetryDomains = TArray(), const TArray& AuthorizationHeaderAllowListURLS = TArray()); public: /** * Pass in a pointer to our Browser Window so that events can be passed on. * * @param InBrowserWindow The browser window this will be handling. */ void SetBrowserWindow(TSharedPtr InBrowserWindow); /** * Sets the browser window features and settings for popups which will be passed along when creating the new window. * * @param InPopupFeatures The popup features and settings for the window. */ void SetPopupFeatures(const TSharedPtr& InPopupFeatures) { BrowserPopupFeatures = InPopupFeatures; } public: // CefClient Interface virtual CefRefPtr GetDisplayHandler() override { return this; } virtual CefRefPtr GetLifeSpanHandler() override { return this; } virtual CefRefPtr GetLoadHandler() override { return this; } virtual CefRefPtr GetRenderHandler() override { return this; } virtual CefRefPtr GetRequestHandler() override { return this; } virtual CefRefPtr GetKeyboardHandler() override { return this; } virtual CefRefPtr GetJSDialogHandler() override { return this; } virtual CefRefPtr GetContextMenuHandler() override { return this; } virtual CefRefPtr GetDragHandler() override { return this; } virtual CefRefPtr GetCookieAccessFilter( CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request) override; virtual bool OnProcessMessageReceived(CefRefPtr Browser, CefRefPtr frame, CefProcessId SourceProcess, CefRefPtr Message) override; public: // CefDisplayHandler Interface virtual void OnTitleChange(CefRefPtr Browser, const CefString& Title) override; virtual void OnAddressChange(CefRefPtr Browser, CefRefPtr Frame, const CefString& Url) override; virtual bool OnTooltip(CefRefPtr Browser, CefString& Text) override; virtual bool OnConsoleMessage( CefRefPtr Browser, cef_log_severity_t level, const CefString& Message, const CefString& Source, int Line) override; public: // CefLifeSpanHandler Interface virtual void OnAfterCreated(CefRefPtr Browser) override; virtual bool DoClose(CefRefPtr Browser) override; virtual void OnBeforeClose(CefRefPtr Browser) override; virtual bool OnBeforePopup(CefRefPtr Browser, CefRefPtr Frame, 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 { return OnBeforePopup(Browser, Frame, Target_Url, Target_Frame_Name, PopupFeatures, WindowInfo, Client, Settings, no_javascript_access); } virtual bool OnBeforePopup(CefRefPtr Browser, CefRefPtr Frame, const CefString& Target_Url, const CefString& Target_Frame_Name, const CefPopupFeatures& PopupFeatures, CefWindowInfo& WindowInfo, CefRefPtr& Client, CefBrowserSettings& Settings, bool* no_javascript_access) ; public: // CefLoadHandler Interface virtual void OnLoadError(CefRefPtr Browser, CefRefPtr Frame, CefLoadHandler::ErrorCode InErrorCode, const CefString& ErrorText, const CefString& FailedUrl) override; virtual void OnLoadingStateChange( CefRefPtr browser, bool isLoading, bool canGoBack, bool canGoForward) override; virtual void OnLoadStart( CefRefPtr Browser, CefRefPtr Frame, TransitionType CefTransitionType) override; public: // CefRenderHandler Interface virtual bool GetRootScreenRect(CefRefPtr Browser, CefRect& Rect) override; virtual void GetViewRect(CefRefPtr Browser, CefRect& Rect) override; virtual void OnPaint(CefRefPtr Browser, PaintElementType Type, const RectList& DirtyRects, const void* Buffer, int Width, int Height) override; virtual void OnAcceleratedPaint(CefRefPtr Browser, PaintElementType Type, const RectList& DirtyRects, void* SharedHandle) override; virtual void OnPopupShow(CefRefPtr Browser, bool bShow) override; virtual void OnPopupSize(CefRefPtr Browser, const CefRect& Rect) override; virtual bool GetScreenInfo(CefRefPtr Browser, CefScreenInfo& ScreenInfo) override; // CefDisplayHandler interface virtual bool OnCursorChange(CefRefPtr browser, CefCursorHandle cursor, cef_cursor_type_t type, const CefCursorInfo& custom_cursor_info) override; #if !PLATFORM_LINUX virtual void OnImeCompositionRangeChanged( CefRefPtr Browser, const CefRange& SelectionRange, const CefRenderHandler::RectList& CharacterBounds) override; #endif public: // CefRequestHandler Interface virtual CefResourceRequestHandler::ReturnValue OnBeforeResourceLoad( CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request, CefRefPtr Callback) override; virtual void OnResourceLoadComplete(CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request, CefRefPtr Response, URLRequestStatus Status, int64 Received_content_length) override; virtual void OnResourceRedirect(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, CefRefPtr response, CefString& new_url) override; virtual void OnRenderProcessTerminated(CefRefPtr Browser, TerminationStatus Status) override; virtual bool OnBeforeBrowse(CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request, bool user_gesture, bool IsRedirect) override; virtual CefRefPtr GetResourceHandler( CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request ) override; virtual bool OnCertificateError( CefRefPtr Browser, cef_errorcode_t CertError, const CefString& RequestUrl, CefRefPtr SslInfo, CefRefPtr Callback ) override; virtual CefRefPtr GetResourceRequestHandler( CefRefPtr browser, CefRefPtr frame, CefRefPtr request, bool is_navigation, bool is_download, const CefString& request_initiator, bool& disable_default_handling) override; public: // CefKeyboardHandler interface virtual bool OnKeyEvent(CefRefPtr Browser, const CefKeyEvent& Event, CefEventHandle OsEvent) override; public: // CefCookieAccessFilter interface virtual bool CanSaveCookie(CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request, CefRefPtr Response, const CefCookie& Cookie) override; virtual bool CanSendCookie(CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request, const CefCookie& Cookie) override; public: // CefJSDialogHandler interface virtual bool OnJSDialog( CefRefPtr Browser, const CefString& OriginUrl, JSDialogType DialogType, const CefString& MessageText, const CefString& DefaultPromptText, CefRefPtr Callback, bool& OutSuppressMessage) override; virtual bool OnBeforeUnloadDialog(CefRefPtr Browser, const CefString& MessageText, bool IsReload, CefRefPtr Callback) override; virtual void OnResetDialogState(CefRefPtr Browser) override; public: // CefContextMenuHandler virtual void OnBeforeContextMenu(CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Params, CefRefPtr Model) override; public: // CefDragHandler interface virtual void OnDraggableRegionsChanged( CefRefPtr Browser, CefRefPtr frame, const std::vector& Regions) override; public: IWebInterfaceBrowserWindow::FOnBeforePopupDelegate& OnBeforePopup() { return BeforePopupDelegate; } IWebInterfaceBrowserWindow::FOnCreateWindow& OnCreateWindow() { return CreateWindowDelegate; } typedef TMap FRequestHeaders; DECLARE_DELEGATE_FourParams(FOnBeforeResourceLoadDelegate, const CefString& /*URL*/, CefRequest::ResourceType /*Type*/, FRequestHeaders& /*AdditionalHeaders*/, const bool /*AllowUserCredentials*/); FOnBeforeResourceLoadDelegate& OnBeforeResourceLoad() { return BeforeResourceLoadDelegate; } DECLARE_DELEGATE_FourParams(FOnResourceLoadCompleteDelegate, const CefString& /*URL*/, CefRequest::ResourceType /*Type*/, CefResourceRequestHandler::URLRequestStatus /*Status*/, int64 /*ContentLength*/); FOnResourceLoadCompleteDelegate& OnResourceLoadComplete() { return ResourceLoadCompleteDelegate; } DECLARE_DELEGATE_FiveParams(FOnConsoleMessageDelegate, CefRefPtr /*Browser*/, cef_log_severity_t /*level*/, const CefString& /*Message*/, const CefString& /*Source*/, int32 /*Line*/); FOnConsoleMessageDelegate& OnConsoleMessage() { return ConsoleMessageDelegate; } bool URLRequestAllowsCredentials(const FString& URL) const; private: bool ShowDevTools(const CefRefPtr& Browser); bool bUseTransparency; bool bAllowAllCookies; bool bInterceptLoadRequests; TArray AltRetryDomains; uint32 AltRetryDomainIdx = 0; /** Domains we allow sending an authorization header too even if the request doesn't otherwise indicate support */ TArray AuthorizationHeaderAllowListURLS; /** Keep track of URLs we see being loaded and the type of load it is*/ TMap MainFrameLoadTypes; /** Delegate for notifying that a popup window is attempting to open. */ IWebInterfaceBrowserWindow::FOnBeforePopupDelegate BeforePopupDelegate; /** Delegate for handling requests to create new windows. */ IWebInterfaceBrowserWindow::FOnCreateWindow CreateWindowDelegate; /** Delegate for handling adding additional headers to requests */ FOnBeforeResourceLoadDelegate BeforeResourceLoadDelegate; /** Delegate that allows response to the status of resource loads */ FOnResourceLoadCompleteDelegate ResourceLoadCompleteDelegate; /** Delegate that allows for response to console logs. Typically used to capture and mirror web logs in client application logs. */ FOnConsoleMessageDelegate ConsoleMessageDelegate; /** Weak Pointer to our Web Browser window so that events can be passed on while it's valid.*/ TWeakPtr BrowserWindowPtr; /** Pointer to the parent web browser handler */ CefRefPtr ParentHandler; /** Stores popup window features and settings */ TSharedPtr BrowserPopupFeatures; // Include the default reference counting implementation. IMPLEMENT_REFCOUNTING(FCEFInterfaceBrowserHandler); }; #endif