[Web] Fix "undefined symbol: elm_init" error
[platform/core/uifw/dali-extension.git] / dali-extension / web-engine-chromium / tizen-web-engine-manager.cpp
1 /*
2  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include "tizen-web-engine-manager.h"
19
20 #include "tizen-web-engine-context.h"
21 #include "tizen-web-engine-cookie-manager.h"
22
23 #include <Elementary.h>
24
25 #include <dali/devel-api/adaptor-framework/lifecycle-controller.h>
26 #include <dali/integration-api/debug.h>
27
28 #include <ewk_context.h>
29 #include <ewk_context_internal.h>
30 #include <ewk_main.h>
31
32 namespace Dali
33 {
34 namespace Plugin
35 {
36 namespace
37 {
38 // @todo : If we make this value as member of WebEngineManager, we got crashed due to 'elm_init' symbol found failed.
39 static bool gWebEngineManagerAvailable = true; // Default as true
40 } // namespace
41
42 WebEngineManager& WebEngineManager::Get()
43 {
44   static WebEngineManager instance;
45   return instance;
46 }
47
48 bool WebEngineManager::IsAvailable()
49 {
50   return gWebEngineManagerAvailable;
51 }
52
53 WebEngineManager::WebEngineManager()
54 : mSlotDelegate(this)
55 {
56   DALI_LOG_RELEASE_INFO("#WebEngineManager is created.\n");
57
58   elm_init(0, 0);
59   ewk_init();
60   mWindow = ecore_evas_new("wayland_egl", 0, 0, 1, 1, 0);
61
62   Ewk_Context* context = ewk_context_default_get();
63   mWebEngineContext.reset(new TizenWebEngineContext(context));
64
65   Ewk_Cookie_Manager* manager = ewk_context_cookie_manager_get(context);
66   mWebEngineCookieManager.reset(new TizenWebEngineCookieManager(manager));
67   Dali::LifecycleController::Get().TerminateSignal().Connect(mSlotDelegate, &WebEngineManager::OnTerminated);
68
69   DALI_LOG_RELEASE_INFO("#WebEngineManager is created fully.\n");
70 }
71
72 WebEngineManager::~WebEngineManager()
73 {
74   if(gWebEngineManagerAvailable)
75   {
76     // Call OnTerminated directly.
77     OnTerminated();
78   }
79 }
80
81 Ecore_Evas* WebEngineManager::GetWindow()
82 {
83   return mWindow;
84 }
85
86 Dali::WebEngineContext* WebEngineManager::GetContext()
87 {
88   return mWebEngineContext.get();
89 }
90
91 Dali::WebEngineCookieManager* WebEngineManager::GetCookieManager()
92 {
93   return mWebEngineCookieManager.get();
94 }
95
96 void WebEngineManager::Add(Evas_Object* webView, Dali::WebEnginePlugin* engine)
97 {
98   mWebEngines[webView] = engine;
99 }
100
101 void WebEngineManager::Remove(Evas_Object* webView)
102 {
103   auto iter = mWebEngines.find(webView);
104   if(iter != mWebEngines.end())
105   {
106     mWebEngines.erase(iter);
107   }
108 }
109
110 Dali::WebEnginePlugin* WebEngineManager::Find(Evas_Object* webView)
111 {
112   auto iter = mWebEngines.find(webView);
113   if(iter != mWebEngines.end())
114   {
115     return iter->second;
116   }
117   else
118   {
119     return nullptr;
120   }
121 }
122
123 void WebEngineManager::OnTerminated()
124 {
125   // Ignore duplicated termination
126   if(DALI_UNLIKELY(!gWebEngineManagerAvailable))
127   {
128     return;
129   }
130   DALI_LOG_RELEASE_INFO("#WebEngineManager is destroyed.\n");
131
132   // App is terminated. Now web engine is not available anymore.
133   gWebEngineManagerAvailable = false;
134
135   for(auto it = mWebEngines.begin(); it != mWebEngines.end(); it++)
136   {
137     // Destroy WebEngine
138     auto webEnginePlugin = it->second;
139     if(webEnginePlugin)
140     {
141       webEnginePlugin->Destroy();
142     }
143   }
144   mWebEngines.clear();
145   ecore_evas_free(mWindow);
146
147   // Release context and cookie manager before ewk_shutdown.
148   mWebEngineContext.reset();
149   mWebEngineCookieManager.reset();
150
151   ewk_shutdown();
152   elm_shutdown();
153   DALI_LOG_RELEASE_INFO("#WebEngineManager is destroyed fully.\n");
154 }
155
156 } // namespace Plugin
157 } // namespace Dali
158
159 extern "C" DALI_EXPORT_API Dali::WebEngineContext* GetWebEngineContext()
160 {
161   return Dali::Plugin::WebEngineManager::Get().GetContext();
162 }
163
164 extern "C" DALI_EXPORT_API Dali::WebEngineCookieManager* GetWebEngineCookieManager()
165 {
166   return Dali::Plugin::WebEngineManager::Get().GetCookieManager();
167 }