CEFInterfaceBrowserHandler.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. // Engine/Source/Runtime/WebBrowser/Private/CEF/CEFBrowserHandler.h
  2. #pragma once
  3. #include "CoreMinimal.h"
  4. #if WITH_CEF3
  5. #include "CEFInterfaceLibCefIncludes.h"
  6. #include "IWebInterfaceBrowserWindow.h"
  7. #endif
  8. class IWebInterfaceBrowserWindow;
  9. struct Rect;
  10. class FCEFWebInterfaceBrowserWindow;
  11. class FCEFInterfaceBrowserPopupFeatures;
  12. #if WITH_CEF3
  13. /**
  14. * Implements CEF Client and other Browser level interfaces.
  15. */
  16. class FCEFInterfaceBrowserHandler
  17. : public CefClient
  18. , public CefDisplayHandler
  19. , public CefLifeSpanHandler
  20. , public CefLoadHandler
  21. , public CefRenderHandler
  22. , public CefRequestHandler
  23. , public CefKeyboardHandler
  24. , public CefJSDialogHandler
  25. , public CefContextMenuHandler
  26. , public CefDragHandler
  27. , public CefResourceRequestHandler
  28. , public CefRequestContextHandler
  29. , public CefCookieAccessFilter
  30. {
  31. public:
  32. /** Default constructor. */
  33. FCEFInterfaceBrowserHandler(bool InUseTransparency, bool InInterceptLoadRequests, const TArray<FString>& AltRetryDomains = TArray<FString>(), const TArray<FString>& AuthorizationHeaderAllowListURLS = TArray<FString>());
  34. public:
  35. /**
  36. * Pass in a pointer to our Browser Window so that events can be passed on.
  37. *
  38. * @param InBrowserWindow The browser window this will be handling.
  39. */
  40. void SetBrowserWindow(TSharedPtr<FCEFWebInterfaceBrowserWindow> InBrowserWindow);
  41. /**
  42. * Sets the browser window features and settings for popups which will be passed along when creating the new window.
  43. *
  44. * @param InPopupFeatures The popup features and settings for the window.
  45. */
  46. void SetPopupFeatures(const TSharedPtr<FCEFInterfaceBrowserPopupFeatures>& InPopupFeatures)
  47. {
  48. BrowserPopupFeatures = InPopupFeatures;
  49. }
  50. public:
  51. // CefClient Interface
  52. virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() override
  53. {
  54. return this;
  55. }
  56. virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() override
  57. {
  58. return this;
  59. }
  60. virtual CefRefPtr<CefLoadHandler> GetLoadHandler() override
  61. {
  62. return this;
  63. }
  64. virtual CefRefPtr<CefRenderHandler> GetRenderHandler() override
  65. {
  66. return this;
  67. }
  68. virtual CefRefPtr<CefRequestHandler> GetRequestHandler() override
  69. {
  70. return this;
  71. }
  72. virtual CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() override
  73. {
  74. return this;
  75. }
  76. virtual CefRefPtr<CefJSDialogHandler> GetJSDialogHandler() override
  77. {
  78. return this;
  79. }
  80. virtual CefRefPtr<CefContextMenuHandler> GetContextMenuHandler() override
  81. {
  82. return this;
  83. }
  84. virtual CefRefPtr<CefDragHandler> GetDragHandler() override
  85. {
  86. return this;
  87. }
  88. virtual CefRefPtr<CefCookieAccessFilter> GetCookieAccessFilter(
  89. CefRefPtr<CefBrowser> Browser,
  90. CefRefPtr<CefFrame> Frame,
  91. CefRefPtr<CefRequest> Request) override;
  92. virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> Browser,
  93. CefRefPtr<CefFrame> frame,
  94. CefProcessId SourceProcess,
  95. CefRefPtr<CefProcessMessage> Message) override;
  96. public:
  97. // CefDisplayHandler Interface
  98. virtual void OnTitleChange(CefRefPtr<CefBrowser> Browser, const CefString& Title) override;
  99. virtual void OnAddressChange(CefRefPtr<CefBrowser> Browser, CefRefPtr<CefFrame> Frame, const CefString& Url) override;
  100. virtual bool OnTooltip(CefRefPtr<CefBrowser> Browser, CefString& Text) override;
  101. virtual bool OnConsoleMessage(
  102. CefRefPtr<CefBrowser> Browser,
  103. cef_log_severity_t level,
  104. const CefString& Message,
  105. const CefString& Source,
  106. int Line) override;
  107. public:
  108. // CefLifeSpanHandler Interface
  109. virtual void OnAfterCreated(CefRefPtr<CefBrowser> Browser) override;
  110. virtual bool DoClose(CefRefPtr<CefBrowser> Browser) override;
  111. virtual void OnBeforeClose(CefRefPtr<CefBrowser> Browser) override;
  112. virtual bool OnBeforePopup(CefRefPtr<CefBrowser> Browser,
  113. CefRefPtr<CefFrame> Frame,
  114. const CefString& Target_Url,
  115. const CefString& Target_Frame_Name,
  116. CefLifeSpanHandler::WindowOpenDisposition /* Target_Disposition */,
  117. bool /* User_Gesture */,
  118. const CefPopupFeatures& PopupFeatures,
  119. CefWindowInfo& WindowInfo,
  120. CefRefPtr<CefClient>& Client,
  121. CefBrowserSettings& Settings,
  122. CefRefPtr<CefDictionaryValue>& extra_info,
  123. bool* no_javascript_access) override
  124. {
  125. return OnBeforePopup(Browser, Frame, Target_Url, Target_Frame_Name, PopupFeatures, WindowInfo, Client, Settings, no_javascript_access);
  126. }
  127. virtual bool OnBeforePopup(CefRefPtr<CefBrowser> Browser,
  128. CefRefPtr<CefFrame> Frame,
  129. const CefString& Target_Url,
  130. const CefString& Target_Frame_Name,
  131. const CefPopupFeatures& PopupFeatures,
  132. CefWindowInfo& WindowInfo,
  133. CefRefPtr<CefClient>& Client,
  134. CefBrowserSettings& Settings,
  135. bool* no_javascript_access) ;
  136. public:
  137. // CefLoadHandler Interface
  138. virtual void OnLoadError(CefRefPtr<CefBrowser> Browser,
  139. CefRefPtr<CefFrame> Frame,
  140. CefLoadHandler::ErrorCode InErrorCode,
  141. const CefString& ErrorText,
  142. const CefString& FailedUrl) override;
  143. virtual void OnLoadingStateChange(
  144. CefRefPtr<CefBrowser> browser,
  145. bool isLoading,
  146. bool canGoBack,
  147. bool canGoForward) override;
  148. virtual void OnLoadStart(
  149. CefRefPtr<CefBrowser> Browser,
  150. CefRefPtr<CefFrame> Frame,
  151. TransitionType CefTransitionType) override;
  152. public:
  153. // CefRenderHandler Interface
  154. virtual bool GetRootScreenRect(CefRefPtr<CefBrowser> Browser, CefRect& Rect) override;
  155. virtual void GetViewRect(CefRefPtr<CefBrowser> Browser, CefRect& Rect) override;
  156. virtual void OnPaint(CefRefPtr<CefBrowser> Browser,
  157. PaintElementType Type,
  158. const RectList& DirtyRects,
  159. const void* Buffer,
  160. int Width, int Height) override;
  161. virtual void OnAcceleratedPaint(CefRefPtr<CefBrowser> Browser,
  162. PaintElementType Type,
  163. const RectList& DirtyRects,
  164. void* SharedHandle) override;
  165. virtual void OnPopupShow(CefRefPtr<CefBrowser> Browser, bool bShow) override;
  166. virtual void OnPopupSize(CefRefPtr<CefBrowser> Browser, const CefRect& Rect) override;
  167. virtual bool GetScreenInfo(CefRefPtr<CefBrowser> Browser, CefScreenInfo& ScreenInfo) override;
  168. // CefDisplayHandler interface
  169. virtual bool OnCursorChange(CefRefPtr<CefBrowser> browser,
  170. CefCursorHandle cursor,
  171. cef_cursor_type_t type,
  172. const CefCursorInfo& custom_cursor_info) override;
  173. #if !PLATFORM_LINUX
  174. virtual void OnImeCompositionRangeChanged(
  175. CefRefPtr<CefBrowser> Browser,
  176. const CefRange& SelectionRange,
  177. const CefRenderHandler::RectList& CharacterBounds) override;
  178. #endif
  179. public:
  180. // CefRequestHandler Interface
  181. virtual CefResourceRequestHandler::ReturnValue OnBeforeResourceLoad(
  182. CefRefPtr<CefBrowser> Browser,
  183. CefRefPtr<CefFrame> Frame,
  184. CefRefPtr<CefRequest> Request,
  185. CefRefPtr<CefRequestCallback> Callback) override;
  186. virtual void OnResourceLoadComplete(CefRefPtr<CefBrowser> Browser,
  187. CefRefPtr<CefFrame> Frame,
  188. CefRefPtr<CefRequest> Request,
  189. CefRefPtr<CefResponse> Response,
  190. URLRequestStatus Status,
  191. int64 Received_content_length) override;
  192. virtual void OnResourceRedirect(CefRefPtr<CefBrowser> browser,
  193. CefRefPtr<CefFrame> frame,
  194. CefRefPtr<CefRequest> request,
  195. CefRefPtr<CefResponse> response,
  196. CefString& new_url) override;
  197. virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> Browser, TerminationStatus Status) override;
  198. virtual bool OnBeforeBrowse(CefRefPtr<CefBrowser> Browser,
  199. CefRefPtr<CefFrame> Frame,
  200. CefRefPtr<CefRequest> Request,
  201. bool user_gesture,
  202. bool IsRedirect) override;
  203. virtual CefRefPtr<CefResourceHandler> GetResourceHandler(
  204. CefRefPtr<CefBrowser> Browser,
  205. CefRefPtr<CefFrame> Frame,
  206. CefRefPtr<CefRequest> Request ) override;
  207. virtual bool OnCertificateError(
  208. CefRefPtr<CefBrowser> Browser,
  209. cef_errorcode_t CertError,
  210. const CefString& RequestUrl,
  211. CefRefPtr<CefSSLInfo> SslInfo,
  212. CefRefPtr<CefRequestCallback> Callback ) override;
  213. virtual CefRefPtr<CefResourceRequestHandler> GetResourceRequestHandler(
  214. CefRefPtr<CefBrowser> browser,
  215. CefRefPtr<CefFrame> frame,
  216. CefRefPtr<CefRequest> request,
  217. bool is_navigation,
  218. bool is_download,
  219. const CefString& request_initiator,
  220. bool& disable_default_handling) override;
  221. public:
  222. // CefKeyboardHandler interface
  223. virtual bool OnKeyEvent(CefRefPtr<CefBrowser> Browser,
  224. const CefKeyEvent& Event,
  225. CefEventHandle OsEvent) override;
  226. public:
  227. // CefCookieAccessFilter interface
  228. virtual bool CanSaveCookie(CefRefPtr<CefBrowser> Browser,
  229. CefRefPtr<CefFrame> Frame,
  230. CefRefPtr<CefRequest> Request,
  231. CefRefPtr<CefResponse> Response,
  232. const CefCookie& Cookie) override;
  233. virtual bool CanSendCookie(CefRefPtr<CefBrowser> Browser,
  234. CefRefPtr<CefFrame> Frame,
  235. CefRefPtr<CefRequest> Request,
  236. const CefCookie& Cookie) override;
  237. public:
  238. // CefJSDialogHandler interface
  239. virtual bool OnJSDialog(
  240. CefRefPtr<CefBrowser> Browser,
  241. const CefString& OriginUrl,
  242. JSDialogType DialogType,
  243. const CefString& MessageText,
  244. const CefString& DefaultPromptText,
  245. CefRefPtr<CefJSDialogCallback> Callback,
  246. bool& OutSuppressMessage) override;
  247. virtual bool OnBeforeUnloadDialog(CefRefPtr<CefBrowser> Browser, const CefString& MessageText, bool IsReload, CefRefPtr<CefJSDialogCallback> Callback) override;
  248. virtual void OnResetDialogState(CefRefPtr<CefBrowser> Browser) override;
  249. public:
  250. // CefContextMenuHandler
  251. virtual void OnBeforeContextMenu(CefRefPtr<CefBrowser> Browser,
  252. CefRefPtr<CefFrame> Frame,
  253. CefRefPtr<CefContextMenuParams> Params,
  254. CefRefPtr<CefMenuModel> Model) override;
  255. public:
  256. // CefDragHandler interface
  257. virtual void OnDraggableRegionsChanged(
  258. CefRefPtr<CefBrowser> Browser,
  259. CefRefPtr<CefFrame> frame,
  260. const std::vector<CefDraggableRegion>& Regions) override;
  261. public:
  262. IWebInterfaceBrowserWindow::FOnBeforePopupDelegate& OnBeforePopup()
  263. {
  264. return BeforePopupDelegate;
  265. }
  266. IWebInterfaceBrowserWindow::FOnCreateWindow& OnCreateWindow()
  267. {
  268. return CreateWindowDelegate;
  269. }
  270. typedef TMap<FString, FString> FRequestHeaders;
  271. DECLARE_DELEGATE_FourParams(FOnBeforeResourceLoadDelegate, const CefString& /*URL*/, CefRequest::ResourceType /*Type*/, FRequestHeaders& /*AdditionalHeaders*/, const bool /*AllowUserCredentials*/);
  272. FOnBeforeResourceLoadDelegate& OnBeforeResourceLoad()
  273. {
  274. return BeforeResourceLoadDelegate;
  275. }
  276. DECLARE_DELEGATE_FourParams(FOnResourceLoadCompleteDelegate, const CefString& /*URL*/, CefRequest::ResourceType /*Type*/, CefResourceRequestHandler::URLRequestStatus /*Status*/, int64 /*ContentLength*/);
  277. FOnResourceLoadCompleteDelegate& OnResourceLoadComplete()
  278. {
  279. return ResourceLoadCompleteDelegate;
  280. }
  281. DECLARE_DELEGATE_FiveParams(FOnConsoleMessageDelegate, CefRefPtr<CefBrowser> /*Browser*/, cef_log_severity_t /*level*/, const CefString& /*Message*/, const CefString& /*Source*/, int32 /*Line*/);
  282. FOnConsoleMessageDelegate& OnConsoleMessage()
  283. {
  284. return ConsoleMessageDelegate;
  285. }
  286. bool URLRequestAllowsCredentials(const FString& URL) const;
  287. private:
  288. bool ShowDevTools(const CefRefPtr<CefBrowser>& Browser);
  289. bool bUseTransparency;
  290. bool bAllowAllCookies;
  291. bool bInterceptLoadRequests;
  292. TArray<FString> AltRetryDomains;
  293. uint32 AltRetryDomainIdx = 0;
  294. /** Domains we allow sending an authorization header too even if the request doesn't otherwise indicate support */
  295. TArray<FString> AuthorizationHeaderAllowListURLS;
  296. /** Keep track of URLs we see being loaded and the type of load it is*/
  297. TMap<FString, CefRequest::ResourceType> MainFrameLoadTypes;
  298. /** Delegate for notifying that a popup window is attempting to open. */
  299. IWebInterfaceBrowserWindow::FOnBeforePopupDelegate BeforePopupDelegate;
  300. /** Delegate for handling requests to create new windows. */
  301. IWebInterfaceBrowserWindow::FOnCreateWindow CreateWindowDelegate;
  302. /** Delegate for handling adding additional headers to requests */
  303. FOnBeforeResourceLoadDelegate BeforeResourceLoadDelegate;
  304. /** Delegate that allows response to the status of resource loads */
  305. FOnResourceLoadCompleteDelegate ResourceLoadCompleteDelegate;
  306. /** Delegate that allows for response to console logs. Typically used to capture and mirror web logs in client application logs. */
  307. FOnConsoleMessageDelegate ConsoleMessageDelegate;
  308. /** Weak Pointer to our Web Browser window so that events can be passed on while it's valid.*/
  309. TWeakPtr<FCEFWebInterfaceBrowserWindow> BrowserWindowPtr;
  310. /** Pointer to the parent web browser handler */
  311. CefRefPtr<FCEFInterfaceBrowserHandler> ParentHandler;
  312. /** Stores popup window features and settings */
  313. TSharedPtr<FCEFInterfaceBrowserPopupFeatures> BrowserPopupFeatures;
  314. // Include the default reference counting implementation.
  315. IMPLEMENT_REFCOUNTING(FCEFInterfaceBrowserHandler);
  316. };
  317. #endif