patch for rc20
[framework/osp/web.git] / src / controls / FWebCtrl_WebManager.cpp
1 //\r
2 // Open Service Platform\r
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.\r
4 //\r
5 // Licensed under the Apache License, Version 2.0 (the License);\r
6 // you may not use this file except in compliance with the License.\r
7 // You may obtain a copy of the License at\r
8 //\r
9 //     http://www.apache.org/licenses/LICENSE-2.0\r
10 //\r
11 // Unless required by applicable law or agreed to in writing, software\r
12 // distributed under the License is distributed on an "AS IS" BASIS,\r
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 // See the License for the specific language governing permissions and\r
15 // limitations under the License.\r
16 //\r
17 \r
18 /**\r
19  * @file                FWebCtrl_WebManager.cpp\r
20  * @brief               The file contains the definition of _WebManager class.\r
21  *\r
22  * The file contains the definition of _WebManager class.\r
23  */\r
24 #include <pthread.h>\r
25 #include <net_connection.h>\r
26 #include <FAppApp.h>\r
27 #include <FBaseSysLog.h>\r
28 #include <FIoDbEnumerator.h>\r
29 #include <FUiControl.h>\r
30 #include <FIo_DirectoryImpl.h>\r
31 #include <FIo_DatabaseImpl.h>\r
32 #include <FIo_FileImpl.h>\r
33 #include <FUiCtrl_FormImpl.h>\r
34 #include <FIo_DirectoryImpl.h>\r
35 #include <FIo_DatabaseImpl.h>\r
36 #include <FIo_FileImpl.h>\r
37 #include "FWebCtrl_EflWebkit.h"\r
38 #include "FWebCtrl_Web.h"\r
39 #include "FWebCtrl_WebImpl.h"\r
40 #include "FWebCtrl_WebManager.h"\r
41 #include "FWebCtrl_WebPopup.h"\r
42 \r
43 using namespace Tizen::Base;\r
44 using namespace Tizen::Base::Collection;\r
45 using namespace Tizen::Io;\r
46 using namespace Tizen::Ui;\r
47 using namespace Tizen::Ui::Controls;\r
48 \r
49 namespace Tizen { namespace Web { namespace Controls\r
50 {\r
51 \r
52 \r
53 _WebManager* _WebManager::__pInstance = null;\r
54 \r
55 \r
56 extern const wchar_t CUSTOM_DB_DIRECTORY_PATH[] = L"data/.webkit/customDatabase/";\r
57 extern const wchar_t USER_CONFIRM_DB_NAME[] = L"userConfirm.db";\r
58 extern const wchar_t GEOLOCATION_TABLE_NAME[] = L"geolocationPermission";\r
59 extern const wchar_t CUSTOM_PROTOCOL_TABLE_NAME[] = L"customProtocol";\r
60 extern const wchar_t CUSTOM_CONTENT_TABLE_NAME[] = L"customContent";\r
61 extern const wchar_t CERTIFICATE_TABLE_NAME[] = L"certificate";\r
62 \r
63 \r
64 static const int CUSTOM_DB_TABLE_COUNT= 4;\r
65 \r
66 \r
67 _WebManager::_WebManager(void)\r
68         : __pWebList(null)\r
69         , __pCallbackList(null)\r
70         , __pActivePopupList(null)\r
71         , __pActiveWeb(null)\r
72         , __pProxy(null)\r
73 {\r
74 }\r
75 \r
76 _WebManager::~_WebManager(void)\r
77 {\r
78         free(__pProxy);\r
79         ClearCertificateDb();\r
80 }\r
81 \r
82 \r
83 void\r
84 _WebManager::InitWebManager(void)\r
85 {\r
86         result r = E_SUCCESS;\r
87 \r
88         std::unique_ptr<_WebManager> pInstance(new (std::nothrow) _WebManager());\r
89         SysTryReturnVoidResult(NID_WEB_CTRL, pInstance.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));\r
90 \r
91         r = pInstance->Construct();\r
92         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
93 \r
94         __pInstance = pInstance.release();\r
95         std::atexit(DestroyWebManager);\r
96 }\r
97 \r
98 \r
99 void\r
100 _WebManager::DestroyWebManager(void)\r
101 {\r
102         delete __pInstance;\r
103         __pInstance = null;\r
104 }\r
105 \r
106 \r
107 _WebManager*\r
108 _WebManager::GetInstance(void)\r
109 {\r
110         static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;\r
111         if (__pInstance== null)\r
112         {\r
113                 ClearLastResult();\r
114                 pthread_once(&onceBlock, InitWebManager);\r
115                 result r = GetLastResult();\r
116                 if (IsFailed(r))\r
117                 {\r
118                         onceBlock = PTHREAD_ONCE_INIT;\r
119                 }\r
120         }\r
121 \r
122         return __pInstance;\r
123 }\r
124 \r
125 \r
126 result\r
127 _WebManager::Construct(void)\r
128 {\r
129         result r = E_SUCCESS;\r
130 \r
131         std::unique_ptr<ArrayListT< int> > pWebList(new (std::nothrow) ArrayListT< int >());\r
132         SysTryReturnResult(NID_WEB_CTRL, pWebList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
133         r = pWebList->Construct();\r
134         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
135 \r
136         std::unique_ptr<MultiHashMapT< int, int > > pCallbackList(new (std::nothrow) MultiHashMapT< int, int >());\r
137         SysTryReturnResult(NID_WEB_CTRL, pCallbackList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
138         r = pCallbackList->Construct();\r
139         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
140 \r
141         std::unique_ptr<ArrayListT< int> > pActivePopupList(new (std::nothrow) ArrayListT< int >());\r
142         SysTryReturnResult(NID_WEB_CTRL, pActivePopupList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
143         r = pActivePopupList->Construct();\r
144         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
145 \r
146         r = InitializeProxyAddress();\r
147         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
148 \r
149         r = CreateResourceDirectory();\r
150         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
151 \r
152         r = InitializeCustomDb();\r
153         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
154 \r
155         __pWebList = std::move(pWebList);\r
156         __pCallbackList = std::move(pCallbackList);\r
157         __pActivePopupList = std::move(pActivePopupList);\r
158 \r
159         return E_SUCCESS;\r
160 }\r
161 \r
162 \r
163 void\r
164 _WebManager::ClearCertificateDb(void)\r
165 {\r
166         result r = E_SUCCESS;\r
167 \r
168         String certificatePath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);\r
169         String table(CERTIFICATE_TABLE_NAME);\r
170         _DatabaseImpl db;\r
171 \r
172         r = db.Construct(certificatePath, "r+", null);\r
173         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
174 \r
175         db.BeginTransaction();\r
176 \r
177         r = db.ExecuteSql(L"Delete From " + table, true);\r
178         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));\r
179 \r
180         db.CommitTransaction();\r
181 \r
182         return;\r
183 \r
184 CATCH:\r
185         db.RollbackTransaction();\r
186 }\r
187 \r
188 \r
189 result\r
190 _WebManager::InitializeProxyAddress(void)\r
191 {\r
192         int ret = -1;\r
193         connection_h handle = null;\r
194         char* pProxy = null;\r
195 \r
196         ret = connection_create(&handle);\r
197         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to create connection.");\r
198 \r
199         connection_address_family_e family = CONNECTION_ADDRESS_FAMILY_IPV4;\r
200 \r
201         ret = connection_get_proxy(handle, family, &pProxy);\r
202         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to get proxy address.");\r
203 \r
204         ret = connection_destroy(handle);\r
205         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to destroy connection.");\r
206 \r
207         __pProxy = pProxy;\r
208 \r
209         return E_SUCCESS;\r
210 }\r
211 \r
212 \r
213 result\r
214 _WebManager::CreateResourceDirectory(void) const\r
215 {\r
216         String html5FeaturesPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH);\r
217 \r
218         if (!_FileImpl::IsFileExist(html5FeaturesPath))\r
219         {\r
220                 result r = E_SUCCESS;\r
221 \r
222                 r = _DirectoryImpl::Create(html5FeaturesPath, true);\r
223                 SysTryReturnResult(NID_WEB_CTRL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred. create html5 features directory.");\r
224         }\r
225 \r
226         return E_SUCCESS;\r
227 }\r
228 \r
229 \r
230 result\r
231 _WebManager::InitializeCustomDb(void) const\r
232 {\r
233         result r = E_SUCCESS;\r
234 \r
235         _DatabaseImpl db;\r
236         String path(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);\r
237         String geolocationTable(GEOLOCATION_TABLE_NAME);\r
238         String protocolTable(CUSTOM_PROTOCOL_TABLE_NAME);\r
239         String contentTable(CUSTOM_CONTENT_TABLE_NAME);\r
240         String certificateTable(CERTIFICATE_TABLE_NAME);\r
241 \r
242         r = db.Construct(path, "a+", null);\r
243         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
244 \r
245         std::unique_ptr<DbEnumerator>   pEnum(db.QueryN(L"Select count(name) from sqlite_master Where type='table' And name in ('" + geolocationTable + L"', '" + protocolTable + L"', '" + contentTable + L"', '" + certificateTable + L"')"));\r
246         if (pEnum.get())\r
247         {\r
248                 int count = 0;\r
249 \r
250                 r = pEnum->MoveNext();\r
251                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));\r
252 \r
253                 r = pEnum->GetIntAt(0, count);\r
254                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));\r
255 \r
256                 if (count == CUSTOM_DB_TABLE_COUNT)\r
257                 {\r
258                         return E_SUCCESS;\r
259                 }\r
260         }\r
261 \r
262         pEnum.reset();\r
263         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + geolocationTable + L"'"));\r
264         if (!pEnum.get())\r
265         {\r
266                 r = db.ExecuteSql(\r
267                         L"CREATE TABLE IF NOT EXISTS " + geolocationTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, origin TEXT, permission INTEGER)",\r
268                         true);\r
269                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
270         }\r
271 \r
272         pEnum.reset();\r
273         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + protocolTable + L"'"));\r
274         if (!pEnum.get())\r
275         {\r
276                 r = db.ExecuteSql(\r
277                         L"CREATE TABLE IF NOT EXISTS " + protocolTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",\r
278                         true);\r
279                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
280         }\r
281 \r
282         pEnum.reset();\r
283         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + contentTable + L"'"));\r
284         if (!pEnum.get())\r
285         {\r
286                 r = db.ExecuteSql(\r
287                         L"CREATE TABLE IF NOT EXISTS " + contentTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",\r
288                         true);\r
289                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
290         }\r
291 \r
292         pEnum.reset();\r
293         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + certificateTable + L"'"));\r
294         if (!pEnum.get())\r
295         {\r
296                 r = db.ExecuteSql(\r
297                         L"CREATE TABLE IF NOT EXISTS " + certificateTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, pem TEXT, allow INTEGER)",\r
298                         true);\r
299                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
300         }\r
301 \r
302         return E_SUCCESS;\r
303 }\r
304 \r
305 \r
306 result\r
307 _WebManager::AddWeb(int webAdress)\r
308 {\r
309         result r = E_SUCCESS;\r
310 \r
311         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(webAdress);\r
312         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));\r
313 \r
314         r = pWebCore->GetEflWebkit()->SetProxyAddress(__pProxy);\r
315         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
316 \r
317         r = __pWebList->Add(webAdress);\r
318         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
319 \r
320         return E_SUCCESS;\r
321 }\r
322 \r
323 \r
324 result\r
325 _WebManager::RemoveWeb(int webAdress)\r
326 {\r
327         result r = E_SUCCESS;\r
328 \r
329         r = __pWebList->Remove(webAdress);\r
330         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
331 \r
332         __pCallbackList->Remove(webAdress);\r
333 \r
334         return E_SUCCESS;\r
335 }\r
336 \r
337 \r
338 bool\r
339 _WebManager::IsValidWeb(int webAdress) const\r
340 {\r
341         return __pWebList->Contains(webAdress);\r
342 }\r
343 \r
344 \r
345 result\r
346 _WebManager::AddCallback(int callerAdress, int callbackAdress)\r
347 {\r
348         result r = E_SUCCESS;\r
349 \r
350         r = __pCallbackList->Add(callerAdress, callbackAdress);\r
351         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
352 \r
353         return E_SUCCESS;\r
354 }\r
355 \r
356 \r
357 result\r
358 _WebManager::RemoveCallback(int callerAdress, int callbackAdress)\r
359 {\r
360         result r = E_SUCCESS;\r
361 \r
362         r = __pCallbackList->Remove(callerAdress, callbackAdress);\r
363         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
364 \r
365         return E_SUCCESS;\r
366 }\r
367 \r
368 \r
369 bool\r
370 _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const\r
371 {\r
372         bool ret = true;\r
373 \r
374         result r = __pCallbackList->Contains(callerAdress, callbackAdress, ret);\r
375         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, true, r, "[%s] Propagating.", GetErrorMessage(r));\r
376 \r
377         return ret;\r
378 }\r
379 \r
380 \r
381 void\r
382 _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
383 {\r
384         if (__pActiveWeb == null)\r
385         {\r
386                 __pActiveWeb = pWebAddress;\r
387         }\r
388         else\r
389         {\r
390                 if (__pActiveWeb->IsVisible() == true)\r
391                 {\r
392                         return;\r
393                 }\r
394                 __pActiveWeb = pWebAddress;\r
395         }\r
396 \r
397         for (int i = 0; i < __pActivePopupList->GetCount(); i++)\r
398         {\r
399                 int activePopupAddr = 0;\r
400                 __pActivePopupList->GetAt(i, activePopupAddr);\r
401                 _WebPopup* pActivePopup = reinterpret_cast< _WebPopup* >(activePopupAddr);\r
402 \r
403                 if (pActivePopup != null)\r
404                 {\r
405                         pActivePopup->SetShowState(false);\r
406 \r
407                         _FormImpl* pFormImpl = __pActiveWeb->GetParentFormImpl(__pActiveWeb);\r
408 \r
409                         if (pFormImpl != null)\r
410                         {\r
411                                 pActivePopup->SetOwner(&pFormImpl->GetPublic());\r
412                         }\r
413                         else\r
414                         {\r
415                                 pActivePopup->SetOwner(&__pActiveWeb->GetPublic());\r
416                         }\r
417 \r
418                         pActivePopup->SetShowState(true);\r
419                         pActivePopup->Show();\r
420                 }\r
421         }\r
422 }\r
423 \r
424 \r
425 void\r
426 _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
427 {\r
428         if (__pActiveWeb == pWebAddress)\r
429         {\r
430                 __pActiveWeb = null;\r
431         }\r
432 }\r
433 \r
434 \r
435 result\r
436 _WebManager::SetActivePopup(int popupAddress)\r
437 {\r
438         result r = E_SUCCESS;\r
439 \r
440         r = __pActivePopupList->Add(popupAddress);\r
441         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
442 \r
443         return r;\r
444 }\r
445 \r
446 \r
447 result\r
448 _WebManager::RemoveActivePopup(int popupAddress)\r
449 {\r
450         result r = E_SUCCESS;\r
451 \r
452         r = __pActivePopupList->Remove(popupAddress);\r
453         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
454 \r
455         return r;\r
456 }\r
457 \r
458 \r
459 } } }\r