+Dali::TypeRegistration type(typeid(Dali::WebEngine), typeid(Dali::BaseHandle), Create);
+
+/**
+ * @brief Control the WebEnginePlugin library lifecycle.
+ * Hold the plugin library handle in static singletone.
+ * It will makes library handle alives during all WebEngine resources create & destory.
+ */
+struct WebEnginePluginObject
+{
+public:
+ static WebEnginePluginObject& GetInstance()
+ {
+ static WebEnginePluginObject gPluginHandle;
+ return gPluginHandle;
+ }
+
+ /**
+ * @brief Converts an handle to a bool.
+ *
+ * This is useful for checking whether the WebEnginePluginObject succes to load library.
+ * @note We don't check mHandle because it is possible that mHandle load is success but
+ * Create/Destroy API load failed.
+ */
+ explicit operator bool() const
+ {
+ return mLoadSucceeded;
+ }
+
+ bool InitializeContextHandle()
+ {
+ if(!mHandle)
+ {
+ return false;
+ }
+
+ if(!mGetWebEngineContextPtr)
+ {
+ mGetWebEngineContextPtr = reinterpret_cast<GetWebEngineContext>(dlsym(mHandle, "GetWebEngineContext"));
+ if(!mGetWebEngineContextPtr)
+ {
+ DALI_LOG_ERROR("Can't load symbol GetWebEngineContext(), error: %s\n", dlerror());
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ bool InitializeCookieManagerHandle()
+ {
+ if(!mHandle)
+ {
+ return false;
+ }
+
+ if(!mGetWebEngineCookieManagerPtr)
+ {
+ mGetWebEngineCookieManagerPtr = reinterpret_cast<GetWebEngineCookieManager>(dlsym(mHandle, "GetWebEngineCookieManager"));
+ if(!mGetWebEngineCookieManagerPtr)
+ {
+ DALI_LOG_ERROR("Can't load symbol GetWebEngineCookieManager(), error: %s\n", dlerror());
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+private:
+ // Private constructor / destructor
+ WebEnginePluginObject()
+ : mLoadSucceeded{false},
+ mHandle{nullptr},
+ mCreateWebEnginePtr{nullptr},
+ mDestroyWebEnginePtr{nullptr},
+ mGetWebEngineContextPtr{nullptr},
+ mGetWebEngineCookieManagerPtr{nullptr}
+ {
+ std::string pluginName;
+ const char* name = EnvironmentVariable::GetEnvironmentVariable(DALI_ENV_WEB_ENGINE_NAME);
+ if(name)
+ {
+ pluginName = MakePluginName(name);
+ }
+ else
+ {
+ pluginName = std::string(kPluginFullNameDefault);
+ }
+
+ mHandle = dlopen(pluginName.c_str(), RTLD_LAZY);
+ if(!mHandle)
+ {
+ DALI_LOG_ERROR("Can't load %s : %s\n", pluginName.c_str(), dlerror());
+ return;
+ }
+
+ mCreateWebEnginePtr = reinterpret_cast<CreateWebEngineFunction>(dlsym(mHandle, "CreateWebEnginePlugin"));
+ if(mCreateWebEnginePtr == nullptr)
+ {
+ DALI_LOG_ERROR("Can't load symbol CreateWebEnginePlugin(), error: %s\n", dlerror());
+ return;
+ }
+
+ mDestroyWebEnginePtr = reinterpret_cast<DestroyWebEngineFunction>(dlsym(mHandle, "DestroyWebEnginePlugin"));
+ if(mDestroyWebEnginePtr == nullptr)
+ {
+ DALI_LOG_ERROR("Can't load symbol DestroyWebEnginePlugin(), error: %s\n", dlerror());
+ return;
+ }
+
+ mLoadSucceeded = true;
+ }
+
+ ~WebEnginePluginObject()
+ {
+ if(mHandle)
+ {
+ dlclose(mHandle);
+ mHandle = nullptr;
+ mLoadSucceeded = false;
+ }
+ }
+
+ WebEnginePluginObject(const WebEnginePluginObject&) = delete;
+ WebEnginePluginObject(WebEnginePluginObject&&) = delete;
+ WebEnginePluginObject& operator=(const WebEnginePluginObject&) = delete;
+ WebEnginePluginObject& operator=(WebEnginePluginObject&&) = delete;
+
+private:
+ bool mLoadSucceeded; ///< True if library loaded successfully. False otherwise.
+
+public:
+ using CreateWebEngineFunction = Dali::WebEnginePlugin* (*)();
+ using DestroyWebEngineFunction = void (*)(Dali::WebEnginePlugin* plugin);
+
+ using GetWebEngineContext = Dali::WebEngineContext* (*)();
+ using GetWebEngineCookieManager = Dali::WebEngineCookieManager* (*)();
+
+ void* mHandle; ///< Handle for the loaded library
+ CreateWebEngineFunction mCreateWebEnginePtr; ///< Function to create plugin instance
+ DestroyWebEngineFunction mDestroyWebEnginePtr; ///< Function to destroy plugin instance
+
+ GetWebEngineContext mGetWebEngineContextPtr; ///< Function to get WebEngineContext
+ GetWebEngineCookieManager mGetWebEngineCookieManagerPtr; ///< Function to get WebEngineCookieManager
+};