Apply Invalidate() after resizing client rect
[framework/osp/web.git] / src / controls / FWebCtrl_WebImpl.cpp
index b8377c6..f15b24e 100755 (executable)
 #include <FGrp_Screen.h>
 #include <FIo_DatabaseImpl.h>
 #include <FIo_NormalFile.h>
+#include <FSys_SettingInfoImpl.h>
 #include <FSys_SystemResource.h>
 #include <FSys_VibratorImpl.h>
 #include <FUi_Control.h>
 #include <FUi_CoordinateSystemUtils.h>
 #include <FUi_EcoreEvasMgr.h>
 #include <FUi_EcoreEvas.h>
+#include <FUi_ResourceManager.h>
 #include <FUi_ResourceSizeInfo.h>
 #include <FUi_Window.h>
 #include <FUiAnim_EflNode.h>
@@ -146,24 +148,7 @@ static const int MAX_TEXT_MATCH = pow(2, 31) - 1;
 
 static const int PORTRAIT_KEYPAD_HEIGHT = 444;
 static const int LANDSCAPE_KEYPAD_HEIGHT = 316;
-static const int DEFAULT_LIST_ITEM_COUNT = 4;
-
-
-Eina_Bool
-AddHttpHeaderData(const Eina_Hash* pHash, const void* pKey, void* pValue, void* pUserData)
-{
-       result r = E_SUCCESS;
-
-       String key(reinterpret_cast< const char* >(pKey));
-       String value(reinterpret_cast< char* >(pValue));
-
-       SysLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", key.GetPointer(), value.GetPointer());
-
-       r = reinterpret_cast< HttpHeader* >(pUserData)->AddField(key, value);
-       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       return EINA_TRUE;
-}
+static const int DEFAULT_LIST_ITEM_COUNT = 5;
 
 
 Eina_Bool
