From 22d0700f7ad4ace1b0bf5a10b52b9858d70e5b1c Mon Sep 17 00:00:00 2001 From: Jiyun Yang Date: Thu, 11 Oct 2018 20:17:32 +0900 Subject: [PATCH] Provide web engine plugin selection feature In-house user can choose web engine plugin by setting environment variable Change-Id: I767c6f3c08019749e1d363b03af7267da6a94b21 Signed-off-by: Jiyun Yang --- .../adaptor-framework/environment-variable.cpp | 5 ++ .../adaptor-framework/environment-variable.h | 9 ++++ .../internal/system/common/environment-variables.h | 2 + .../internal/web-engine/common/web-engine-impl.cpp | 56 +++++++++++++++++++--- dali/internal/web-engine/common/web-engine-impl.h | 9 +++- 5 files changed, 73 insertions(+), 8 deletions(-) diff --git a/dali/devel-api/adaptor-framework/environment-variable.cpp b/dali/devel-api/adaptor-framework/environment-variable.cpp index 9eb6582..1bcf1b6 100644 --- a/dali/devel-api/adaptor-framework/environment-variable.cpp +++ b/dali/devel-api/adaptor-framework/environment-variable.cpp @@ -31,6 +31,11 @@ const char * GetEnvironmentVariable( const char * variable ) return std::getenv( variable ); } +bool SetEnvironmentVariable( const char * variable, const char * value ) +{ + return setenv( variable, value, 1 ) == 0; +} + } // namespace EnvironmentVariable } // namespace Dali diff --git a/dali/devel-api/adaptor-framework/environment-variable.h b/dali/devel-api/adaptor-framework/environment-variable.h index b258d31..3ebe394 100644 --- a/dali/devel-api/adaptor-framework/environment-variable.h +++ b/dali/devel-api/adaptor-framework/environment-variable.h @@ -34,6 +34,15 @@ namespace EnvironmentVariable */ DALI_ADAPTOR_API const char * GetEnvironmentVariable( const char * variable ); +/** + * @brief Create or overwrite (when it does not exist) an environment variable. + * + * @param[in] variable Null-terminated character string identifying the name of the environmental variable. + * @param[in] value Null-terminated character string to set as a value. + * @return True on success, false on error. + */ +DALI_ADAPTOR_API bool SetEnvironmentVariable( const char * variable, const char * value ); + } // namespace EnvironmentVariable } // namespace Dali diff --git a/dali/internal/system/common/environment-variables.h b/dali/internal/system/common/environment-variables.h index 2833f6b..cddaaa3 100644 --- a/dali/internal/system/common/environment-variables.h +++ b/dali/internal/system/common/environment-variables.h @@ -112,6 +112,8 @@ namespace Adaptor #define DALI_ENV_DISABLE_STENCIL_BUFFER "DALI_DISABLE_STENCIL_BUFFER" +#define DALI_ENV_WEB_ENGINE_NAME "DALI_WEB_ENGINE_NAME" + } // namespace Adaptor } // namespace Internal diff --git a/dali/internal/web-engine/common/web-engine-impl.cpp b/dali/internal/web-engine/common/web-engine-impl.cpp index 988462d..b727a48 100644 --- a/dali/internal/web-engine/common/web-engine-impl.cpp +++ b/dali/internal/web-engine/common/web-engine-impl.cpp @@ -21,8 +21,13 @@ // EXTERNAL INCLUDES #include #include -#include #include +#include + +// INTERNAL INCLUDES +#include +#include +#include namespace Dali { @@ -36,7 +41,20 @@ namespace Adaptor namespace // unnamed namespace { -const char* WEB_ENGINE_PLUGIN_SO( "libdali-web-engine-plugin.so" ); +constexpr char const * const kPluginFullNamePrefix = "libdali-web-engine-"; +constexpr char const * const kPluginFullNamePostfix = "-plugin.so"; +constexpr char const * const kPluginFullNameDefault = "libdali-web-engine-plugin.so"; + +// Note: Dali WebView policy does not allow to use multiple web engines in an application. +// So once pluginName is set to non-empty string, it will not change. +std::string pluginName; + +std::string MakePluginName( const char* environmentName ) +{ + std::stringstream fullName; + fullName << kPluginFullNamePrefix << environmentName << kPluginFullNamePostfix; + return std::move( fullName.str() ); +} Dali::BaseHandle Create() { @@ -84,16 +102,40 @@ WebEngine::~WebEngine() } } +bool WebEngine::InitializePluginHandle() +{ + if ( pluginName.length() == 0 ) + { + // pluginName is not initialized yet. + const char* name = EnvironmentVariable::GetEnvironmentVariable( DALI_ENV_WEB_ENGINE_NAME ); + if ( name ) + { + pluginName = MakePluginName( name ); + mHandle = dlopen( pluginName.c_str(), RTLD_LAZY ); + if ( mHandle ) + { + return true; + } + } + 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 false; + } + + return true; +} + bool WebEngine::Initialize() { char* error = NULL; - mHandle = dlopen( WEB_ENGINE_PLUGIN_SO, RTLD_LAZY ); - - error = dlerror(); - if( mHandle == NULL || error != NULL ) + if ( !InitializePluginHandle() ) { - DALI_LOG_ERROR( "WebEngine::Initialize(), dlopen error: %s\n", error ); return false; } diff --git a/dali/internal/web-engine/common/web-engine-impl.h b/dali/internal/web-engine/common/web-engine-impl.h index 3cb1eb6..90616ad 100644 --- a/dali/internal/web-engine/common/web-engine-impl.h +++ b/dali/internal/web-engine/common/web-engine-impl.h @@ -187,9 +187,16 @@ private: */ bool Initialize(); + /** + * @brief Initializes library handle by loading web engine plugin. + * + * @return Whether the initialization succeed or not. + */ + bool InitializePluginHandle(); + private: - Dali::WebEnginePlugin* mPlugin; ///< WebEngine plugin handle + Dali::WebEnginePlugin* mPlugin; ///< WebEnginePlugin instance void* mHandle; ///< Handle for the loaded library typedef Dali::WebEnginePlugin* (*CreateWebEngineFunction)(); -- 2.7.4