WebInterfaceBrowserModule.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Engine/Source/Runtime/WebBrowser/Private/WebBrowserModule.cpp
  2. #include "WebInterfaceBrowserModule.h"
  3. #include "WebInterfaceBrowserLog.h"
  4. #include "WebInterfaceBrowserSingleton.h"
  5. #include "Misc/App.h"
  6. #include "Misc/EngineVersion.h"
  7. #include "Misc/Paths.h"
  8. #if WITH_CEF3
  9. # include "CEF3Utils.h"
  10. # if PLATFORM_MAC
  11. # include "include/wrapper/cef_library_loader.h"
  12. # define CEF3_BIN_DIR TEXT("Binaries/ThirdParty/CEF3")
  13. # if PLATFORM_MAC_ARM64
  14. # define CEF3_FRAMEWORK_DIR CEF3_BIN_DIR TEXT("/Mac/Chromium Embedded Framework arm64.framework")
  15. # else
  16. # define CEF3_FRAMEWORK_DIR CEF3_BIN_DIR TEXT("/Mac/Chromium Embedded Framework x86.framework")
  17. # endif
  18. # define CEF3_FRAMEWORK_EXE CEF3_FRAMEWORK_DIR TEXT("/Chromium Embedded Framework")
  19. # endif
  20. #endif
  21. DEFINE_LOG_CATEGORY(LogWebInterfaceBrowser);
  22. static FWebInterfaceBrowserSingleton* WebBrowserSingleton = nullptr;
  23. FWebInterfaceBrowserInitSettings::FWebInterfaceBrowserInitSettings()
  24. : ProductVersion(FString::Printf(TEXT("%s/%s UnrealEngine/%s Chrome/90.0.4430.212"), FApp::GetProjectName(), FApp::GetBuildVersion(), *FEngineVersion::Current().ToString()))
  25. {
  26. }
  27. class FWebInterfaceBrowserModule : public IWebInterfaceBrowserModule
  28. {
  29. private:
  30. // IModuleInterface Interface
  31. virtual void StartupModule() override;
  32. virtual void ShutdownModule() override;
  33. public:
  34. virtual bool IsWebModuleAvailable() const override;
  35. virtual IWebInterfaceBrowserSingleton* GetSingleton() override;
  36. virtual bool CustomInitialize(const FWebInterfaceBrowserInitSettings& WebBrowserInitSettings) override;
  37. private:
  38. #if WITH_CEF3
  39. bool bLoadedCEFModule = false;
  40. #if PLATFORM_MAC
  41. // Dynamically load the CEF framework library.
  42. CefScopedLibraryLoader *CEFLibraryLoader = nullptr;
  43. #endif
  44. #endif
  45. };
  46. IMPLEMENT_MODULE( FWebInterfaceBrowserModule, WebBrowserUI );
  47. void FWebInterfaceBrowserModule::StartupModule()
  48. {
  49. #if WITH_CEF3
  50. if (!IsRunningCommandlet())
  51. {
  52. CEF3Utils::BackupCEF3Logfile(FPaths::ProjectLogDir());
  53. }
  54. bLoadedCEFModule = CEF3Utils::LoadCEF3Modules(true);
  55. #if PLATFORM_MAC
  56. // Dynamically load the CEF framework library into this dylibs memory space.
  57. // CEF now loads function pointers at runtime so we need this to be dylib specific.
  58. CEFLibraryLoader = new CefScopedLibraryLoader();
  59. FString CefFrameworkPath(FPaths::Combine(*FPaths::EngineDir(), CEF3_FRAMEWORK_EXE));
  60. CefFrameworkPath = FPaths::ConvertRelativePathToFull(CefFrameworkPath);
  61. bool bLoaderInitialized = false;
  62. if (!CEFLibraryLoader->LoadInMain(TCHAR_TO_ANSI(*CefFrameworkPath)))
  63. {
  64. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("Chromium loader initialization failed"));
  65. }
  66. #endif // PLATFORM_MAC
  67. #endif
  68. }
  69. void FWebInterfaceBrowserModule::ShutdownModule()
  70. {
  71. if (WebBrowserSingleton != nullptr)
  72. {
  73. delete WebBrowserSingleton;
  74. WebBrowserSingleton = nullptr;
  75. }
  76. #if WITH_CEF3
  77. CEF3Utils::UnloadCEF3Modules();
  78. #if PLATFORM_MAC
  79. delete CEFLibraryLoader;
  80. CEFLibraryLoader = nullptr;
  81. #endif // PLATFORM_MAC
  82. #endif
  83. }
  84. bool FWebInterfaceBrowserModule::CustomInitialize(const FWebInterfaceBrowserInitSettings& WebBrowserInitSettings)
  85. {
  86. if (WebBrowserSingleton == nullptr)
  87. {
  88. WebBrowserSingleton = new FWebInterfaceBrowserSingleton(WebBrowserInitSettings);
  89. return true;
  90. }
  91. return false;
  92. }
  93. IWebInterfaceBrowserSingleton* FWebInterfaceBrowserModule::GetSingleton()
  94. {
  95. if (WebBrowserSingleton == nullptr)
  96. {
  97. WebBrowserSingleton = new FWebInterfaceBrowserSingleton(FWebInterfaceBrowserInitSettings());
  98. }
  99. return WebBrowserSingleton;
  100. }
  101. bool FWebInterfaceBrowserModule::IsWebModuleAvailable() const
  102. {
  103. #if WITH_CEF3
  104. return bLoadedCEFModule;
  105. #else
  106. return true;
  107. #endif
  108. }