@@ -175,7 +160,7 @@ AddHttpAttributeData(const Eina_Hash* pHash, const void* pKey, void* pValue, voi
        std::unique_ptr<String> pAttrValue(new (std::nothrow) String(reinterpret_cast< char* >(pValue)));
        SysTryReturn(NID_WEB_CTRL, pAttrKey.get() && pAttrValue.get(), EINA_FALSE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
 
-       SysLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", pAttrKey->GetPointer(), pAttrValue->GetPointer());
+       SysSecureLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", pAttrKey->GetPointer(), pAttrValue->GetPointer());
 
        r = reinterpret_cast< HashMap* >(pUserData)->Add(*pAttrKey, *pAttrValue);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
@@ -391,7 +376,26 @@ OnScriptPromptRequested(Evas_Object* pView, const char* pMessage, const char* pD
 CATCH:
        ewk_view_javascript_prompt_reply(pView, null);
 
-       return EINA_FALSE;
+       return EINA_TRUE;
+}
+
+
+Eina_Bool
+_WebImpl::OnBeforeUnloadConfirmRequested(Evas_Object* pView, const char* pMessage, void* pUserData)
+{
+       _WebImpl* pWebImpl = reinterpret_cast< _WebImpl* >(pUserData);
+       SysAssertf(pWebImpl, "Failed to request");
+       result r = E_SUCCESS;
+
+       String msg(pMessage);
+
+       r = pWebImpl->ShowUserConfirmPopupAsync(USER_BEFORE_UNLOAD_CONFIRM, pView, msg);
+       SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+       return EINA_TRUE;
+
+CATCH:
+       ewk_view_javascript_confirm_reply(pView, EINA_FALSE);
+       return EINA_TRUE;
 }
 
 
@@ -521,9 +525,12 @@ OnApplicationCachePermissionRequested(Evas_Object* pView, Ewk_Security_Origin* p
        _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
        SysAssertf(pImpl , "Failed to request");
 
+       _SystemResource* pSysResource = _SystemResource::GetInstance();
+       SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
        const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
        String msg;
-       result r = msg.Format(256, L"Allow %s to use offline application cache?", pHostName);
+       result r = msg.Format(256, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
 
        r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_APP_CACHE, pView, msg);
@@ -539,9 +546,12 @@ OnIndexedDatabaseQuotaExceeded(Evas_Object* pView, Ewk_Security_Origin* pSecOrig
        _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
        SysAssertf(pImpl , "Failed to request");
 
+       _SystemResource* pSysResource = _SystemResource::GetInstance();
+       SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
        const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
        String msg;
-       result r = msg.Format(512, L"%s Used %lld of storage. Allow %s to use upto 2GB of indexed db?", pHostName, currentQuota, pHostName);
+       result r = msg.Format(512, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
 
        r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED, pView, msg);
@@ -557,9 +567,12 @@ OnDatabaseQuotaExceeded(Evas_Object* pView, Ewk_Security_Origin* pSecOrigin, con
        _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
        SysAssertf(pImpl , "Failed to request");
 
+       _SystemResource* pSysResource = _SystemResource::GetInstance();
+       SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
        const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
        String msg;
-       result r = msg.Format(512, L"Allow %s to open  %s use upto %lld  of web database?", pHostName, database_name, expectedQuota);
+       result r = msg.Format(512, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
 
        r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_DB_QUOTA_EXCEDED, pView, msg);
@@ -574,9 +587,12 @@ Eina_Bool OnLocalFileSystemQuotaExceeded(Evas_Object* pView, Ewk_Security_Origin
        _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
        SysAssertf(pImpl , "Failed to request");
 
+       _SystemResource* pSysResource = _SystemResource::GetInstance();
+       SysAssertf(pSysResource != null, "Failed to get _SystemResource instance");
+
        const char* pHostName = ewk_security_origin_host_get(pSecOrigin);
        String msg;
-       result r = msg.Format(512, L"%s Used %lld of storgae. Allow %s to use upto 2GB of file system?", pHostName, currentQuota, pHostName);
+       result r = msg.Format(512, pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_TPLATFORM_BODY_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE").GetPointer(), _StringConverter::CopyToCharArrayN(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_THIS_WEBPAGE")), pHostName);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r));
 
        r = pImpl->ShowUserConfirmPopup(USER_CONFIRM_LOCAL_FS_QUOTA_EXCEDED, pView, msg);
@@ -988,15 +1004,8 @@ OnLoadingRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
        String uriScheme(uri.GetScheme());
        SysSecureLog(NID_WEB_CTRL, "The current value of scheme is %ls", uriScheme.GetPointer());
 
-       if ((uriScheme != L"http") && (uriScheme != L"https") && (uriScheme != L"file"))
+       if ((uriScheme != L"http") && (uriScheme != L"https") && (uriScheme != L"file") && (uriScheme != L""))
        {
-               ewk_policy_decision_ignore(pPolicy);
-
-               if (uriScheme == L"")
-               {
-                       return;
-               }
-
                result r = E_SUCCESS;
 
                if (uriScheme == L"tel")
@@ -1014,9 +1023,13 @@ OnLoadingRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
                        String operationId(L"http://tizen.org/appcontrol/operation/view");
                        r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
                }
-               SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 
-               return;
+               if (r == E_SUCCESS)
+               {
+                       ewk_policy_decision_ignore(pPolicy);
+
+                       return;
+               }
        }
 
        ewk_policy_decision_use(pPolicy);
@@ -1118,17 +1131,31 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
                if (code >= REDIRECTION_HEADER_GROUP && code < REDIRECTION_HEADER_GROUP + 100)
                {
                        pImpl->SetRedirectRequested(true);
-                       mime = L"";
                }
 
                ILoadingListener* pLoadingListener = pImpl->GetLoadingListener();
                if (pLoadingListener)
                {
-                       const Eina_Hash* pHeader = ewk_policy_decision_response_headers_get(pPolicy);
                        HttpHeader httpHeader;
 
-                       eina_hash_foreach(pHeader, AddHttpHeaderData, &httpHeader);
-                       SysTryCatch(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+                       Eina_Iterator* iterator = eina_hash_iterator_tuple_new(ewk_policy_decision_response_headers_get(pPolicy));
+                       if (iterator)
+                       {
+                               Eina_Hash_Tuple *tuple = null;
+
+                               EINA_ITERATOR_FOREACH(iterator, tuple)
+                               {
+                                       String key(reinterpret_cast< const char* >(tuple->key));
+                                       String value(reinterpret_cast< char* >(tuple->data));
+
+                                       SysSecureLog(NID_WEB_CTRL, "The current value of key is %ls, value is %ls", key.GetPointer(), value.GetPointer());
+
+                                       r = httpHeader.AddField(key, value);
+                                       SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, eina_iterator_free(iterator), r, "[%s] Propagating.", GetErrorMessage(r));
+                               }
+
+                               eina_iterator_free(iterator);
+                       }
 
                        pImpl->SetPolicyDecision(pLoadingListener->OnWebDataReceived(mime, httpHeader));
                }
@@ -1146,9 +1173,10 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
                String redirectUrl(pImpl->GetRedirectUri(url, currentUrl, mime));
                if (redirectUrl != L"")
                {
-                       pImpl->LoadUrl(redirectUrl);
                        ewk_policy_decision_ignore(pPolicy);
 
+                       pImpl->LoadUrl(redirectUrl);
+
                        return;
                }
 
@@ -1164,6 +1192,13 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
 
                        r = _AppControlImpl::FindAndStart(operationId, &url, &mime, null, null, null);
                        SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS || r == E_OBJ_NOT_FOUND, r, "[%s] Propagating.", GetErrorMessage(r));
