// Engine/Source/Runtime/WebBrowser/Private/CEF/CEFCookieManager.cpp #include "CoreTypes.h" #include "Containers/ContainersFwd.h" #if WITH_CEF3 #include "IWebInterfaceBrowserCookieManager.h" #include "WebInterfaceBrowserSingleton.h" #include "CEFInterfaceLibCefIncludes.h" class FCefInterfaceCookieManager : public IWebInterfaceBrowserCookieManager { public: virtual ~FCefInterfaceCookieManager() { } virtual void SetCookie(const FString& URL, const FCookie& Cookie, TFunction Completed) override { CefRefPtr Callback = Completed ? new FSetCookieFunctionCallback(Completed) : nullptr; CefCookie CefCookie; CefString(&CefCookie.name) = TCHAR_TO_WCHAR(*Cookie.Name); CefString(&CefCookie.value) = TCHAR_TO_WCHAR(*Cookie.Value); CefString(&CefCookie.domain) = TCHAR_TO_WCHAR(*Cookie.Domain); CefString(&CefCookie.path) = TCHAR_TO_WCHAR(*Cookie.Path); CefCookie.secure = Cookie.bSecure; CefCookie.httponly = Cookie.bHttpOnly; CefCookie.has_expires = Cookie.bHasExpires; cef_time_t CefTime; CefTime.year = Cookie.Expires.GetYear(); CefTime.month = Cookie.Expires.GetMonth(); CefTime.day_of_month = Cookie.Expires.GetDay(); CefTime.hour = Cookie.Expires.GetHour(); CefTime.minute = Cookie.Expires.GetMinute(); CefTime.second = Cookie.Expires.GetSecond(); CefTime.millisecond = Cookie.Expires.GetMillisecond(); const EDayOfWeek DayOfWeek = Cookie.Expires.GetDayOfWeek(); if (DayOfWeek == EDayOfWeek::Sunday) // some crazy reason our date/time class think Monday is the beginning of the week { CefTime.day_of_week = 0; } else { CefTime.day_of_week = ((int32)DayOfWeek) + 1; } CefCookie.expires = CefTime; if (!CookieManager->SetCookie(TCHAR_TO_WCHAR(*URL), CefCookie, Callback)) { Callback->OnComplete(false); } } virtual void DeleteCookies(const FString& URL, const FString& CookieName, TFunction Completed) override { CefRefPtr Callback = Completed ? new FDeleteCookiesFunctionCallback(Completed) : nullptr; if (!CookieManager->DeleteCookies(TCHAR_TO_WCHAR(*URL), TCHAR_TO_WCHAR(*CookieName), Callback)) { Callback->OnComplete(-1); } } private: FCefInterfaceCookieManager( const CefRefPtr& InCookieManager) : CookieManager(InCookieManager) { } // Callback that will invoke the callback with the result on the UI thread. class FDeleteCookiesFunctionCallback : public CefDeleteCookiesCallback { TFunction Callback; public: FDeleteCookiesFunctionCallback(const TFunction& InCallback) : Callback(InCallback) {} virtual void OnComplete(int NumDeleted) override { // We're on the IO thread, so we'll have to schedule the callback on the main thread CefPostTask(TID_UI, new FDeleteCookiesNotificationTask(Callback, NumDeleted)); } IMPLEMENT_REFCOUNTING(FDeleteCookiesFunctionCallback); }; // Callback that will invoke the callback with the result on the UI thread. class FSetCookieFunctionCallback : public CefSetCookieCallback { TFunction Callback; public: FSetCookieFunctionCallback(const TFunction& InCallback) : Callback(InCallback) {} virtual void OnComplete(bool bSuccess) override { // We're on the IO thread, so we'll have to schedule the callback on the main thread CefPostTask(TID_UI, new FSetCookieNotificationTask(Callback, bSuccess)); } IMPLEMENT_REFCOUNTING(FSetCookieFunctionCallback); }; // Task for executing a callback on a given thread. class FDeleteCookiesNotificationTask : public CefTask { TFunction Callback; int Value; public: FDeleteCookiesNotificationTask(const TFunction& InCallback, int InValue) : Callback(InCallback) , Value(InValue) {} virtual void Execute() override { Callback(Value); } IMPLEMENT_REFCOUNTING(FDeleteCookiesNotificationTask); }; // Task for executing a callback on a given thread. class FSetCookieNotificationTask : public CefTask { TFunction Callback; bool bSuccess; public: FSetCookieNotificationTask(const TFunction& InCallback, bool InSuccess) : Callback(InCallback) , bSuccess(InSuccess) {} virtual void Execute() override { Callback(bSuccess); } IMPLEMENT_REFCOUNTING(FSetCookieNotificationTask); }; private: const CefRefPtr CookieManager; friend FCefWebInterfaceCookieManagerFactory; }; TSharedRef FCefWebInterfaceCookieManagerFactory::Create( const CefRefPtr& CookieManager) { return MakeShareable(new FCefInterfaceCookieManager( CookieManager)); } #endif