[Tizen] Revert "[Tizen][Web] Update WebView terminate crash" 84/284284/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 15 Nov 2022 04:06:06 +0000 (13:06 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 15 Nov 2022 04:07:00 +0000 (13:07 +0900)
Revert due to TCT failed

This reverts commit 9eefda2585dc5336aaa2213bb51ac794c97308b3.

Change-Id: Ia39b6091edf965f5d6eba5b55748a40689bb652b

dali/internal/web-engine/common/web-engine-impl.cpp

index 3d5e300..c530481 100644 (file)
@@ -26,6 +26,7 @@
 
 // INTERNAL INCLUDES
 #include <dali/devel-api/adaptor-framework/environment-variable.h>
+#include <dali/devel-api/adaptor-framework/lifecycle-controller.h>
 #include <dali/devel-api/adaptor-framework/web-engine/web-engine-back-forward-list.h>
 #include <dali/devel-api/adaptor-framework/web-engine/web-engine-certificate.h>
 #include <dali/devel-api/adaptor-framework/web-engine/web-engine-console-message.h>
@@ -68,83 +69,37 @@ Dali::TypeRegistration type(typeid(Dali::WebEngine), typeid(Dali::BaseHandle), C
 
 /**
  * @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
+  WebEnginePluginObject()
+  : mPluginName{},
+    mHandle{nullptr},
+    mCreateWebEnginePtr{nullptr},
+    mDestroyWebEnginePtr{nullptr},
+    mGetWebEngineContextPtr{nullptr},
+    mGetWebEngineCookieManagerPtr{nullptr}
   {
-    return mLoadSuccess;
   }
 
-  bool InitializeContextHandle()
+  ~WebEnginePluginObject()
   {
-    if(!mHandle)
-    {
-      return false;
-    }
-
-    if(!mGetWebEngineContextPtr)
+    if(mHandle)
     {
-      mGetWebEngineContextPtr = reinterpret_cast<GetWebEngineContext>(dlsym(mHandle, "GetWebEngineContext"));
-
-      if(!mGetWebEngineContextPtr)
-      {
-        DALI_LOG_ERROR("Can't load symbol GetWebEngineContext(), error: %s\n", dlerror());
-        return false;
-      }
+      dlclose(mHandle);
+      mHandle = nullptr;
     }
-
-    return true;
   }
 
-  bool InitializeCookieManagerHandle()
+  bool InitializePluginHandle()
   {
-    if(!mHandle)
-    {
-      return false;
-    }
-
-    if(!mGetWebEngineCookieManagerPtr)
+    if(mHandle)
     {
-      mGetWebEngineCookieManagerPtr = reinterpret_cast<GetWebEngineCookieManager>(dlsym(mHandle, "GetWebEngineCookieManager"));
-
-      if(!mGetWebEngineCookieManagerPtr)
-      {
-        DALI_LOG_ERROR("Can't load symbol GetWebEngineCookieManager(), error: %s\n", dlerror());
-        return false;
-      }
+      DALI_LOG_ERROR("Plugin.so has been opened already.\n");
+      return true;
     }
 
-    return true;
-  }
-
-private:
-  // Private constructor / destructor
-  WebEnginePluginObject()
-  : mPluginName{},
-    mLoadSuccess{false},
-    mHandle{nullptr},
-    mCreateWebEnginePtr{nullptr},
-    mDestroyWebEnginePtr{nullptr},
-    mGetWebEngineContextPtr{nullptr},
-    mGetWebEngineCookieManagerPtr{nullptr}
-  {
     if(mPluginName.length() == 0)
     {
       // mPluginName is not initialized yet.
@@ -163,36 +118,64 @@ private:
     if(!mHandle)
     {
       DALI_LOG_ERROR("Can't load %s : %s\n", mPluginName.c_str(), dlerror());
-      return;
+      return false;
     }
 
     mCreateWebEnginePtr = reinterpret_cast<CreateWebEngineFunction>(dlsym(mHandle, "CreateWebEnginePlugin"));
     if(mCreateWebEnginePtr == nullptr)
     {
       DALI_LOG_ERROR("Can't load symbol CreateWebEnginePlugin(), error: %s\n", dlerror());
-      return;
+
+      return false;
     }
 
     mDestroyWebEnginePtr = reinterpret_cast<DestroyWebEngineFunction>(dlsym(mHandle, "DestroyWebEnginePlugin"));
     if(mDestroyWebEnginePtr == nullptr)
     {
       DALI_LOG_ERROR("Can't load symbol DestroyWebEnginePlugin(), error: %s\n", dlerror());
-      return;
+      return false;
     }
 
-    mLoadSuccess = true;
+    return true;
   }
 
-  ~WebEnginePluginObject()
+  bool InitializeContextHandle()
   {
-    if(mHandle)
+    if(!InitializePluginHandle())
     {
-      dlclose(mHandle);
-      mHandle      = nullptr;
-      mLoadSuccess = false;
+      return false;
+    }
+
+    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(!InitializePluginHandle())
+    {
+      return false;
+    }
+
+    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:
   WebEnginePluginObject(const WebEnginePluginObject&) = delete;
   WebEnginePluginObject(WebEnginePluginObject&&)      = delete;
   WebEnginePluginObject& operator=(const WebEnginePluginObject&) = delete;
@@ -203,8 +186,6 @@ private:
                            /// 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.
 
-  bool mLoadSuccess; ///< True if library loaded successfully. False otherwise.
-
 public:
   using CreateWebEngineFunction  = Dali::WebEnginePlugin* (*)();
   using DestroyWebEngineFunction = void (*)(Dali::WebEnginePlugin* plugin);
@@ -220,6 +201,8 @@ public:
   GetWebEngineCookieManager mGetWebEngineCookieManagerPtr; ///< Function to get WebEngineCookieManager
 };
 
+static WebEnginePluginObject gPluginHandle; // Keep this object as static, so Let we assume that library closed after all WebEngines are disposed.
+
 } // unnamed namespace
 
 WebEnginePtr WebEngine::New()
@@ -236,14 +219,14 @@ WebEnginePtr WebEngine::New()
 
 Dali::WebEngineContext* WebEngine::GetContext()
 {
-  if(!WebEnginePluginObject::GetInstance().InitializeContextHandle())
+  if(!gPluginHandle.InitializeContextHandle())
   {
     return nullptr;
   }
 
-  if(WebEnginePluginObject::GetInstance().mGetWebEngineContextPtr)
+  if(gPluginHandle.mGetWebEngineContextPtr)
   {
-    return WebEnginePluginObject::GetInstance().mGetWebEngineContextPtr();
+    return gPluginHandle.mGetWebEngineContextPtr();
   }
 
   return nullptr;
@@ -251,14 +234,14 @@ Dali::WebEngineContext* WebEngine::GetContext()
 
 Dali::WebEngineCookieManager* WebEngine::GetCookieManager()
 {
-  if(!WebEnginePluginObject::GetInstance().InitializeCookieManagerHandle())
+  if(!gPluginHandle.InitializeCookieManagerHandle())
   {
     return nullptr;
   }
 
-  if(WebEnginePluginObject::GetInstance().mGetWebEngineCookieManagerPtr)
+  if(gPluginHandle.mGetWebEngineCookieManagerPtr)
   {
-    return WebEnginePluginObject::GetInstance().mGetWebEngineCookieManagerPtr();
+    return gPluginHandle.mGetWebEngineCookieManagerPtr();
   }
 
   return nullptr;
@@ -274,10 +257,9 @@ WebEngine::~WebEngine()
   if(mPlugin != nullptr)
   {
     mPlugin->Destroy();
-    // Check whether plugin load sccess or not.
-    if(DALI_LIKELY(WebEnginePluginObject::GetInstance()))
+    if(gPluginHandle.mDestroyWebEnginePtr != nullptr)
     {
-      WebEnginePluginObject::GetInstance().mDestroyWebEnginePtr(mPlugin);
+      gPluginHandle.mDestroyWebEnginePtr(mPlugin);
     }
     mPlugin = nullptr;
   }
@@ -285,13 +267,12 @@ WebEngine::~WebEngine()
 
 bool WebEngine::Initialize()
 {
-  // Check whether plugin load sccess or not.
-  if(!WebEnginePluginObject::GetInstance())
+  if(!gPluginHandle.InitializePluginHandle())
   {
     return false;
   }
 
-  mPlugin = WebEnginePluginObject::GetInstance().mCreateWebEnginePtr();
+  mPlugin = gPluginHandle.mCreateWebEnginePtr();
   if(mPlugin == nullptr)
   {
     DALI_LOG_ERROR("Can't create the WebEnginePlugin object\n");