+                       if (r == E_OBJ_NOT_FOUND)
+                       {
+                               String operationId(L"http://tizen.org/appcontrol/operation/download");
+
+                               r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null);
+                               SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+                       }
 
                        return;
                }
@@ -1305,7 +1340,13 @@ OnLoadingCompleted(void* pUserData, Evas_Object* pView, void* pEventInfo)
                SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
                pEventArg.release();
        }
+}
+
 
+void
+OnLoadingCommitted(void* pUserData, Evas_Object* pView, void* pEventInfo)
+{
+       evas_object_focus_set(pView, EINA_FALSE);
 }
 
 
@@ -1641,11 +1682,7 @@ OnWebKeypadStateChanged(void* pUserData, Evas_Object* pView, void* pEventInfo)
                {
                        pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(rect.height));
 
-                       if (pFormImpl->HasFooter())
-                       {
-                               pFormImpl->GetCore().SetKeypadShowState(true);
-                               pFormImpl->Draw();
-                       }                       
+                       pFormImpl->Invalidate(false);
                }
 
                if (pImpl->GetWebKeypadEventListener())
@@ -1662,6 +1699,7 @@ OnWebKeypadStateChanged(void* pUserData, Evas_Object* pView, void* pEventInfo)
                                pImpl->GetWebKeypadEventListener()->OnWebKeypadWillOpen(*dynamic_cast< Web* >(&pImpl->GetPublic()));
                        }
                }
+
                pImpl->SetPreviousKeypadBounds(rect);
        }
        else
@@ -1680,6 +1718,21 @@ OnWebKeypadOpened(void* pUserData, Evas_Object* pView, void* pEventInfo)
 
        pImpl->SetKeypadVisibleState(true);
 
