// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. #include "WebBrowserPrivatePCH.h" #include "WebBrowserHandler.h" #include "WebBrowserWindow.h" #include "WebBrowserSingleton.h" #define LOCTEXT_NAMESPACE "WebBrowserHandler" #if WITH_CEF3 FWebBrowserHandler::FWebBrowserHandler() : ShowErrorMessage(true) { // This has to match the config in UnrealCEFSubpProcess CefMessageRouterConfig MessageRouterConfig; MessageRouterConfig.js_query_function = "ueQuery"; MessageRouterConfig.js_cancel_function = "ueQueryCancel"; MessageRouter = CefMessageRouterBrowserSide::Create(MessageRouterConfig); } void FWebBrowserHandler::OnTitleChange(CefRefPtr Browser, const CefString& Title) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->SetTitle(Title); } } void FWebBrowserHandler::OnAddressChange(CefRefPtr Browser, CefRefPtr Frame, const CefString& Url) { if (Frame->IsMain()) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->SetUrl(Url); } } } void FWebBrowserHandler::OnAfterCreated(CefRefPtr Browser) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->BindCefBrowser(Browser); } } void FWebBrowserHandler::OnBeforeClose(CefRefPtr Browser) { MessageRouter->OnBeforeClose(Browser); TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->BindCefBrowser(nullptr); } } void FWebBrowserHandler::OnLoadError(CefRefPtr Browser, CefRefPtr Frame, CefLoadHandler::ErrorCode InErrorCode, const CefString& ErrorText, const CefString& FailedUrl) { // Don't display an error for downloaded files. if (InErrorCode == ERR_ABORTED) { return; } // notify browser window if (Frame->IsMain()) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->NotifyDocumentError(); } } // Display a load error message. if (ShowErrorMessage) { FFormatNamedArguments Args; { Args.Add(TEXT("FailedUrl"), FText::FromString(FailedUrl.ToWString().c_str())); Args.Add(TEXT("ErrorText"), FText::FromString(ErrorText.ToWString().c_str())); Args.Add(TEXT("ErrorCode"), FText::AsNumber(InErrorCode)); } FText ErrorMsg = FText::Format(LOCTEXT("WebBrowserLoadError", "Failed to load URL {FailedUrl} with error {ErrorText} ({ErrorCode})."), Args); FString ErrorHTML = TEXT("

") + ErrorMsg.ToString() + TEXT("

"); Frame->LoadString(*ErrorHTML, FailedUrl); } } void FWebBrowserHandler::OnLoadingStateChange(CefRefPtr browser, bool isLoading, bool canGoBack, bool canGoForward) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->NotifyDocumentLoadingStateChange(isLoading); } } bool FWebBrowserHandler::GetViewRect(CefRefPtr Browser, CefRect& Rect) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { return BrowserWindow->GetViewRect(Rect); } return false; } void FWebBrowserHandler::OnPaint(CefRefPtr Browser, PaintElementType Type, const RectList& DirtyRects, const void* Buffer, int Width, int Height) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->OnPaint(Type, DirtyRects, Buffer, Width, Height); } } void FWebBrowserHandler::OnCursorChange(CefRefPtr Browser, CefCursorHandle Cursor) { TSharedPtr BrowserWindow = BrowserWindowPtr.Pin(); if (BrowserWindow.IsValid()) { BrowserWindow->OnCursorChange(Cursor); } } bool FWebBrowserHandler::OnBeforeResourceLoad(CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request) { const FString LanguageHeaderText(TEXT("Accept-Language")); const FString LocaleCode = FWebBrowserSingleton::GetCurrentLocaleCode(); CefRequest::HeaderMap HeaderMap; Request->GetHeaderMap(HeaderMap); auto LanguageHeader = HeaderMap.find(*LanguageHeaderText); if (LanguageHeader != HeaderMap.end()) { (*LanguageHeader).second = *LocaleCode; } else { HeaderMap.insert(std::pair(*LanguageHeaderText, *LocaleCode)); } Request->SetHeaderMap(HeaderMap); return false; } void FWebBrowserHandler::OnRenderProcessTerminated(CefRefPtr Browser, TerminationStatus Status) { MessageRouter->OnRenderProcessTerminated(Browser); } bool FWebBrowserHandler::OnBeforeBrowse(CefRefPtr Browser, CefRefPtr Frame, CefRefPtr Request, bool IsRedirect) { MessageRouter->OnBeforeBrowse(Browser, Frame); return false; } void FWebBrowserHandler::SetBrowserWindow(TSharedPtr InBrowserWindow) { BrowserWindowPtr = InBrowserWindow; } bool FWebBrowserHandler::OnProcessMessageReceived(CefRefPtr Browser, CefProcessId SourceProcess, CefRefPtr Message) { return MessageRouter->OnProcessMessageReceived(Browser, SourceProcess, Message); } #endif #undef LOCTEXT_NAMESPACE