Fix for focus issue about N_SE-51671
[framework/osp/web.git] / src / controls / FWebCtrl_WebImpl.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                FWebCtrl_WebImpl.cpp
20  * @brief               The file contains the definition of _WebImpl class.
21  *
22  * The file contains the definition of _WebImpl class.
23  */
24 #include <Ecore_IMF_Evas.h>
25 #include <Ecore_Evas.h>
26 #include <elm_config.h>
27 #include <elm_win.h>
28 #include <EWebKit2.h>
29 #include <ewk_popup_menu_item.h>
30 #include <libsoup/soup-status.h>
31 #include <FAppApp.h>
32 #include <FAppAppControl.h>
33 #include <FAppIAppControlListener.h>
34 #include <FBaseColAllElementsDeleter.h>
35 #include <FBaseColHashMapT.h>
36 #include <FBaseRtMutex.h>
37 #include <FBaseRtMutexGuard.h>
38 #include <FBaseSysLog.h>
39 #include <FBaseUtilUri.h>
40 #include <FGrpColor.h>
41 #include <FGrpPoint.h>
42 #include <FGrpRectangle.h>
43 #include <FIoDbEnumerator.h>
44 #include <FIoDbStatement.h>
45 #include <FIoFile.h>
46 #include <FMediaImage.h>
47 #include <FMediaImageTypes.h>
48 #include <FNetHttpHttpHeader.h>
49 #include <FSysVibrator.h>
50 #include <FUiControl.h>
51 #include <FUiCtrlKeypad.h>
52 #include <FWebCtrlHitElementResult.h>
53 #include <FWebCtrlITextSearchListener.h>
54 #include <FWebCtrlIWebDownloadListener.h>
55 #include <FWebCtrlIWebUiEventListener.h>
56 #include <FWebCtrlIWebUiEventListenerF.h>
57 #include <FWebCtrlIWebKeypadEventListener.h>
58 #include <FWebCtrlIJavaScriptBridge.h>
59 #include <FWebCtrlPageNavigationList.h>
60 #include <FWebCtrlAuthenticationChallenge.h>
61 #include <FWebCtrlWeb.h>
62 #include <FWebCtrlWebSetting.h>
63 #include <FWebHistoryItem.h>
64 #include <FWebJsonJsonObject.h>
65 #include <FWebJsonJsonParser.h>
66 #include <FWebJsonJsonString.h>
67 #include <FApp_AppControlImpl.h>
68 #include <FApp_AppControlManager.h>
69 #include <FApp_AppInfo.h>
70 #include <FApp_AppManagerImpl.h>
71 #include <FBase_StringConverter.h>
72 #include <FGrp_CoordinateSystem.h>
73 #include <FGrp_Screen.h>
74 #include <FIo_DatabaseImpl.h>
75 #include <FIo_NormalFile.h>
76 #include <FSys_SystemResource.h>
77 #include <FSys_VibratorImpl.h>
78 #include <FUi_Control.h>
79 #include <FUi_CoordinateSystemUtils.h>
80 #include <FUi_EcoreEvasMgr.h>
81 #include <FUi_EcoreEvas.h>
82 #include <FUi_ResourceSizeInfo.h>
83 #include <FUi_Window.h>
84 #include <FUiAnim_EflNode.h>
85 #include <FUiAnim_VisualElement.h>
86 #include <FUiCtrl_FooterImpl.h>
87 #include <FUiCtrl_FormImpl.h>
88 #include "FWeb_HistoryItemImpl.h"
89 #include "FWebCtrl_AppControlListener.h"
90 #include "FWebCtrl_AuthConfirmPopup.h"
91 #include "FWebCtrl_AuthenticationChallengeImpl.h"
92 #include "FWebCtrl_EflWebkit.h"
93 #include "FWebCtrl_FormDataWindow.h"
94 #include "FWebCtrl_GeolocationPermissionManagerImpl.h"
95 #include "FWebCtrl_HitElementResultImpl.h"
96 #include "FWebCtrl_InputPickerPopup.h"
97 #include "FWebCtrl_WebNotification.h"
98 #include "FWebCtrl_PageNavigationListImpl.h"
99 #include "FWebCtrl_PromptPopup.h"
100 #include "FWebCtrl_SelectBox.h"
101 #include "FWebCtrl_Utility.h"
102 #include "FWebCtrl_Web.h"
103 #include "FWebCtrl_WebDataHandler.h"
104 #include "FWebCtrl_WebEvent.h"
105 #include "FWebCtrl_WebEventArg.h"
106 #include "FWebCtrl_WebImpl.h"
107 #include "FWebCtrl_WebManager.h"
108 #include "FWebCtrl_WebPresenter.h"
109 #include "FWebCtrl_WebSettingImpl.h"
110
111
112 using namespace Tizen::App;
113 using namespace Tizen::Base;
114 using namespace Tizen::Base::Collection;
115 using namespace Tizen::Base::Runtime;
116 using namespace Tizen::Base::Utility;
117 using namespace Tizen::Content;
118 using namespace Tizen::Graphics;
119 using namespace Tizen::Io;
120 using namespace Tizen::Media;
121 using namespace Tizen::Net::Http;
122 using namespace Tizen::System;
123 using namespace Tizen::Ui;
124 using namespace Tizen::Ui::Animations;
125 using namespace Tizen::Ui::Controls;
126 using namespace Tizen::Web::Json;
127
128
129 namespace Tizen { namespace Web { namespace Controls
130 {
131
132
133 static const char WEB_CTRL[] = "webcontrol";
134 static const char PARENT_WEB_CTRL[] = "parentwebcontrol";
135
136
137 static const float MIN_ZOOM_LEVEL = 0.3;
138 static const float MAX_ZOOM_LEVEL = 2;
139
140
141 static const int REDIRECTION_HEADER_GROUP = 300;
142
143
144 static const int MAX_TEXT_MATCH = pow(2, 31) - 1;
145
146
147 static const int PORTRAIT_KEYPAD_HEIGHT = 444;
148 static const int LANDSCAPE_KEYPAD_HEIGHT = 316;
149 static const int DEFAULT_LIST_ITEM_COUNT = 4;
150
151
152 Eina_Bool
153 AddHttpAttributeData(const Eina_Hash* pHash, const void* pKey, void* pValue, void* pUserData)
154 {
155         result r = E_SUCCESS;
156
157         std::unique_ptr<String> pAttrKey(new (std::nothrow) String(reinterpret_cast< char* >(const_cast< void* >(pKey))));
158         std::unique_ptr<String> pAttrValue(new (std::nothrow) String(reinterpret_cast< char* >(pValue)));
159         SysTryReturn(NID_WEB_CTRL, pAttrKey.get() && pAttrValue.get(), EINA_FALSE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
160
161         SysLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", pAttrKey->GetPointer(), pAttrValue->GetPointer());
162
163         r = reinterpret_cast< HashMap* >(pUserData)->Add(*pAttrKey, *pAttrValue);
164         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
165         pAttrKey.release();
166         pAttrValue.release();
167
168         return EINA_TRUE;
169 }
170
171
172 void
173 FreeCharArray(void* pData)
174 {
175         delete[] reinterpret_cast<char*>(pData);
176 }
177
178
179 LoadingErrorType
180 ConvertErrorCode(int error)
181 {
182         LoadingErrorType errorCode = WEB_ERROR_UNKNOWN;
183
184         switch (error)
185         {
186         case EWK_ERROR_NETWORK_STATUS_CANCELLED:
187         //fall through
188         case EWK_ERROR_NETWORK_STATUS_CANT_RESOLVE:
189         //fall through
190         case EWK_ERROR_NETWORK_STATUS_CANT_RESOLVE_PROXY:
191         //fall through
192         case EWK_ERROR_NETWORK_STATUS_CANT_CONNECT:
193         //fall through
194         case EWK_ERROR_NETWORK_STATUS_CANT_CONNECT_PROXY:
195         //fall through
196         case EWK_ERROR_NETWORK_STATUS_IO_ERROR:
197         //fall through
198         case EWK_ERROR_NETWORK_STATUS_MALFORMED:
199         //fall through
200         case EWK_ERROR_NETWORK_STATUS_TRY_AGAIN:
201         //fall through
202         case EWK_ERROR_NETWORK_STATUS_TOO_MANY_REDIRECTS:
203         //fall through
204         case EWK_ERROR_NETWORK_STATUS_TLS_FAILED:
205         //fall through
206         case EWK_ERROR_NETWORK_STATUS_INTERNAL_SERVER_ERROR:
207         //fall through
208         case EWK_ERROR_NETWORK_STATUS_BAD_GATEWAY:
209         //fall through
210         case EWK_ERROR_NETWORK_STATUS_SERVICE_UNAVAILABLE:
211         //fall through
212         case EWK_ERROR_NETWORK_STATUS_GATEWAY_TIMEOUT:
213                 errorCode = WEB_NO_CONNECTION;
214                 break;
215
216         case EWK_ERROR_NETWORK_STATUS_BAD_REQUEST:
217         //fall through
218         case EWK_ERROR_NETWORK_STATUS_REQUEST_URI_TOO_LONG:
219                 errorCode = WEB_BAD_URL;
220                 break;
221
222         case EWK_ERROR_NETWORK_STATUS_FORBIDDEN:
223                 errorCode = WEB_FILE_ACCESS_FAILED;
224                 break;
225
226         case EWK_ERROR_NETWORK_STATUS_REQUEST_TIMEOUT:
227                 errorCode = WEB_REQUEST_TIMEOUT;
228                 break;
229
230         case EWK_ERROR_NETWORK_STATUS_UNSUPPORTED_MEDIA_TYPE:
231                 errorCode = WEB_MIME_NOT_SUPPORTED;
232                 break;
233
234         case EWK_ERROR_NETWORK_STATUS_INSUFFICIENT_STORAGE:
235                 errorCode = WEB_OUT_OF_MEMORY;
236                 break;
237
238         case EWK_ERROR_NETWORK_STATUS_REQUEST_ENTITY_TOO_LARGE:
239                 errorCode = WEB_REQUEST_MAX_EXCEEDED;
240                 break;
241
242         case EWK_ERROR_NETWORK_STATUS_CONTINUE:
243         //fall through
244         case EWK_ERROR_NETWORK_STATUS_SWITCHING_PROTOCOLS:
245         //fall through
246         case EWK_ERROR_NETWORK_STATUS_PROCESSING:
247         //fall through
248         case EWK_ERROR_NETWORK_STATUS_OK:
249         //fall through
250         case EWK_ERROR_NETWORK_STATUS_CREATED:
251         //fall through
252         case EWK_ERROR_NETWORK_STATUS_ACCEPTED:
253         //fall through
254         case EWK_ERROR_NETWORK_STATUS_NON_AUTHORITATIVE:
255         //fall through
256         case EWK_ERROR_NETWORK_STATUS_NO_CONTENT:
257         //fall through
258         case EWK_ERROR_NETWORK_STATUS_RESET_CONTENT:
259         //fall through
260         case EWK_ERROR_NETWORK_STATUS_PARTIAL_CONTENT:
261         //fall through
262         case EWK_ERROR_NETWORK_STATUS_MULTI_STATUS:
263         //fall through
264         case EWK_ERROR_NETWORK_STATUS_MULTIPLE_CHOICES:
265         //fall through
266         case EWK_ERROR_NETWORK_STATUS_MOVED_PERMANENTLY:
267         //fall through
268         case EWK_ERROR_NETWORK_STATUS_FOUND:
269         //fall through
270         case EWK_ERROR_NETWORK_STATUS_SEE_OTHER:
271         //fall through
272         case EWK_ERROR_NETWORK_STATUS_NOT_MODIFIED:
273         //fall through
274         case EWK_ERROR_NETWORK_STATUS_USE_PROXY:
275         //fall through
276         case EWK_ERROR_NETWORK_STATUS_NOT_APPEARING_IN_THIS_PROTOCOL:
277         //fall through
278         case EWK_ERROR_NETWORK_STATUS_TEMPORARY_REDIRECT:
279                 errorCode = WEB_HTTP_RESPONSE;
280                 break;
281
282         case EWK_ERROR_NETWORK_STATUS_SSL_FAILED:
283                 errorCode = WEB_INVALID_CERTIFICATE;
284                 break;
285
286         default:
287                 errorCode = WEB_ERROR_UNKNOWN;
288                 break;
289         }
290
291         return errorCode;
292 }
293
294
295 result
296 FireLoadingErrorOccurredEvent(_WebImpl* pImpl, int code, const char* pDescription)
297 {
298         result r = E_SUCCESS;
299
300         std::unique_ptr<Integer> pErrorCode(new (std::nothrow) Integer(code));
301         std::unique_ptr<String> pErrorDescription(new (std::nothrow) String(pDescription));
302         std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_ERROR_OCCURRED));
303         SysTryReturnResult(NID_WEB_CTRL, pErrorCode.get() && pErrorDescription.get() && pEventArg.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
304
305         r = pEventArg->SetEventInfo(_LoadingEventArg::ERROR_TYPE, *pErrorCode.get());
306         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
307         pErrorCode.release();
308
309         r = pEventArg->SetEventInfo(_LoadingEventArg::ERROR_MESSAGE, *pErrorDescription.get());
310         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
311         pErrorDescription.release();
312
313         r = pImpl->GetWebEvent()->FireAsync(*pEventArg);
314         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
315         pEventArg.release();
316
317         return E_SUCCESS;
318 }
319
320
321 Eina_Bool
322 OnScriptAlertRequested(Evas_Object* pView, const char* pMessage, void* pUserData)
323 {
324         SysLog(NID_WEB_CTRL, "The current value of message is %s", pMessage);
325
326         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
327         String msg(pMessage);
328
329         result r = pImpl->ShowUserConfirmPopupAsync(USER_SCRIPT_ALERT, pView, msg);
330         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
331         return EINA_TRUE;
332
333 CATCH:
334         ewk_view_javascript_alert_reply(pView);
335         return EINA_TRUE;
336 }
337
338
339 Eina_Bool
340 OnScriptConfirmRequested(Evas_Object* pView, const char* pMessage, void* pUserData)
341 {
342         SysLog(NID_WEB_CTRL, "The current value of message is %s", pMessage);
343
344         result r = E_SUCCESS;
345         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
346         String msg(pMessage);
347
348         r = pImpl->ShowUserConfirmPopupAsync(USER_SCRIPT_CONFIRM, pView, msg);
349         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
350         return EINA_TRUE;
351
352 CATCH:
353         ewk_view_javascript_confirm_reply(pView, EINA_FALSE);
354         return EINA_TRUE;
355 }
356
357
358 Eina_Bool
359 OnScriptPromptRequested(Evas_Object* pView, const char* pMessage, const char* pDefaultValue, void* pUserData)
360 {
361         SysLog(NID_WEB_CTRL, "The current value of message is %s, defaulValue is %s", pMessage, pDefaultValue);
362
363         result r = E_SUCCESS;
364         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
365
366         String msg(pMessage);
367         String defVal(pDefaultValue);
368
369         r = pImpl->ShowPromptPopup(msg, defVal);
370         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
371
372         return EINA_TRUE;
373
374 CATCH:
375         ewk_view_javascript_prompt_reply(pView, null);
376
377         return EINA_FALSE;
378 }
379
380
381 void
382 OnCertificateRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
383 {
384         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
385         Ewk_Certificate_Policy_Decision* pPolicy = reinterpret_cast< Ewk_Certificate_Policy_Decision* >(pEventInfo);
386         SysAssertf(pImpl && pPolicy, "Failed to request");
387
388         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
389
390         switch (pImpl->GetSetting().GetCertificateErrorHandlingMode())
391         {
392         case WEB_CERTIFICATE_ERROR_HANDLING_MODE_USER_CONFIRM:
393         {
394                 if (pImpl->IsCertificateRequested())
395                 {
396                         ewk_certificate_policy_decision_allowed_set(pPolicy, static_cast< Eina_Bool >(pImpl->IsCertificateConfirmed()));
397                         return;
398                 }
399
400                 result r = E_SUCCESS;
401
402                 std::unique_ptr<DbEnumerator> pEnum;
403
404                 String certificatePath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
405                 String table(CERTIFICATE_TABLE_NAME);
406                 _DatabaseImpl db;
407
408                 String pem(ewk_certificate_policy_decision_certificate_pem_get(pPolicy));
409
410                 r = db.Construct(certificatePath, "r", null);
411                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
412
413                 pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select allow From " + table + L" Where pem = '" + pem + L"'"));
414                 if (pEnum.get())
415                 {
416                         r = pEnum->MoveNext();
417                         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
418
419                         int allow = 0;
420                         r = pEnum->GetIntAt(0, allow);
421                         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
422
423                         SysLog(NID_WEB_CTRL, "The current value of allow is %d", allow);
424
425                         ewk_certificate_policy_decision_allowed_set(pPolicy, static_cast < Eina_Bool >(allow));
426                         pImpl->SetCertificateConfirmed(static_cast < bool >(allow));
427                 }
428                 else
429                 {
430                         r = pImpl->ShowCertificateConfirmPopup(CERTIFICATE_POPUP_MODE_USER_CONFIRM, pPolicy);
431                         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
432
433                         ewk_view_resume(pWebCore->GetWebNativeNode());
434                 }
435
436                 if (pImpl)
437                 {
438                         pImpl->SetCertificateRequested(true);
439                 }
440                 break;
441         }
442         case WEB_CERTIFICATE_ERROR_HANDLING_MODE_CANCEL:
443                 ewk_certificate_policy_decision_allowed_set(pPolicy, EINA_FALSE);
444                 break;
445         case WEB_CERTIFICATE_ERROR_HANDLING_MODE_CONTINUE :
446                 ewk_certificate_policy_decision_allowed_set(pPolicy, EINA_TRUE);
447                 break;
448         default:
449                 SysAssert(false);
450         }
451
452         return;
453
454 CATCH:
455         ewk_certificate_policy_decision_allowed_set(pPolicy, EINA_FALSE);
456         pImpl->SetCertificateConfirmed(false);
457         pImpl->SetCertificateRequested(true);
458
459         ewk_view_resume(pWebCore->GetWebNativeNode());
460 }
461
462
463 void
464 OnHttpAuthenticationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
465 {
466         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
467         Ewk_Auth_Challenge* pChallenge = reinterpret_cast< Ewk_Auth_Challenge* >(pEventInfo);
468         SysAssertf(pImpl && pChallenge, "Failed to request");
469
470         result r = E_SUCCESS;
471
472         r = pImpl->HttpAuthenticationRequested(pChallenge);
473         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
474         return;
475
476 CATCH:
477         ewk_auth_challenge_credential_cancel(pChallenge);
478         evas_object_smart_callback_call(pView, "authentication,canceled", NULL);
479 }
480
481
482 void
483 OnHttpAuthenticationCanceled(void* pUserData, Evas_Object* pView, void* pEventInfo)
484 {
485         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
486         SysAssertf(pImpl , "Failed to request");
487
488         if (pImpl->GetLoadingListener())
489         {
490                 result r = E_SUCCESS;
491
492                 std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_AUTHENTICATION_CANCELED));
493                 SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
494
495                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
496                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
497                 pEventArg.release();
498         }
499 }
500
501 Eina_Bool
502 OnApplicationCachePermissionRequested(Evas_Object* pView, Ewk_Security_Origin* pSecOrigin,  void* pUserData)
503 {
504         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
505         SysAssertf(pImpl , "Failed to request");
506
507         const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
508         String msg;
509         result r = msg.Format(256, L"Allow %s to use offline application cache?", pHostName);
510         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
511
512         r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_APP_CACHE, pView, msg);
513         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
514
515         return EINA_TRUE;
516 }
517
518
519 Eina_Bool
520 OnIndexedDatabaseQuotaExceeded(Evas_Object* pView, Ewk_Security_Origin* pSecOrigin,  long long currentQuota, void* pUserData)
521 {
522         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
523         SysAssertf(pImpl , "Failed to request");
524
525         const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
526         String msg;
527         result r = msg.Format(512, L"%s Used %lld of storage. Allow %s to use upto 2GB of indexed db?", pHostName, currentQuota, pHostName);
528         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
529
530         r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED, pView, msg);
531         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
532
533         return EINA_TRUE;
534 }
535
536
537 Eina_Bool
538 OnDatabaseQuotaExceeded(Evas_Object* pView, Ewk_Security_Origin* pSecOrigin, const char* database_name, unsigned long long expectedQuota, void* pUserData)
539 {
540         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
541         SysAssertf(pImpl , "Failed to request");
542
543         const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
544         String msg;
545         result r = msg.Format(512, L"Allow %s to open  %s use upto %lld  of web database?", pHostName, database_name, expectedQuota);
546         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
547
548         r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_DB_QUOTA_EXCEDED, pView, msg);
549         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
550
551         return EINA_TRUE;
552 }
553
554
555 Eina_Bool OnLocalFileSystemQuotaExceeded(Evas_Object* pView, Ewk_Security_Origin* pSecOrigin,  long long currentQuota, void* pUserData)
556 {
557         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
558         SysAssertf(pImpl , "Failed to request");
559
560         const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
561         String msg;
562         result r = msg.Format(512, L"%s Used %lld of storgae. Allow %s to use upto 2GB of file system?", pHostName, currentQuota, pHostName);
563         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
564
565         r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_LOCAL_FS_QUOTA_EXCEDED, pView, msg);
566         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
567
568         return EINA_TRUE;
569 }
570
571
572 void
573 OnGeolocationPermissionRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
574 {
575         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
576         Ewk_Geolocation_Permission_Request* pPermissionRequest = reinterpret_cast< Ewk_Geolocation_Permission_Request* >(pEventInfo);
577         SysAssertf(pImpl && pPermissionRequest, "Failed to request");
578
579         if (pImpl->GetSetting().IsGeolocationEnabled())
580         {
581                 result r = E_SUCCESS;
582
583                 std::unique_ptr<DbEnumerator> pEnum;
584
585                 String geolocationPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
586                 String table(GEOLOCATION_TABLE_NAME);
587                 _DatabaseImpl db;
588
589                 const Ewk_Security_Origin* pSecurityOrigin = ewk_geolocation_permission_request_origin_get(pPermissionRequest);
590                 String origin = _Utility::CreateOrigin(pSecurityOrigin);
591
592                 r = db.Construct(geolocationPath, "r", null);
593                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
594
595                 pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select permission From " + table + L" Where origin = '" + origin + L"'"));
596                 if (pEnum.get())
597                 {
598                         r = pEnum->MoveNext();
599                         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
600
601                         int permission = 0;
602                         r = pEnum->GetIntAt(0, permission);
603                         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
604
605                         SysLog(NID_WEB_CTRL, "The current value of permission is %d", permission);
606
607                         ewk_geolocation_permission_request_set(pPermissionRequest, static_cast < Eina_Bool >(permission));
608                 }
609                 else
610                 {
611                         ewk_geolocation_permission_request_suspend(pPermissionRequest);
612
613                         r = pImpl->ShowUserConfirmPopupAsync(USER_CONFIRM_GEOLOCATION, pPermissionRequest);
614                         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
615                 }
616
617                 return;
618         }
619
620 CATCH:
621         ewk_geolocation_permission_request_set(pPermissionRequest, EINA_FALSE);
622 }
623
624
625 void
626 OnGetUserMediaPermissionRequsted(void* pUserData, Evas_Object* pView, void* pEventInfo)
627 {
628         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
629         Ewk_User_Media_Permission_Request* pPermissionRequest = reinterpret_cast< Ewk_User_Media_Permission_Request* >(pEventInfo);
630         SysAssertf(pImpl && pPermissionRequest, "Failed to request");
631
632         result r = pImpl->ShowUserConfirmPopupAsync(USER_CONFIRM_USERMEDIA, pEventInfo);
633         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
634         return;
635
636 CATCH:
637         ewk_user_media_permission_request_set(pPermissionRequest, EINA_FALSE);
638 }
639
640
641 void
642 OnNotificationPermissionRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
643 {
644         result r = E_SUCCESS;
645         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
646
647         Ewk_Notification_Permission_Request* pPermissionRequest = reinterpret_cast< Ewk_Notification_Permission_Request* >(pEventInfo);
648         SysAssertf(pImpl && pPermissionRequest, "Failed to request");
649
650         ewk_notification_permission_request_suspend(pPermissionRequest);
651
652         r = pImpl->ShowUserConfirmPopupAsync(USER_CONFIRM_NOTIFICATION, pPermissionRequest);
653         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
654         return;
655
656 CATCH:
657         ewk_notification_permission_request_set(pPermissionRequest, EINA_FALSE);
658 }
659
660
661 void
662 OnNotificationShow(void* pUserData, Evas_Object* pView, void* pEventInfo)
663 {
664         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
665         Ewk_Notification* pNotification = reinterpret_cast< Ewk_Notification* >(pEventInfo);
666         SysAssertf(pImpl && pNotification, "Failed to request");
667
668         result r = E_SUCCESS;
669         Ewk_Context* pContext = ewk_view_context_get(pView);
670         SysAssertf(pContext, "Failed to get webkit instance.");
671         uint64_t notificationId = ewk_notification_id_get(pNotification);
672
673         //ewk_notification_security_origin_get(pNotification)
674
675         const char* text = ewk_notification_body_get(pNotification);
676         SysSecureLog(NID_WEB_CTRL, "The current value of icon path is %s",ewk_notification_icon_url_get(pNotification));
677
678         std::unique_ptr<_WebNotification> pNotificationWindow( new (std::nothrow) _WebNotification());
679         SysTryReturnVoidResult(NID_WEB_CTRL, pNotificationWindow.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
680
681         r = pNotificationWindow->Construct(pContext, notificationId, pImpl);
682         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Error propogated.", GetErrorMessage(r));
683
684         pNotificationWindow->SetText(String(text));
685         pNotificationWindow->LaunchNotification();
686         pImpl->SetWebNotification(pNotificationWindow.release());
687
688         ewk_notification_showed(pContext, notificationId);
689 }
690
691
692 void
693 OnNotificationCancel(void* pUserData, Evas_Object* pView, void* pEventInfo)
694 {
695         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
696         uint64_t* pNotificationID = reinterpret_cast< uint64_t* >(pEventInfo);
697         SysAssertf(pImpl && pNotificationID, "Failed to request");
698
699         //ToDo : Where is ewk API for cancel operation?
700 }
701
702
703 void
704 OnProtocolHandlerRegistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
705 {
706         result r = E_SUCCESS;
707         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
708         SysAssertf(pImpl, "Failed to request");
709
710         r = pImpl->ShowUserConfirmPopup(USER_PROTOCOL_HANDLER, pEventInfo);
711         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
712 }
713
714
715 void
716 OnIsProtocolHandlerRegistered(void* pUserData, Evas_Object* pView, void* pEventInfo)
717 {
718         int checkHandler = 0;
719         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
720         Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
721         SysAssertf(pImpl && pHandlerData, "Failed to request");
722
723         checkHandler = pImpl->SearchHandler(pHandlerData, false);
724         SysTryReturnVoidResult(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
725         switch (checkHandler)
726         {
727         case -1:
728                 return;
729         case 0:
730                 ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_DECLINED);
731                 break;
732         case 1:
733                 ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_REGISTERED);
734                 break;
735         case 2:
736                 ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_NEW);
737                 break;
738         default:
739                 SysAssert(false);
740         }
741 }
742
743 void
744 OnProtocolHandlerUnregistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
745 {
746         result r = E_SUCCESS;
747         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
748         Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
749         SysAssertf(pImpl && pHandlerData, "Failed to request");
750
751         r = pImpl->UnregistrationHandler(pHandlerData, false);
752         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
753 }
754
755
756 void
757 OnContentHandlerRegistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
758 {
759         result r = E_SUCCESS;
760         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
761         SysAssertf(pImpl, "Failed to request");
762         
763         r = pImpl->ShowUserConfirmPopup(USER_CONTENT_HANDLER, pEventInfo);
764         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
765 }
766
767
768 void
769 OnIsContentHandlerRegistered(void* pUserData, Evas_Object* pView, void* pEventInfo)
770 {
771         int checkHandler = 0;
772         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
773         Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
774         SysAssertf(pImpl && pHandlerData, "Failed to request");
775
776         checkHandler = pImpl->SearchHandler(pHandlerData, true);
777         SysTryReturnVoidResult(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
778         
779         switch (checkHandler)
780         {
781         case -1:
782                 return;
783         case 0:
784                 ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_DECLINED);
785                 break;
786         case 1:
787                 ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_REGISTERED);
788                 break;
789         case 2:
790                 ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_NEW);
791                 break;
792         default:
793                 SysAssert(false);
794         }
795 }
796
797
798 void
799 OnContentHandlerUnregistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
800 {
801         result r = E_SUCCESS;
802         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
803         Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
804         SysAssertf(pImpl && pHandlerData, "Failed to request");
805
806         r = pImpl->UnregistrationHandler(pHandlerData, true);
807         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
808 }
809
810
811 void
812 OnFullScreenEntered(void* pUserData, Evas_Object* pView, void* pEventInfo)
813 {
814         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
815         bool* pIsHandleNeeded = reinterpret_cast< bool* >(pEventInfo);
816         SysAssertf(pImpl, "Failed to request");
817
818         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
819         SysAssertf(pWebCore, "Failed to get Web core object");
820
821         if (pIsHandleNeeded && *pIsHandleNeeded)
822         {
823                 pWebCore->SetFullScreenEntered(true);
824         }
825 }
826
827
828 void
829 OnFullScreenExited(void* pUserData, Evas_Object* pView, void* pEventInfo)
830 {
831         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
832         SysAssertf(pImpl, "Failed to request");
833
834         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
835         SysAssertf(pWebCore, "Failed to get Web core object");
836
837         pWebCore->SetFullScreenEntered(false);
838 }
839
840
841 void
842 OnFocusDownRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
843 {
844         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
845         SysAssertf(pImpl, "Failed to request");
846
847         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
848         pWebCore->SetFocusEnd(true);
849 }
850
851
852 void
853 OnFocusUpRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
854 {
855         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
856         SysAssertf(pImpl, "Failed to request");
857
858         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
859         pWebCore->SetFocusEnd(true);
860 }
861
862
863 void
864 OnVibrationRequested(uint64_t duration, void* pUserData)
865 {
866         result r = E_SUCCESS;
867
868         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
869         SysAssertf(pImpl, "Failed to request");
870
871         r = pImpl->VibrationRequested(duration);
872         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
873 }
874
875
876 void
877 OnVibrationCanceled(void* pUserData)
878 {
879         _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
880         SysAssertf(pImpl, "Failed to request");
881
882         pImpl->VibrationCanceled();
883 }
884
885
886 void
887 OnLoadingRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
888 {
889         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
890         Ewk_Policy_Decision* pPolicy = reinterpret_cast< Ewk_Policy_Decision* >(pEventInfo);
891         SysAssertf(pImpl && pPolicy, "Failed to request");
892
893         String url(ewk_policy_decision_url_get(pPolicy));
894         SysSecureLog(NID_WEB_CTRL, "The current value of url is %ls", url.GetPointer());
895
896         if (ewk_frame_is_main_frame(ewk_policy_decision_frame_get(pPolicy))
897                 && !pImpl->IsRedirectRequested())
898         {
899                 _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
900                 SysAssertf(pWebCore, "Failed to get Web core object");
901
902                 pWebCore->SetFullScreenEntered(false);
903
904                 pImpl->SetCertificateRequested(false);
905
906                 if (pImpl->GetTextSearchListener())
907                 {
908                         pImpl->DisableAsyncSearch();
909                 }
910
911                 ILoadingListener* pLoadingListener = pImpl->GetLoadingListener();
912                 if (pLoadingListener)
913                 {
914                         WebNavigationType navigationType = WEB_NAVIGATION_OTHER;
915                         Ewk_Policy_Navigation_Type ewkNavigationType = ewk_policy_decision_navigation_type_get(pPolicy);
916
917                         switch (ewkNavigationType)
918                         {
919                         case EWK_POLICY_NAVIGATION_TYPE_LINK_CLICKED:
920                                 navigationType = WEB_NAVIGATION_LINK_CLICKED;
921                                 break;
922                         case EWK_POLICY_NAVIGATION_TYPE_FORM_SUBMITTED:
923                                 navigationType = WEB_NAVIGATION_FORM_SUBMITTED;
924                                 break;
925                         case EWK_POLICY_NAVIGATION_TYPE_BACK_FORWARD:
926                                 navigationType = WEB_NAVIGATION_BACKFORWARD;
927                                 break;
928                         case EWK_POLICY_NAVIGATION_TYPE_RELOAD:
929                                 navigationType = WEB_NAVIGATION_RELOAD;
930                                 break;
931                         case EWK_POLICY_NAVIGATION_TYPE_FORM_RESUBMITTED:
932                                 navigationType = WEB_NAVIGATION_FORM_RESUBMITTED;
933                                 break;
934                         case EWK_POLICY_NAVIGATION_TYPE_OTHER:
935                                 navigationType = WEB_NAVIGATION_OTHER;
936                                 break;
937                         default:
938                                 SysAssert(false);
939                         }
940
941                         if (pLoadingListener->OnLoadingRequested(url, navigationType))
942                         {
943                                 ewk_policy_decision_ignore(pPolicy);
944
945                                 return;
946                         }
947                 }
948         }
949
950         if (url == L"about:blank")
951         {
952                 ewk_policy_decision_use(pPolicy);
953
954                 return;
955         }
956
957         String currentUrl(pImpl->GetUrl());
958         String redirectUrl(pImpl->GetProtocolFromUri(url,  currentUrl));
959         if (redirectUrl != L"")
960         {
961                 ewk_policy_decision_ignore(pPolicy);
962
963                 pImpl->LoadUrl(redirectUrl);
964
965                 return;
966         }
967         
968         Uri uri;
969         uri.SetUri(url);
970
971         String uriScheme(uri.GetScheme());
972         SysSecureLog(NID_WEB_CTRL, "The current value of scheme is %ls", uriScheme.GetPointer());
973
974         if ((uriScheme != L"http") && (uriScheme != L"https") && (uriScheme != L"file"))
975         {
976                 ewk_policy_decision_ignore(pPolicy);
977
978                 if (uriScheme == L"")
979                 {
980                         return;
981                 }
982
983                 result r = E_SUCCESS;
984
985                 if (uriScheme == L"tel")
986                 {
987                         String operationId(L"http://tizen.org/appcontrol/operation/dial");
988                         r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
989                 }
990                 else if (uriScheme == L"mailto" || uriScheme == L"sms" || uriScheme == L"smsto" || uriScheme == L"mms" || uriScheme == L"mmsto" )
991                 {
992                         String operationId(L"http://tizen.org/appcontrol/operation/compose");
993                         r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
994                 }
995                 else
996                 {
997                         String operationId(L"http://tizen.org/appcontrol/operation/view");
998                         r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
999                 }
1000                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1001
1002                 return;
1003         }
1004
1005         ewk_policy_decision_use(pPolicy);
1006 }
1007
1008
1009 void
1010 OnLoadingStarted(void* pUserData, Evas_Object* pView, void* pEventInfo)
1011 {
1012         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1013         SysAssertf(pImpl, "Failed to request");
1014
1015         if (pImpl->GetLoadingListener())
1016         {
1017                 result r = E_SUCCESS;
1018
1019                 std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_STARTED));
1020                 SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1021
1022                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1023                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1024                 pEventArg.release();
1025         }
1026 }
1027
1028
1029 void
1030 OnPageTitleReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
1031 {
1032         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1033         char* pTitle = reinterpret_cast< char* >(pEventInfo);
1034         SysAssertf(pImpl, "Failed to request");
1035
1036         SysLog(NID_WEB_CTRL, "The current value of title is %s", pTitle);
1037
1038         if (pImpl->GetLoadingListener())
1039         {
1040                 result r = E_SUCCESS;
1041
1042                 std::unique_ptr<String> pPageTitle(new (std::nothrow) String(pTitle));
1043                 std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_PAGETITLE_RECEIVED));
1044                 SysTryReturnVoidResult(NID_WEB_CTRL, pPageTitle.get() && pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1045
1046                 r = pEventArg->SetEventInfo(_LoadingEventArg::PAGE_TITLE, *pPageTitle.get());
1047                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1048                 pPageTitle.release();
1049
1050                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1051                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1052                 pEventArg.release();
1053         }
1054 }
1055
1056
1057 void
1058 OnEstimatedProgress(void* pUserData, Evas_Object* pView, void* pEventInfo)
1059 {
1060         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1061         double* pProgress = reinterpret_cast< double* >(pEventInfo);
1062         SysAssertf(pImpl, "Failed to request");
1063
1064         SysLog(NID_WEB_CTRL, "The current value of progress is %lf", *pProgress);
1065
1066         if (pImpl->GetLoadingListener())
1067         {
1068                 result r = E_SUCCESS;
1069
1070                 std::unique_ptr<Integer> pProgressPercentage(new (std::nothrow) Integer(static_cast< int >(*pProgress * 100)));
1071                 std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_PROGRESS));
1072                 SysTryReturnVoidResult(NID_WEB_CTRL, pProgressPercentage.get() && pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1073
1074                 r = pEventArg->SetEventInfo(_LoadingEventArg::ESTIMATED_PROGRESS, *pProgressPercentage.get());
1075                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1076                 pProgressPercentage.release();
1077
1078                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1079                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1080                 pEventArg.release();
1081         }
1082 }
1083
1084
1085 void
1086 OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
1087 {
1088         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1089         Ewk_Policy_Decision* pPolicy = reinterpret_cast< Ewk_Policy_Decision* >(pEventInfo);
1090         SysAssertf(pImpl && pPolicy, "Failed to request");
1091
1092         result r = E_SUCCESS;
1093
1094         int code = ewk_policy_decision_response_status_code_get(pPolicy);
1095         String url(ewk_policy_decision_url_get(pPolicy));
1096         String mime(ewk_policy_decision_response_mime_get(pPolicy));
1097         SysSecureLog(NID_WEB_CTRL, "code : %d, url : %ls, mime : %ls", code, url.GetPointer(), mime.GetPointer());
1098
1099         if (ewk_frame_is_main_frame(ewk_policy_decision_frame_get(pPolicy)))
1100         {
1101                 if (code >= REDIRECTION_HEADER_GROUP && code < REDIRECTION_HEADER_GROUP + 100)
1102                 {
1103                         pImpl->SetRedirectRequested(true);
1104                         mime = L"";
1105                 }
1106
1107                 ILoadingListener* pLoadingListener = pImpl->GetLoadingListener();
1108                 if (pLoadingListener)
1109                 {
1110                         HttpHeader httpHeader;
1111
1112                         Eina_Iterator* iterator = eina_hash_iterator_tuple_new(ewk_policy_decision_response_headers_get(pPolicy));
1113                         if (iterator)
1114                         {
1115                                 Eina_Hash_Tuple *tuple = null;
1116
1117                                 EINA_ITERATOR_FOREACH(iterator, tuple)
1118                                 {
1119                                         String key(reinterpret_cast< const char* >(tuple->key));
1120                                         String value(reinterpret_cast< char* >(tuple->data));
1121
1122                                         SysSecureLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", key.GetPointer(), value.GetPointer());
1123
1124                                         r = httpHeader.AddField(key, value);
1125                                         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1126                                 }
1127
1128                                 eina_iterator_free(iterator);
1129                         }
1130
1131                         pImpl->SetPolicyDecision(pLoadingListener->OnWebDataReceived(mime, httpHeader));
1132                 }
1133                 else
1134                 {
1135                         pImpl->SetPolicyDecision(WEB_DECISION_CONTINUE);
1136                 }
1137         }
1138
1139         switch (pImpl->GetPolicyDecision())
1140         {
1141         case WEB_DECISION_CONTINUE:
1142         {
1143                 String currentUrl(pImpl->GetUrl());
1144                 String redirectUrl(pImpl->GetRedirectUri(url, currentUrl, mime));
1145                 if (redirectUrl != L"")
1146                 {
1147                         ewk_policy_decision_ignore(pPolicy);
1148
1149                         pImpl->LoadUrl(redirectUrl);
1150
1151                         return;
1152                 }
1153
1154                 if (ewk_policy_decision_type_get(pPolicy) == EWK_POLICY_DECISION_USE)
1155                 {
1156                         break;
1157                 }
1158                 else
1159                 {
1160                         ewk_policy_decision_ignore(pPolicy);
1161
1162                         String operationId(L"http://tizen.org/appcontrol/operation/view");
1163
1164                         r = _AppControlImpl::FindAndStart(operationId, &url, &mime, null, null, null);
1165                         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS || r == E_OBJ_NOT_FOUND, r, "[%s] Propagating.", GetErrorMessage(r));
1166                         if (r == E_OBJ_NOT_FOUND)
1167                         {
1168                                 String operationId(L"http://tizen.org/appcontrol/operation/download");
1169
1170                                 r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
1171                                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1172                         }
1173
1174                         return;
1175                 }
1176                 break;
1177         }
1178
1179         case WEB_DECISION_DOWNLOAD:
1180         {
1181                 ewk_policy_decision_ignore(pPolicy);
1182
1183                 _WebDataHandler* pDownloadHandler = pImpl->GetDownloadHandler();
1184                 SysTryReturnVoidResult(NID_WEB_CTRL, pDownloadHandler, E_SYSTEM, "[%s] A system error has been occurred. Failed to get DownloadHandler.", GetErrorMessage(E_SYSTEM));
1185
1186                 Ewk_Context* pContext = ewk_view_context_get(pView);
1187                 SysAssertf(pContext, "Failed to get webkit instance.");
1188
1189                 pDownloadHandler->StartDownload(url);
1190
1191                 return;
1192         }
1193
1194         case WEB_DECISION_IGNORE:
1195         {
1196                 ewk_policy_decision_ignore(pPolicy);
1197
1198                 return;
1199         }
1200
1201         default:
1202         {
1203                 SysAssert(false);
1204         }
1205         }
1206
1207         ewk_policy_decision_use(pPolicy);
1208
1209         return;
1210
1211 CATCH:
1212         ewk_policy_decision_ignore(pPolicy);
1213 }
1214
1215
1216 void
1217 OnProgressCompleted(void* pUserData, Evas_Object* pView, void* pEventInfo)
1218 {
1219         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1220         SysAssertf(pImpl, "Failed to request");
1221
1222         if (pImpl->IsRedirectRequested())
1223         {
1224                 pImpl->SetRedirectRequested(false);
1225         }
1226
1227         if (pImpl->IsLoadingErrorOccurred())
1228         {
1229                 pImpl->SetLoadingErrorOccurred(false);
1230                 evas_object_smart_callback_call(pView, "load,finished", NULL);
1231         }
1232 }
1233
1234
1235 void
1236 OnLoadingErrorOccurred(void* pUserData, Evas_Object* pView, void* pEventInfo)
1237 {
1238         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1239         Ewk_Error* pErrorData = reinterpret_cast< Ewk_Error* >(pEventInfo);
1240         SysAssertf(pImpl && pErrorData, "Failed to request");
1241
1242         int code = ewk_error_code_get(pErrorData);
1243         const char* pDescription = ewk_error_description_get(pErrorData);
1244
1245         SysLog(NID_WEB_CTRL, "The current value of code is %d, description is %s", code, pDescription);
1246
1247         switch (code)
1248         {
1249         case EWK_ERROR_CODE_FRAMELOADINTERRUPTEDBYPOLICYCHANGE:
1250                 pImpl->SetLoadingErrorOccurred(true);
1251                 break;
1252
1253         case EWK_ERROR_CODE_PLUGINWILLHANDLELOAD:
1254                 evas_object_smart_callback_call(pView, "load,finished", NULL);
1255                 break;
1256
1257         case EWK_ERROR_NETWORK_STATUS_CANCELLED:
1258                 pImpl->SetLoadingErrorOccurred(true);
1259                 evas_object_smart_callback_call(pView, "load,stop", NULL);
1260                 break;
1261
1262         default:
1263                 pImpl->SetLoadingErrorOccurred(true);
1264                 if (pImpl->GetLoadingListener())
1265                 {
1266                         result r = E_SUCCESS;
1267
1268                         r = FireLoadingErrorOccurredEvent(pImpl, code, pDescription);
1269                         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1270                 }
1271                 break;
1272         }
1273 }
1274
1275
1276 void
1277 OnLoadingCanceled(void* pUserData, Evas_Object* pView, void* pEventInfo)
1278 {
1279         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1280         SysAssertf(pImpl, "Failed to request");
1281
1282         if (pImpl->GetLoadingListener())
1283         {
1284                 result r = E_SUCCESS;
1285
1286                 std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_CANCELED));
1287                 SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1288
1289                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1290                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1291                 pEventArg.release();
1292         }
1293
1294 }
1295
1296
1297 void
1298 OnLoadingCompleted(void* pUserData, Evas_Object* pView, void* pEventInfo)
1299 {
1300         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1301         SysAssertf(pImpl, "Failed to request");
1302
1303         if (pImpl->GetLoadingListener())
1304         {
1305                 result r = E_SUCCESS;
1306
1307                 std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_COMPLETED));
1308                 SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1309
1310                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1311                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1312                 pEventArg.release();
1313         }
1314
1315 }
1316
1317
1318 void
1319 OnLoadingCommitted(void* pUserData, Evas_Object* pView, void* pEventInfo)
1320 {
1321         evas_object_focus_set(pView, EINA_FALSE);
1322 }
1323
1324
1325 void
1326 OnFaviconReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
1327 {
1328         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1329         SysAssertf(pImpl, "Failed to request");
1330
1331         if (pImpl->GetLoadingListener())
1332         {
1333                 result r = E_SUCCESS;
1334
1335                 std::unique_ptr<_LoadingEventArg> pEventArg(new (std::nothrow) _LoadingEventArg(WEB_EVENT_LOADINGLISTENER_FAVICON_RECEIVED));
1336                 SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1337
1338                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1339                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1340                 pEventArg.release();
1341         }
1342
1343 }
1344
1345
1346 void
1347 OnDidStartDownloadCallback(const char* pUrl, void* pUserData)
1348 {
1349         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1350         SysAssertf(pUrl && pImpl != null, "Failed to request");
1351
1352         SysSecureLog(NID_WEB_CTRL, "The current value of url is %s", pUrl);
1353 }
1354
1355
1356 result
1357 FireWebPageShowRequestedEvent(_WebImpl* pImpl, int event)
1358 {
1359         result r = E_SUCCESS;
1360
1361         std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(event));
1362         SysTryReturnResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
1363
1364         r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1365         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1366         pEventArg.release();
1367
1368         return E_SUCCESS;
1369 }
1370
1371
1372 void
1373 OnWebPageShowRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
1374 {
1375         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1376         SysAssertf(pImpl, "Failed to request");
1377
1378         if (pImpl->GetUiEventListener())
1379         {
1380                 result r = E_SUCCESS;
1381
1382                 r = FireWebPageShowRequestedEvent(pImpl, WEB_EVENT_WEBUIEVENTLISTENER_PAGE_SHOW_REQUESTED);
1383                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1384         }
1385         if (pImpl->GetUiEventListenerF())
1386         {
1387                 result r = E_SUCCESS;
1388
1389                 r = FireWebPageShowRequestedEvent(pImpl, WEB_EVENT_WEBUIEVENTLISTENER_PAGE_SHOW_REQUESTED_FLOAT);
1390                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1391         }
1392 }
1393
1394
1395 void
1396 OnWebWindowCreateRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
1397 {
1398         _WebImpl* pParentImpl = reinterpret_cast< _WebImpl* >(pUserData);
1399         Evas_Object** pChildView = reinterpret_cast< Evas_Object** >(pEventInfo);
1400         SysAssertf(pParentImpl && pChildView, "Failed to request");
1401
1402         IWebUiEventListener* pUserUiListener = pParentImpl->GetUiEventListener();
1403         IWebUiEventListenerF* pUserUiListenerF = pParentImpl->GetUiEventListenerF();
1404         if (pUserUiListener)
1405         {
1406                 Web* pWeb = pUserUiListener->OnWebWindowCreateRequested();
1407                 if (pWeb)
1408                 {
1409                         _WebImpl* pChildImpl = _WebImpl::GetInstance(pWeb);
1410                         SysTryReturnVoidResult(NID_WEB_CTRL, pChildImpl, E_SYSTEM, "[%s] A system error has been occurred. Failed to get ChildImpl object.", GetErrorMessage(E_SYSTEM));
1411
1412                         *pChildView = dynamic_cast< _Web* >(&pChildImpl->GetCore())->GetWebNativeNode();
1413                         evas_object_data_set(*pChildView, PARENT_WEB_CTRL, pParentImpl);
1414                 }
1415         }
1416         if (pUserUiListenerF)
1417         {
1418                 Web* pWeb = pUserUiListenerF->OnWebWindowCreateRequested();
1419                 if (pWeb)
1420                 {
1421                         _WebImpl* pChildImpl = _WebImpl::GetInstance(pWeb);
1422                         SysTryReturnVoidResult(NID_WEB_CTRL, pChildImpl, E_SYSTEM, "[%s] A system error has been occurred. Failed to get ChildImpl object.", GetErrorMessage(E_SYSTEM));
1423
1424                         *pChildView = dynamic_cast< _Web* >(&pChildImpl->GetCore())->GetWebNativeNode();
1425                         evas_object_data_set(*pChildView, PARENT_WEB_CTRL, pParentImpl);
1426                 }
1427         }
1428 }
1429
1430
1431 result
1432 FireWebWindowClosedRequestedEvent(_WebImpl* pImpl, int event)
1433 {
1434         result r = E_SUCCESS;
1435
1436         std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(event));
1437         SysTryReturnResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
1438
1439         r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1440         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1441         pEventArg.release();
1442
1443         return E_SUCCESS;
1444 }
1445
1446
1447 void
1448 OnWebWindowClosedRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
1449 {
1450         _WebImpl* pChildImpl = reinterpret_cast< _WebImpl* >(pUserData);
1451         SysAssertf(pChildImpl, "Failed to request");
1452
1453         _WebImpl* pParentImpl = reinterpret_cast< _WebImpl* >(evas_object_data_get(pView, PARENT_WEB_CTRL));
1454         if (pParentImpl == null)
1455         {
1456                 return;
1457         }
1458
1459         if (pParentImpl->GetUiEventListener())
1460         {
1461                 result r = E_SUCCESS;
1462
1463                 r = FireWebWindowClosedRequestedEvent(pChildImpl, WEB_EVENT_WEBUIEVENTLISTENER_WINDOW_CLOSE_REQUSTED);
1464                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1465         }
1466         if (pParentImpl->GetUiEventListenerF())
1467         {
1468                 result r = E_SUCCESS;
1469
1470                 r = FireWebWindowClosedRequestedEvent(pChildImpl, WEB_EVENT_WEBUIEVENTLISTENER_WINDOW_CLOSE_REQUSTED_FLOAT);
1471                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1472         }
1473 }
1474
1475
1476 result
1477 FireWebPreventDefaultTriggeredEvent(_WebImpl* pImpl, int event, bool trigger)
1478 {
1479         result r = E_SUCCESS;
1480
1481         std::unique_ptr<Boolean> pPreventTrigger(new (std::nothrow) Boolean(trigger));
1482         std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(event));
1483         SysTryReturnResult(NID_WEB_CTRL, pPreventTrigger.get() && pEventArg.get(), E_OUT_OF_MEMORY, " Memory allocation failed." );
1484
1485         r = pEventArg->SetEventInfo(_WebUiEventArg::PREVENT_DEFAULT, *pPreventTrigger.get());
1486         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1487         pPreventTrigger.release();
1488
1489         r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1490         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1491         pEventArg.release();
1492
1493         return E_SUCCESS;
1494 }
1495
1496
1497 void
1498 OnWebPreventDefaultTriggered(void* pUserData, Evas_Object* pView, void* pEventInfo)
1499 {
1500         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1501         Eina_Bool* pTrigger = reinterpret_cast< Eina_Bool* >(pEventInfo);
1502         SysAssertf(pImpl && pTrigger, "Failed to request");
1503
1504         if (pImpl->GetUiEventListener())
1505         {
1506                 result r = E_SUCCESS;
1507
1508                 r = FireWebPreventDefaultTriggeredEvent(pImpl, WEB_EVENT_WEBUIEVENTLISTENER_PREVENT_DEFAULT_TRIGGERED, static_cast< bool >(*pTrigger));
1509                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1510         }
1511         if (pImpl->GetUiEventListenerF())
1512         {
1513                 result r = E_SUCCESS;
1514
1515                 r = FireWebPreventDefaultTriggeredEvent(pImpl, WEB_EVENT_WEBUIEVENTLISTENER_PREVENT_DEFAULT_TRIGGERED_FLOAT, static_cast< bool >(*pTrigger));
1516                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1517         }
1518 }
1519
1520
1521 result
1522 FireWebPageBlockSelectedEvent(_WebImpl* pImpl)
1523 {
1524         result r = E_SUCCESS;
1525
1526         std::unique_ptr<Point> startPoint(new (std::nothrow) Point());
1527         std::unique_ptr<Point> endPoint(new (std::nothrow) Point());
1528         SysTryReturnResult(NID_WEB_CTRL, startPoint.get() && endPoint.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
1529
1530         pImpl->GetBlockRange(*startPoint.get(), *endPoint.get());
1531
1532         if ((endPoint->x != 0) && (endPoint->y != 0))
1533         {
1534                 std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED));
1535                 SysTryReturnResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
1536
1537                 r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_START, *startPoint.get());
1538                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1539                 startPoint.release();
1540
1541                 r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_END, *endPoint.get());
1542                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1543                 endPoint.release();
1544
1545                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1546                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1547                 pEventArg.release();
1548         }
1549
1550         return E_SUCCESS;
1551 }
1552
1553
1554 result
1555 FireWebPageBlockSelectedEventF(_WebImpl* pImpl)
1556 {
1557         result r = E_SUCCESS;
1558
1559         std::unique_ptr<FloatPoint> startPoint(new (std::nothrow) FloatPoint());
1560         std::unique_ptr<FloatPoint> endPoint(new (std::nothrow) FloatPoint());
1561
1562         SysTryReturnResult(NID_WEB_CTRL, startPoint.get() && endPoint.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
1563
1564         pImpl->GetBlockRange(*startPoint.get(), *endPoint.get());
1565         if ((endPoint->x != 0.0f) && (endPoint->y != 0.0f))
1566         {
1567                 std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED_FLOAT));
1568                 SysTryReturnResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
1569
1570                 r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_START, *startPoint.get());
1571                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1572                 startPoint.release();
1573
1574                 r = pEventArg->SetEventInfo(_WebUiEventArg::BLOCK_END, *endPoint.get());
1575                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1576                 endPoint.release();
1577
1578                 r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1579                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1580                 pEventArg.release();
1581         }
1582
1583         return E_SUCCESS;
1584 }
1585
1586
1587 void
1588 OnWebPageBlockSelected(void* pUserData, Evas_Object* pView, void* pEventInfo)
1589 {
1590         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1591         SysAssertf(pImpl, "Failed to request");
1592
1593         if (pImpl->GetUiEventListener())
1594         {
1595                 result r = E_SUCCESS;
1596
1597                 r = FireWebPageBlockSelectedEvent(pImpl);
1598                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1599         }
1600         if (pImpl->GetUiEventListenerF())
1601         {
1602                 result r = E_SUCCESS;
1603
1604                 r = FireWebPageBlockSelectedEventF(pImpl);
1605                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1606         }
1607 }
1608
1609
1610 void
1611 OnHandleJavaScriptRequest(void* pUserData, Evas_Object* pView, void* pEventInfo)
1612 {
1613         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1614         char* pJsonText = reinterpret_cast< char* >(pEventInfo);
1615         SysAssertf(pImpl && pJsonText, "Failed to request");
1616
1617         result r = E_SUCCESS;
1618
1619         SysLog(NID_WEB_CTRL, "The current value of jsontext is %s", pJsonText);
1620
1621         std::unique_ptr<_JsBridgeArg> pEventArg(new (std::nothrow) _JsBridgeArg());
1622         SysTryReturnVoidResult(NID_WEB_CTRL, pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1623
1624         r = pEventArg->Construct(pJsonText);
1625         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1626
1627         r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
1628         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1629         pEventArg.release();
1630 }
1631
1632
1633 void
1634 OnWebKeypadStateChanged(void* pUserData, Evas_Object* pView, void* pEventInfo)
1635 {
1636         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1637         Eina_Rectangle* pEinaRect = reinterpret_cast< Eina_Rectangle* >(pEventInfo);
1638         SysAssertf(pImpl && pEinaRect, "Failed to request");
1639
1640         if (pImpl->GetSetting().GetInputStyle() == INPUT_STYLE_OVERLAY)
1641         {
1642                 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
1643                 SysAssertf(pXformer, "Failed to get CoordinateTransformer");
1644
1645                 Rectangle rect(pEinaRect->x, pEinaRect->y, pEinaRect->w, pEinaRect->h);
1646
1647                 if (rect.height == 0)
1648                 {
1649                         return;
1650                 }
1651
1652                 _FormImpl* pFormImpl = pImpl->GetParentFormImpl(dynamic_cast< _ControlImpl* >(pImpl));
1653                 if (pFormImpl)
1654                 {
1655                         pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(rect.height));
1656                 }
1657
1658                 if (pImpl->GetWebKeypadEventListener())
1659                 {
1660                         if (pImpl->IsKeypadVisible() == true)
1661                         {
1662                                 if ((pImpl->GetPreviousKeypadBounds().width == rect.width) && (pImpl->GetPreviousKeypadBounds().height != rect.height))
1663                                 {
1664                                         pImpl->GetWebKeypadEventListener()->OnWebKeypadBoundsChanged(*dynamic_cast< Web* >(&pImpl->GetPublic()));
1665                                 }
1666                         }
1667                         else
1668                         {
1669                                 pImpl->GetWebKeypadEventListener()->OnWebKeypadWillOpen(*dynamic_cast< Web* >(&pImpl->GetPublic()));
1670                         }
1671                 }
1672                 pImpl->SetPreviousKeypadBounds(rect);
1673         }
1674         else
1675         {
1676                 result r = pImpl->SetFullScreenKeypad();
1677                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1678         }
1679 }
1680
1681
1682 void
1683 OnWebKeypadOpened(void* pUserData, Evas_Object* pView, void* pEventInfo)
1684 {
1685         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1686         SysAssertf(pImpl, "Failed to request");
1687
1688         pImpl->SetKeypadVisibleState(true);
1689
1690         _FormImpl* pFormImpl = pImpl->GetParentFormImpl(dynamic_cast< _ControlImpl* >(pImpl));
1691         if (pFormImpl)
1692         {
1693                 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
1694                 SysAssertf(pXformer, "Failed to get CoordinateTransformer");
1695
1696                 pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(pImpl->GetPreviousKeypadBounds().height));
1697
1698                 if (pFormImpl->HasFooter())
1699                 {
1700                         pFormImpl->GetCore().SetKeypadShowState(true);
1701                         pFormImpl->Draw();
1702                 }
1703         }
1704
1705         if (pImpl->GetWebKeypadEventListener())
1706         {
1707                 pImpl->GetWebKeypadEventListener()->OnWebKeypadOpened(*static_cast< Web* >(&pImpl->GetPublic()));
1708         }
1709 }
1710
1711
1712 void
1713 OnWebKeypadClosed(void* pUserData, Evas_Object* pView, void* pEventInfo)
1714 {
1715         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1716         SysAssertf(pImpl, "Failed to request");
1717
1718         _FormImpl* pFormImpl = pImpl->GetParentFormImpl(dynamic_cast< _ControlImpl* >(pImpl));
1719         if (pFormImpl)
1720         {
1721                 pFormImpl->DeflateClientRectHeight(0);
1722
1723                 if (pFormImpl->HasFooter())
1724                 {
1725                         pFormImpl->GetCore().SetKeypadShowState(false);
1726                         pFormImpl->Draw();
1727                 }
1728         }
1729
1730         if (pImpl->GetWebKeypadEventListener())
1731         {
1732                 pImpl->GetWebKeypadEventListener()->OnWebKeypadClosed(*dynamic_cast< Web* >(&pImpl->GetPublic()));
1733         }
1734
1735         pImpl->SetKeypadVisibleState(false);
1736 }
1737
1738
1739 void
1740 OnWindowObjectFocusLost(void* pUserData, Evas_Object* pWin, void* pEvent_info)
1741 {
1742         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1743         SysAssertf(pImpl, "Failed to request");
1744
1745         pImpl->SetWinFocusLost(true);
1746 }
1747
1748
1749 void
1750 OnWindowObjectFocusGained(void* pUserData, Evas_Object* pWin, void* pEvent_info)
1751 {
1752         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1753         SysAssertf(pImpl, "Failed to request");
1754
1755         if (pImpl->IsVisible() == true && pImpl->IsFocused() == true)
1756         {
1757                 _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
1758                 SysAssertf(pWebCore, "Failed to get Web core object");
1759
1760                 if (pImpl->IsWinFocusLost() == true)
1761                 {
1762                         if (pImpl->IsKeypadOpened() == true)
1763                         {
1764                                 evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
1765                         }
1766
1767                         Ewk_Settings* pSettings = ewk_view_settings_get(pWebCore->GetWebNativeNode());
1768                         SysAssertf(pSettings, "Failed to get settings instance.");
1769
1770                         if (ewk_settings_clear_text_selection_automatically_get(pSettings) == EINA_FALSE)
1771                         {
1772                                 ewk_settings_clear_text_selection_automatically_set(pSettings, EINA_TRUE);
1773
1774                                 evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
1775                         }
1776                 }
1777         }
1778
1779         pImpl->SetWinFocusLost(false);
1780 }
1781
1782
1783 void
1784 OnWebNativeNodeFocusGained(void* pUserData, Evas* pCanvas, Evas_Object* pView, void* pEventInfo)
1785 {
1786         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1787         SysAssertf(pImpl, "Failed to request");
1788
1789         if (pImpl->IsKeypadOpened() == true)
1790         {
1791                 pImpl->SetKeypadOpened(false);
1792         }
1793 }
1794
1795
1796 void
1797 OnWebNativeNodeFocusLost(void* pUserData, Evas* pCanvas, Evas_Object* pView, void* pEventInfo)
1798 {
1799         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
1800         SysAssertf(pImpl, "Failed to request");
1801
1802         if (pImpl->IsWinFocusLost() == true)
1803         {
1804                 _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
1805                 SysAssertf(pWebCore, "Failed to get Web core object");
1806
1807                 Ewk_Settings* pSettings = ewk_view_settings_get(pWebCore->GetWebNativeNode());
1808                 SysAssertf(pSettings, "Failed to get settings instance.");
1809
1810                 ewk_settings_clear_text_selection_automatically_set(pSettings, EINA_FALSE);
1811         }
1812
1813
1814
1815 Eina_Bool
1816 OnColorPickerProviderRequested(Ewk_View_Smart_Data* pSmartData, int red, int green, int blue, int alpha)
1817 {
1818         SysAssertf(pSmartData, "invalid smartdata");
1819         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1820         SysAssertf(pWebImpl, "Failed to get Impl");
1821
1822         result r = E_SUCCESS;
1823
1824         if (pWebImpl->GetColorpicker())
1825         {
1826                 return EINA_FALSE;
1827         }
1828
1829         Color color;
1830
1831         r = pWebImpl->ShowColorPicker(red, green, blue, alpha, color);
1832         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Memory allocation failed.", GetErrorMessage(r));
1833
1834         byte r1, g1, b1, a1;
1835         color.GetColorComponents(r1, g1, b1, a1);
1836         ewk_view_color_picker_color_set(pSmartData->self, r1, g1, b1, a1);
1837
1838         return EINA_TRUE;
1839 }
1840
1841
1842 Eina_Bool
1843 OnColorPickerProviderDismissed(Ewk_View_Smart_Data* pSmartData)
1844 {
1845         SysAssertf(pSmartData, "invalid smartdata");
1846
1847         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1848         SysAssertf(pWebImpl, "Failed to get Impl");
1849
1850         return pWebImpl->HideColorPicker();
1851 }
1852
1853
1854 Eina_Bool
1855 OnDatePickerProviderRequested(Ewk_View_Smart_Data* pSmartData, Ewk_Input_Type inputType, const char* inputValue)
1856 {
1857         SysAssertf(pSmartData, "Failed to request");
1858         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1859         SysAssertf(pWebImpl, "Failed to get Impl");
1860
1861         result r = E_SUCCESS;
1862
1863         if (pWebImpl->GetDatepicker())
1864         {
1865                 ewk_view_focused_input_element_value_set(pSmartData->self, inputValue);
1866
1867                 return EINA_FALSE;
1868         }
1869
1870         String dateStr;
1871
1872         r = pWebImpl->ShowDatePicker(inputType, inputValue, dateStr);
1873         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Memory allocation failed.", GetErrorMessage(r));
1874
1875         std::unique_ptr<char[]> pDateStr(_StringConverter::CopyToCharArrayN(dateStr));
1876         SysTryReturn(NID_WEB_CTRL, pDateStr.get(), EINA_FALSE, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
1877
1878         ewk_view_focused_input_element_value_set(pSmartData->self, pDateStr.get());
1879
1880         return EINA_TRUE;
1881 }
1882
1883
1884 Eina_Bool
1885 OnSelectBoxRequested(Ewk_View_Smart_Data* pSmartData, Eina_Rectangle rect, Ewk_Text_Direction textDirection, double pageScaleFactor, Eina_List* pItems, int selectedIndex)
1886 {
1887         SysAssertf(pSmartData, "Failed to request");
1888
1889         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1890         SysAssertf(pWebImpl, "Failed to get Impl");
1891
1892         result r = pWebImpl->ShowSelectBoxPopup(false, L"", pItems, pSmartData->self, selectedIndex);
1893         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
1894
1895         return EINA_TRUE;
1896 }
1897
1898
1899 Eina_Bool
1900 OnMultiSelectBoxRequested(Ewk_View_Smart_Data* pSmartData, Eina_Rectangle rect, Ewk_Text_Direction text_direction, double page_scale_factor, Eina_List* pItems)
1901 {
1902         SysAssertf(pSmartData, "Failed to request");
1903
1904         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1905         SysAssertf(pWebImpl, "Failed to get Impl");
1906
1907         result r = pWebImpl->ShowSelectBoxPopup(true, L"", pItems, pSmartData->self, 0);
1908         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
1909
1910         return EINA_TRUE;
1911 }
1912
1913
1914 Eina_Bool
1915 OnSelectBoxClosed(Ewk_View_Smart_Data* pSmartData)
1916 {
1917         SysAssertf(pSmartData, "invalid smartdata");
1918
1919         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1920         SysAssertf(pWebImpl, "Failed to get Impl");
1921
1922         result r = pWebImpl->ClearSelectBoxPopup();
1923         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
1924
1925         return EINA_TRUE;
1926 }
1927
1928
1929 Eina_Bool
1930 OnSelectBoxUpdateRequested(Ewk_View_Smart_Data *pSmartData, Eina_Rectangle rect, Ewk_Text_Direction textDirection, Eina_List* pItems, int selectedIndex)
1931 {
1932         SysAssertf(pSmartData, "invalid smartdata");
1933
1934         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1935         SysAssertf(pWebImpl, "Failed to get Impl");
1936
1937         result r = pWebImpl->UpdateSelectBoxPopup(pItems, selectedIndex, false);
1938         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
1939
1940         return EINA_TRUE;
1941 }
1942
1943
1944 Eina_Bool
1945 OnFormDataCandidateShow(Ewk_View_Smart_Data *pSmartData, int x, int y, int w, int h)
1946 {
1947         SysAssertf(pSmartData, "Failed to request");
1948
1949         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1950         SysAssertf(pWebImpl, "Failed to get Impl");
1951
1952         Rectangle windowRect(x, y, w, h);
1953         result r = pWebImpl->ShowFormDataWindow(windowRect, pSmartData->self);
1954         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
1955
1956         return EINA_TRUE;
1957 }
1958
1959
1960 Eina_Bool
1961 OnFormDataCandidateHide(Ewk_View_Smart_Data *pSmartData)
1962 {
1963         SysAssertf(pSmartData, "Failed to request");
1964
1965         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1966         SysAssertf(pWebImpl, "Failed to get Impl");
1967
1968         if (pWebImpl->IsFormDataWindowVisible())
1969         {
1970                 pWebImpl->HideFormDataWindow();
1971         }
1972
1973         return EINA_TRUE;
1974 }
1975
1976
1977 Eina_Bool
1978 OnFormDataCandidateUpdate(Ewk_View_Smart_Data *pSmartData, Eina_List *pDataList)
1979 {
1980         SysAssertf(pSmartData, "Failed to request");
1981
1982         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1983         SysAssertf(pWebImpl, "Failed to get Impl");
1984
1985         pWebImpl->SetFormDataList(pDataList);
1986
1987         return EINA_TRUE;
1988 }
1989
1990
1991 Eina_Bool
1992 OnFormDataCandidateIsShowing(Ewk_View_Smart_Data *pSmartData)
1993 {
1994         SysAssertf(pSmartData, "Failed to request");
1995
1996         _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(pSmartData->self, WEB_CTRL));
1997         SysAssertf(pWebImpl, "Failed to get Impl");
1998
1999         if (pWebImpl->IsFormDataWindowVisible())
2000         {
2001                 return EINA_TRUE;
2002         }
2003         else
2004         {
2005                 return EINA_FALSE;
2006         }
2007 }
2008
2009
2010 void
2011 OnCookiesPolicyGot(Ewk_Cookie_Accept_Policy policy, Ewk_Web_Error *pError, void *pUserData)
2012 {
2013         _WebPresenter* pPresenter = reinterpret_cast< _WebPresenter* >(pUserData);
2014         SysAssertf(pPresenter && !pError, "Failed to request");
2015
2016         bool ret = EINA_TRUE;
2017
2018         switch (policy)
2019         {
2020         case EWK_COOKIE_ACCEPT_POLICY_ALWAYS:
2021                 //fall through
2022         case EWK_COOKIE_ACCEPT_POLICY_NO_THIRD_PARTY:
2023                 ret = EINA_TRUE;
2024                 break;
2025
2026         case EWK_COOKIE_ACCEPT_POLICY_NEVER:
2027                 //fall through
2028                 ret = EINA_FALSE;
2029                 break;
2030
2031         default:
2032                 SysAssert(false);
2033         }
2034
2035         SysLog(NID_WEB_CTRL, "The current value of policy is %d", ret);
2036
2037         pPresenter->EndAsyncProcess(ret);
2038 }
2039
2040
2041 void
2042 OnScriptExecuted(Evas_Object* pView, const char* pResult, void* pUserData)
2043 {
2044         _WebPresenter* pPresenter = reinterpret_cast< _WebPresenter* >(pUserData);
2045         SysAssertf(pPresenter, "Failed to request");
2046
2047         String result(pResult);
2048         SysLog(NID_WEB_CTRL, "result : %ls", result.GetPointer());
2049
2050         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(evas_object_data_get(pView, WEB_CTRL));
2051         _WebManager* pWebManager = _WebManager::GetInstance();
2052         if (pWebManager->IsValidCallback(reinterpret_cast< int >(pImpl), reinterpret_cast< int >(pPresenter)))
2053         {
2054                 pPresenter->EndAsyncProcess(result);
2055         }
2056 }
2057
2058
2059 void
2060 OnTextFound(void* pUserData, Evas_Object* pView, void* pEventInfo)
2061 {
2062         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
2063         SysAssertf(pImpl, "Failed to request");
2064
2065         int* pTotalCount = reinterpret_cast< int* >(pEventInfo);
2066         SysLog(NID_WEB_CTRL, "The current value of totalCount is %d", *pTotalCount);
2067
2068         _WebPresenter* pWebPresenter = pImpl->GetSearchPresenter();
2069
2070         if (pWebPresenter)
2071         {
2072                 pWebPresenter->EndAsyncProcess(*pTotalCount);
2073         }
2074         else
2075         {
2076                 if (pImpl->GetTextSearchListener())
2077                 {
2078                         result r = E_SUCCESS;
2079
2080                         int ordinal = 0;
2081
2082                         if (*pTotalCount > 0)
2083                         {
2084                                 ordinal = pImpl->GetAsyncSearchOrdinal();
2085                                 pImpl->SetAsyncSearchResult(*pTotalCount);
2086                         }
2087
2088                         if (pImpl->GetPendingAsyncSearchCount() > 0)
2089                         {
2090                                 return;
2091                         }
2092
2093                         std::unique_ptr<Integer> pCount(new (std::nothrow) Integer(*pTotalCount));
2094                         std::unique_ptr<Integer> pOrdinal(new (std::nothrow) Integer(ordinal));
2095                         std::unique_ptr<_TextSearchEventArg> pEventArg(new (std::nothrow) _TextSearchEventArg(WEB_EVENT_TEXTSEARCHLISTENER_TEXT_FOUND));
2096                         SysTryReturnVoidResult(NID_WEB_CTRL, pCount.get() && pOrdinal.get() && pEventArg.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2097
2098                         r = pEventArg->SetEventInfo(_TextSearchEventArg::TOTAL_COUNT, *pCount.get());
2099                         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
2100                         pCount.release();
2101
2102                         r = pEventArg->SetEventInfo(_TextSearchEventArg::CURRENT_ORDINAL, *pOrdinal.get());
2103                         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
2104                         pOrdinal.release();
2105
2106                         r = pImpl->GetWebEvent()->FireAsync(*pEventArg.get());
2107                         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
2108                         pEventArg.release();
2109                 }
2110         }
2111 }
2112
2113
2114 class _JsBridgeHashCodeProvider
2115         : public Tizen::Base::Collection::IHashCodeProviderT< Tizen::Base::String >
2116 {
2117 public:
2118         _JsBridgeHashCodeProvider(){}
2119         virtual ~_JsBridgeHashCodeProvider(void) {}
2120
2121
2122         int GetHashCode(const Tizen::Base::String& obj) const
2123         {
2124                 return obj.GetHashCode();
2125         }
2126
2127 };
2128
2129
2130 //Comparer implementation
2131 class _JsBridgeComparer
2132         : public Tizen::Base::Collection::IComparerT< Tizen::Base::String >
2133 {
2134 public:
2135         _JsBridgeComparer(){}
2136         virtual ~_JsBridgeComparer(void) {}
2137
2138
2139         result Compare(const Tizen::Base::String& obj1, const Tizen::Base::String& obj2, int& cmp) const
2140         {
2141                 if (obj1 == obj2)
2142                 {
2143                         cmp = 0;
2144                 }
2145                 else
2146                 {
2147                         cmp = 1;
2148                 }
2149
2150                 return E_SUCCESS;
2151         }
2152
2153 };
2154
2155
2156 _WebImpl::_WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore)
2157         : _ContainerImpl(pWeb, pCore)
2158         , __isFooterVisible(false)
2159         , __isKeypadVisible(false)
2160         , __isKeypadOpened(false)
2161         , __isWinFocusLost(false)
2162         , __isLoadingErrorOccurred(false)
2163         , __isRedirectRequested(false)
2164         , __isCertificateRequested(false)
2165         , __isCertificateConfirmed(false)
2166         , __isFormDataVisible(false)
2167         , __keypadBounds(0, 0, 0, 0)
2168         , __pWebCore(null)
2169         , __pUserLoadingListener(null)
2170         , __pUserUiListener(null)
2171         , __pUserUiListenerF(null)
2172         , __pUserKeypadEventListener(null)
2173         , __pTextSearchListener(null)
2174         , __pKeypad(null)
2175         , __pJsBridgeList(null)
2176         , __pJsProvider(null)
2177         , __pJsComparer(null)
2178         , __pWebDownloadHandler(null)
2179         , __pWebEvent(null)
2180         , __pAuthChallenge(null)
2181         , __pAuthPopup(null)
2182         , __pUserMediaConfirmPopup(null)
2183         , __pContentHandlerConfirmPopup(null)
2184         , __pProtocolHandlerConfirmPopup(null)
2185         , __pGeolocationConfirmPopup(null)
2186         , __pNotificationConfirmPopup(null)
2187         , __pScriptAlertConfirmPopup(null)
2188         , __pScriptConfirmPopup(null)
2189         , __pAppCacheConfirmPopup(null)
2190         , __pDbQuotaConfirmPopup(null)
2191         , __pLocalFsQuotaConfirmPopup(null)
2192         , __pIndexedDbQuotaConfirmPopup(null)
2193         , __pPromptPopup(null)
2194         , __pCertConfirmPopup(null)
2195         , __pSelectBox(null)
2196         , __pDatePicker(null)
2197         , __pColorPicker(null)
2198         , __pFormDataWindow(null)
2199         , __pVibrator(null)
2200         , __policy(WEB_DECISION_CONTINUE)
2201         , __defaultUserAgent(L"")
2202         , __pFormDataList(null)
2203         , __popupClosed(false)
2204 {
2205         __textSearch.__searchAll = false;
2206         __textSearch.__searchForward = true;
2207         __textSearch.__caseSensitive = false;
2208         __textSearch.__pending = 0;
2209         __textSearch.__currentIndex = 1;
2210         __textSearch.__totalCount = -1;
2211         __textSearch.__text = L"";
2212 }
2213
2214
2215 _WebImpl::~_WebImpl()
2216 {
2217         _WebManager* pWebManager = _WebManager::GetInstance();
2218         SysTryCatch(NID_WEB_CTRL, pWebManager, , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2219
2220         pWebManager->RemoveWeb(reinterpret_cast< int >(this));
2221         pWebManager->RemoveActiveWeb(this);
2222
2223 CATCH:
2224         RemoveEventListenerCallback();
2225
2226         ClearCertificateDb();
2227 }
2228
2229
2230 _WebImpl*
2231 _WebImpl::CreateWebImplN(Web* pControl, const Rectangle& bounds)
2232 {
2233         result r = E_SUCCESS;
2234
2235         r = GET_SIZE_INFO(Web).CheckInitialSizeValid(Dimension(bounds.width, bounds.height), _CONTROL_ORIENTATION_PORTRAIT);
2236         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
2237
2238         _Web* pCore = _Web::CreateWebN();
2239         SysTryReturn(NID_WEB_CTRL, pCore, null, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2240
2241         _WebImpl* pImpl = new (std::nothrow) _WebImpl(pControl, pCore);
2242
2243         r = CheckConstruction(pCore, pImpl);
2244         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
2245
2246         r = pImpl->InitializeBoundsProperties(GET_SIZE_INFO(Web), bounds, pCore->GetOrientation());
2247         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2248
2249         r = pImpl->Construct();
2250         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2251
2252         return pImpl;
2253
2254 CATCH:
2255         delete pImpl;
2256
2257         return null;
2258 }
2259
2260
2261 _WebImpl*
2262 _WebImpl::CreateWebImplN(Web* pControl, const FloatRectangle& bounds)
2263 {
2264         result r = E_SUCCESS;
2265
2266         r = GET_SIZE_INFO(Web).CheckInitialSizeValidF(FloatDimension(bounds.width, bounds.height), _CONTROL_ORIENTATION_PORTRAIT);
2267         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
2268
2269         _Web* pCore = _Web::CreateWebN();
2270         SysTryReturn(NID_WEB_CTRL, pCore, null, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2271
2272         _WebImpl* pImpl = new (std::nothrow) _WebImpl(pControl, pCore);
2273
2274         r = CheckConstruction(pCore, pImpl);
2275         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
2276
2277         r = pImpl->InitializeBoundsPropertiesF(GET_SIZE_INFO(Web), bounds, pCore->GetOrientation());
2278         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2279
2280         r = pImpl->Construct();
2281         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2282
2283         return pImpl;
2284
2285 CATCH:
2286         delete pImpl;
2287
2288         return null;
2289 }
2290
2291
2292 result
2293 _WebImpl::Construct(void)
2294 {
2295         result r = E_SUCCESS;
2296
2297         r = __mutex.Create();
2298         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2299
2300         r = __textSearch.__searchQueue.Construct();
2301         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2302
2303         r = __webNotificationList.Construct();
2304         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2305
2306         r = InitJsBridgeList();
2307         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2308
2309         r = InitWebEvent();
2310         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2311
2312         __pWebCore = dynamic_cast< _Web* >(&(GetCore()));
2313         SysTryReturnResult(NID_WEB_CTRL, __pWebCore, E_SYSTEM, "A system error has been occurred. Failed to get web control");
2314
2315         return E_SUCCESS;
2316 }
2317
2318
2319 result
2320 _WebImpl::InitializeSetting(void)
2321 {
2322         result r = E_SUCCESS;
2323
2324         WebSetting* pWebSetting = __pWebCore->GetSetting();
2325         _WebSettingImpl* pWebSettingImpl = _WebSettingImpl::GetInstance(pWebSetting);
2326
2327         SetCookieEnabled(pWebSettingImpl->IsCookieEnabled());
2328         SetPrivateBrowsingEnabled(pWebSettingImpl->IsPrivateBrowsingEnabled());
2329
2330         __defaultUserAgent = pWebSettingImpl->GetUserAgent();
2331
2332         r = SetSetting(*pWebSetting);
2333         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2334
2335         SetEventListenerCallback();
2336
2337         return E_SUCCESS;
2338 }
2339
2340
2341 bool
2342 _WebImpl::IsLayoutable(void) const
2343 {
2344         return true;
2345 }
2346
2347
2348 result
2349 _WebImpl::InitWebEvent(void)
2350 {
2351         __pWebEvent = std::unique_ptr<_WebEvent>(new (std::nothrow) _WebEvent());
2352         SysTryReturnResult(NID_WEB_CTRL, __pWebEvent.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
2353
2354         return __pWebEvent->Construct(*this);
2355 }
2356
2357
2358 _WebEvent*
2359 _WebImpl::GetWebEvent(void) const
2360 {
2361         return __pWebEvent.get();
2362 }
2363
2364
2365 Eina_Hash*
2366 _WebImpl::ConvertToSlpHeaderN(const HttpHeader& header) const
2367 {
2368         Eina_Hash* pHttpHeader = null;
2369
2370         std::unique_ptr<IList> pFieldNameList(header.GetFieldNamesN());
2371         if (pFieldNameList.get())
2372         {
2373                 pHttpHeader = eina_hash_string_small_new(FreeCharArray);
2374                 SysTryReturn(NID_WEB_CTRL, pHttpHeader, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2375                 
2376                 int count = pFieldNameList->GetCount();
2377
2378                 for (int i = 0; i < count; i++)
2379                 {
2380                         String* pFieldName = dynamic_cast< String* >(pFieldNameList->GetAt(i));
2381                         SysTryCatch(NID_WEB_CTRL, pFieldName, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2382
2383                         std::unique_ptr<char[]> pKey(_StringConverter::CopyToCharArrayN(*pFieldName));
2384                         SysTryCatch(NID_WEB_CTRL, pKey.get(), , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2385
2386                         std::unique_ptr<IEnumerator> pFieldValueEnum(header.GetFieldValuesN(*pFieldName));
2387                         SysTryCatch(NID_WEB_CTRL, pFieldValueEnum.get(), , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2388                         
2389                         while (pFieldValueEnum->MoveNext() == E_SUCCESS)
2390                         {
2391                                 Eina_Bool ret = false;
2392
2393                                 String* pFieldValue = dynamic_cast< String* >(pFieldValueEnum->GetCurrent());
2394                                 SysTryCatch(NID_WEB_CTRL, pFieldValue, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2395
2396                                 std::unique_ptr<char[]> pValue(_StringConverter::CopyToCharArrayN(*pFieldValue));
2397                                 SysTryCatch(NID_WEB_CTRL, pValue.get(), , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2398
2399                                 ret = eina_hash_add(pHttpHeader, pKey.get(), pValue.release());
2400                                 SysTryCatch(NID_WEB_CTRL, ret == EINA_TRUE, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2401                         }
2402                 }
2403         }
2404         return pHttpHeader;
2405
2406 CATCH:
2407         eina_hash_free(pHttpHeader);
2408
2409         return null;
2410 }
2411
2412
2413 result
2414 _WebImpl::LoadUrl(const String& url) const
2415 {
2416         std::unique_ptr<char[]> pUrl(_StringConverter::CopyToCharArrayN(url));
2417         SysTryReturn(NID_WEB_CTRL, pUrl.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2418
2419         ewk_view_url_set(__pWebCore->GetWebNativeNode(), pUrl.get());
2420
2421         return E_SUCCESS;
2422 }
2423
2424
2425 result 
2426 _WebImpl::LoadUrl(const String& url, const HttpHeader& header)
2427 {
2428         std::unique_ptr<char[]> pUrl(_StringConverter::CopyToCharArrayN(url));
2429         SysTryReturn(NID_WEB_CTRL, pUrl.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2430         
2431         Eina_Hash* pHttpHeader = ConvertToSlpHeaderN(header);
2432
2433         ewk_view_url_request_set(__pWebCore->GetWebNativeNode(), pUrl.get(), EWK_HTTP_METHOD_GET, pHttpHeader, null);
2434
2435         eina_hash_free(pHttpHeader);
2436
2437         return E_SUCCESS;
2438 }
2439
2440
2441 result
2442 _WebImpl::LoadUrlWithPostRequest(const String& url, const HttpHeader& header, const ByteBuffer& body) const
2443 {
2444         std::unique_ptr<char[]> pUrl(_StringConverter::CopyToCharArrayN(url));
2445         SysTryReturn(NID_WEB_CTRL, pUrl.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2446
2447         Eina_Hash* pHttpHeader = ConvertToSlpHeaderN(header);
2448
2449         ewk_view_url_request_set(__pWebCore->GetWebNativeNode(), pUrl.get(), EWK_HTTP_METHOD_POST, pHttpHeader, reinterpret_cast< const char* >(body.GetPointer()));
2450
2451         eina_hash_free(pHttpHeader);
2452
2453         return E_SUCCESS;
2454 }
2455
2456
2457 result
2458 _WebImpl::LoadData(const String& baseUrl, const ByteBuffer& content, const String& mime, const String& encoding) const
2459 {
2460         SysTryReturnResult(NID_WEB_CTRL, content.GetLimit() > 0, E_INVALID_ARG, "The content buffer is empty.");
2461
2462         std::unique_ptr<char[]> pUrl(_StringConverter::CopyToCharArrayN(baseUrl));
2463         std::unique_ptr<char[]> pMime(_StringConverter::CopyToCharArrayN(mime));
2464         std::unique_ptr<char[]> pEncoding(_StringConverter::CopyToCharArrayN(encoding));
2465         SysTryReturn(NID_WEB_CTRL, pUrl.get() && pMime.get() && pEncoding.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2466
2467         ewk_view_contents_set(__pWebCore->GetWebNativeNode(), reinterpret_cast< const char* >(content.GetPointer()), content.GetLimit(), pMime.get(), pEncoding.get(), pUrl.get());
2468
2469         return E_SUCCESS;
2470 }
2471
2472
2473 void
2474 _WebImpl::Pause(void)
2475 {
2476         ewk_view_suspend(__pWebCore->GetWebNativeNode());
2477 }
2478
2479
2480 void
2481 _WebImpl::Resume(void)
2482 {
2483         ewk_view_resume(__pWebCore->GetWebNativeNode());
2484 }
2485
2486
2487 result
2488 _WebImpl::ShowSelectBoxPopup(bool isMultiSelect, const String& title, Eina_List* pItems, Evas_Object* pWebView, int selectedIndex)
2489 {
2490         __pSelectBox.reset();
2491
2492         SysTryReturnResult(NID_WEB_CTRL, eina_list_count(pItems) > 0, E_SYSTEM, "ItemCount is invalid.");
2493
2494         result r = E_SUCCESS;
2495
2496         std::unique_ptr<_SelectBox> pSelectBox(new (std::nothrow) _SelectBox());
2497         SysTryReturnResult(NID_WEB_CTRL, pSelectBox.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
2498
2499         r = pSelectBox->Construct(isMultiSelect, title, DEFAULT_LIST_ITEM_COUNT, pWebView);
2500         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2501
2502         r = pSelectBox->UpdateList(pItems, selectedIndex, false, false);
2503         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2504
2505         __pSelectBox = std::move(pSelectBox);
2506
2507         return __pSelectBox->ShowPopup();
2508 }
2509
2510
2511 result
2512 _WebImpl::UpdateSelectBoxPopup(Eina_List* pItems, int selectedIndex, bool isGroupedList)
2513 {
2514         SysTryReturnResult(NID_WEB_CTRL, __pSelectBox.get(), E_SYSTEM, "SlectBox instance does not exist.");
2515
2516         return __pSelectBox->UpdateList(pItems, selectedIndex, true, isGroupedList);
2517 }
2518
2519
2520 result
2521 _WebImpl::ClearSelectBoxPopup(void)
2522 {
2523         SysTryReturnResult(NID_WEB_CTRL, __pSelectBox.get(), E_SYSTEM, "SlectBox instance does not exist.");
2524
2525         __pSelectBox.reset();
2526
2527         Resume();
2528
2529         return E_SUCCESS;
2530 }
2531
2532
2533 _InputPickerPopup*
2534 _WebImpl::GetDatepicker(void)
2535 {
2536         _InputPickerPopup* pInputPicker =null;
2537         if (__pDatePicker)
2538         {
2539                 pInputPicker =  __pDatePicker.get();
2540         }
2541         return pInputPicker;
2542 }
2543
2544
2545 _InputPickerPopup*
2546 _WebImpl::GetColorpicker(void)
2547 {
2548         _InputPickerPopup* pInputPicker =null;
2549         if (__pColorPicker)
2550         {
2551                 pInputPicker =  __pColorPicker.get();
2552         }
2553         return pInputPicker;
2554 }
2555
2556
2557 bool
2558 _WebImpl::CanGoBack(void) const
2559 {
2560         return static_cast< bool >(ewk_view_back_possible(__pWebCore->GetWebNativeNode()));
2561 }
2562
2563
2564 bool
2565 _WebImpl::CanGoForward(void) const
2566 {
2567         return static_cast< bool >(ewk_view_forward_possible(__pWebCore->GetWebNativeNode()));
2568 }
2569
2570
2571 void
2572 _WebImpl::GoBack(void) const
2573 {
2574         ewk_view_back(__pWebCore->GetWebNativeNode());
2575 }
2576
2577
2578 void
2579 _WebImpl::GoForward(void) const
2580 {
2581         ewk_view_forward(__pWebCore->GetWebNativeNode());
2582 }
2583
2584
2585 Tizen::Base::String
2586 _WebImpl::GetUrl(void) const
2587 {
2588         return ewk_view_url_get(__pWebCore->GetWebNativeNode());
2589 }
2590
2591
2592 Tizen::Base::String
2593 _WebImpl::GetTitle(void) const
2594 {
2595         return ewk_view_title_get(__pWebCore->GetWebNativeNode());
2596 }
2597
2598
2599 void
2600 _WebImpl::StopLoading(void) const
2601 {
2602         ewk_view_stop(__pWebCore->GetWebNativeNode());
2603 }
2604
2605
2606 void
2607 _WebImpl::Reload(void) const
2608 {
2609         ewk_view_reload(__pWebCore->GetWebNativeNode());
2610 }
2611
2612
2613 String*
2614 _WebImpl::EvaluateJavascriptN(const String& scriptCode)
2615 {
2616         Evas_Object* pView = __pWebCore->GetWebNativeNode();
2617         if (!pView)
2618         {
2619                 return null;
2620         }
2621         
2622         std::unique_ptr<char[]> pScript(_StringConverter::CopyToCharArrayN(scriptCode));
2623         SysTryReturn(NID_WEB_CTRL, pScript.get(), null, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2624
2625         std::unique_ptr<_WebPresenter> pPresenter(new (std::nothrow) _WebPresenter(this));
2626         SysTryReturn(NID_WEB_CTRL, pPresenter.get(), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2627
2628         ewk_view_script_execute(pView, pScript.get(), OnScriptExecuted, pPresenter.get());
2629
2630         String* pResult = new (std::nothrow) String(L"");
2631         SysTryReturn(NID_WEB_CTRL, pResult, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2632
2633         pPresenter->WaitAsyncProcess(*pResult);
2634
2635         return pResult;
2636 }
2637
2638
2639 result
2640 _WebImpl::SetZoomLevel(float level)
2641 {
2642         SysTryReturnResult(NID_WEB_CTRL, level >= MIN_ZOOM_LEVEL && level <= MAX_ZOOM_LEVEL, E_OUT_OF_RANGE, "The level(%f) must be between 0.3 and 2.0(%f).", level, level);
2643
2644         ewk_view_scale_set(__pWebCore->GetWebNativeNode(), static_cast< double >(level), 0, 0);
2645
2646         return E_SUCCESS;
2647 }
2648
2649
2650 float
2651 _WebImpl::GetZoomLevel(void) const
2652 {
2653         return static_cast< float >(ewk_view_scale_get(__pWebCore->GetWebNativeNode()));
2654 }
2655
2656
2657 const PageNavigationList*
2658 _WebImpl::GetBackForwardListN(void) const
2659 {
2660         Evas_Object* pView = __pWebCore->GetWebNativeNode();
2661         if (!pView)
2662         {
2663                 return null;
2664         }
2665
2666         result r = E_SUCCESS;
2667
2668         _PageNavigationListImpl* pNavigationListImpl = null;
2669         _HistoryItemImpl* pHistoryItemImpl = null;
2670
2671         std::unique_ptr<PageNavigationList> pNavigationList;
2672         std::unique_ptr<ArrayList, AllElementsDeleter> pHistoryList;
2673
2674         int backCount = 0;
2675         int forwardCount = 0;
2676
2677         String url(L"");
2678         String title(L"");
2679
2680         Ewk_History* pEwkHistoryList = ewk_view_history_get(pView);
2681         SysTryReturn(NID_WEB_CTRL, pEwkHistoryList, null, E_SYSTEM, "[%s] A system error has been occurred. Failed to get full history.", GetErrorMessage(E_SYSTEM));
2682
2683         Ewk_History_Item* pEwkItem = ewk_history_nth_item_get(pEwkHistoryList, 0);
2684         SysTryCatch(NID_WEB_CTRL, pEwkItem, , E_DATA_NOT_FOUND, "[%s] There is no history.", GetErrorMessage(E_DATA_NOT_FOUND));
2685
2686         pNavigationList = std::unique_ptr<PageNavigationList>(new (std::nothrow) PageNavigationList());
2687         SysTryCatch(NID_WEB_CTRL, pNavigationList.get(), , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2688
2689         pNavigationListImpl = _PageNavigationListImpl::GetInstance(pNavigationList.get());
2690         SysTryCatch(NID_WEB_CTRL, pNavigationListImpl, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2691
2692         pHistoryList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
2693         SysTryCatch(NID_WEB_CTRL, pHistoryList.get(), , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2694
2695         r = pHistoryList->Construct();
2696         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2697
2698         backCount = ewk_history_back_list_length_get(pEwkHistoryList);
2699         forwardCount = ewk_history_forward_list_length_get(pEwkHistoryList);
2700         SysLog(NID_WEB_CTRL, "The current value of backCount is %d, forwardCount is %d", backCount, forwardCount);
2701
2702         for (int i = -backCount; i < forwardCount + 1; i++)
2703         {
2704                 std::unique_ptr<HistoryItem> pHistoryItem(new (std::nothrow) HistoryItem());
2705                 SysTryCatch(NID_WEB_CTRL, pHistoryItem.get(), , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2706
2707                 pHistoryItemImpl = _HistoryItemImpl::GetInstance(pHistoryItem.get());
2708                 SysTryCatch(NID_WEB_CTRL, pHistoryItemImpl, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2709
2710                 pEwkItem = ewk_history_nth_item_get(pEwkHistoryList, i);
2711                 SysTryCatch(NID_WEB_CTRL, pEwkItem, , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2712
2713                 url = ewk_history_item_uri_get(pEwkItem);
2714                 title = ewk_history_item_title_get(pEwkItem);
2715                 SysSecureLog(NID_WEB_CTRL, "The current value of url is %s, title is %s", url.GetPointer(), title.GetPointer());
2716
2717                 pHistoryItemImpl->SetHistoryItem(url, title);
2718
2719                 r = pHistoryList->Add(*pHistoryItem.get());
2720                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2721                 pHistoryItem.release();
2722         }
2723
2724         pNavigationListImpl->SetPageNavigationList(pHistoryList.release(), backCount);
2725
2726         ewk_history_free(pEwkHistoryList);
2727
2728         return pNavigationList.release();
2729
2730 CATCH:
2731         ewk_history_free(pEwkHistoryList);
2732
2733         return null;
2734 }
2735
2736
2737 bool
2738 _WebImpl::SearchText(const String& text, bool searchForward)
2739 {
2740         Evas_Object* pView = __pWebCore->GetWebNativeNode();
2741         if (!pView)
2742         {
2743                 return false;
2744         }
2745
2746         result r = E_SUCCESS;
2747
2748         Ewk_Find_Options condition = static_cast< Ewk_Find_Options >(EWK_FIND_OPTIONS_SHOW_HIGHLIGHT | EWK_FIND_OPTIONS_CASE_INSENSITIVE);
2749
2750         if (!searchForward)
2751         {
2752             condition = static_cast < Ewk_Find_Options >(condition | EWK_FIND_OPTIONS_BACKWARDS);
2753         }
2754
2755         std::unique_ptr<_WebPresenter> pPresenter(new (std::nothrow) _WebPresenter(this));
2756         SysTryReturn(NID_WEB_CTRL, pPresenter.get(), false, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
2757
2758         r = SynchronizeSearch(SEARCH_SYNC, pView, condition, text, searchForward, false, pPresenter.get());
2759         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
2760
2761         int result = 0;
2762         pPresenter->WaitAsyncProcess(result);
2763
2764         return static_cast < bool >(result);
2765 }
2766
2767
2768 result
2769 _WebImpl::SearchTextAllAsync(const Tizen::Base::String& text, bool caseSensitive)
2770 {
2771         Evas_Object* pView = __pWebCore->GetWebNativeNode();
2772         if (!pView)
2773         {
2774                 return E_SUCCESS;
2775         }
2776
2777         result r = E_SUCCESS;
2778
2779         Ewk_Find_Options condition = EWK_FIND_OPTIONS_SHOW_HIGHLIGHT;
2780
2781         if (!caseSensitive)
2782         {
2783             condition = static_cast <Ewk_Find_Options>(condition | EWK_FIND_OPTIONS_CASE_INSENSITIVE);
2784         }
2785
2786         r = SynchronizeSearch(SEARCH_ALL_ASYNC, pView, condition, text, true, caseSensitive);
2787         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2788
2789         return E_SUCCESS;
2790 }
2791
2792
2793 result
2794 _WebImpl::SearchNextAsync(bool searchForward)
2795 {
2796         Evas_Object* pView = __pWebCore->GetWebNativeNode();
2797         if (!pView)
2798         {
2799                 return E_SUCCESS;
2800         }
2801
2802         SysTryReturnResult(NID_WEB_CTRL, __textSearch.__searchAll && __textSearch.__totalCount > -1, E_INVALID_OPERATION, "The SearchTextAllAsync() method is not called or completed.");
2803         SysTryReturnResult(NID_WEB_CTRL, (searchForward && __textSearch.__currentIndex < __textSearch.__totalCount) || (!searchForward && __textSearch.__currentIndex > 1)
2804                 , E_OBJ_NOT_FOUND,  "The Next instance is not available.");
2805
2806         result r = E_SUCCESS;
2807
2808         Ewk_Find_Options condition = EWK_FIND_OPTIONS_SHOW_HIGHLIGHT;
2809
2810         if (!__textSearch.__caseSensitive)
2811         {
2812                 condition = static_cast <Ewk_Find_Options>(condition | EWK_FIND_OPTIONS_CASE_INSENSITIVE);
2813         }
2814
2815         if (!searchForward)
2816         {
2817                 condition = static_cast <Ewk_Find_Options>(condition | EWK_FIND_OPTIONS_BACKWARDS);
2818         }
2819
2820         r = SynchronizeSearch(SEARCH_NEXT_ASYNC, pView, condition, __textSearch.__text, searchForward);
2821         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
2822
2823         return E_SUCCESS;
2824 }
2825
2826
2827 result
2828 _WebImpl::SynchronizeSearch(_SearchType type, Evas_Object* pView, Ewk_Find_Options condition, const Tizen::Base::String& text, bool searchForward, bool caseSensitive,  _WebPresenter* pWebPresenter)
2829 {
2830         MutexGuard lock(__mutex);
2831
2832         std::unique_ptr<char[]> pText(_StringConverter::CopyToCharArrayN(text));
2833         SysTryReturn(NID_WEB_CTRL, pText.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2834
2835         switch (type)
2836         {
2837         case SEARCH_SYNC:
2838                 if (__textSearch.__searchAll)
2839                 {
2840                         DisableAsyncSearch();
2841
2842                         __textSearch.__searchQueue.Enqueue(this);
2843                         __textSearch.__searchQueue.Enqueue(pWebPresenter);
2844
2845                         ewk_view_text_find(pView, "", condition, MAX_TEXT_MATCH);
2846                         ewk_view_text_find(pView, pText.get(), condition, MAX_TEXT_MATCH);
2847                 }
2848                 else
2849                 {
2850                         __textSearch.__searchQueue.Enqueue(pWebPresenter);
2851
2852                         ewk_view_text_find(pView, pText.get(), condition, MAX_TEXT_MATCH);
2853                 }
2854                 break;
2855
2856         case SEARCH_ALL_ASYNC:
2857                 __textSearch.__searchAll = true;
2858                 __textSearch.__text = text;
2859                 __textSearch.__searchForward = true;
2860                 __textSearch.__caseSensitive = caseSensitive;
2861                 __textSearch.__totalCount = -1;
2862                 __textSearch.__currentIndex = 1;
2863
2864                 __textSearch.__searchQueue.Enqueue(this);
2865                 __textSearch.__searchQueue.Enqueue(this);
2866
2867                 ewk_view_text_find(pView, "", condition, MAX_TEXT_MATCH);
2868                 ewk_view_text_find(pView, pText.get(), condition, MAX_TEXT_MATCH);
2869                 break;
2870
2871         case SEARCH_NEXT_ASYNC:
2872                 __textSearch.__searchForward = searchForward;
2873
2874                 CalculateAsyncSearchOrdinal();
2875
2876                 __textSearch.__searchQueue.Enqueue(this);
2877
2878                 ewk_view_text_find(pView, pText.get(), condition, MAX_TEXT_MATCH);
2879                 break;
2880
2881         default:
2882                 SysAssert(false);
2883         }
2884
2885         return E_SUCCESS;
2886 }
2887
2888
2889 void
2890 _WebImpl::SetAsyncSearchResult(int totalCount)
2891 {
2892         __textSearch.__totalCount = totalCount;
2893 }
2894
2895
2896 _WebPresenter*
2897 _WebImpl::GetSearchPresenter(void)
2898 {
2899         MutexGuard lock(__mutex);
2900
2901         return dynamic_cast< _WebPresenter* >(__textSearch.__searchQueue.Dequeue());
2902 }
2903
2904
2905  int
2906  _WebImpl::GetPendingAsyncSearchCount(void) const
2907 {
2908         return __textSearch.__searchQueue.GetCount();
2909 }
2910
2911
2912 void
2913 _WebImpl::CalculateAsyncSearchOrdinal(void)
2914 {
2915         if (__textSearch.__searchForward)
2916         {
2917                 __textSearch.__currentIndex++;
2918         }
2919         else
2920         {
2921                 __textSearch.__currentIndex--;
2922         }
2923 }
2924
2925
2926  int
2927  _WebImpl::GetAsyncSearchOrdinal(void) const
2928 {
2929         return __textSearch.__currentIndex;
2930 }
2931
2932
2933  void
2934  _WebImpl::DisableAsyncSearch(void)
2935 {
2936         __textSearch.__searchAll = false;
2937 }
2938
2939
2940 result
2941 _WebImpl::SetSetting(const WebSetting& setting)
2942 {
2943         if (__pWebCore->GetWebNativeNode())
2944         {
2945                 Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
2946                 Ewk_Settings* pSettings = ewk_view_settings_get(__pWebCore->GetWebNativeNode());
2947                 SysAssertf(pContext && pSettings, "Failed to get webkit instance.");
2948
2949                 std::unique_ptr<char[]> pEncoding(_StringConverter::CopyToCharArrayN(setting.GetDefaultTextEncoding()));
2950                 SysTryReturn(NID_WEB_CTRL, pEncoding.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2951
2952                 ewk_settings_default_encoding_set(pSettings, pEncoding.get());
2953
2954                 switch (setting.GetCacheControl())
2955                 {
2956                 case WEB_CACHE_VALIDATED:
2957                         ewk_context_cache_disabled_set(pContext, EINA_FALSE);
2958                         break;
2959
2960                 case WEB_CACHE_IGNORE:
2961                         ewk_context_cache_disabled_set(pContext, EINA_TRUE);
2962                         break;
2963
2964                 default:
2965                         SysAssert(false);
2966                 }
2967
2968                 if (setting.GetInputStyle() == INPUT_STYLE_OVERLAY)
2969                 {
2970                         ewk_settings_default_keypad_enabled_set(pSettings, EINA_TRUE);
2971                 }
2972                 else
2973                 {
2974                         ewk_settings_default_keypad_enabled_set(pSettings, EINA_FALSE);
2975                 }
2976
2977                 ewk_settings_font_default_size_set(pSettings, static_cast< Eina_Bool >(setting.GetFontSize()));
2978
2979                 ewk_settings_javascript_enabled_set(pSettings, static_cast< Eina_Bool >(setting.IsJavascriptEnabled()));
2980
2981                 ewk_settings_loads_images_automatically_set(pSettings, static_cast< Eina_Bool >(setting.IsAutoImageLoadEnabled()));
2982
2983                 if (__defaultUserAgent != setting.GetUserAgent())
2984                 {
2985                         std::unique_ptr<char[]> pAgent(_StringConverter::CopyToCharArrayN(setting.GetUserAgent()));
2986                         SysTryReturn(NID_WEB_CTRL, pAgent.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2987
2988                         ewk_view_user_agent_set(__pWebCore->GetWebNativeNode(), pAgent.get());
2989                 }
2990
2991                 ewk_settings_auto_fitting_set(pSettings, static_cast< Eina_Bool >(setting.IsAutoFittingEnabled()));
2992
2993                 ewk_settings_scripts_window_open_set(pSettings,  static_cast< Eina_Bool >(setting.IsJavaScriptPopupEnabled()));
2994
2995                 ewk_settings_form_candidate_data_enabled_set(pSettings,  static_cast< Eina_Bool >(setting.IsAutoFormDataShowEnabled()));
2996
2997                 ewk_settings_autofill_password_form_enabled_set(pSettings,  static_cast< Eina_Bool >(setting.IsAutoLoginFormFillEnabled()));
2998         }
2999
3000         _WebSettingImpl* pWebSettingImpl = _WebSettingImpl::GetInstance(__pWebCore->GetSetting());
3001
3002         pWebSettingImpl->SetCertificateErrorHandlingMode(setting.GetCertificateErrorHandlingMode());
3003         pWebSettingImpl->SetDefaultTextEncoding(setting.GetDefaultTextEncoding());
3004         pWebSettingImpl->SetCacheControl(setting.GetCacheControl());
3005         pWebSettingImpl->SetFontSize(setting.GetFontSize());
3006         pWebSettingImpl->SetJavascriptEnabled(setting.IsJavascriptEnabled());
3007         pWebSettingImpl->SetAutoImageLoadEnabled(setting.IsAutoImageLoadEnabled());
3008         pWebSettingImpl->SetInputStyle(setting.GetInputStyle());
3009         pWebSettingImpl->SetUserAgent(setting.GetUserAgent());
3010         pWebSettingImpl->SetAutoFittingEnabled(setting.IsAutoFittingEnabled());
3011         pWebSettingImpl->SetJavaScriptPopupEnabled(setting.IsJavaScriptPopupEnabled());
3012         pWebSettingImpl->SetGeolocationEnabled(setting.IsGeolocationEnabled());
3013         pWebSettingImpl->SetAutoFormDataShowEnabled(setting.IsAutoFormDataShowEnabled());
3014         pWebSettingImpl->SetAutoLoginFormFillEnabled(setting.IsAutoLoginFormFillEnabled());
3015
3016         return E_SUCCESS;
3017 }
3018
3019
3020 WebSetting
3021 _WebImpl::GetSetting(void) const
3022 {
3023         return *__pWebCore->GetSetting();
3024 }
3025
3026
3027 const HitElementResult*
3028 _WebImpl::GetElementByPointN(const Point& point) const
3029 {
3030         return GetElementByPointN(_CoordinateSystemUtils::ConvertToFloat(point));
3031 }
3032
3033
3034 const HitElementResult*
3035 _WebImpl::GetElementByPointN(const FloatPoint& point) const
3036 {
3037         Evas_Object* pView = __pWebCore->GetWebNativeNode();
3038         if (!pView)
3039         {
3040                 return null;
3041         }
3042
3043         SysTryReturn(NID_WEB_CTRL, Contains(point), null, E_INVALID_ARG, "[%s] The point must be contained in the bounds of a web control.", GetErrorMessage(E_INVALID_ARG));
3044
3045         result r = E_SUCCESS;
3046
3047         _HitElementResultImpl* pHitElementResultImpl = null;
3048
3049         std::unique_ptr<HitElementResult> pHitElementResult;
3050         std::unique_ptr<Bitmap> pImage;
3051         std::unique_ptr<HashMap, AllElementsDeleter> pAttributeMap;
3052
3053         Point absPoint(_CoordinateSystemUtils::ConvertToInteger(__pWebCore->GetAbsoluteCoordinate(point)));
3054
3055         Ewk_Hit_Test* pEwkHitTest = ewk_view_hit_test_new(pView, absPoint.x, absPoint.y, EWK_HIT_TEST_MODE_ALL);
3056         SysTryReturn(NID_WEB_CTRL, pEwkHitTest, null, E_SYSTEM, "[%s] Failed to get hit test.", GetErrorMessage(E_SYSTEM));
3057
3058         Eina_Hash* pAttrHash = ewk_hit_test_attribute_hash_get(pEwkHitTest);
3059         Ewk_Hit_Test_Result_Context context = ewk_hit_test_result_context_get(pEwkHitTest);
3060         String url(ewk_hit_test_link_uri_get(pEwkHitTest));
3061         String tagName(ewk_hit_test_tag_name_get(pEwkHitTest));
3062         String nodeValue(ewk_hit_test_node_value_get(pEwkHitTest));
3063
3064         SysSecureLog(NID_WEB_CTRL, "The current value of url is %ls, tag is %ls, value is %ls", url.GetPointer(), tagName.GetPointer(), nodeValue.GetPointer());
3065
3066         pHitElementResult = std::unique_ptr<HitElementResult>(new (std::nothrow) HitElementResult());
3067         SysTryCatch(NID_WEB_CTRL, pHitElementResult.get(), , E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
3068
3069         pHitElementResultImpl = _HitElementResultImpl::GetInstance(pHitElementResult.get());
3070         SysTryCatch(NID_WEB_CTRL, pHitElementResultImpl, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
3071
3072         if (context & EWK_HIT_TEST_RESULT_CONTEXT_IMAGE)
3073         {
3074                 ByteBuffer buf;
3075                 Image image;
3076                 ImageFormat format;
3077
3078                 int imageLength = ewk_hit_test_image_buffer_length_get(pEwkHitTest);
3079                 void* pImageBuffer = ewk_hit_test_image_buffer_get(pEwkHitTest);
3080                 const char* pExtension = ewk_hit_test_image_file_name_extension_get(pEwkHitTest);
3081                 SysLog(NID_WEB_CTRL, "The current value of imageBuffer is %u, bufferLength is %d, extension is %s", pImageBuffer, imageLength, pExtension);
3082
3083                 r = buf.Construct(imageLength);
3084                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3085
3086                 r = buf.SetArray(reinterpret_cast< byte* >(pImageBuffer), 0, imageLength);
3087                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3088
3089                 buf.Rewind();
3090
3091 //              ToDo : webkit doesn't support types such as IMG_FORMAT_WBMP and IMG_FORMAT_TIFF
3092 //              webkit support types such as ico and vp8 additionally
3093                 if (strcmp(pExtension, "gif") == 0)
3094                 {
3095                         format = IMG_FORMAT_GIF;
3096                 }
3097                 else if (strcmp(pExtension, "jpg") == 0)
3098                 {
3099                         format = IMG_FORMAT_JPG;
3100                 }
3101                 else if (strcmp(pExtension, "png") == 0)
3102                 {
3103                         format = IMG_FORMAT_PNG;
3104                 }
3105                 else if (strcmp(pExtension, "bmp") == 0)
3106                 {
3107                         format = IMG_FORMAT_BMP;
3108                 }
3109                 else
3110                 {
3111                         SysLogException(NID_WEB_CTRL, E_UNSUPPORTED_FORMAT, "[%s] The %s format is not supported", GetErrorMessage(E_UNSUPPORTED_FORMAT), pExtension);
3112                         goto CATCH;
3113                 }
3114
3115                 r = image.Construct();
3116                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3117
3118                 pImage = std::unique_ptr<Bitmap>(image.DecodeN(buf, format, BITMAP_PIXEL_FORMAT_RGB565));
3119                 SysTryCatch(NID_WEB_CTRL, pImage.get(), , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
3120         }
3121
3122         if (pAttrHash)
3123         {
3124                 pAttributeMap = std::unique_ptr<HashMap, AllElementsDeleter>(new (std::nothrow) HashMap());
3125                 SysTryCatch(NID_WEB_CTRL, pAttributeMap.get(), , E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
3126
3127                 r = pAttributeMap->Construct(eina_hash_population(pAttrHash));
3128                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3129
3130                 eina_hash_foreach(pAttrHash, AddHttpAttributeData, pAttributeMap.get());
3131                 SysTryCatch(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
3132         }
3133
3134         pHitElementResultImpl->SetHitElementResult(pAttributeMap.release(), pImage.release(), tagName, nodeValue, url);
3135
3136         ewk_hit_test_free(pEwkHitTest);
3137
3138         return pHitElementResult.release();
3139
3140 CATCH:
3141         ewk_hit_test_free(pEwkHitTest);
3142
3143         return null;
3144 }
3145
3146
3147 bool
3148 _WebImpl::IsLoading(void) const
3149 {
3150         double percent = ewk_view_load_progress_get(__pWebCore->GetWebNativeNode());
3151
3152         if (Double::Compare(percent, 0.0) > 0 && Double::Compare(percent, 1.0) < 0)
3153         {
3154                 return true;
3155         }
3156         else
3157         {
3158                 return false;
3159         }
3160 }
3161
3162
3163 String
3164 _WebImpl::GetTextFromBlock(void) const
3165 {
3166         return ewk_view_text_selection_text_get(__pWebCore->GetWebNativeNode());
3167 }
3168
3169
3170 bool
3171 _WebImpl::IsPrivateBrowsingEnabled(void) const
3172 {
3173         if (__pWebCore->GetWebNativeNode() == null)
3174         {
3175                 return _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->IsPrivateBrowsingEnabled();
3176         }
3177
3178         Ewk_Settings* pSettings = ewk_view_settings_get(__pWebCore->GetWebNativeNode());
3179         SysAssertf(pSettings, "Failed to get webkit instance.");
3180
3181         return static_cast< bool >(ewk_settings_private_browsing_enabled_get(pSettings));
3182 }
3183
3184
3185 void
3186 _WebImpl::SetPrivateBrowsingEnabled(bool enable)
3187 {
3188         if (__pWebCore->GetWebNativeNode() == null)
3189         {
3190                 _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->SetPrivateBrowsingEnabled(enable);
3191                 return;
3192         }
3193
3194         Ewk_Settings* pSettings = ewk_view_settings_get(__pWebCore->GetWebNativeNode());
3195         SysAssertf(pSettings, "Failed to get webkit instance.");
3196
3197         ewk_settings_private_browsing_enabled_set(pSettings, static_cast< Eina_Bool >(enable));
3198 }
3199
3200
3201 void
3202 _WebImpl::ClearHistory(void)
3203 {
3204         ewk_view_back_forward_list_clear(__pWebCore->GetWebNativeNode());
3205 }
3206
3207
3208 void
3209 _WebImpl::ClearCache(void)
3210 {
3211         Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
3212
3213         ewk_context_cache_clear(pContext);
3214 }
3215
3216
3217 void
3218 _WebImpl::ClearCookie(void)
3219 {
3220         Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
3221         Ewk_Cookie_Manager* pCookieManager =  ewk_context_cookie_manager_get(pContext);
3222
3223         ewk_cookie_manager_cookies_clear(pCookieManager);
3224 }
3225
3226
3227 void
3228 _WebImpl::ClearFormData(void)
3229 {
3230         Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
3231
3232         ewk_context_form_candidate_data_clear(pContext);
3233 }
3234
3235
3236 void
3237 _WebImpl::ClearLoginFormData(void)
3238 {
3239         Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
3240
3241         ewk_context_form_password_data_clear(pContext);
3242 }
3243
3244
3245 bool
3246 _WebImpl::IsCookieEnabled(void) const
3247 {
3248         if (__pWebCore->GetWebNativeNode() == null)
3249         {
3250                 return _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->IsCookieEnabled();
3251         }
3252
3253         Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
3254         Ewk_Cookie_Manager* pCookieManager =  ewk_context_cookie_manager_get(pContext);
3255         SysAssertf(pCookieManager, "Failed to get webkit instance.");
3256
3257         std::unique_ptr<_WebPresenter> pPresenter(new (std::nothrow) _WebPresenter(this));
3258         SysTryReturn(NID_WEB_CTRL, pPresenter.get(), false, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
3259
3260         ewk_cookie_manager_async_accept_policy_get(pCookieManager, OnCookiesPolicyGot, pPresenter.get());
3261
3262         bool result = false;
3263         pPresenter->WaitAsyncProcess(result);
3264
3265         return result;
3266 }
3267
3268
3269 void
3270 _WebImpl::SetCookieEnabled(bool enable)
3271 {
3272         if (__pWebCore->GetWebNativeNode() == null)
3273         {
3274                 _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->SetCookiEnabled(enable);
3275
3276                 return;
3277         }
3278
3279         Ewk_Context* pContext = ewk_view_context_get(__pWebCore->GetWebNativeNode());
3280         Ewk_Cookie_Manager* pCookieManager =  ewk_context_cookie_manager_get(pContext);
3281         SysAssertf(pCookieManager, "Failed to get webkit instance.");
3282
3283         if (enable)
3284         {
3285                 ewk_cookie_manager_accept_policy_set(pCookieManager, EWK_COOKIE_ACCEPT_POLICY_ALWAYS);
3286         }
3287         else
3288         {
3289                 ewk_cookie_manager_accept_policy_set(pCookieManager, EWK_COOKIE_ACCEPT_POLICY_NEVER);
3290                 ewk_cookie_manager_cookies_clear(pCookieManager);
3291         }
3292 }
3293
3294
3295 result 
3296 _WebImpl::SavePageAsPdf(const String& filePath, const Dimension* pSize) const
3297 {
3298         result r = E_SUCCESS;
3299
3300         std::unique_ptr<char[]> pFilePath(_StringConverter::CopyToCharArrayN(filePath));
3301         SysTryReturn(NID_WEB_CTRL, pFilePath.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
3302
3303         String dirPath;
3304         String fileExtension = File::GetFileExtension(filePath);
3305         int pathLength = filePath.GetLength();
3306         int index = 0;
3307
3308         SysTryReturnResult(NID_WEB_CTRL, fileExtension.Equals("pdf", false), E_INVALID_ARG, "Invalid argument(s) is used. File extension is not pdf.");
3309
3310         r = filePath.LastIndexOf(L"/", pathLength - 1, index);
3311         SysTryReturnResult(NID_WEB_CTRL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument(s) is used. Directory path is invalid.");
3312         r = filePath.SubString(0, index + 1, dirPath);
3313         SysTryReturnResult(NID_WEB_CTRL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument(s) is used. Directory path is invalid.");
3314
3315         std::unique_ptr<char[]> pDirPath(_StringConverter::CopyToCharArrayN(dirPath));
3316         SysTryReturnResult(NID_WEB_CTRL, access(pDirPath.get(), W_OK) == 0, E_INACCESSIBLE_PATH, "Directory permission is read-only.");
3317
3318         if (pSize)
3319         {
3320                 SysTryReturnResult(NID_WEB_CTRL, pSize->width > 0 && pSize->height > 0, E_INVALID_ARG, "Invalid argument(s) is used. Size of pdf file is invalid.");
3321
3322                 ewk_view_contents_pdf_get(__pWebCore->GetWebNativeNode(), pSize->width, pSize->height, pFilePath.get());
3323         }
3324         else
3325         {
3326                 Evas_Coord contentsWidth;
3327                 Evas_Coord contentsHeight;
3328
3329                 ewk_view_contents_size_get(__pWebCore->GetWebNativeNode(), &contentsWidth, &contentsHeight);
3330                 ewk_view_contents_pdf_get(__pWebCore->GetWebNativeNode(), contentsWidth, contentsHeight, pFilePath.get());
3331         }
3332
3333         return E_SUCCESS;
3334 }
3335
3336
3337 bool
3338 _WebImpl::IsMimeSupported(const String& mime) const
3339 {
3340         std::unique_ptr<char[]> pMime(_StringConverter::CopyToCharArrayN(mime));
3341         SysTryReturn(NID_WEB_CTRL, pMime.get(), false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
3342
3343         return static_cast< bool >(ewk_frame_can_show_mime_type(ewk_view_main_frame_get(__pWebCore->GetWebNativeNode()), pMime.get()));
3344 }
3345
3346
3347 void
3348 _WebImpl::SetLoadingListener(ILoadingListener* pLoadingListener)
3349 {
3350         __pUserLoadingListener = const_cast< ILoadingListener* >(pLoadingListener);
3351 }
3352
3353
3354 void
3355 _WebImpl::SetWebUiEventListener(IWebUiEventListener* pUiEventListener)
3356 {
3357         __pUserUiListener = pUiEventListener;
3358 }
3359
3360
3361 void
3362 _WebImpl::SetWebUiEventListenerF(IWebUiEventListenerF* pUiEventListener)
3363 {
3364         __pUserUiListenerF = pUiEventListener;
3365 }
3366
3367
3368 void
3369 _WebImpl::SetWebKeypadEventListener(IWebKeypadEventListener* pKeypadEventListener)
3370 {
3371         __pUserKeypadEventListener = pKeypadEventListener;
3372 }
3373
3374
3375 void
3376 _WebImpl::SetDownloadListener(IWebDownloadListener* pDownLoadListener)
3377 {
3378         if (__pWebDownloadHandler.get() == null)
3379         {
3380                 __pWebDownloadHandler = std::unique_ptr<_WebDataHandler>(new (std::nothrow) _WebDataHandler());
3381                 SysTryReturnVoidResult(NID_WEB_CTRL, __pWebDownloadHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
3382         }
3383
3384         __pWebDownloadHandler->SetDownloadListener(pDownLoadListener);
3385         __pWebDownloadHandler->SetWebEvent(__pWebEvent.get());
3386 }
3387
3388
3389 void
3390 _WebImpl::SetTextSearchListener(ITextSearchListener* pTextSearchListener)
3391 {
3392         __pTextSearchListener = pTextSearchListener;
3393 }
3394
3395
3396 void
3397 _WebImpl::SetScrollEnabled(bool enable)
3398 {
3399         _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->SetScrollEnabled(enable);
3400 }
3401
3402
3403 bool
3404 _WebImpl::IsScrollEnabled(void) const
3405 {
3406         return _WebSettingImpl::GetInstance(__pWebCore->GetSetting())->IsScrollEnabled();
3407 }
3408
3409
3410 result
3411 _WebImpl::InitJsBridgeList(void)
3412 {
3413         result r = E_SUCCESS;
3414
3415         __pJsProvider = std::unique_ptr<_JsBridgeHashCodeProvider>(new (std::nothrow) _JsBridgeHashCodeProvider());
3416         SysTryReturnResult(NID_WEB_CTRL, __pJsProvider.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
3417
3418         __pJsComparer = std::unique_ptr<_JsBridgeComparer>(new (std::nothrow) _JsBridgeComparer());
3419         SysTryReturnResult(NID_WEB_CTRL, __pJsComparer.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
3420
3421         std::unique_ptr<HashMapT< String, IJavaScriptBridge* > > pJsBridgeList(new (std::nothrow) HashMapT< String, IJavaScriptBridge* >);
3422         SysTryReturnResult(NID_WEB_CTRL, pJsBridgeList.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
3423
3424         r = pJsBridgeList->Construct(0, 0, *__pJsProvider.get(), *__pJsComparer.get());
3425         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3426
3427         __pJsBridgeList = std::move(pJsBridgeList);
3428
3429         return E_SUCCESS;
3430 }
3431
3432
3433 result
3434 _WebImpl::AddJavaScriptBridge(const IJavaScriptBridge& jsBridge)
3435 {
3436         result r = E_SUCCESS;
3437
3438         IJavaScriptBridge* pJsBridge = const_cast< IJavaScriptBridge* >(&jsBridge);
3439         String key(pJsBridge->GetName());
3440
3441         r = __pJsBridgeList->Add(key, pJsBridge);
3442         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3443
3444         return E_SUCCESS;
3445 }
3446
3447
3448 result
3449 _WebImpl::RemoveJavaScriptBridge(const IJavaScriptBridge& jsBridge)
3450 {
3451         result r = E_SUCCESS;
3452
3453         IJavaScriptBridge* pJsBridge = const_cast< IJavaScriptBridge* >(&jsBridge);
3454         String key(pJsBridge->GetName());
3455
3456         r = __pJsBridgeList->Remove(key);
3457         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3458
3459         return E_SUCCESS;
3460 }
3461
3462
3463 IJavaScriptBridge*
3464 _WebImpl::FindJsInterface(const IJsonValue* pValue) const
3465 {
3466         result r = E_SUCCESS;
3467
3468         IJsonValue* pJsonValue = null;
3469         IJavaScriptBridge* pJsBridge = null;
3470
3471         String key(L"name");
3472
3473         const JsonObject* pJsonObject = dynamic_cast< const JsonObject* >(pValue);
3474         SysTryReturn(NID_WEB_CTRL, pJsonObject, null, E_INVALID_ARG, "[%s] Invalid argument(s) is used. Json text must be Json Object type." , GetErrorMessage(E_INVALID_ARG));
3475
3476         r = pJsonObject->GetValue(&key, pJsonValue);
3477         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS && pJsonValue, null, r, "[%s] Propagating.", GetErrorMessage(r));
3478
3479         JsonString* pBridgeName = dynamic_cast< JsonString* >(pJsonValue);
3480         SysTryReturn(NID_WEB_CTRL, pBridgeName, null, E_INVALID_ARG, "[%s] Invalid argument(s) is used. name key is missing." , GetErrorMessage(E_INVALID_ARG));
3481
3482         r = __pJsBridgeList->GetValue(static_cast< String >(*pBridgeName), pJsBridge);
3483         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
3484
3485         return pJsBridge;
3486 }
3487
3488
3489 ILoadingListener*
3490 _WebImpl::GetLoadingListener(void) const
3491 {
3492         return __pUserLoadingListener;
3493 }
3494
3495
3496 IWebUiEventListener*
3497 _WebImpl::GetUiEventListener(void) const
3498 {
3499         return __pUserUiListener;
3500 }
3501
3502
3503 IWebUiEventListenerF*
3504 _WebImpl::GetUiEventListenerF(void) const
3505 {
3506         return __pUserUiListenerF;
3507 }
3508
3509
3510 IWebKeypadEventListener*
3511 _WebImpl::GetWebKeypadEventListener(void) const
3512 {
3513         return __pUserKeypadEventListener;
3514 }
3515
3516
3517 ITextSearchListener*
3518 _WebImpl::GetTextSearchListener(void) const
3519 {
3520         return __pTextSearchListener;
3521 }
3522
3523
3524 void
3525 _WebImpl::SetEventListenerCallback(void) const
3526 {
3527         Evas_Object* pWebNativeNode = __pWebCore->GetWebNativeNode();
3528         if (pWebNativeNode)
3529         {
3530                 _EcoreEvas* pEcoreEvas = GetEcoreEvasMgr()->GetEcoreEvas();
3531                 SysAssertf(pEcoreEvas, "Failed to get Ui ecore evas");
3532
3533                 Evas_Object* pWinObject = pEcoreEvas->GetWindowObject();
3534                 SysAssertf(pWinObject, "Failed to get Ui window evas object");
3535
3536                 Ewk_View_Smart_Data* pSmartData = (Ewk_View_Smart_Data*) evas_object_smart_data_get(pWebNativeNode);
3537                 SysAssertf(pSmartData, "Failed to request");
3538
3539                 Ewk_View_Smart_Class *pSmart = const_cast<Ewk_View_Smart_Class*>(pSmartData->api);
3540                 SysAssertf(pSmart, "Failed to request");
3541
3542                 pSmart->popup_menu_show = OnSelectBoxRequested;
3543                 pSmart->multiple_popup_menu_show = OnMultiSelectBoxRequested;
3544                 pSmart->popup_menu_hide = OnSelectBoxClosed;
3545                 pSmart->popup_menu_update = OnSelectBoxUpdateRequested;
3546
3547                 pSmart->input_picker_show = OnDatePickerProviderRequested;
3548                 pSmart->input_picker_color_request = OnColorPickerProviderRequested;
3549                 pSmart->input_picker_color_dismiss = OnColorPickerProviderDismissed;
3550
3551                 pSmart->formdata_candidate_show = OnFormDataCandidateShow;
3552                 pSmart->formdata_candidate_hide = OnFormDataCandidateHide;
3553                 pSmart->formdata_candidate_update_data = OnFormDataCandidateUpdate;
3554                 pSmart->formdata_candidate_is_showing = OnFormDataCandidateIsShowing;
3555
3556                 evas_object_data_set(pWebNativeNode, WEB_CTRL, this);
3557
3558                 // add loading event callbacks for ILoadingListener
3559                 evas_object_smart_callback_add(pWebNativeNode, "create,window", OnWebWindowCreateRequested, this);
3560                 evas_object_smart_callback_add(pWebNativeNode, "close,window", OnWebWindowClosedRequested, this);
3561
3562                 evas_object_smart_callback_add(pWebNativeNode, "policy,navigation,decide", OnLoadingRequested, this);
3563                 evas_object_smart_callback_add(pWebNativeNode, "load,started", OnLoadingStarted, this);
3564                 evas_object_smart_callback_add(pWebNativeNode, "load,finished", OnLoadingCompleted, this);
3565                 evas_object_smart_callback_add(pWebNativeNode, "load,progress", OnEstimatedProgress, this);
3566                 evas_object_smart_callback_add(pWebNativeNode, "load,progress,finished", OnProgressCompleted, this);
3567                 evas_object_smart_callback_add(pWebNativeNode, "load,stop", OnLoadingCanceled, this);
3568                 evas_object_smart_callback_add(pWebNativeNode, "load,error", OnLoadingErrorOccurred, this);
3569                 evas_object_smart_callback_add(pWebNativeNode, "title,changed", OnPageTitleReceived, this);
3570                 evas_object_smart_callback_add(pWebNativeNode, "load,committed", OnLoadingCommitted, this);
3571
3572                 evas_object_smart_callback_add(pWebNativeNode, "requestToNative,json", OnHandleJavaScriptRequest, this);
3573
3574                 evas_object_smart_callback_add(pWinObject, "focus,in", OnWindowObjectFocusGained, this);
3575                 evas_object_smart_callback_add(pWinObject, "focus,out", OnWindowObjectFocusLost, this);
3576
3577                 evas_object_smart_callback_add(pWebNativeNode, "inputmethod,changed", OnWebKeypadStateChanged, this);
3578                 evas_object_smart_callback_add(pWebNativeNode, "editorclient,ime,opened", OnWebKeypadOpened, this);
3579                 evas_object_smart_callback_add(pWebNativeNode, "editorclient,ime,closed", OnWebKeypadClosed, this);
3580
3581                 evas_object_smart_callback_add(pWebNativeNode, "authentication,challenge", OnHttpAuthenticationRequested, this);
3582                 evas_object_smart_callback_add(pWebNativeNode, "authentication,canceled", OnHttpAuthenticationCanceled, this);
3583
3584                 evas_object_smart_callback_add(pWebNativeNode, "geolocation,permission,request", OnGeolocationPermissionRequested, this);
3585
3586                 ewk_view_javascript_alert_callback_set(pWebNativeNode, OnScriptAlertRequested, const_cast< _WebImpl* >(this));
3587                 ewk_view_javascript_prompt_callback_set(pWebNativeNode, OnScriptPromptRequested, const_cast< _WebImpl* >(this));
3588                 ewk_view_javascript_confirm_callback_set(pWebNativeNode, OnScriptConfirmRequested, const_cast< _WebImpl* >(this));
3589
3590                 evas_object_smart_callback_add(pWebNativeNode, "policy,response,decide", OnWebDataReceived, this);
3591
3592                 evas_object_smart_callback_add(pWebNativeNode, "load,nonemptylayout,finished", OnWebPageShowRequested, this);
3593                 evas_object_smart_callback_add(pWebNativeNode, "request,certificate,confirm", OnCertificateRequested, this);
3594                 evas_object_smart_callback_add(pWebNativeNode, "usermedia,permission,request", OnGetUserMediaPermissionRequsted, this);
3595
3596                 evas_object_smart_callback_add(pWebNativeNode, "notification,permission,request", OnNotificationPermissionRequested, this);
3597                 evas_object_smart_callback_add(pWebNativeNode, "notification,show", OnNotificationShow, this);
3598                 evas_object_smart_callback_add(pWebNativeNode, "notification,cancel", OnNotificationCancel, this);
3599
3600                 evas_object_smart_callback_add(pWebNativeNode, "protocolhandler,registration,requested", OnProtocolHandlerRegistrationRequested, this);
3601                 evas_object_smart_callback_add(pWebNativeNode, "protocolhandler,isregistered", OnIsProtocolHandlerRegistered, this);
3602                 evas_object_smart_callback_add(pWebNativeNode, "protocolhandler,unregistration,requested", OnProtocolHandlerUnregistrationRequested, this);
3603
3604                 evas_object_smart_callback_add(pWebNativeNode, "contenthandler,registration,requested", OnContentHandlerRegistrationRequested, this);
3605                 evas_object_smart_callback_add(pWebNativeNode, "contenthandler,isregistered", OnIsContentHandlerRegistered, this);
3606                 evas_object_smart_callback_add(pWebNativeNode, "contenthandler,unregistration,requested", OnContentHandlerUnregistrationRequested, this);
3607                 evas_object_smart_callback_add(pWebNativeNode, "text,found", OnTextFound, this);
3608
3609                 evas_object_smart_callback_add(pWebNativeNode, "touchmove,handled", OnWebPreventDefaultTriggered, this);
3610                 evas_object_smart_callback_add(pWebNativeNode, "icon,received", OnFaviconReceived, this);
3611
3612                 evas_object_smart_callback_add(pWebNativeNode, "magnifier,hide", OnWebPageBlockSelected, this);
3613
3614                 evas_object_smart_callback_add(pWebNativeNode, "fullscreen,enterfullscreen", OnFullScreenEntered, this);
3615                 evas_object_smart_callback_add(pWebNativeNode, "fullscreen,exitfullscreen", OnFullScreenExited, this);
3616
3617                 evas_object_smart_callback_add(pWebNativeNode, "keyevent,down,not,handled", OnFocusDownRequested, this);
3618                 evas_object_smart_callback_add(pWebNativeNode, "keyevent,up,not,handled", OnFocusUpRequested, this);
3619
3620                 Ewk_Context* pContext = ewk_view_context_get(pWebNativeNode);
3621                 SysAssertf(pContext, "Failed to get webkit instance.");
3622                 ewk_context_did_start_download_callback_set(pContext, OnDidStartDownloadCallback, const_cast< _WebImpl* >(this));
3623                 ewk_context_vibration_client_callbacks_set(pContext, OnVibrationRequested, OnVibrationCanceled, const_cast< _WebImpl* >(this));
3624
3625                 ewk_view_application_cache_permission_callback_set(pWebNativeNode, OnApplicationCachePermissionRequested, const_cast< _WebImpl* >(this));
3626                 ewk_view_exceeded_indexed_database_quota_callback_set(pWebNativeNode, OnIndexedDatabaseQuotaExceeded, const_cast< _WebImpl* >(this));
3627                 ewk_view_exceeded_database_quota_callback_set(pWebNativeNode, OnDatabaseQuotaExceeded, const_cast< _WebImpl* >(this));
3628                 ewk_view_exceeded_local_file_system_quota_callback_set(pWebNativeNode, OnLocalFileSystemQuotaExceeded, const_cast< _WebImpl* >(this));
3629
3630                 evas_object_event_callback_add(pWebNativeNode, EVAS_CALLBACK_FOCUS_IN, OnWebNativeNodeFocusGained, this);
3631                 evas_object_event_callback_add(pWebNativeNode, EVAS_CALLBACK_FOCUS_OUT, OnWebNativeNodeFocusLost, this);
3632         }
3633 }
3634
3635
3636 void
3637 _WebImpl::RemoveEventListenerCallback(void) const
3638 {
3639         Evas_Object* pWebNativeNode = __pWebCore->GetWebNativeNode();
3640         if (pWebNativeNode)
3641         {
3642                 _EcoreEvas* pEcoreEvas = GetEcoreEvasMgr()->GetEcoreEvas();
3643                 SysAssertf(pEcoreEvas, "Failed to get Ui ecore evas");
3644
3645                 Evas_Object* pWinObject = pEcoreEvas->GetWindowObject();
3646                 SysAssertf(pWinObject, "Failed to get Ui window evas object");
3647
3648                 evas_object_smart_callback_del(pWebNativeNode, "create,window", OnWebWindowCreateRequested);
3649                 evas_object_smart_callback_del(pWebNativeNode, "close,window", OnWebWindowClosedRequested);
3650
3651                 evas_object_smart_callback_del(pWebNativeNode, "policy,navigation,decide", OnLoadingRequested);
3652                 evas_object_smart_callback_del(pWebNativeNode, "load,started", OnLoadingStarted);
3653                 evas_object_smart_callback_del(pWebNativeNode, "load,finished", OnLoadingCompleted);
3654                 evas_object_smart_callback_del(pWebNativeNode, "load,progress", OnEstimatedProgress);
3655                 evas_object_smart_callback_del(pWebNativeNode, "load,progress,finished", OnProgressCompleted);
3656                 evas_object_smart_callback_del(pWebNativeNode, "load,stop", OnLoadingCanceled);
3657                 evas_object_smart_callback_del(pWebNativeNode, "load,error", OnLoadingErrorOccurred);
3658                 evas_object_smart_callback_del(pWebNativeNode, "title,changed", OnPageTitleReceived);
3659                 evas_object_smart_callback_del(pWebNativeNode, "load,committed", OnLoadingCommitted);
3660
3661                 evas_object_smart_callback_del(pWebNativeNode, "requestToNative,json", OnHandleJavaScriptRequest);
3662
3663                 evas_object_smart_callback_del_full(pWinObject, "focus,in", OnWindowObjectFocusGained, this);
3664                 evas_object_smart_callback_del_full(pWinObject, "focus,out", OnWindowObjectFocusLost, this);
3665
3666                 evas_object_smart_callback_del(pWebNativeNode, "inputmethod,changed", OnWebKeypadStateChanged);
3667                 evas_object_smart_callback_del(pWebNativeNode, "editorclient,ime,opened", OnWebKeypadOpened);
3668                 evas_object_smart_callback_del(pWebNativeNode, "editorclient,ime,closed", OnWebKeypadClosed);
3669
3670                 evas_object_smart_callback_del(pWebNativeNode, "authentication,challenge", OnHttpAuthenticationRequested);
3671                 evas_object_smart_callback_del(pWebNativeNode, "authentication,canceled", OnHttpAuthenticationCanceled);
3672
3673                 evas_object_smart_callback_del(pWebNativeNode, "geolocation,permission,request", OnGeolocationPermissionRequested);
3674
3675                 ewk_view_javascript_alert_callback_set(pWebNativeNode, null, null);
3676                 ewk_view_javascript_prompt_callback_set(pWebNativeNode, null, null);
3677                 ewk_view_javascript_confirm_callback_set(pWebNativeNode, null, null);
3678
3679                 evas_object_smart_callback_del(pWebNativeNode, "policy,response,decide", OnWebDataReceived);
3680
3681                 evas_object_smart_callback_del(pWebNativeNode, "load,nonemptylayout,finished", OnWebPageShowRequested);
3682                 evas_object_smart_callback_del(pWebNativeNode, "request,certificate,confirm", OnCertificateRequested);
3683                 evas_object_smart_callback_del(pWebNativeNode, "usermedia,permission,request", OnGetUserMediaPermissionRequsted);
3684
3685                 evas_object_smart_callback_del(pWebNativeNode, "notification,permission,request", OnNotificationPermissionRequested);
3686                 evas_object_smart_callback_del(pWebNativeNode, "notification,show", OnNotificationShow);
3687                 evas_object_smart_callback_del(pWebNativeNode, "notification,cancel", OnNotificationCancel);
3688                 evas_object_smart_callback_del(pWebNativeNode, "protocolhandler,registration,requested", OnProtocolHandlerRegistrationRequested);
3689                 evas_object_smart_callback_del(pWebNativeNode, "protocolhandler,isregistered", OnIsProtocolHandlerRegistered);
3690                 evas_object_smart_callback_del(pWebNativeNode, "protocolhandler,unregistration,requested", OnProtocolHandlerUnregistrationRequested);
3691
3692                 evas_object_smart_callback_del(pWebNativeNode, "contenthandler,registration,requested", OnContentHandlerRegistrationRequested);
3693                 evas_object_smart_callback_del(pWebNativeNode, "contenthandler,isregistered", OnIsContentHandlerRegistered);
3694                 evas_object_smart_callback_del(pWebNativeNode, "contenthandler,unregistration,requested", OnContentHandlerUnregistrationRequested);
3695
3696                 evas_object_smart_callback_del(pWebNativeNode, "text,found", OnTextFound);
3697
3698                 evas_object_smart_callback_del(pWebNativeNode, "touchmove,handled", OnWebPreventDefaultTriggered);
3699                 evas_object_smart_callback_del(pWebNativeNode, "icon,received", OnFaviconReceived);
3700
3701                 evas_object_smart_callback_del(pWebNativeNode, "magnifier,hide", OnWebPageBlockSelected);
3702
3703                 evas_object_smart_callback_del(pWebNativeNode, "fullscreen,enterfullscreen", OnFullScreenEntered);
3704                 evas_object_smart_callback_del(pWebNativeNode, "fullscreen,exitfullscreen", OnFullScreenExited);
3705
3706                 evas_object_smart_callback_del(pWebNativeNode, "keyevent,down,not,handled", OnFocusDownRequested);
3707                 evas_object_smart_callback_del(pWebNativeNode, "keyevent,up,not,handled", OnFocusUpRequested);
3708
3709                 Ewk_Context* pContext = ewk_view_context_get(pWebNativeNode);
3710                 SysAssertf(pContext, "Failed to get webkit instance.");
3711                 ewk_context_vibration_client_callbacks_set(pContext, null, null, null);
3712
3713                 ewk_view_application_cache_permission_callback_set(pWebNativeNode, null, null);
3714                 ewk_view_exceeded_indexed_database_quota_callback_set(pWebNativeNode, null, null);
3715                 ewk_view_exceeded_database_quota_callback_set(pWebNativeNode, null, null);
3716                 ewk_view_exceeded_local_file_system_quota_callback_set(pWebNativeNode, null, null);
3717
3718                 evas_object_event_callback_del(pWebNativeNode, EVAS_CALLBACK_FOCUS_IN, OnWebNativeNodeFocusGained);
3719                 evas_object_event_callback_del(pWebNativeNode, EVAS_CALLBACK_FOCUS_OUT, OnWebNativeNodeFocusLost);
3720         }
3721 }
3722
3723
3724 void
3725 _WebImpl::ClearCertificateDb(void)
3726 {
3727         result r = E_SUCCESS;
3728
3729         String certificatePath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
3730         String table(CERTIFICATE_TABLE_NAME);
3731         _DatabaseImpl db;
3732
3733         r = db.Construct(certificatePath, "r+", null);
3734         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
3735
3736         db.BeginTransaction();
3737
3738         r = db.ExecuteSql(L"Delete From " + table, true);
3739         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
3740
3741         db.CommitTransaction();
3742
3743         return;
3744
3745 CATCH:
3746         db.RollbackTransaction();
3747 }
3748
3749
3750 result
3751 _WebImpl::SetBlockSelectionPosition(const Point& startPoint)
3752 {
3753         return SetBlockSelectionPosition(_CoordinateSystemUtils::ConvertToFloat(startPoint));
3754 }
3755
3756
3757 result
3758 _WebImpl::SetBlockSelectionPosition(const FloatPoint& startPoint)
3759 {
3760         Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
3761         if (!pWebview)
3762         {
3763                 return E_SUCCESS;
3764         }
3765
3766         SetFocused();
3767
3768         Ewk_View_Smart_Data* pSmartData = reinterpret_cast< Ewk_View_Smart_Data* >(evas_object_smart_data_get(pWebview));
3769         SysAssertf(pSmartData && pSmartData->api, "Failed to get webkit instance.");
3770         Point absPoint(_CoordinateSystemUtils::ConvertToInteger(__pWebCore->GetAbsoluteCoordinate(startPoint)));
3771
3772         Eina_Bool ret = pSmartData->api->text_selection_down(pSmartData, absPoint.x, absPoint.y);
3773         if (ret)
3774         {
3775                 pSmartData->api->text_selection_up(pSmartData, absPoint.x, absPoint.y);
3776
3777                 Ewk_Hit_Test* pEwkHitTest = ewk_view_hit_test_new(pWebview, absPoint.x, absPoint.y, EWK_HIT_TEST_MODE_ALL);
3778                 SysTryReturnResult(NID_WEB_CTRL, pEwkHitTest, E_SYSTEM, "Failed to get hit test.");
3779
3780                 String tagName(ewk_hit_test_tag_name_get(pEwkHitTest));
3781
3782                 Eina_Hash* pAttrHash = ewk_hit_test_attribute_hash_get(pEwkHitTest);
3783                 char* pValue = reinterpret_cast< char* >(eina_hash_find(pAttrHash, "contenteditable"));
3784                 if (tagName.Equals(L"INPUT", false) || tagName.Equals(L"TEXTAREA", false) || pValue)
3785                 {
3786                         ewk_view_command_execute(pWebview, "SelectWord", 0);
3787                         evas_object_smart_callback_call(pWebview, "magnifier,hide", NULL);
3788                 }
3789         }
3790
3791         SysTryReturnResult(NID_WEB_CTRL, GetTextFromBlock().GetLength() > 0, E_INVALID_ARG, "Failed to set text selection up.");
3792
3793         return E_SUCCESS;
3794 }
3795
3796
3797 void
3798 _WebImpl::ReleaseBlock(void)
3799 {
3800         ewk_view_text_selection_range_clear(__pWebCore->GetWebNativeNode());
3801 }
3802
3803
3804 void
3805 _WebImpl::GetBlockRange(Point& startPoint, Point& endPoint) const
3806 {
3807         FloatPoint tempStartPoint;
3808         FloatPoint tempEndPoint;
3809
3810         GetBlockRange(tempStartPoint, tempEndPoint);
3811
3812         startPoint = _CoordinateSystemUtils::ConvertToInteger(tempStartPoint);
3813         endPoint = _CoordinateSystemUtils::ConvertToInteger(tempEndPoint);
3814 }
3815
3816
3817 void
3818 _WebImpl::GetBlockRange(FloatPoint& startPoint, FloatPoint& endPoint) const
3819 {
3820         Eina_Rectangle leftHandle;
3821         Eina_Rectangle rightHandle;
3822
3823         EINA_RECTANGLE_SET(&leftHandle, 0, 0, 0, 0);
3824         EINA_RECTANGLE_SET(&rightHandle, 0, 0, 0, 0);
3825
3826         ewk_view_text_selection_range_get(__pWebCore->GetWebNativeNode(), &leftHandle, &rightHandle);
3827
3828         startPoint.x = _CoordinateSystemUtils::ConvertToFloat(leftHandle.x);
3829         startPoint.y = _CoordinateSystemUtils::ConvertToFloat(leftHandle.y);
3830         endPoint.x = _CoordinateSystemUtils::ConvertToFloat(rightHandle.x + rightHandle.w);
3831         endPoint.y = _CoordinateSystemUtils::ConvertToFloat(rightHandle.y + rightHandle.h);
3832
3833         if ((endPoint.x != 0.0f) && (endPoint.y != 0.0f))
3834         {
3835                 startPoint = __pWebCore->GetRelativeCoordinate(startPoint);
3836                 endPoint = __pWebCore->GetRelativeCoordinate(endPoint);
3837         }
3838 }
3839
3840
3841 Bitmap*
3842 _WebImpl::GetFaviconN(void) const
3843 {
3844         result r = E_SUCCESS;
3845
3846         Evas_Object* pView = __pWebCore->GetWebNativeNode();
3847         Ewk_Context* pContext = ewk_view_context_get(pView);
3848         const char* pUrl = ewk_view_url_get(pView);
3849         Evas* pEvas = evas_object_evas_get(pView);
3850
3851         Evas_Object* pFavicon = ewk_context_icon_database_icon_object_add(pContext, pUrl, pEvas);
3852         if (!pFavicon)
3853         {
3854                 return null;
3855         }
3856
3857         Tizen::Graphics::BufferInfo bufferInfo;
3858
3859         r = _Utility::GetPixelBufferFromEvasObject(pFavicon,  bufferInfo);
3860         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
3861
3862         const Dimension dimension(bufferInfo.width, bufferInfo.height);
3863         Tizen::Base::ByteBuffer byteBuffer;
3864         
3865         r = byteBuffer.Construct((byte*)bufferInfo.pPixels, 0, dimension.height * dimension.width * 32, dimension.height * dimension.width * 32 );
3866         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
3867
3868         std::unique_ptr<Bitmap> pImage(new (std::nothrow) Bitmap());
3869         SysTryReturn(NID_WEB_CTRL, pImage.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
3870
3871         r = pImage->Construct(byteBuffer, dimension, BITMAP_PIXEL_FORMAT_ARGB8888);
3872         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
3873
3874         return pImage.release();
3875
3876 }
3877
3878
3879 void
3880 _WebImpl::ScrollBy(const Tizen::Graphics::Point& diff)
3881 {
3882         ewk_view_scroll_by(__pWebCore->GetWebNativeNode(), diff.x, diff.y);
3883 }
3884
3885
3886 void
3887 _WebImpl::ScrollTo(const Tizen::Graphics::Point& dest)
3888 {
3889         ewk_view_scroll_set(__pWebCore->GetWebNativeNode(), dest.x, dest.y);
3890 }
3891
3892
3893 Point
3894 _WebImpl::GetScrollPosition(void) const
3895 {
3896         Point position;
3897
3898         ewk_view_scroll_pos_get(__pWebCore->GetWebNativeNode(), &position.x, &position.y);
3899
3900         return position;
3901 }
3902
3903
3904 Dimension
3905 _WebImpl::GetPageSize(void) const
3906 {
3907         Evas_Coord width = 0;
3908         Evas_Coord height = 0;
3909
3910         ewk_view_contents_size_get(__pWebCore->GetWebNativeNode(), &width, &height);
3911
3912         Dimension size(static_cast< int >(width), static_cast< int >(height));
3913
3914         return size;
3915 }
3916
3917
3918 result
3919 _WebImpl::AddHttpHeaderField(const String& name, const String& value)
3920 {
3921         SysTryReturnResult(NID_WEB_CTRL, name.GetLength() > 0, E_INVALID_ARG, "Invalid argument(s) is used. name key is missing.");
3922
3923         std::unique_ptr<char[]> pName(_StringConverter::CopyToCharArrayN(name));
3924         SysTryReturn(NID_WEB_CTRL, pName.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
3925
3926         std::unique_ptr<char[]> pValue(_StringConverter::CopyToCharArrayN(value));
3927
3928         ewk_view_custom_header_add(__pWebCore->GetWebNativeNode(), pName.get(), pValue.get());
3929
3930         return E_SUCCESS;
3931 }
3932
3933
3934 result
3935 _WebImpl::RemoveHttpHeaderField(const String& name)
3936 {
3937         SysTryReturnResult(NID_WEB_CTRL, name.GetLength() > 0, E_INVALID_ARG, "Invalid argument(s) is used. name key is missing.");
3938
3939         std::unique_ptr<char[]> pName(_StringConverter::CopyToCharArrayN(name));
3940         SysTryReturn(NID_WEB_CTRL, pName.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
3941
3942         ewk_view_custom_header_remove(__pWebCore->GetWebNativeNode(), pName.get());
3943
3944         return E_SUCCESS;
3945 }
3946
3947
3948 void
3949 _WebImpl::SetLoadingErrorOccurred(bool arg)
3950 {
3951         __isLoadingErrorOccurred = arg;
3952 }
3953
3954
3955 bool
3956 _WebImpl::IsLoadingErrorOccurred(void) const
3957 {
3958         return __isLoadingErrorOccurred;
3959 }
3960
3961
3962 void
3963 _WebImpl::SetRedirectRequested(bool arg)
3964 {
3965         __isRedirectRequested = arg;
3966 }
3967
3968
3969 bool
3970 _WebImpl::IsRedirectRequested(void) const
3971 {
3972         return __isRedirectRequested;
3973 }
3974
3975
3976 void
3977 _WebImpl::SetPolicyDecision(DecisionPolicy policy)
3978 {
3979         __policy = policy;
3980 }
3981
3982
3983 DecisionPolicy
3984 _WebImpl::GetPolicyDecision(void) const
3985 {
3986         return __policy;
3987 }
3988
3989
3990 void
3991 _WebImpl::SetCertificateRequested(bool arg)
3992 {
3993         __isCertificateRequested = arg;
3994 }
3995
3996
3997 bool
3998 _WebImpl::IsCertificateRequested(void) const
3999 {
4000         return __isCertificateRequested;
4001 }
4002
4003
4004 void
4005 _WebImpl::SetCertificateConfirmed(bool arg)
4006 {
4007         __isCertificateConfirmed = arg;
4008 }
4009
4010
4011 bool
4012 _WebImpl::IsCertificateConfirmed(void) const
4013 {
4014         return __isCertificateConfirmed;
4015 }
4016
4017
4018 result
4019 _WebImpl::SetFullScreenKeypad(void)
4020 {
4021         result r = E_SUCCESS;
4022
4023         std::unique_ptr<Keypad> pKeypad(new (std::nothrow) Keypad());
4024         SysTryReturnResult(NID_WEB_CTRL, pKeypad.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
4025
4026         r = pKeypad->Construct(KEYPAD_STYLE_NORMAL, 100);
4027         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4028
4029         String text(ewk_view_focused_input_element_value_get(__pWebCore->GetWebNativeNode()));
4030         pKeypad->SetText(text);
4031
4032         r = pKeypad->SetShowState(true);
4033         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4034
4035         r = pKeypad->Show();
4036         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4037
4038         pKeypad->AddTextEventListener(*this);
4039
4040         __pKeypad = std::move(pKeypad);
4041
4042         return E_SUCCESS;
4043 }
4044
4045
4046 void
4047 _WebImpl::RemoveFullScreenKeypad(void)
4048 {
4049         __pKeypad->RemoveTextEventListener(*this);
4050
4051         __pKeypad.reset();
4052 }
4053
4054
4055 bool
4056 _WebImpl::IsFooterVisible(void) const
4057 {
4058         return __isFooterVisible;
4059 }
4060
4061
4062 void
4063 _WebImpl::SetFooterVisibleState(bool isFooterVisible)
4064 {
4065         __isFooterVisible = isFooterVisible;
4066 }
4067
4068
4069 bool
4070 _WebImpl::IsKeypadVisible(void) const
4071 {
4072         return __isKeypadVisible;
4073 }
4074
4075
4076 void
4077 _WebImpl::SetKeypadVisibleState(bool isKeypadVisible)
4078 {
4079         __isKeypadVisible = isKeypadVisible;
4080 }
4081
4082
4083 bool 
4084 _WebImpl::IsKeypadOpened(void) const
4085 {
4086         return __isKeypadOpened;
4087 }
4088
4089 void 
4090 _WebImpl::SetKeypadOpened(bool isKeypadOpened)
4091 {
4092         __isKeypadOpened = isKeypadOpened;
4093 }
4094
4095
4096 bool
4097 _WebImpl::IsWinFocusLost(void) const
4098 {
4099         return __isWinFocusLost;
4100 }
4101
4102
4103 void
4104 _WebImpl::SetWinFocusLost(bool isWinFocusLost)
4105 {
4106         __isWinFocusLost = isWinFocusLost;
4107 }
4108
4109
4110 Rectangle
4111 _WebImpl::GetPreviousKeypadBounds(void) const
4112 {
4113         return __keypadBounds;
4114 }
4115
4116
4117 void 
4118 _WebImpl::SetPreviousKeypadBounds(Rectangle& bounds)
4119 {
4120         __keypadBounds = bounds;
4121 }
4122
4123
4124 void
4125 _WebImpl::OnTextValueChangeCanceled(const Control& source)
4126 {
4127         RemoveFullScreenKeypad();
4128 }
4129
4130
4131 void
4132 _WebImpl::OnTextValueChanged(const Control& source)
4133 {
4134         std::unique_ptr<char[]> pText(_StringConverter::CopyToCharArrayN(__pKeypad->GetText()));
4135
4136         ewk_view_focused_input_element_value_set(__pWebCore->GetWebNativeNode(), pText.get());
4137
4138         RemoveFullScreenKeypad();
4139 }
4140
4141
4142 result
4143 _WebImpl::OnHandleJavaScriptRequestByEventArg(const IEventArg& arg)
4144 {
4145         const _JsBridgeArg* pEventArg = dynamic_cast< const _JsBridgeArg* >(&arg);
4146         SysTryReturnResult(NID_WEB_CTRL, pEventArg, E_INVALID_ARG, "Invalid argument(s) is used. arg is not _JsBridgeArg object.");
4147
4148         std::unique_ptr<IJsonValue> pJsonValue(JsonParser::ParseN(*(pEventArg->GetJsonData())));
4149         SysTryReturn(NID_WEB_JSON, GetLastResult() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4150
4151         IJavaScriptBridge* pJsInterface = FindJsInterface(pJsonValue.get());
4152         SysTryReturnResult(NID_WEB_CTRL, pJsInterface, E_OBJ_NOT_FOUND, "JsInterface instance is not available.");
4153
4154         pJsInterface->HandleJavaScriptRequestN(pJsonValue.release());
4155
4156         return E_SUCCESS;
4157 }
4158
4159
4160 result
4161 _WebImpl::OnHandleLoadingEvent(const IEventArg& arg)
4162 {
4163         result r = E_SUCCESS;
4164
4165         const _LoadingEventArg* pEventArg = dynamic_cast< const _LoadingEventArg* >(&arg);
4166         SysTryReturnResult(NID_WEB_CTRL, pEventArg, E_INVALID_ARG, "Invalid argument(s) is used. Type casting failed. argument must be IEventArg type.");
4167
4168         SysLog(NID_WEB_CTRL, "The current value of event type is %d", pEventArg->GetEventType());
4169
4170         ILoadingListener* pLoadingListner = GetLoadingListener();
4171         SysTryReturnResult(NID_WEB_CTRL, pLoadingListner, E_SYSTEM, "A system error has been occurred. Loading listener was not set or null.");
4172
4173         switch (pEventArg->GetEventType())
4174         {
4175         case WEB_EVENT_LOADINGLISTENER_STARTED:
4176         {
4177                 pLoadingListner->OnLoadingStarted();
4178                 break;
4179         }
4180
4181         case WEB_EVENT_LOADINGLISTENER_PROGRESS:
4182         {
4183                 const Integer* pProgressPercentage = dynamic_cast< const Integer* >(pEventArg->GetEventInfo(_LoadingEventArg::ESTIMATED_PROGRESS));
4184                 SysTryReturn(NID_WEB_CTRL, pProgressPercentage, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4185
4186                 pLoadingListner->OnEstimatedProgress(pProgressPercentage->ToInt());
4187                 break;
4188         }
4189
4190         case WEB_EVENT_LOADINGLISTENER_PAGETITLE_RECEIVED:
4191         {
4192                 const String* pPageTitle = dynamic_cast< const String* >(pEventArg->GetEventInfo(_LoadingEventArg::PAGE_TITLE));
4193                 SysTryReturn(NID_WEB_CTRL, pPageTitle, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4194
4195                 pLoadingListner->OnPageTitleReceived(*pPageTitle);
4196                 break;
4197         }
4198
4199         case WEB_EVENT_LOADINGLISTENER_CANCELED:
4200         {
4201                 pLoadingListner->OnLoadingCanceled();
4202                 break;
4203         }
4204
4205         case WEB_EVENT_LOADINGLISTENER_ERROR_OCCURRED:
4206         {
4207                 const Integer* pErrorType = dynamic_cast< const Integer* >(pEventArg->GetEventInfo(_LoadingEventArg::ERROR_TYPE));
4208                 SysTryReturn(NID_WEB_CTRL, pErrorType, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4209
4210                 const String* pErrorMessage = dynamic_cast< const String* >(pEventArg->GetEventInfo(_LoadingEventArg::ERROR_MESSAGE));
4211                 SysTryReturn(NID_WEB_CTRL, pErrorMessage, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4212
4213                 LoadingErrorType errorType = ConvertErrorCode(pErrorType->ToInt());
4214
4215                 pLoadingListner->OnLoadingErrorOccurred(errorType, *pErrorMessage);
4216                 break;
4217         }
4218
4219         case WEB_EVENT_LOADINGLISTENER_COMPLETED:
4220         {
4221                 pLoadingListner->OnLoadingCompleted();
4222                 break;
4223         }
4224
4225         case WEB_EVENT_LOADINGLISTENER_AUTHENTICATION_CANCELED:
4226         {
4227                 pLoadingListner->OnHttpAuthenticationCanceled();
4228                 break;
4229         }
4230
4231         case WEB_EVENT_LOADINGLISTENER_FAVICON_RECEIVED:
4232         {
4233                 std::unique_ptr<Bitmap> pFavicon(GetFaviconN());
4234                 SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4235
4236                 if (pFavicon.get())
4237                 {
4238                         pLoadingListner->OnFaviconReceived(*pFavicon.get());
4239                 }
4240                 break;
4241         }
4242
4243         default:
4244         {
4245                 SysAssert(false);
4246         }
4247         }
4248
4249         return r;
4250 }
4251
4252
4253 result
4254 _WebImpl::OnHandleWebDownloadEvent(const IEventArg& arg)
4255 {
4256         result r = E_SUCCESS;
4257
4258         const _WebDownloadEventArg* pEventArg = dynamic_cast< const _WebDownloadEventArg* >(&arg);
4259         SysTryReturnResult(NID_WEB_CTRL, pEventArg, E_INVALID_ARG, "Invalid argument(s) is used. Type casting failed. argument must be IEventArg type.");
4260
4261         SysLog(NID_WEB_CTRL, "The current value of event type is %d", pEventArg->GetEventType());
4262
4263         IWebDownloadListener* pWebDownloadListener = __pWebDownloadHandler->GetDownloadListener();
4264         SysTryReturnResult(NID_WEB_CTRL, pWebDownloadListener, E_SYSTEM, "A system error has been occurred. Web Downloading listener was not set or null.");
4265
4266         switch (pEventArg->GetEventType())
4267         {
4268         case WEB_EVENT_WEBDOWNLOADLISTENER_DATA_RECEIVED:
4269         {
4270                 const ByteBuffer* pChunk = dynamic_cast< const ByteBuffer* >(pEventArg->GetEventInfo(_WebDownloadEventArg::CHUNKED_DATA));
4271                 SysTryReturn(NID_WEB_CTRL, pChunk, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4272
4273                 pWebDownloadListener->OnWebChunkedDataReceived(*pChunk);
4274                 break;
4275         }
4276
4277         case WEB_EVENT_WEBDOWNLOADLISTENER_COMPLETED:
4278         {
4279                 pWebDownloadListener->OnWebDataDownloadCompleted();
4280                 break;
4281         }
4282
4283         case WEB_EVENT_WEBDOWNLOADLISTENER_FAILED:
4284         {
4285                 const Integer* pErrorType = dynamic_cast< const Integer* >(pEventArg->GetEventInfo(_WebDownloadEventArg::ERROR_TYPE));
4286                 SysTryReturn(NID_WEB_CTRL, pErrorType, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4287
4288                 LoadingErrorType errorType = static_cast < LoadingErrorType >(pErrorType->ToInt());
4289
4290                 pWebDownloadListener->OnWebDownloadFailed(errorType);
4291                 break;
4292         }
4293
4294         default:
4295         {
4296                 SysAssert(false);
4297         }
4298         }
4299
4300         return r;
4301 }
4302
4303
4304 result
4305 _WebImpl::OnHandleWebUiEvent(const IEventArg& arg)
4306 {
4307         const _WebUiEventArg* pEventArg = dynamic_cast< const _WebUiEventArg* >(&arg);
4308         SysTryReturnResult(NID_WEB_CTRL, pEventArg, E_INVALID_ARG, "Invalid argument(s) is used. Type casting failed. argument must be IEventArg type.");
4309
4310         SysLog(NID_WEB_CTRL, "The current value of event type is %d", pEventArg->GetEventType());
4311
4312         SysTryReturnResult(NID_WEB_CTRL, __pUserUiListener, E_SYSTEM, "A system error has been occurred. Web UI listener was not set or null.");
4313
4314         switch (pEventArg->GetEventType())
4315         {
4316         case WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED:
4317         {
4318                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4319
4320                 Point* pStartPoint = const_cast< Point* >(dynamic_cast< const Point* >(pEventArg->GetEventInfo(_WebUiEventArg::BLOCK_START)));
4321                 SysTryReturn(NID_WEB_CTRL, pStartPoint, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4322
4323                 Point* pEndPoint = const_cast< Point* >(dynamic_cast< const Point* >(pEventArg->GetEventInfo(_WebUiEventArg::BLOCK_END)));
4324                 SysTryReturn(NID_WEB_CTRL, pEndPoint, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4325
4326                 __pUserUiListener->OnWebPageBlockSelected(*pWeb, *pStartPoint, *pEndPoint);
4327                 break;
4328         }
4329
4330         case WEB_EVENT_WEBUIEVENTLISTENER_PAGE_SHOW_REQUESTED:
4331         {
4332                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4333
4334                 __pUserUiListener->OnWebPageShowRequested(*pWeb);
4335                 break;
4336         }
4337
4338         case WEB_EVENT_WEBUIEVENTLISTENER_WINDOW_CLOSE_REQUSTED:
4339         {
4340                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4341
4342                 __pUserUiListener->OnWebWindowCloseRequested(*pWeb);
4343                 break;
4344         }
4345
4346         case WEB_EVENT_WEBUIEVENTLISTENER_PREVENT_DEFAULT_TRIGGERED:
4347         {
4348                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4349
4350                 Boolean* pTrigger = const_cast< Boolean* >(dynamic_cast< const Boolean* >(pEventArg->GetEventInfo(_WebUiEventArg::PREVENT_DEFAULT)));
4351                 SysTryReturn(NID_WEB_CTRL, pTrigger, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4352
4353                 __pUserUiListener->OnWebPreventDefaultTriggered(*pWeb, pTrigger->ToBool());
4354                 break;
4355         }
4356
4357         default:
4358         {
4359                 SysAssert(false);
4360         }
4361         }
4362
4363         return E_SUCCESS;
4364 }
4365
4366
4367 result
4368 _WebImpl::OnHandleWebUiEventF(const IEventArg& arg)
4369 {
4370         const _WebUiEventArg* pEventArg = dynamic_cast< const _WebUiEventArg* >(&arg);
4371         SysTryReturnResult(NID_WEB_CTRL, pEventArg, E_INVALID_ARG, "Invalid argument(s) is used. Type casting failed. argument must be IEventArg type.");
4372
4373         SysLog(NID_WEB_CTRL, "The current value of event type is %d", pEventArg->GetEventType());
4374
4375         SysTryReturnResult(NID_WEB_CTRL, __pUserUiListenerF, E_SYSTEM, "A system error has been occurred. Web UI listener was not set or null.");
4376
4377         switch (pEventArg->GetEventType())
4378         {
4379         case WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED_FLOAT:
4380         {
4381                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4382
4383                 FloatPoint* pStartPoint = const_cast< FloatPoint* >(dynamic_cast< const FloatPoint* >(pEventArg->GetEventInfo(_WebUiEventArg::BLOCK_START)));
4384                 SysTryReturn(NID_WEB_CTRL, pStartPoint, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4385
4386                 FloatPoint* pEndPoint = const_cast< FloatPoint* >(dynamic_cast< const FloatPoint* >(pEventArg->GetEventInfo(_WebUiEventArg::BLOCK_END)));
4387                 SysTryReturn(NID_WEB_CTRL, pEndPoint, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4388
4389                 __pUserUiListenerF->OnWebPageBlockSelected(*pWeb, *pStartPoint, *pEndPoint);
4390                 break;
4391         }
4392
4393         case WEB_EVENT_WEBUIEVENTLISTENER_PAGE_SHOW_REQUESTED_FLOAT:
4394         {
4395                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4396
4397                 __pUserUiListenerF->OnWebPageShowRequested(*pWeb);
4398                 break;
4399         }
4400
4401         case WEB_EVENT_WEBUIEVENTLISTENER_WINDOW_CLOSE_REQUSTED_FLOAT:
4402         {
4403                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4404
4405                 __pUserUiListenerF->OnWebWindowCloseRequested(*pWeb);
4406                 break;
4407         }
4408
4409         case WEB_EVENT_WEBUIEVENTLISTENER_PREVENT_DEFAULT_TRIGGERED_FLOAT:
4410         {
4411                 Web* pWeb = dynamic_cast< Web* >(&(this->GetPublic()));
4412
4413                 Boolean* pTrigger = const_cast< Boolean* >(dynamic_cast< const Boolean* >(pEventArg->GetEventInfo(_WebUiEventArg::PREVENT_DEFAULT)));
4414                 SysTryReturn(NID_WEB_CTRL, pTrigger, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4415
4416                 __pUserUiListenerF->OnWebPreventDefaultTriggered(*pWeb, pTrigger->ToBool());
4417                 break;
4418         }
4419
4420         default:
4421         {
4422                 SysAssert(false);
4423         }
4424         }
4425
4426         return E_SUCCESS;
4427 }
4428
4429
4430 result
4431 _WebImpl::OnHandleTextSearchEvent(const IEventArg& arg)
4432 {
4433         result r = E_SUCCESS;
4434
4435         const _TextSearchEventArg* pEventArg = dynamic_cast< const _TextSearchEventArg* >(&arg);
4436         SysTryReturnResult(NID_WEB_CTRL, pEventArg, E_INVALID_ARG, "Invalid argument(s) is used. Type casting failed. argument must be IEventArg type.");
4437
4438         SysLog(NID_WEB_CTRL, "The current value of event type is %d", pEventArg->GetEventType());
4439
4440         ITextSearchListener* pTextSearchListner = GetTextSearchListener();
4441         SysTryReturnResult(NID_WEB_CTRL, pTextSearchListner, E_SYSTEM, "A system error has been occurred. Web text search listener was not set or null.");
4442
4443         switch (pEventArg->GetEventType())
4444         {
4445         case WEB_EVENT_TEXTSEARCHLISTENER_TEXT_FOUND:
4446         {
4447                 Integer* pTotalCount= dynamic_cast< Integer* >(const_cast< Object* >(pEventArg->GetEventInfo(_TextSearchEventArg::TOTAL_COUNT)));
4448                 SysTryReturn(NID_WEB_CTRL, pTotalCount, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4449
4450                 Integer* pCurrentOrdinal = dynamic_cast< Integer* >(const_cast< Object* >(pEventArg->GetEventInfo(_TextSearchEventArg::CURRENT_ORDINAL)));
4451                 SysTryReturn(NID_WEB_CTRL, pCurrentOrdinal, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4452
4453                 pTextSearchListner->OnTextFound(pTotalCount->ToInt(), pCurrentOrdinal->ToInt());
4454                 break;
4455         }
4456
4457         default:
4458         {
4459                 SysAssert(false);
4460         }
4461         }
4462
4463         return r;
4464 }
4465
4466
4467 result
4468 _WebImpl::VibrationRequested(uint64_t duration)
4469 {
4470         result r = E_SUCCESS;
4471
4472         __pVibrator.reset();
4473
4474         std::unique_ptr<_VibratorImpl> pVibrator(new (std::nothrow) _VibratorImpl);
4475         SysTryReturnResult(NID_WEB_CTRL, pVibrator.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
4476
4477         r = pVibrator->Construct();
4478         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4479
4480         __pVibrator = std::move(pVibrator);
4481
4482         IntensityDurationVibrationPattern pattern = {static_cast< int >(duration), -1};
4483
4484         r = __pVibrator->Start(&pattern, 1, 1);
4485         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4486
4487         return E_SUCCESS;
4488 }
4489
4490
4491 void
4492 _WebImpl::VibrationCanceled(void)
4493 {
4494         __pVibrator.reset();
4495 }
4496
4497
4498 result
4499 _WebImpl::HttpAuthenticationRequested(Ewk_Auth_Challenge* pChallenge)
4500 {
4501         result r = E_SUCCESS;
4502
4503         String host(ewk_auth_challenge_url_get(pChallenge));
4504         String realm(ewk_auth_challenge_realm_get(pChallenge));
4505
4506         __pAuthChallenge.reset();
4507
4508         std::unique_ptr<AuthenticationChallenge> pAuthChallenge(new (std::nothrow) AuthenticationChallenge());
4509         SysTryReturnResult(NID_WEB_CTRL, pAuthChallenge, E_OUT_OF_MEMORY, "Memory Allocation failed.");
4510
4511         _AuthenticationChallengeImpl* pAuthImpl = _AuthenticationChallengeImpl::GetInstance(pAuthChallenge.get());
4512         SysTryReturn(NID_WEB_CTRL, pAuthImpl,  GetLastResult(),  GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
4513
4514         pAuthImpl->SetAuthenticationChallengeHandler(pChallenge);
4515         pAuthImpl->SetWebEvasObject(__pWebCore->GetWebNativeNode());
4516
4517         __pAuthChallenge = std::move(pAuthChallenge);
4518
4519         ewk_auth_challenge_suspend(pChallenge);
4520         if (__pUserLoadingListener && __pUserLoadingListener->OnHttpAuthenticationRequestedN(host, realm, *__pAuthChallenge.get()))
4521         {
4522                 __pAuthChallenge.release();
4523         }
4524         else
4525         {
4526                 r = ShowAuthenticationPopup(host, realm, __pAuthChallenge.get());
4527                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4528         }
4529
4530         return E_SUCCESS;
4531 }
4532
4533
4534 result
4535 _WebImpl::ShowAuthenticationPopup(const String& host, const String& realm, AuthenticationChallenge* pAuthChallenge)
4536 {
4537         result r = E_SUCCESS;
4538
4539         std::unique_ptr<_AuthConfirmPopup> pAuthPopup(new (std::nothrow) _AuthConfirmPopup());
4540         SysTryReturnResult(NID_WEB_CTRL, pAuthPopup, E_OUT_OF_MEMORY, "Memory Allocation failed.");
4541
4542         r = pAuthPopup->Construct(host, realm, pAuthChallenge);
4543         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4544
4545         __pAuthPopup = std::move(pAuthPopup);
4546
4547         int modalResult = 0;
4548
4549         r = __pAuthPopup->ShowAndWait(modalResult);
4550         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4551
4552 CATCH:
4553         if (__pAuthPopup)
4554         {
4555                 __pAuthPopup.reset();
4556         }
4557
4558         return r;
4559 }
4560
4561
4562 result
4563 _WebImpl::ShowCertificateConfirmPopup(_CertificatePopupMode userConfirmMode, Ewk_Certificate_Policy_Decision* pPolicy)
4564 {
4565         result r = E_SUCCESS;
4566
4567         std::unique_ptr<_CertificateConfirmPopup> pCertConfirmPopup(new (std::nothrow) _CertificateConfirmPopup());
4568         SysTryReturnResult(NID_WEB_CTRL, pCertConfirmPopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
4569
4570         r = pCertConfirmPopup->Construct(userConfirmMode, pPolicy);
4571         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4572
4573         __pCertConfirmPopup = std::move(pCertConfirmPopup);
4574
4575         int modalResult = 0;
4576
4577         r = __pCertConfirmPopup->ShowAndWait(modalResult);
4578         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4579
4580         if (__pCertConfirmPopup.get() && userConfirmMode == CERTIFICATE_POPUP_MODE_USER_CONFIRM)
4581         {
4582                 __isCertificateConfirmed = __pCertConfirmPopup->GetConfirmResult();
4583         }
4584
4585 CATCH:
4586         if (__pCertConfirmPopup.get())
4587         {
4588                 __pCertConfirmPopup.reset();
4589         }
4590
4591         return r;
4592 }
4593
4594
4595 result
4596 _WebImpl::ShowPromptPopup(String msg, String defVal)
4597 {
4598         result r = E_SUCCESS;
4599
4600         std::unique_ptr< _PromptPopup > pPromptPopup(new (std::nothrow) _PromptPopup());
4601         SysTryReturnResult(NID_WEB_CTRL, pPromptPopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
4602
4603         r = pPromptPopup->Construct(msg, defVal, __pWebCore->GetWebNativeNode(), this);
4604         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4605
4606         __pPromptPopup = std::move(pPromptPopup);
4607
4608         r = __pPromptPopup->ShowPopup();
4609         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
4610
4611         return E_SUCCESS;
4612
4613 CATCH:
4614         __pPromptPopup.reset();
4615
4616         return r;
4617
4618 }
4619
4620
4621 result
4622 _WebImpl::ShowUserConfirmPopup(_UserConfirmMode userConfirmMode, void* pPolicy, String msg)
4623 {
4624         result r = E_SUCCESS;
4625
4626         std::unique_ptr<_UserConfirmPopup> pUserConfirmPopup(new (std::nothrow) _UserConfirmPopup());
4627         SysTryReturnResult(NID_WEB_CTRL, pUserConfirmPopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
4628
4629         r = pUserConfirmPopup->Construct(userConfirmMode, pPolicy, this, true, msg);
4630         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4631
4632         int modalResult = 0;
4633
4634         switch(userConfirmMode)
4635         {
4636         case USER_CONTENT_HANDLER:
4637         {
4638                 __pContentHandlerConfirmPopup = std::move(pUserConfirmPopup);
4639
4640                 r = __pContentHandlerConfirmPopup->ShowAndWait(modalResult);
4641                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pContentHandlerConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4642
4643                 __pContentHandlerConfirmPopup.reset();
4644
4645                 ewk_view_resume(__pWebCore->GetWebNativeNode());
4646
4647                 break;
4648         }
4649         case USER_PROTOCOL_HANDLER:
4650         {
4651                 __pProtocolHandlerConfirmPopup = std::move(pUserConfirmPopup);
4652
4653                 r = __pProtocolHandlerConfirmPopup->ShowAndWait(modalResult);
4654                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pProtocolHandlerConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4655
4656                 __pProtocolHandlerConfirmPopup.reset();
4657
4658                 ewk_view_resume(__pWebCore->GetWebNativeNode());
4659
4660                 break;
4661         }
4662         case USER_CONFIRM_APP_CACHE:
4663         {
4664                 __pAppCacheConfirmPopup = std::move(pUserConfirmPopup);
4665
4666                 r = __pAppCacheConfirmPopup->ShowAndWait(modalResult);
4667                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pAppCacheConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4668
4669                 __pAppCacheConfirmPopup.reset();
4670
4671                 ewk_view_resume(__pWebCore->GetWebNativeNode());
4672
4673                 break;
4674         }
4675         case USER_CONFIRM_DB_QUOTA_EXCEDED:
4676         {
4677                 __pDbQuotaConfirmPopup = std::move(pUserConfirmPopup);
4678
4679                 r = __pDbQuotaConfirmPopup->ShowAndWait(modalResult);
4680                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pDbQuotaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4681
4682                 __pDbQuotaConfirmPopup.reset();
4683
4684                 ewk_view_resume(__pWebCore->GetWebNativeNode());
4685
4686                 break;
4687         }
4688         case USER_CONFIRM_LOCAL_FS_QUOTA_EXCEDED:
4689         {
4690                 __pLocalFsQuotaConfirmPopup = std::move(pUserConfirmPopup);
4691
4692                 r = __pLocalFsQuotaConfirmPopup->ShowAndWait(modalResult);
4693                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pLocalFsQuotaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4694
4695                 __pLocalFsQuotaConfirmPopup.reset();
4696
4697                 ewk_view_resume(__pWebCore->GetWebNativeNode());
4698
4699                 break;
4700         }
4701         case USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED:
4702         {
4703                 __pIndexedDbQuotaConfirmPopup = std::move(pUserConfirmPopup);
4704
4705                 r = __pIndexedDbQuotaConfirmPopup->ShowAndWait(modalResult);
4706                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pIndexedDbQuotaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4707
4708                 __pIndexedDbQuotaConfirmPopup.reset();
4709
4710                 ewk_view_resume(__pWebCore->GetWebNativeNode());
4711
4712                 break;
4713         }
4714         default:
4715                 break;
4716         }
4717 CATCH:
4718                 return r;
4719 }
4720
4721
4722 result
4723 _WebImpl::ShowUserConfirmPopupAsync(_UserConfirmMode userConfirmMode, void* pPolicy, String msg)
4724 {
4725         result r = E_SUCCESS;
4726
4727         std::unique_ptr<_UserConfirmPopup> pUserConfirmPopup(new (std::nothrow) _UserConfirmPopup());
4728         SysTryReturnResult(NID_WEB_CTRL, pUserConfirmPopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
4729
4730         r = pUserConfirmPopup->Construct(userConfirmMode, pPolicy, this, false, msg);
4731         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4732
4733         switch(userConfirmMode)
4734         {
4735         case USER_CONFIRM_USERMEDIA:
4736         {
4737                 __pUserMediaConfirmPopup.reset();
4738
4739                 __pUserMediaConfirmPopup = std::move(pUserConfirmPopup);
4740
4741                 r = __pUserMediaConfirmPopup->ShowPopup();
4742                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pUserMediaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4743
4744                 break;
4745         }
4746         case USER_CONFIRM_GEOLOCATION:
4747         {
4748                 __pGeolocationConfirmPopup.reset();
4749
4750                 __pGeolocationConfirmPopup = std::move(pUserConfirmPopup);
4751
4752                 r = __pGeolocationConfirmPopup->ShowPopup();
4753                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pGeolocationConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4754
4755                 break;
4756         }
4757         case USER_CONFIRM_NOTIFICATION:
4758         {
4759                 __pNotificationConfirmPopup.reset();
4760
4761                 __pNotificationConfirmPopup = std::move(pUserConfirmPopup);
4762
4763                 r = __pNotificationConfirmPopup->ShowPopup();
4764                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pNotificationConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4765
4766                 break;
4767         }
4768         case USER_SCRIPT_ALERT:
4769         {
4770                 __pScriptAlertConfirmPopup.reset();
4771
4772                 __pScriptAlertConfirmPopup = std::move(pUserConfirmPopup);
4773
4774                 r = __pScriptAlertConfirmPopup->ShowPopup();
4775                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pScriptAlertConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4776
4777                 break;
4778         }
4779         case USER_SCRIPT_CONFIRM:
4780         {
4781                 __pScriptConfirmPopup.reset();
4782
4783                 __pScriptConfirmPopup = std::move(pUserConfirmPopup);
4784
4785                 r = __pScriptConfirmPopup->ShowPopup();
4786                 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pScriptConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
4787
4788                 break;
4789         }
4790         default:
4791                 break;
4792         }
4793
4794         return E_SUCCESS;
4795
4796 CATCH:
4797         return r;
4798 }
4799
4800
4801 _FormImpl*
4802 _WebImpl::GetParentFormImpl(_ControlImpl* pControlImpl)
4803 {
4804         String parentName;
4805         _FormImpl* pFormImpl = null;
4806
4807         _ControlImpl* pParentControlImpl = dynamic_cast< _ControlImpl* >(pControlImpl->GetParent());
4808         if (!pParentControlImpl)
4809         {
4810                 return null;
4811         }
4812
4813         pFormImpl = dynamic_cast< _FormImpl* >(pParentControlImpl);
4814         if (pFormImpl)
4815         {
4816                 return pFormImpl;
4817         }
4818
4819         return GetParentFormImpl(pParentControlImpl);
4820 }
4821
4822
4823 bool 
4824 _WebImpl::OnFocusGained(const _ControlImpl& source)
4825 {
4826         return false;
4827 }
4828
4829
4830 bool 
4831 _WebImpl::OnFocusLost(const _ControlImpl& source)
4832 {
4833         Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
4834         if (!pWebview)
4835         {
4836                 return false;
4837         }
4838
4839         if(IsKeypadVisible() == true)
4840         {
4841                 SetKeypadOpened(true);
4842         }
4843
4844         return false;
4845 }
4846
4847
4848 bool
4849 _WebImpl::HasValidNativeNode(void) const
4850 {
4851         if (__pWebCore && __pWebCore->GetWebNativeNode())
4852         {
4853                 return true;
4854         }
4855
4856         return false;
4857 }
4858
4859
4860 result
4861 _WebImpl::OnPreAttachedToMainTree(void)
4862 {
4863         result r = E_SUCCESS;
4864
4865         if (IsVisible() == true)
4866         {
4867                 _WebManager* pWebManager = _WebManager::GetInstance();
4868                 pWebManager->SetActiveWeb(this);
4869         }
4870
4871         r = _ContainerImpl::OnPreAttachedToMainTree();
4872         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4873
4874         if (!HasValidNativeNode())
4875         {
4876                 r = __pWebCore->InitializeWebNativeNode();
4877                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4878
4879                 _ControlManager* pControlManager = _ControlManager::GetInstance();
4880                 SysTryReturnResult(NID_WEB_CTRL, pControlManager, E_SYSTEM, "Failed to get the ControlManager instance.");
4881                 OnChangeLayout(pControlManager->GetScreenRotation());
4882
4883                 r = InitializeSetting();
4884                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4885
4886                 _WebManager* pWebManager = _WebManager::GetInstance();
4887                 pWebManager->AddWeb(reinterpret_cast< int >(this));
4888         }
4889
4890         return E_SUCCESS;
4891 }
4892
4893
4894 result
4895 _WebImpl::OnDetachingFromMainTree(void)
4896 {
4897         result r = E_SUCCESS;
4898
4899         _WebManager* pWebManager = _WebManager::GetInstance();
4900         pWebManager->RemoveActiveWeb(this);
4901
4902         r = _ContainerImpl::OnDetachingFromMainTree();
4903         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
4904
4905         return E_SUCCESS;
4906 }
4907
4908
4909 void
4910 _WebImpl::OnChangeLayout(_ControlRotation rotation)
4911 {
4912         int degree = 0;
4913
4914         switch (rotation)
4915         {
4916                 case _CONTROL_ROTATION_0:
4917                         degree =  0;
4918                         break;
4919                 case _CONTROL_ROTATION_90:
4920                         degree =  90;
4921                         break;
4922                 case _CONTROL_ROTATION_180:
4923                         degree =  180;
4924                         break;
4925                 case _CONTROL_ROTATION_270:
4926                         degree =  -90;
4927                         break;
4928                 default:
4929                         SysAssert(false);
4930         }
4931         ewk_view_orientation_send(__pWebCore->GetWebNativeNode(), degree);
4932 }
4933
4934
4935 void
4936 _WebImpl::OnChangeLayout(_ControlOrientation orientation)
4937 {
4938         _ContainerImpl::OnChangeLayout(orientation);
4939
4940         if (__pColorPicker.get())
4941         {
4942                 __pColorPicker->ChangeLayout(orientation);
4943         }
4944
4945         HideFormDataWindow();
4946
4947         std::unique_ptr< IEnumerator > pEnum(__webNotificationList.GetEnumeratorN());
4948         _WebNotification* pWebNotification = null;
4949
4950         while (pEnum->MoveNext() == E_SUCCESS)
4951         {
4952                 pWebNotification = static_cast< _WebNotification* >(pEnum->GetCurrent());
4953                 pWebNotification->OnChangeLayout();
4954         }
4955 }
4956
4957
4958 void
4959 _WebImpl::OnAncestorVisibleStateChanged(const _Control& control)
4960 {
4961         _WebManager* pWebManager = _WebManager::GetInstance();
4962         if (IsVisible() == true)
4963         {
4964                 pWebManager->SetActiveWeb(this);
4965                 ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, false);
4966         }
4967         else
4968         {
4969                 pWebManager->RemoveActiveWeb(this);
4970                 ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_HIDDEN, false);
4971         }
4972 }
4973
4974
4975 void
4976 _WebImpl::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs)
4977 {
4978         _ContainerImpl::OnUserEventReceivedN(requestId, pArgs);
4979         
4980         switch (requestId)
4981         {
4982         case ID_CERTIFICATE_CONFIRM_POPUP_CLOSE:
4983                 __pCertConfirmPopup.reset();
4984                 break;
4985         case ID_PROMPT_POPUP_CLOSE:
4986                 __pPromptPopup.reset();
4987                 break;
4988         case ID_USER_CONFIRM_USERMEDIA_CLOSE:
4989                 __pUserMediaConfirmPopup.reset();
4990                 break;
4991         case ID_USER_CONFIRM_GEOLOCATION_CLOSE:
4992                 __pGeolocationConfirmPopup.reset();
4993                 break;
4994         case ID_USER_CONFIRM_NOTIFICATION_CLOSE:
4995                 __pNotificationConfirmPopup.reset();
4996                 break;
4997         case ID_USER_SCRIPT_ALERT_CLOSE:
4998                 __pScriptAlertConfirmPopup.reset();
4999                 break;
5000         case ID_USER_SCRIPT_CONFIRM_CLOSE:
5001                 __pScriptConfirmPopup.reset();
5002                 break;
5003         default:
5004                 break;
5005         }
5006
5007         Resume();
5008 }
5009
5010
5011 _WebDataHandler*
5012 _WebImpl::GetDownloadHandler(void) const
5013 {
5014         return __pWebDownloadHandler.get();
5015 }
5016
5017
5018 Eina_Bool
5019 _WebImpl::HideColorPicker(void)
5020 {
5021         __pColorPicker.reset();
5022
5023         Resume();
5024
5025         return EINA_TRUE;
5026 }
5027
5028
5029 result
5030 _WebImpl::ShowColorPicker(int red, int green, int blue, int alpha, Color& color)
5031 {
5032         result r = E_SUCCESS;
5033
5034         std::unique_ptr<_InputPickerPopup> pColorHadler(new (std::nothrow) _InputPickerPopup());
5035         SysTryReturnResult(NID_WEB_CTRL, pColorHadler.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
5036
5037         Tizen::Graphics::Color colorVal(static_cast< byte >(red), static_cast< byte >(green), static_cast< byte >(blue), static_cast< byte >(alpha));
5038
5039         r = pColorHadler->Construct(colorVal, this);
5040         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5041
5042         __pColorPicker = std::move(pColorHadler);
5043
5044         r = __pColorPicker->ShowPopup();
5045         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
5046
5047         if (__pColorPicker)
5048         {
5049                 color = __pColorPicker->GetColor();
5050         }
5051
5052 CATCH:
5053         if (__pColorPicker)
5054         {
5055                 __pColorPicker.reset();
5056                 Resume();
5057         }
5058
5059         return r;
5060 }
5061
5062
5063 result
5064 _WebImpl::ShowDatePicker(Ewk_Input_Type inputType, const char* inputValue, String& dateStr)
5065 {
5066         result r = E_SUCCESS;
5067
5068         std::unique_ptr<_InputPickerPopup> pInputPicker(new (std::nothrow) _InputPickerPopup());
5069         SysTryReturnResult(NID_WEB_CTRL, pInputPicker.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
5070
5071         r = pInputPicker->Construct(String(inputValue), inputType, this);
5072         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5073
5074         __pDatePicker = std::move(pInputPicker);
5075
5076         r = __pDatePicker->ShowPopup();
5077         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
5078
5079         if (__pDatePicker)
5080         {
5081                 dateStr = __pDatePicker->GetDate();
5082         }
5083
5084 CATCH:
5085         if (__pDatePicker)
5086         {
5087                 __pDatePicker.reset();
5088                 Resume();
5089         }
5090
5091         return r;
5092 }
5093
5094
5095 _WebImpl*
5096 _WebImpl::GetInstance(Web* pWeb)
5097 {
5098         return dynamic_cast< _WebImpl* >(_ControlImpl::GetInstance(*pWeb));
5099 }
5100
5101
5102 const _WebImpl*
5103 _WebImpl::GetInstance(const Web* pWeb)
5104 {
5105         return dynamic_cast< const _WebImpl* >(_ControlImpl::GetInstance(*pWeb));
5106 }
5107
5108
5109 int 
5110 _WebImpl::SearchHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime)
5111 {
5112         int checkReturn = 0;
5113         _DatabaseImpl db;
5114         String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
5115
5116         String table;
5117         if( checkmime == true)
5118         {
5119                 table = CUSTOM_CONTENT_TABLE_NAME;
5120         }
5121         else
5122         {
5123                 table = CUSTOM_PROTOCOL_TABLE_NAME;
5124         }
5125         
5126         String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
5127         String uri(ewk_custom_handlers_data_url_get(pHandlerData));
5128         String target(ewk_custom_handlers_data_target_get(pHandlerData));
5129
5130         SysSecureLog(NID_WEB_CTRL, "BaseUrl : %s, Url : %s, mime : %s", baseUri.GetPointer(), uri.GetPointer(), target.GetPointer());
5131         
5132         result r = db.Construct(handlerPath, "r+", null);
5133         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
5134
5135         std::unique_ptr<DbEnumerator> pEnum(db.QueryN(L"Select allow From " + table + L" Where baseUrl = '" + baseUri + L"' AND url = '" + uri + L"' AND mime = '" + target + L"'"));
5136         SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, -1, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
5137
5138         if(pEnum.get())
5139         {
5140                 r = pEnum->MoveNext();
5141                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
5142                 r = pEnum->GetIntAt(0, checkReturn);
5143                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
5144         }
5145         else
5146         {
5147                 checkReturn = 2;
5148         }
5149
5150         return checkReturn;
5151 }
5152
5153
5154 result 
5155 _WebImpl::UnregistrationHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime)
5156 {
5157         int checkId = 0;
5158         _DatabaseImpl db;
5159         String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
5160
5161         String table;
5162         if( checkmime == true)
5163         {
5164                 table = CUSTOM_CONTENT_TABLE_NAME;
5165         }
5166         else
5167         {
5168                 table = CUSTOM_PROTOCOL_TABLE_NAME;
5169         }
5170
5171         String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
5172         String uri(ewk_custom_handlers_data_url_get(pHandlerData));
5173         String target(ewk_custom_handlers_data_target_get(pHandlerData));
5174         
5175         SysSecureLog(NID_WEB_CTRL, "BaseUrl : %s, Url : %s, mime : %s", baseUri.GetPointer(), uri.GetPointer(), target.GetPointer());
5176         
5177         result r = db.Construct(handlerPath, "r+", null);
5178         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5179
5180         std::unique_ptr<DbEnumerator> pEnum(db.QueryN(L"Select id From " + table + L" Where baseUrl = '" + baseUri + L"' AND url = '" + uri + L"' AND mime = '" + target + L"'"));
5181         SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
5182
5183         if(pEnum.get())
5184         {
5185                 r = pEnum->MoveNext();
5186                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5187                 r = pEnum->GetIntAt(0, checkId);
5188                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5189                 
5190                 std::unique_ptr<DbStatement> pDeleteStmt(db.CreateStatementN(L"Delete From " + table + L" Where id = (?)"));
5191                 SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
5192
5193                 r = pDeleteStmt->BindInt(0, checkId);
5194                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5195                 
5196                 db.BeginTransaction();
5197                 
5198                 std::unique_ptr<DbEnumerator> pEnum(db.ExecuteStatementN(*pDeleteStmt));
5199                 
5200                 db.CommitTransaction();
5201         }
5202
5203         return E_SUCCESS;
5204 }
5205
5206
5207 const Tizen::Base::String 
5208 _WebImpl::GetProtocolFromUri(const Tizen::Base::String& originUri, const Tizen::Base::String& currentUri)
5209 {
5210         if (originUri == L"" || currentUri == L"")
5211         {
5212                 return L"";
5213         }
5214
5215         result r = E_SUCCESS;
5216         String baseUri;
5217         _DatabaseImpl db;
5218         String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
5219         String originReplace(originUri);
5220         String table(CUSTOM_PROTOCOL_TABLE_NAME);
5221         int found = 0;
5222         int foundQuery = 0;
5223
5224         r = currentUri.LastIndexOf(L"/", currentUri.GetLength()-1, found);
5225         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5226         
5227         r = currentUri.SubString(0, found + 1, baseUri);
5228         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5229                 
5230         r = db.Construct(handlerPath, "r+", null);
5231         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5232         
5233         std::unique_ptr<DbEnumerator> pEnum(db.QueryN(L"Select mime, url, allow From " + table + L" Where baseUrl = '" + baseUri + "'"));
5234         SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, L"", GetLastResult(), "[%s] Propagating.", GetErrorMessage(r));
5235
5236         if(pEnum.get())
5237         {
5238                 while (pEnum->MoveNext() == E_SUCCESS)
5239                 {                       
5240                         String protocol;
5241                         String queryUrl;
5242                         int allow;
5243                         String originScheme;
5244
5245                         r = pEnum->GetStringAt(0, protocol);
5246                         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5247                 
5248                         r = pEnum->GetStringAt(1, queryUrl);
5249                         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5250                         
5251                         r = pEnum->GetIntAt(2, allow);
5252                         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5253
5254                         if (allow == 0)
5255                         {
5256                                 break;
5257                         }
5258
5259                         String protocolScheme(protocol + L":");
5260                         
5261                         r = originReplace.SubString(0, protocolScheme.GetLength(), originScheme);
5262                         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5263                                                 
5264                         if ((originReplace.GetLength() >= protocolScheme.GetLength()) && originScheme.Equals(protocolScheme, false))
5265                         {
5266                                 if (queryUrl.IndexOf(L"%s", 0, foundQuery) == E_SUCCESS)
5267                                 {
5268                                         r = originReplace.Replace(originScheme, "");
5269                                         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5270                                         
5271                                         queryUrl.Replace("%s", originReplace, 0);
5272                                         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5273
5274                                         return queryUrl;
5275                                 }
5276                         }               
5277                 }
5278         }
5279         
5280         return L"";
5281 }
5282
5283
5284 const Tizen::Base::String 
5285 _WebImpl::GetRedirectUri(const Tizen::Base::String& originUri, const Tizen::Base::String& currentUri, const Tizen::Base::String& mime)
5286 {
5287         if (originUri == L"" || currentUri == L"" || mime == L"")
5288         {
5289                 return L"";
5290         }
5291
5292         result r = E_SUCCESS;
5293         String baseUri;
5294         String contentUrl;
5295         String originUrlStr = originUri;
5296         const String replaceStr = L"%s";
5297         _DatabaseImpl db;
5298         String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
5299         String table(CUSTOM_CONTENT_TABLE_NAME);
5300         int allow = 0;
5301         int found = 0;
5302         
5303         r = currentUri.LastIndexOf(L"/", currentUri.GetLength()-1, found);
5304         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5305                 
5306         r = currentUri.SubString(0, found + 1, baseUri);
5307         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5308                 
5309         r = db.Construct(handlerPath, "r+", null);
5310         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5311
5312         std::unique_ptr<DbEnumerator> pEnum(db.QueryN(L"Select allow, url From " + table + L" Where baseUrl = '" + baseUri + "' AND mime = '" + mime + L"'"));
5313         
5314         if (pEnum.get())
5315         {
5316                 r = pEnum->MoveNext();
5317                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5318                 r = pEnum->GetIntAt(0, allow);
5319                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5320                 r = pEnum->GetStringAt(1, contentUrl);
5321                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5322                         
5323                 if (allow == 0)
5324                 {
5325                         return L"";
5326                 }
5327                 else
5328                 {
5329                         if (contentUrl != L"")
5330                         {
5331                                 r = contentUrl.Replace(replaceStr, originUrlStr, 0);
5332                                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
5333
5334                                 return contentUrl;
5335                         }
5336                 }
5337         }
5338         
5339         return L"";
5340 }
5341
5342
5343 void
5344 _WebImpl::SetFormDataList(Eina_List* pFormDataList)
5345 {
5346         __pFormDataList = pFormDataList;
5347 }
5348
5349
5350 bool
5351 _WebImpl::IsFormDataWindowVisible(void) const
5352 {
5353         return __isFormDataVisible;
5354 }
5355
5356
5357 result
5358 _WebImpl::ShowFormDataWindow(const Rectangle& windowRect, Evas_Object* pWebView)
5359 {
5360         Rectangle rect(_CoordinateSystemUtils::InverseTransform(Rectangle(windowRect.x, windowRect.y + windowRect.height, windowRect.width, windowRect.height)));
5361
5362         if (__isFormDataVisible)
5363         {
5364                 result r = __pFormDataWindow->UpdateList(__pFormDataList, rect);
5365                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5366         }
5367         else
5368         {
5369                 __pFormDataWindow.reset();
5370
5371                 std::unique_ptr<_FormDataWindow> pFormDataWindow( new (std::nothrow) _FormDataWindow());
5372                 SysTryReturnResult(NID_WEB_CTRL, pFormDataWindow.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
5373
5374                 result r = pFormDataWindow->Construct(rect, this, pWebView);
5375                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5376
5377                 r = pFormDataWindow->UpdateList(__pFormDataList, rect);
5378                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5379
5380                 r = pFormDataWindow->LaunchFormDataWindow();
5381                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5382
5383                 __pFormDataWindow = std::move(pFormDataWindow);
5384                 __isFormDataVisible = true;
5385         }
5386
5387         return E_SUCCESS;
5388 }
5389
5390
5391 void
5392 _WebImpl::HideFormDataWindow(bool delWindow)
5393 {
5394         if (delWindow)
5395         {
5396                 __pFormDataWindow.reset();
5397         }
5398
5399         __isFormDataVisible = false;
5400 }
5401
5402
5403 void
5404 _WebImpl::ClearWebNotification(_WebNotification* pWebNotification)
5405 {
5406         __webNotificationList.Remove(*pWebNotification);
5407 }
5408
5409
5410 void
5411 _WebImpl::SetWebNotification(_WebNotification* pWebNotification)
5412 {
5413         __webNotificationList.Add(pWebNotification);
5414 }
5415
5416
5417 }}} // Tizen::Web::Controls