+       _FormImpl* pFormImpl = pImpl->GetParentFormImpl(dynamic_cast< _ControlImpl* >(pImpl));
+       if (pFormImpl)
+       {
+               _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
+               SysAssertf(pXformer, "Failed to get CoordinateTransformer");
+
+               pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(pImpl->GetPreviousKeypadBounds().height));
+
+               if (pFormImpl->HasFooter())
+               {
+                       pFormImpl->GetCore().SetKeypadShowState(true);
+                       pFormImpl->Draw();
+               }
+       }
+
        if (pImpl->GetWebKeypadEventListener())
        {
                pImpl->GetWebKeypadEventListener()->OnWebKeypadOpened(*static_cast< Web* >(&pImpl->GetPublic()));
@@ -1698,6 +1751,8 @@ OnWebKeypadClosed(void* pUserData, Evas_Object* pView, void* pEventInfo)
        {
                pFormImpl->DeflateClientRectHeight(0);
 
+               pFormImpl->Invalidate(false);
+
                if (pFormImpl->HasFooter())
                {
                        pFormImpl->GetCore().SetKeypadShowState(false);
@@ -1737,11 +1792,6 @@ OnWindowObjectFocusGained(void* pUserData, Evas_Object* pWin, void* pEvent_info)
 
                if (pImpl->IsWinFocusLost() == true)
                {
-                       if (pImpl->IsKeypadOpened() == true)
-                       {
-                               evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
-                       }
-
                        Ewk_Settings* pSettings = ewk_view_settings_get(pWebCore->GetWebNativeNode());
                        SysAssertf(pSettings, "Failed to get settings instance.");
 
@@ -1751,6 +1801,10 @@ OnWindowObjectFocusGained(void* pUserData, Evas_Object* pWin, void* pEvent_info)
 
                                evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
                        }
+                       else if (pImpl->IsKeypadOpened() == true)
+                       {
+                               evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE);
+                       }
                }
        }
 
@@ -1768,6 +1822,13 @@ OnWebNativeNodeFocusGained(void* pUserData, Evas* pCanvas, Evas_Object* pView, v
        {
                pImpl->SetKeypadOpened(false);
        }
+       else if (pImpl->IsWinFocusLost() == true && pImpl->IsFocused() == false)
+       {
+               _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
+               SysAssertf(pWebCore, "Failed to get Web core object");
+
+               evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_FALSE);
+       }
 }
 
 
@@ -1777,11 +1838,17 @@ OnWebNativeNodeFocusLost(void* pUserData, Evas* pCanvas, Evas_Object* pView, voi
        _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData);
        SysAssertf(pImpl, "Failed to request");
 
-       if (pImpl->IsWinFocusLost() == true)
-       {
-               _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
-               SysAssertf(pWebCore, "Failed to get Web core object");
+       _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
+       SysAssertf(pWebCore, "Failed to get Web core object");
 
+       Eina_Rectangle leftHandle;
+       Eina_Rectangle rightHandle;
+
+       EINA_RECTANGLE_SET(&leftHandle, 0, 0, 0, 0);
+       EINA_RECTANGLE_SET(&rightHandle, 0, 0, 0, 0);
+
+       if (pImpl->IsWinFocusLost() == true && ewk_view_text_selection_range_get(pWebCore->GetWebNativeNode(), &leftHandle, &rightHandle))
+       {
                Ewk_Settings* pSettings = ewk_view_settings_get(pWebCore->GetWebNativeNode());
                SysAssertf(pSettings, "Failed to get settings instance.");
 
@@ -2164,6 +2231,7 @@ _WebImpl::_WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore)
        , __pNotificationConfirmPopup(null)
        , __pScriptAlertConfirmPopup(null)
        , __pScriptConfirmPopup(null)
+       , __pBeforeUnloadConfirmPopup(null)
        , __pAppCacheConfirmPopup(null)
        , __pDbQuotaConfirmPopup(null)
        , __pLocalFsQuotaConfirmPopup(null)
@@ -2199,8 +2267,8 @@ _WebImpl::~_WebImpl()
        pWebManager->RemoveActiveWeb(this);
 
 CATCH:
+       _SettingInfoImpl::RemoveSettingEventListener(*this);
        RemoveEventListenerCallback();
-
        ClearCertificateDb();
 }
 
