2014-12-07 19:09:38 -05:00
|
|
|
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
2014-10-02 10:53:05 -04:00
|
|
|
|
|
|
|
|
#include "WebBrowserPrivatePCH.h"
|
|
|
|
|
#include "WebBrowserHandler.h"
|
|
|
|
|
#include "WebBrowserWindow.h"
|
|
|
|
|
#include "WebBrowserSingleton.h"
|
|
|
|
|
|
|
|
|
|
#define LOCTEXT_NAMESPACE "WebBrowserHandler"
|
|
|
|
|
|
|
|
|
|
#if WITH_CEF3
|
|
|
|
|
FWebBrowserHandler::FWebBrowserHandler()
|
2015-03-13 08:26:18 -04:00
|
|
|
: ShowErrorMessage(true)
|
2015-04-02 09:42:37 -04:00
|
|
|
{
|
|
|
|
|
// This has to match the config in UnrealCEFSubpProcess
|
|
|
|
|
CefMessageRouterConfig MessageRouterConfig;
|
|
|
|
|
MessageRouterConfig.js_query_function = "ueQuery";
|
|
|
|
|
MessageRouterConfig.js_cancel_function = "ueQueryCancel";
|
|
|
|
|
MessageRouter = CefMessageRouterBrowserSide::Create(MessageRouterConfig);
|
|
|
|
|
}
|
2014-10-02 10:53:05 -04:00
|
|
|
|
|
|
|
|
void FWebBrowserHandler::OnTitleChange(CefRefPtr<CefBrowser> Browser, const CefString& Title)
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
BrowserWindow->SetTitle(Title);
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-02 09:42:37 -04:00
|
|
|
void FWebBrowserHandler::OnAddressChange(CefRefPtr<CefBrowser> Browser, CefRefPtr<CefFrame> Frame, const CefString& Url)
|
|
|
|
|
{
|
|
|
|
|
if (Frame->IsMain())
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
|
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
|
|
|
|
BrowserWindow->SetUrl(Url);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
void FWebBrowserHandler::OnAfterCreated(CefRefPtr<CefBrowser> Browser)
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
BrowserWindow->BindCefBrowser(Browser);
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FWebBrowserHandler::OnBeforeClose(CefRefPtr<CefBrowser> Browser)
|
|
|
|
|
{
|
2015-04-02 09:42:37 -04:00
|
|
|
MessageRouter->OnBeforeClose(Browser);
|
2015-03-13 08:26:18 -04:00
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
BrowserWindow->BindCefBrowser(nullptr);
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FWebBrowserHandler::OnLoadError(CefRefPtr<CefBrowser> Browser,
|
|
|
|
|
CefRefPtr<CefFrame> Frame,
|
|
|
|
|
CefLoadHandler::ErrorCode InErrorCode,
|
|
|
|
|
const CefString& ErrorText,
|
|
|
|
|
const CefString& FailedUrl)
|
|
|
|
|
{
|
|
|
|
|
// Don't display an error for downloaded files.
|
|
|
|
|
if (InErrorCode == ERR_ABORTED)
|
2015-03-13 08:26:18 -04:00
|
|
|
{
|
2014-10-02 10:53:05 -04:00
|
|
|
return;
|
2015-03-13 08:26:18 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// notify browser window
|
|
|
|
|
if (Frame->IsMain())
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
|
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
|
|
|
|
BrowserWindow->NotifyDocumentError();
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-10-02 10:53:05 -04:00
|
|
|
|
|
|
|
|
// Display a load error message.
|
2015-03-13 08:26:18 -04:00
|
|
|
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("<html><body bgcolor=\"white\"><h2>") + ErrorMsg.ToString() + TEXT("</h2></body></html>");
|
|
|
|
|
|
|
|
|
|
Frame->LoadString(*ErrorHTML, FailedUrl);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FWebBrowserHandler::OnLoadingStateChange(CefRefPtr<CefBrowser> browser, bool isLoading, bool canGoBack, bool canGoForward)
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
|
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
|
|
|
|
BrowserWindow->NotifyDocumentLoadingStateChange(isLoading);
|
|
|
|
|
}
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FWebBrowserHandler::GetViewRect(CefRefPtr<CefBrowser> Browser, CefRect& Rect)
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
return BrowserWindow->GetViewRect(Rect);
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
2015-03-13 08:26:18 -04:00
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FWebBrowserHandler::OnPaint(CefRefPtr<CefBrowser> Browser,
|
|
|
|
|
PaintElementType Type,
|
|
|
|
|
const RectList& DirtyRects,
|
|
|
|
|
const void* Buffer,
|
|
|
|
|
int Width, int Height)
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
BrowserWindow->OnPaint(Type, DirtyRects, Buffer, Width, Height);
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FWebBrowserHandler::OnCursorChange(CefRefPtr<CefBrowser> Browser, CefCursorHandle Cursor)
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
TSharedPtr<FWebBrowserWindow> BrowserWindow = BrowserWindowPtr.Pin();
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
if (BrowserWindow.IsValid())
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
BrowserWindow->OnCursorChange(Cursor);
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FWebBrowserHandler::OnBeforeResourceLoad(CefRefPtr<CefBrowser> Browser, CefRefPtr<CefFrame> Frame, CefRefPtr<CefRequest> 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<CefString, CefString>(*LanguageHeaderText, *LocaleCode));
|
|
|
|
|
}
|
|
|
|
|
Request->SetHeaderMap(HeaderMap);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-02 09:42:37 -04:00
|
|
|
void FWebBrowserHandler::OnRenderProcessTerminated(CefRefPtr<CefBrowser> Browser, TerminationStatus Status)
|
|
|
|
|
{
|
|
|
|
|
MessageRouter->OnRenderProcessTerminated(Browser);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FWebBrowserHandler::OnBeforeBrowse(CefRefPtr<CefBrowser> Browser,
|
|
|
|
|
CefRefPtr<CefFrame> Frame,
|
|
|
|
|
CefRefPtr<CefRequest> Request,
|
|
|
|
|
bool IsRedirect)
|
|
|
|
|
{
|
|
|
|
|
MessageRouter->OnBeforeBrowse(Browser, Frame);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
void FWebBrowserHandler::SetBrowserWindow(TSharedPtr<FWebBrowserWindow> InBrowserWindow)
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
BrowserWindowPtr = InBrowserWindow;
|
2014-10-02 10:53:05 -04:00
|
|
|
}
|
2015-04-02 09:42:37 -04:00
|
|
|
|
|
|
|
|
bool FWebBrowserHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> Browser,
|
|
|
|
|
CefProcessId SourceProcess,
|
|
|
|
|
CefRefPtr<CefProcessMessage> Message)
|
|
|
|
|
{
|
|
|
|
|
return MessageRouter->OnProcessMessageReceived(Browser, SourceProcess, Message);
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-02 10:53:05 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#undef LOCTEXT_NAMESPACE
|