CEFInterfaceResourceContextHandler.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // Engine/Source/Runtime/WebBrowser/Private/CEF/CEFInterfaceResourceContextHandler.cpp
  2. #include "CEF/CEFInterfaceResourceContextHandler.h"
  3. #include "HAL/PlatformApplicationMisc.h"
  4. #if WITH_CEF3
  5. //#define DEBUG_ONBEFORELOAD // Debug print beforebrowse steps
  6. #include "CEFInterfaceBrowserClosureTask.h"
  7. #include "WebInterfaceBrowserSingleton.h"
  8. #define LOCTEXT_NAMESPACE "WebInterfaceBrowserHandler"
  9. FCEFInterfaceResourceContextHandler::FCEFInterfaceResourceContextHandler(FWebInterfaceBrowserSingleton * InOwningSingleton) :
  10. OwningSingleton(InOwningSingleton)
  11. { }
  12. FString _ResourceTypeToString(const CefRequest::ResourceType& Type)
  13. {
  14. const static FString ResourceType_MainFrame(TEXT("MAIN_FRAME"));
  15. const static FString ResourceType_SubFrame(TEXT("SUB_FRAME"));
  16. const static FString ResourceType_StyleSheet(TEXT("STYLESHEET"));
  17. const static FString ResourceType_Script(TEXT("SCRIPT"));
  18. const static FString ResourceType_Image(TEXT("IMAGE"));
  19. const static FString ResourceType_FontResource(TEXT("FONT_RESOURCE"));
  20. const static FString ResourceType_SubResource(TEXT("SUB_RESOURCE"));
  21. const static FString ResourceType_Object(TEXT("OBJECT"));
  22. const static FString ResourceType_Media(TEXT("MEDIA"));
  23. const static FString ResourceType_Worker(TEXT("WORKER"));
  24. const static FString ResourceType_SharedWorker(TEXT("SHARED_WORKER"));
  25. const static FString ResourceType_Prefetch(TEXT("PREFETCH"));
  26. const static FString ResourceType_Favicon(TEXT("FAVICON"));
  27. const static FString ResourceType_XHR(TEXT("XHR"));
  28. const static FString ResourceType_Ping(TEXT("PING"));
  29. const static FString ResourceType_ServiceWorker(TEXT("SERVICE_WORKER"));
  30. const static FString ResourceType_CspReport(TEXT("CSP_REPORT"));
  31. const static FString ResourceType_PluginResource(TEXT("PLUGIN_RESOURCE"));
  32. const static FString ResourceType_Unknown(TEXT("UNKNOWN"));
  33. FString TypeStr;
  34. switch (Type)
  35. {
  36. case CefRequest::ResourceType::RT_MAIN_FRAME:
  37. TypeStr = ResourceType_MainFrame;
  38. break;
  39. case CefRequest::ResourceType::RT_SUB_FRAME:
  40. TypeStr = ResourceType_SubFrame;
  41. break;
  42. case CefRequest::ResourceType::RT_STYLESHEET:
  43. TypeStr = ResourceType_StyleSheet;
  44. break;
  45. case CefRequest::ResourceType::RT_SCRIPT:
  46. TypeStr = ResourceType_Script;
  47. break;
  48. case CefRequest::ResourceType::RT_IMAGE:
  49. TypeStr = ResourceType_Image;
  50. break;
  51. case CefRequest::ResourceType::RT_FONT_RESOURCE:
  52. TypeStr = ResourceType_FontResource;
  53. break;
  54. case CefRequest::ResourceType::RT_SUB_RESOURCE:
  55. TypeStr = ResourceType_SubResource;
  56. break;
  57. case CefRequest::ResourceType::RT_OBJECT:
  58. TypeStr = ResourceType_Object;
  59. break;
  60. case CefRequest::ResourceType::RT_MEDIA:
  61. TypeStr = ResourceType_Media;
  62. break;
  63. case CefRequest::ResourceType::RT_WORKER:
  64. TypeStr = ResourceType_Worker;
  65. break;
  66. case CefRequest::ResourceType::RT_SHARED_WORKER:
  67. TypeStr = ResourceType_SharedWorker;
  68. break;
  69. case CefRequest::ResourceType::RT_PREFETCH:
  70. TypeStr = ResourceType_Prefetch;
  71. break;
  72. case CefRequest::ResourceType::RT_FAVICON:
  73. TypeStr = ResourceType_Favicon;
  74. break;
  75. case CefRequest::ResourceType::RT_XHR:
  76. TypeStr = ResourceType_XHR;
  77. break;
  78. case CefRequest::ResourceType::RT_PING:
  79. TypeStr = ResourceType_Ping;
  80. break;
  81. case CefRequest::ResourceType::RT_SERVICE_WORKER:
  82. TypeStr = ResourceType_ServiceWorker;
  83. break;
  84. case CefRequest::ResourceType::RT_CSP_REPORT:
  85. TypeStr = ResourceType_CspReport;
  86. break;
  87. case CefRequest::ResourceType::RT_PLUGIN_RESOURCE:
  88. TypeStr = ResourceType_PluginResource;
  89. break;
  90. default:
  91. TypeStr = ResourceType_Unknown;
  92. break;
  93. }
  94. return TypeStr;
  95. }
  96. CefResourceRequestHandler::ReturnValue FCEFInterfaceResourceContextHandler::OnBeforeResourceLoad(CefRefPtr<CefBrowser> Browser, CefRefPtr<CefFrame> Frame, CefRefPtr<CefRequest> Request, CefRefPtr<CefRequestCallback> Callback)
  97. {
  98. #ifdef DEBUG_ONBEFORELOAD
  99. auto url = Request->GetURL();
  100. auto type = Request->GetResourceType();
  101. auto method = Request->GetMethod();
  102. if (type == CefRequest::ResourceType::RT_MAIN_FRAME || type == CefRequest::ResourceType::RT_XHR)
  103. {
  104. GLog->Logf(ELogVerbosity::Display, TEXT("FCEFInterfaceResourceContextHandler::OnBeforeResourceLoad :%s type:%s method:%s"), url.c_str(), *_ResourceTypeToString(type), method.c_str());
  105. }
  106. #endif
  107. if (Request->IsReadOnly())
  108. {
  109. // we can't alter this request so just allow it through
  110. return RV_CONTINUE;
  111. }
  112. // Current thread is IO thread. We need to invoke BrowserWindow->GetResourceContent on the UI (aka Game) thread:
  113. CefPostTask(TID_UI, new FCEFInterfaceBrowserClosureTask(this, [=]()
  114. {
  115. const FString LanguageHeaderText(TEXT("Accept-Language"));
  116. const FString LocaleCode = FWebInterfaceBrowserSingleton::GetCurrentLocaleCode();
  117. CefRequest::HeaderMap HeaderMap;
  118. Request->GetHeaderMap(HeaderMap);
  119. auto LanguageHeader = HeaderMap.find(TCHAR_TO_WCHAR(*LanguageHeaderText));
  120. if (LanguageHeader != HeaderMap.end())
  121. {
  122. (*LanguageHeader).second = TCHAR_TO_WCHAR(*LocaleCode);
  123. }
  124. else
  125. {
  126. HeaderMap.insert(std::pair<CefString, CefString>(TCHAR_TO_WCHAR(*LanguageHeaderText), TCHAR_TO_WCHAR(*LocaleCode)));
  127. }
  128. bool bAllowCredentials = false;
  129. if (OwningSingleton != nullptr)
  130. {
  131. bAllowCredentials = OwningSingleton->URLRequestAllowsCredentials(WCHAR_TO_TCHAR(Request->GetURL().ToWString().c_str()));
  132. }
  133. FInterfaceContextRequestHeaders AdditionalHeaders;
  134. BeforeResourceLoadDelegate.ExecuteIfBound(WCHAR_TO_TCHAR(Request->GetURL().ToWString().c_str()), _ResourceTypeToString(Request->GetResourceType()), AdditionalHeaders, bAllowCredentials);
  135. for (auto Iter = AdditionalHeaders.CreateConstIterator(); Iter; ++Iter)
  136. {
  137. const FString Header = Iter.Key();
  138. const FString Value = Iter.Value();
  139. HeaderMap.insert(std::pair<CefString, CefString>(TCHAR_TO_WCHAR(*Header), TCHAR_TO_WCHAR(*Value)));
  140. }
  141. Request->SetHeaderMap(HeaderMap);
  142. Callback->Continue(true);
  143. }));
  144. // Tell CEF that we're handling this asynchronously.
  145. return RV_CONTINUE_ASYNC;
  146. }
  147. CefRefPtr<CefResourceRequestHandler> FCEFInterfaceResourceContextHandler::GetResourceRequestHandler( CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
  148. CefRefPtr<CefRequest> request, bool is_navigation, bool is_download, const CefString& request_initiator, bool& disable_default_handling)
  149. {
  150. #ifdef DEBUG_ONBEFORELOAD
  151. auto url = request->GetURL();
  152. auto type = request->GetResourceType();
  153. if (type == CefRequest::ResourceType::RT_MAIN_FRAME || type == CefRequest::ResourceType::RT_XHR || type == CefRequest::ResourceType::RT_SUB_RESOURCE)
  154. {
  155. GLog->Logf(ELogVerbosity::Display, TEXT("FCEFInterfaceResourceContextHandler::GetResourceRequestHandler :%s type:%s"), url.c_str(), *_ResourceTypeToString(type));
  156. }
  157. #endif
  158. return this;
  159. }
  160. /*void FCEFInterfaceResourceContextHandler::AddLoadCallback(IWebInterfaceBrowserOnBeforeResourceLoadHandler* pCallback)
  161. {
  162. callbacks.Add(pCallback);
  163. }*/
  164. #undef LOCTEXT_NAMESPACE
  165. #endif // WITH_CEF