@@ -2405,7 +2473,7 @@ _WebImpl::LoadUrl(const String& url, const HttpHeader& header)
 {
        std::unique_ptr<char[]> pUrl(_StringConverter::CopyToCharArrayN(url));
        SysTryReturn(NID_WEB_CTRL, pUrl.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
-       
+
        Eina_Hash* pHttpHeader = ConvertToSlpHeaderN(header);
 
        ewk_view_url_request_set(__pWebCore->GetWebNativeNode(), pUrl.get(), EWK_HTTP_METHOD_GET, pHttpHeader, null);
@@ -2474,7 +2542,14 @@ _WebImpl::ShowSelectBoxPopup(bool isMultiSelect, const String& title, Eina_List*
        std::unique_ptr<_SelectBox> pSelectBox(new (std::nothrow) _SelectBox());
        SysTryReturnResult(NID_WEB_CTRL, pSelectBox.get(), E_OUT_OF_MEMORY, "Memory allocation failed.");
 
-       r = pSelectBox->Construct(isMultiSelect, title, DEFAULT_LIST_ITEM_COUNT, pWebView);
+       if (isMultiSelect)
+       {
+               r = pSelectBox->Construct(this, isMultiSelect, title, DEFAULT_LIST_ITEM_COUNT - 1, pWebView);
+       }
+       else
+       {
+               r = pSelectBox->Construct(this, isMultiSelect, title, DEFAULT_LIST_ITEM_COUNT, pWebView);
+       }
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
        r = pSelectBox->UpdateList(pItems, selectedIndex, false, false);
@@ -3545,6 +3620,7 @@ _WebImpl::SetEventListenerCallback(void) const
                evas_object_smart_callback_add(pWebNativeNode, "load,stop", OnLoadingCanceled, this);
                evas_object_smart_callback_add(pWebNativeNode, "load,error", OnLoadingErrorOccurred, this);
                evas_object_smart_callback_add(pWebNativeNode, "title,changed", OnPageTitleReceived, this);
+               evas_object_smart_callback_add(pWebNativeNode, "load,committed", OnLoadingCommitted, this);
 
                evas_object_smart_callback_add(pWebNativeNode, "requestToNative,json", OnHandleJavaScriptRequest, this);
 
@@ -3563,6 +3639,7 @@ _WebImpl::SetEventListenerCallback(void) const
                ewk_view_javascript_alert_callback_set(pWebNativeNode, OnScriptAlertRequested, const_cast< _WebImpl* >(this));
                ewk_view_javascript_prompt_callback_set(pWebNativeNode, OnScriptPromptRequested, const_cast< _WebImpl* >(this));
                ewk_view_javascript_confirm_callback_set(pWebNativeNode, OnScriptConfirmRequested, const_cast< _WebImpl* >(this));
+               ewk_view_before_unload_confirm_panel_callback_set(pWebNativeNode, OnBeforeUnloadConfirmRequested, const_cast< _WebImpl* >(this));
 
                evas_object_smart_callback_add(pWebNativeNode, "policy,response,decide", OnWebDataReceived, this);
 
@@ -3633,6 +3710,7 @@ _WebImpl::RemoveEventListenerCallback(void) const
                evas_object_smart_callback_del(pWebNativeNode, "load,stop", OnLoadingCanceled);
                evas_object_smart_callback_del(pWebNativeNode, "load,error", OnLoadingErrorOccurred);
                evas_object_smart_callback_del(pWebNativeNode, "title,changed", OnPageTitleReceived);
+               evas_object_smart_callback_del(pWebNativeNode, "load,committed", OnLoadingCommitted);
 
                evas_object_smart_callback_del(pWebNativeNode, "requestToNative,json", OnHandleJavaScriptRequest);
 
@@ -3651,6 +3729,7 @@ _WebImpl::RemoveEventListenerCallback(void) const
                ewk_view_javascript_alert_callback_set(pWebNativeNode, null, null);
                ewk_view_javascript_prompt_callback_set(pWebNativeNode, null, null);
                ewk_view_javascript_confirm_callback_set(pWebNativeNode, null, null);
+               ewk_view_before_unload_confirm_panel_callback_set(pWebNativeNode, null, null);
 
                evas_object_smart_callback_del(pWebNativeNode, "policy,response,decide", OnWebDataReceived);
 
@@ -4761,6 +4840,17 @@ _WebImpl::ShowUserConfirmPopupAsync(_UserConfirmMode userConfirmMode, void* pPol
 
                break;
        }
+       case USER_BEFORE_UNLOAD_CONFIRM:
+       {
+               __pBeforeUnloadConfirmPopup.reset();
+
+               __pBeforeUnloadConfirmPopup = std::move(pUserConfirmPopup);
+
+               r = __pBeforeUnloadConfirmPopup->ShowPopup();
+               SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pBeforeUnloadConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r));
+
+               break;
+       }
        default:
                break;
        }
@@ -4857,6 +4947,8 @@ _WebImpl::OnPreAttachedToMainTree(void)
                r = InitializeSetting();
                SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
+               _SettingInfoImpl::AddSettingEventListener(*this);
+
                _WebManager* pWebManager = _WebManager::GetInstance();
                pWebManager->AddWeb(reinterpret_cast< int >(this));
        }
@@ -4881,8 +4973,30 @@ _WebImpl::OnDetachingFromMainTree(void)
 
 
 void
+_WebImpl::OnSettingChanged(String& key)
+{
+       Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
+       if (!pWebview)
+       {
+               return;
+       }
+
+       if (key == L"http://tizen.org/setting/font.type")
+       {
+               ewk_view_use_settings_font(pWebview);
+       }
+}
+
+
+void
 _WebImpl::OnChangeLayout(_ControlRotation rotation)
 {
+       Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
+       if (!pWebview)
+       {
+               return;
+       }
+
        int degree = 0;
 
        switch (rotation)
@@ -4902,7 +5016,7 @@ _WebImpl::OnChangeLayout(_ControlRotation rotation)
                default:
                        SysAssert(false);
        }
-       ewk_view_orientation_send(__pWebCore->GetWebNativeNode(), degree);
+       ewk_view_orientation_send(pWebview, degree);
 }
 
 
@@ -4926,22 +5040,37 @@ _WebImpl::OnChangeLayout(_ControlOrientation orientation)
                pWebNotification = static_cast< _WebNotification* >(pEnum->GetCurrent());
                pWebNotification->OnChangeLayout();
        }
+
+       if (IsKeypadVisible())
+       {
+               _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
+               SysAssertf(pXformer, "Failed to get CoordinateTransformer");
+
+               _FormImpl* pFormImpl = GetParentFormImpl(dynamic_cast< _ControlImpl* >(this));
+               pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(GetPreviousKeypadBounds().height));
+       }
 }
 
 
 void
 _WebImpl::OnAncestorVisibleStateChanged(const _Control& control)
 {
+       Evas_Object* pWebview = __pWebCore->GetWebNativeNode();
+       if (!pWebview)
+       {
+               return;
+       }
+
        _WebManager* pWebManager = _WebManager::GetInstance();
        if (IsVisible() == true)
        {
                pWebManager->SetActiveWeb(this);
-               ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, false);
+               ewk_view_page_visibility_state_set(pWebview, EWK_PAGE_VISIBILITY_STATE_VISIBLE, false);
        }
        else
        {
                pWebManager->RemoveActiveWeb(this);
-               ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_HIDDEN, false);
+               ewk_view_page_visibility_state_set(pWebview, EWK_PAGE_VISIBILITY_STATE_HIDDEN, false);
        }
 }
 
@@ -4974,6 +5103,14 @@ _WebImpl::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::ILi
        case ID_USER_SCRIPT_CONFIRM_CLOSE:
                __pScriptConfirmPopup.reset();
                break;
+
+       case ID_USER_BEFORE_UNLOAD_CONFIRM_CLOSE:
+               __pBeforeUnloadConfirmPopup.reset();
+               break;
+
+       case ID_USER_SCRIPT_SELECTBOX_CLOSE:
+               __pSelectBox.reset();
+               break;
        default:
                break;
        }