X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcontrols%2FFWebCtrl_WebImpl.cpp;h=2b78f55876b6bebf6b6236f40377a19cbfefeacc;hb=c0487af2b87d9c2f4e2883c17f44a643bcf8db17;hp=cd8f5ab10e1d5538131039c9bc4ede0d104f929a;hpb=18da11d03b0526789752d58c0c465cfbe57fe3f1;p=framework%2Fosp%2Fweb.git diff --git a/src/controls/FWebCtrl_WebImpl.cpp b/src/controls/FWebCtrl_WebImpl.cpp index cd8f5ab..2b78f55 100755 --- a/src/controls/FWebCtrl_WebImpl.cpp +++ b/src/controls/FWebCtrl_WebImpl.cpp @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -70,8 +69,6 @@ #include #include #include -#include -#include #include #include #include @@ -87,7 +84,7 @@ #include #include #include -#include +#include #include "FWeb_HistoryItemImpl.h" #include "FWebCtrl_AppControlListener.h" #include "FWebCtrl_AuthConfirmPopup.h" @@ -107,6 +104,7 @@ #include "FWebCtrl_WebEvent.h" #include "FWebCtrl_WebEventArg.h" #include "FWebCtrl_WebImpl.h" +#include "FWebCtrl_WebManager.h" #include "FWebCtrl_WebPresenter.h" #include "FWebCtrl_WebSettingImpl.h" @@ -152,23 +150,6 @@ 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; -} - - -Eina_Bool AddHttpAttributeData(const Eina_Hash* pHash, const void* pKey, void* pValue, void* pUserData) { result r = E_SUCCESS; @@ -364,26 +345,12 @@ OnScriptConfirmRequested(Evas_Object* pView, const char* pMessage, void* pUserDa _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData); String msg(pMessage); - MessageBox messageBox; - r = messageBox.Construct(L"", msg, MSGBOX_STYLE_OKCANCEL); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r)); - - int modalResult = 0; - - messageBox.SetOwner(&pImpl->GetPublic()); - - r = messageBox.ShowAndWait(modalResult); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_FALSE, r, "[%s] Propagating.", GetErrorMessage(r)); - - if (modalResult == MSGBOX_RESULT_OK) - { - ewk_view_javascript_confirm_reply(pView, EINA_TRUE); - } - else - { - ewk_view_javascript_confirm_reply(pView, EINA_FALSE); - } + r = pImpl->ShowUserConfirmPopupAsync(USER_SCRIPT_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; } @@ -418,6 +385,8 @@ OnCertificateRequested(void* pUserData, Evas_Object* pView, void* pEventInfo) Ewk_Certificate_Policy_Decision* pPolicy = reinterpret_cast< Ewk_Certificate_Policy_Decision* >(pEventInfo); SysAssertf(pImpl && pPolicy, "Failed to request"); + _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore())); + switch (pImpl->GetSetting().GetCertificateErrorHandlingMode()) { case WEB_CERTIFICATE_ERROR_HANDLING_MODE_USER_CONFIRM: @@ -460,9 +429,14 @@ OnCertificateRequested(void* pUserData, Evas_Object* pView, void* pEventInfo) { r = pImpl->ShowCertificateConfirmPopup(CERTIFICATE_POPUP_MODE_USER_CONFIRM, pPolicy); SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); + + ewk_view_resume(pWebCore->GetWebNativeNode()); } - pImpl->SetCertificateRequested(true); + if (pImpl) + { + pImpl->SetCertificateRequested(true); + } break; } case WEB_CERTIFICATE_ERROR_HANDLING_MODE_CANCEL: @@ -481,6 +455,8 @@ CATCH: ewk_certificate_policy_decision_allowed_set(pPolicy, EINA_FALSE); pImpl->SetCertificateConfirmed(false); pImpl->SetCertificateRequested(true); + + ewk_view_resume(pWebCore->GetWebNativeNode()); } @@ -833,6 +809,58 @@ OnContentHandlerUnregistrationRequested(void* pUserData, Evas_Object* pView, voi void +OnFullScreenEntered(void* pUserData, Evas_Object* pView, void* pEventInfo) +{ + _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData); + bool* pIsHandleNeeded = reinterpret_cast< bool* >(pEventInfo); + SysAssertf(pImpl, "Failed to request"); + + _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore())); + SysAssertf(pWebCore, "Failed to get Web core object"); + + if (pIsHandleNeeded && *pIsHandleNeeded) + { + pWebCore->SetFullScreenEntered(true); + } +} + + +void +OnFullScreenExited(void* pUserData, Evas_Object* pView, void* pEventInfo) +{ + _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData); + SysAssertf(pImpl, "Failed to request"); + + _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore())); + SysAssertf(pWebCore, "Failed to get Web core object"); + + pWebCore->SetFullScreenEntered(false); +} + + +void +OnFocusDownRequested(void* pUserData, Evas_Object* pView, void* pEventInfo) +{ + _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData); + SysAssertf(pImpl, "Failed to request"); + + _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore())); + pWebCore->SetFocusEnd(true); +} + + +void +OnFocusUpRequested(void* pUserData, Evas_Object* pView, void* pEventInfo) +{ + _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData); + SysAssertf(pImpl, "Failed to request"); + + _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore())); + pWebCore->SetFocusEnd(true); +} + + +void OnVibrationRequested(uint64_t duration, void* pUserData) { result r = E_SUCCESS; @@ -865,64 +893,75 @@ OnLoadingRequested(void* pUserData, Evas_Object* pView, void* pEventInfo) String url(ewk_policy_decision_url_get(pPolicy)); SysSecureLog(NID_WEB_CTRL, "The current value of url is %ls", url.GetPointer()); - if (url == L"about:blank") - { - ewk_policy_decision_use(pPolicy); - return; - } - - if (pImpl->GetLoadingListener() && ewk_frame_is_main_frame(ewk_policy_decision_frame_get(pPolicy)) + if (ewk_frame_is_main_frame(ewk_policy_decision_frame_get(pPolicy)) && !pImpl->IsRedirectRequested()) { + _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore())); + SysAssertf(pWebCore, "Failed to get Web core object"); + + pWebCore->SetFullScreenEntered(false); + pImpl->SetCertificateRequested(false); if (pImpl->GetTextSearchListener()) { pImpl->DisableAsyncSearch(); } - - WebNavigationType navigationType = WEB_NAVIGATION_OTHER; - Ewk_Policy_Navigation_Type ewkNavigationType = ewk_policy_decision_navigation_type_get(pPolicy); - switch (ewkNavigationType) + ILoadingListener* pLoadingListener = pImpl->GetLoadingListener(); + if (pLoadingListener) { - case EWK_POLICY_NAVIGATION_TYPE_LINK_CLICKED: - navigationType = WEB_NAVIGATION_LINK_CLICKED; - break; - case EWK_POLICY_NAVIGATION_TYPE_FORM_SUBMITTED: - navigationType = WEB_NAVIGATION_FORM_SUBMITTED; - break; - case EWK_POLICY_NAVIGATION_TYPE_BACK_FORWARD: - navigationType = WEB_NAVIGATION_BACKFORWARD; - break; - case EWK_POLICY_NAVIGATION_TYPE_RELOAD: - navigationType = WEB_NAVIGATION_RELOAD; - break; - case EWK_POLICY_NAVIGATION_TYPE_FORM_RESUBMITTED: - navigationType = WEB_NAVIGATION_FORM_RESUBMITTED; - break; - case EWK_POLICY_NAVIGATION_TYPE_OTHER: - navigationType = WEB_NAVIGATION_OTHER; - break; - default: - SysAssert(false); - } + WebNavigationType navigationType = WEB_NAVIGATION_OTHER; + Ewk_Policy_Navigation_Type ewkNavigationType = ewk_policy_decision_navigation_type_get(pPolicy); - if (pImpl->GetLoadingListener()->OnLoadingRequested(url, navigationType)) - { - ewk_policy_decision_ignore(pPolicy); + switch (ewkNavigationType) + { + case EWK_POLICY_NAVIGATION_TYPE_LINK_CLICKED: + navigationType = WEB_NAVIGATION_LINK_CLICKED; + break; + case EWK_POLICY_NAVIGATION_TYPE_FORM_SUBMITTED: + navigationType = WEB_NAVIGATION_FORM_SUBMITTED; + break; + case EWK_POLICY_NAVIGATION_TYPE_BACK_FORWARD: + navigationType = WEB_NAVIGATION_BACKFORWARD; + break; + case EWK_POLICY_NAVIGATION_TYPE_RELOAD: + navigationType = WEB_NAVIGATION_RELOAD; + break; + case EWK_POLICY_NAVIGATION_TYPE_FORM_RESUBMITTED: + navigationType = WEB_NAVIGATION_FORM_RESUBMITTED; + break; + case EWK_POLICY_NAVIGATION_TYPE_OTHER: + navigationType = WEB_NAVIGATION_OTHER; + break; + default: + SysAssert(false); + } - return; + if (pLoadingListener->OnLoadingRequested(url, navigationType)) + { + ewk_policy_decision_ignore(pPolicy); + + return; + } } } + if (url == L"about:blank") + { + ewk_policy_decision_use(pPolicy); + + return; + } + String currentUrl(pImpl->GetUrl()); String redirectUrl(pImpl->GetProtocolFromUri(url, currentUrl)); if (redirectUrl != L"") { - pImpl->LoadUrl(redirectUrl); ewk_policy_decision_ignore(pPolicy); + pImpl->LoadUrl(redirectUrl); + return; } @@ -930,7 +969,7 @@ OnLoadingRequested(void* pUserData, Evas_Object* pView, void* pEventInfo) uri.SetUri(url); String uriScheme(uri.GetScheme()); - SysLog(NID_WEB_CTRL, "The current value of scheme is %ls", uriScheme.GetPointer()); + SysSecureLog(NID_WEB_CTRL, "The current value of scheme is %ls", uriScheme.GetPointer()); if ((uriScheme != L"http") && (uriScheme != L"https") && (uriScheme != L"file")) { @@ -956,8 +995,7 @@ OnLoadingRequested(void* pUserData, Evas_Object* pView, void* pEventInfo) else { String operationId(L"http://tizen.org/appcontrol/operation/view"); - String mime(ewk_policy_decision_response_mime_get(pPolicy)); - r = _AppControlImpl::FindAndStart(operationId, &url, &mime, null, null, null); + r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null); } SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r)); @@ -1053,36 +1091,49 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo) result r = E_SUCCESS; - _SystemResource* pSysResource = _SystemResource::GetInstance(); - SysAssertf(pSysResource != null, "Failed to get _SystemResource instance"); - - const char* pUrl = ewk_policy_decision_url_get(pPolicy); int code = ewk_policy_decision_response_status_code_get(pPolicy); - String mime(ewk_policy_decision_response_mime_get(pPolicy)); - SysSecureLog(NID_WEB_CTRL, "url : %s, mime : %ls, code : %d", pUrl, mime.GetPointer(), code); - - ILoadingListener* pLoadingListener = pImpl->GetLoadingListener(); - String url(ewk_policy_decision_url_get(pPolicy)); + String mime(ewk_policy_decision_response_mime_get(pPolicy)); + SysSecureLog(NID_WEB_CTRL, "code : %d, url : %ls, mime : %ls", code, url.GetPointer(), mime.GetPointer()); - if (pLoadingListener && ewk_frame_is_main_frame(ewk_policy_decision_frame_get(pPolicy))) + if (ewk_frame_is_main_frame(ewk_policy_decision_frame_get(pPolicy))) { - const Eina_Hash* pHeader = ewk_policy_decision_response_headers_get(pPolicy); - - DecisionPolicy policy; - HttpHeader httpHeader; - if (code >= REDIRECTION_HEADER_GROUP && code < REDIRECTION_HEADER_GROUP + 100) { pImpl->SetRedirectRequested(true); mime = L""; } - eina_hash_foreach(pHeader, AddHttpHeaderData, &httpHeader); - SysTryCatch(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult())); + ILoadingListener* pLoadingListener = pImpl->GetLoadingListener(); + if (pLoadingListener) + { + HttpHeader httpHeader; + + Eina_Iterator* iterator = eina_hash_iterator_tuple_new(ewk_policy_decision_response_headers_get(pPolicy)); + if (iterator) + { + Eina_Hash_Tuple *tuple = null; - policy = pLoadingListener->OnWebDataReceived(mime, httpHeader); - pImpl->SetPolicyDecision(policy); + 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, , r, "[%s] Propagating.", GetErrorMessage(r)); + } + + eina_iterator_free(iterator); + } + + pImpl->SetPolicyDecision(pLoadingListener->OnWebDataReceived(mime, httpHeader)); + } + else + { + pImpl->SetPolicyDecision(WEB_DECISION_CONTINUE); + } } switch (pImpl->GetPolicyDecision()) @@ -1093,54 +1144,38 @@ 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; } - if (pImpl->IsMimeSupported(mime) || mime == L"") + if (ewk_policy_decision_type_get(pPolicy) == EWK_POLICY_DECISION_USE) { break; } - else { ewk_policy_decision_ignore(pPolicy); - _SelectBox selectBox; - int selectedIndex = 0; String operationId(L"http://tizen.org/appcontrol/operation/view"); 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) { - r = selectBox.Construct(false, L"Select application", 1); //+1 for Downloader - SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r)); + String operationId(L"http://tizen.org/appcontrol/operation/download"); - selectBox.AddListItem(pSysResource->GetString(_RESOURCE_DOMAIN_ID_OSP, "IDS_BR_BODY_DOWNLOAD"), _SelectBox::LIST_ITEM_TYPE_NORMAL, false); - r = selectBox.ShowAndWait(selectedIndex); + r = _AppControlImpl::FindAndStart(operationId, &url, null, null, null, null); SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r)); - - if (selectedIndex == 0) //download - { - RequestId reqId = 0; - DownloadRequest request(pUrl); - - _DownloadManagerImpl* pManagerImpl = _DownloadManagerImpl::GetInstance(); - SysTryReturnVoidResult(NID_WEB_CTRL, pManagerImpl, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult())); - - r = pManagerImpl->Start(request, reqId); - SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r)); - } } return; } break; } + case WEB_DECISION_DOWNLOAD: { ewk_policy_decision_ignore(pPolicy); @@ -1151,16 +1186,18 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo) Ewk_Context* pContext = ewk_view_context_get(pView); SysAssertf(pContext, "Failed to get webkit instance."); - pDownloadHandler->StartDownload(pUrl); + pDownloadHandler->StartDownload(url); return; } + case WEB_DECISION_IGNORE: { ewk_policy_decision_ignore(pPolicy); return; } + default: { SysAssert(false); @@ -1525,7 +1562,6 @@ FireWebPageBlockSelectedEventF(_WebImpl* pImpl) SysTryReturnResult(NID_WEB_CTRL, startPoint.get() && endPoint.get(), E_OUT_OF_MEMORY, "Memory Allocation failed."); pImpl->GetBlockRange(*startPoint.get(), *endPoint.get()); - if ((endPoint->x != 0.0f) && (endPoint->y != 0.0f)) { std::unique_ptr<_WebUiEventArg> pEventArg(new (std::nothrow) _WebUiEventArg(WEB_EVENT_WEBUIEVENTLISTENER_PAGE_BLOCK_SELECTED_FLOAT)); @@ -1572,133 +1608,6 @@ OnWebPageBlockSelected(void* pUserData, Evas_Object* pView, void* pEventInfo) void -OnWebPageBlockSelectedByOrientation(void* pUserData, Evas_Object* pView, void* pEventInfo) -{ - _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData); - SysAssertf(pImpl, "Failed to request"); - - if (!pImpl->IsOrientationChanged()) - { - return; - } - - pImpl->SetOrientationChanged(false); - - int orientation = 0; - _ControlRotation rotation = _ControlManager::GetInstance()->GetOrientationStatus(); - switch (rotation) - { - case _CONTROL_ROTATION_0: - orientation = 0; - break; - case _CONTROL_ROTATION_90: - orientation = 90; - break; - case _CONTROL_ROTATION_180: - orientation = 180; - break; - case _CONTROL_ROTATION_270: - orientation = -90; - break; - } - ewk_view_orientation_send(pView, orientation); - - OnWebPageBlockSelected(pUserData, pView, pEventInfo); -} - - -Eina_Bool -OnSelectUploadFile(Evas_Object* pView, Eina_Bool multipleFile, Eina_List* pAcceptTypes, const char* pCapture, void* pUserData) -{ - std::unique_ptr<_MediaSelectionListener> pMediaListener(new (std::nothrow) _MediaSelectionListener()); - SysTryReturn(NID_WEB_CTRL, pMediaListener.get(), EINA_TRUE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); - - pMediaListener->Construct(pView); - - HashMap extraData; - result r = extraData.Construct(); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, EINA_TRUE, r, "[%s] Propagating.", GetErrorMessage(r)); - - String isMultipleSelection(L"single"); - String mode(L"selectionType"); - String type(L"type"); - String fileType = L"*/*"; - String operationId = L"http://tizen.org/appcontrol/operation/pick"; - - if (multipleFile) - { - isMultipleSelection.Append(L"multiple"); - } - - if (eina_list_count(pAcceptTypes) == 1) - { - String item((char*)eina_list_nth(pAcceptTypes, 0)); - String captureString(pCapture); - - if (item.StartsWith("image/",0)) - { - if (captureString == L"camera") - { - fileType = L"image/jpg"; - operationId = L"http://tizen.org/appcontrol/operation/create_content"; - String typeKey = L"http://tizen.org/appcontrol/data/camera/allow_switch"; - String typeVal = L"false"; - extraData.Add(&typeKey, &typeVal); - } - else - { - fileType = L"image/*"; - String selectKey = L"http://tizen.org/appcontrol/data/selection_mode"; - extraData.Add(&selectKey, &isMultipleSelection); - } - } - else if (item.StartsWith("audio/",0)) - { - fileType = L"audio/*"; - //TO DO: as microphone is not supported yet. suggest to throw an exception - //if (captureString == L"microphone") - //{ - //operationId = L"http://tizen.org/appcontrol/operation/create_content"; - //} - //else - //{ - String selectKey = L"http://tizen.org/appcontrol/data/selection_mode"; - extraData.Add(&selectKey, &isMultipleSelection); - //} - } - else if (item.StartsWith("video/",0)) - { - if (captureString == L"camcorder") - { - fileType = L"video/3gpp"; - operationId = L"http://tizen.org/appcontrol/operation/create_content"; - String typeKey = L"http://tizen.org/appcontrol/data/camera/allow_switch"; - String typeVal = L"false"; - extraData.Add(&typeKey, &typeVal); - } - else - { - fileType = L"video/*"; - String selectKey = L"http://tizen.org/appcontrol/data/selection_mode"; - extraData.Add(&selectKey, &isMultipleSelection); - } - } - } - - r = _AppControlImpl::FindAndStart(operationId, null, &fileType, null, &extraData, pMediaListener.get()); - SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); - - pMediaListener.release(); - - return EINA_TRUE; - -CATCH: - ewk_view_open_panel_reply(pView, null, EINA_FALSE); - return EINA_TRUE; -} - - -void OnHandleJavaScriptRequest(void* pUserData, Evas_Object* pView, void* pEventInfo) { _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData); @@ -1740,16 +1649,10 @@ OnWebKeypadStateChanged(void* pUserData, Evas_Object* pView, void* pEventInfo) return; } - _Form* pFormCore = pImpl->GetParentFormCore(dynamic_cast< _Control* >(&pImpl->GetCore())); - if (pFormCore) + _FormImpl* pFormImpl = pImpl->GetParentFormImpl(dynamic_cast< _ControlImpl* >(pImpl)); + if (pFormImpl) { - pFormCore->DeflateClientRectHeight(pXformer->TransformVertical(rect.height)); - - if (pFormCore->HasFooter()) - { - pFormCore->SetKeypadShowState(true); - pFormCore->Draw(); - } + pFormImpl->DeflateClientRectHeight(pXformer->TransformVertical(rect.height)); } if (pImpl->GetWebKeypadEventListener()) @@ -1766,7 +1669,6 @@ OnWebKeypadStateChanged(void* pUserData, Evas_Object* pView, void* pEventInfo) pImpl->GetWebKeypadEventListener()->OnWebKeypadWillOpen(*dynamic_cast< Web* >(&pImpl->GetPublic())); } } - pImpl->SetKeypadVisibleState(true); pImpl->SetPreviousKeypadBounds(rect); } else @@ -1783,6 +1685,23 @@ OnWebKeypadOpened(void* pUserData, Evas_Object* pView, void* pEventInfo) _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData); SysAssertf(pImpl, "Failed to request"); + 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())); @@ -1796,15 +1715,15 @@ OnWebKeypadClosed(void* pUserData, Evas_Object* pView, void* pEventInfo) _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData); SysAssertf(pImpl, "Failed to request"); - _Form* pFormCore = pImpl->GetParentFormCore(dynamic_cast< _Control* >(&pImpl->GetCore())); - if (pFormCore) + _FormImpl* pFormImpl = pImpl->GetParentFormImpl(dynamic_cast< _ControlImpl* >(pImpl)); + if (pFormImpl) { - pFormCore->DeflateClientRectHeight(0); + pFormImpl->DeflateClientRectHeight(0); - if (pFormCore->HasFooter()) + if (pFormImpl->HasFooter()) { - pFormCore->SetKeypadShowState(false); - pFormCore->Draw(); + pFormImpl->GetCore().SetKeypadShowState(false); + pFormImpl->Draw(); } } @@ -1818,20 +1737,46 @@ OnWebKeypadClosed(void* pUserData, Evas_Object* pView, void* pEventInfo) void +OnWindowObjectFocusLost(void* pUserData, Evas_Object* pWin, void* pEvent_info) +{ + _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData); + SysAssertf(pImpl, "Failed to request"); + + pImpl->SetWinFocusLost(true); +} + + +void OnWindowObjectFocusGained(void* pUserData, Evas_Object* pWin, void* pEvent_info) { _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(pUserData); SysAssertf(pImpl, "Failed to request"); - if (pImpl->IsKeypadOpened() == true && pImpl->IsVisible() == true && pImpl->IsFocused()) + if (pImpl->IsVisible() == true && pImpl->IsFocused() == true) { _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore())); SysAssertf(pWebCore, "Failed to get Web core object"); - evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE); + 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."); + + if (ewk_settings_clear_text_selection_automatically_get(pSettings) == EINA_FALSE) + { + ewk_settings_clear_text_selection_automatically_set(pSettings, EINA_TRUE); + + evas_object_focus_set(pWebCore->GetWebNativeNode(), EINA_TRUE); + } + } } - pImpl->SetKeypadOpened(false); + pImpl->SetWinFocusLost(false); } @@ -1844,8 +1789,25 @@ OnWebNativeNodeFocusGained(void* pUserData, Evas* pCanvas, Evas_Object* pView, v if (pImpl->IsKeypadOpened() == true) { pImpl->SetKeypadOpened(false); + } +} + + +void +OnWebNativeNodeFocusLost(void* pUserData, Evas* pCanvas, Evas_Object* pView, void* pEventInfo) +{ + _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"); + + Ewk_Settings* pSettings = ewk_view_settings_get(pWebCore->GetWebNativeNode()); + SysAssertf(pSettings, "Failed to get settings instance."); - pImpl->SetFocused(); + ewk_settings_clear_text_selection_automatically_set(pSettings, EINA_FALSE); } } @@ -2086,7 +2048,8 @@ OnScriptExecuted(Evas_Object* pView, const char* pResult, void* pUserData) SysLog(NID_WEB_CTRL, "result : %ls", result.GetPointer()); _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(evas_object_data_get(pView, WEB_CTRL)); - if (pImpl && pImpl->IsPresenterAlived(pPresenter)) + _WebManager* pWebManager = _WebManager::GetInstance(); + if (pWebManager->IsValidCallback(reinterpret_cast< int >(pImpl), reinterpret_cast< int >(pPresenter))) { pPresenter->EndAsyncProcess(result); } @@ -2195,11 +2158,11 @@ _WebImpl::_WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore) , __isFooterVisible(false) , __isKeypadVisible(false) , __isKeypadOpened(false) + , __isWinFocusLost(false) , __isLoadingErrorOccurred(false) , __isRedirectRequested(false) , __isCertificateRequested(false) , __isCertificateConfirmed(false) - , __isOrientationChanged(false) , __isFormDataVisible(false) , __keypadBounds(0, 0, 0, 0) , __pWebCore(null) @@ -2216,7 +2179,17 @@ _WebImpl::_WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore) , __pWebEvent(null) , __pAuthChallenge(null) , __pAuthPopup(null) - , __pUserConfirmPopup(null) + , __pUserMediaConfirmPopup(null) + , __pContentHandlerConfirmPopup(null) + , __pProtocolHandlerConfirmPopup(null) + , __pGeolocationConfirmPopup(null) + , __pNotificationConfirmPopup(null) + , __pScriptAlertConfirmPopup(null) + , __pScriptConfirmPopup(null) + , __pAppCacheConfirmPopup(null) + , __pDbQuotaConfirmPopup(null) + , __pLocalFsQuotaConfirmPopup(null) + , __pIndexedDbQuotaConfirmPopup(null) , __pPromptPopup(null) , __pCertConfirmPopup(null) , __pSelectBox(null) @@ -2227,6 +2200,7 @@ _WebImpl::_WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore) , __policy(WEB_DECISION_CONTINUE) , __defaultUserAgent(L"") , __pFormDataList(null) + , __popupClosed(false) { __textSearch.__searchAll = false; __textSearch.__searchForward = true; @@ -2240,10 +2214,15 @@ _WebImpl::_WebImpl(Web* pWeb, Tizen::Ui::_Control* pCore) _WebImpl::~_WebImpl() { - _DownloadManagerImpl* pManagerImpl = _DownloadManagerImpl::GetInstance(); - pManagerImpl->SetDownloadListener(null); + _WebManager* pWebManager = _WebManager::GetInstance(); + SysTryCatch(NID_WEB_CTRL, pWebManager, , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); + pWebManager->RemoveWeb(reinterpret_cast< int >(this)); + pWebManager->RemoveActiveWeb(this); + +CATCH: RemoveEventListenerCallback(); + ClearCertificateDb(); } @@ -2321,9 +2300,6 @@ _WebImpl::Construct(void) r = __textSearch.__searchQueue.Construct(); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); - r = __callbackList.Construct(); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); - r = __webNotificationList.Construct(); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); @@ -2333,11 +2309,6 @@ _WebImpl::Construct(void) r = InitWebEvent(); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); - _DownloadManagerImpl* pManagerImpl = _DownloadManagerImpl::GetInstance(); - SysTryReturn(NID_WEB_CTRL, pManagerImpl, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult())); - - pManagerImpl->SetDownloadListener(this); - __pWebCore = dynamic_cast< _Web* >(&(GetCore())); SysTryReturnResult(NID_WEB_CTRL, __pWebCore, E_SYSTEM, "A system error has been occurred. Failed to get web control"); @@ -2533,8 +2504,6 @@ _WebImpl::ShowSelectBoxPopup(bool isMultiSelect, const String& title, Eina_List* __pSelectBox = std::move(pSelectBox); - __pSelectBox->SetOwner(&GetPublic()); - return __pSelectBox->ShowPopup(); } @@ -2555,6 +2524,8 @@ _WebImpl::ClearSelectBoxPopup(void) __pSelectBox.reset(); + Resume(); + return E_SUCCESS; } @@ -2648,35 +2619,20 @@ _WebImpl::EvaluateJavascriptN(const String& scriptCode) return null; } - result r = E_SUCCESS; - std::unique_ptr pScript(_StringConverter::CopyToCharArrayN(scriptCode)); SysTryReturn(NID_WEB_CTRL, pScript.get(), null, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult())); - std::unique_ptr<_WebPresenter> pPresenter(new (std::nothrow) _WebPresenter()); + std::unique_ptr<_WebPresenter> pPresenter(new (std::nothrow) _WebPresenter(this)); SysTryReturn(NID_WEB_CTRL, pPresenter.get(), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); - r = __callbackList.Add(pPresenter.get()); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r)); - ewk_view_script_execute(pView, pScript.get(), OnScriptExecuted, pPresenter.get()); - std::unique_ptr pResult(new (std::nothrow) String(L"")); - SysTryReturn(NID_WEB_CTRL, pResult.get(), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); - pPresenter->WaitAsyncProcess(*pResult.get()); - - r = __callbackList.Remove(*pPresenter.get()); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r)); - pPresenter.release(); - - return pResult.release(); -} + String* pResult = new (std::nothrow) String(L""); + SysTryReturn(NID_WEB_CTRL, pResult, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); + pPresenter->WaitAsyncProcess(*pResult); -bool -_WebImpl::IsPresenterAlived(_WebPresenter* pPresenter) const -{ - return __callbackList.Contains(*pPresenter); + return pResult; } @@ -2796,14 +2752,14 @@ _WebImpl::SearchText(const String& text, bool searchForward) condition = static_cast < Ewk_Find_Options >(condition | EWK_FIND_OPTIONS_BACKWARDS); } - _WebPresenter presenter; - presenter.InitAsyncProcess(); + std::unique_ptr<_WebPresenter> pPresenter(new (std::nothrow) _WebPresenter(this)); + SysTryReturn(NID_WEB_CTRL, pPresenter.get(), false, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); - r = SynchronizeSearch(SEARCH_SYNC, pView, condition, text, searchForward, false, &presenter); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); + r = SynchronizeSearch(SEARCH_SYNC, pView, condition, text, searchForward, false, pPresenter.get()); + SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r)); int result = 0; - presenter.WaitAsyncProcess(result); + pPresenter->WaitAsyncProcess(result); return static_cast < bool >(result); } @@ -3298,13 +3254,13 @@ _WebImpl::IsCookieEnabled(void) const Ewk_Cookie_Manager* pCookieManager = ewk_context_cookie_manager_get(pContext); SysAssertf(pCookieManager, "Failed to get webkit instance."); - _WebPresenter presenter; - presenter.InitAsyncProcess(); + std::unique_ptr<_WebPresenter> pPresenter(new (std::nothrow) _WebPresenter(this)); + SysTryReturn(NID_WEB_CTRL, pPresenter.get(), false, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); - ewk_cookie_manager_async_accept_policy_get(pCookieManager, OnCookiesPolicyGot, &presenter); + ewk_cookie_manager_async_accept_policy_get(pCookieManager, OnCookiesPolicyGot, pPresenter.get()); bool result = false; - presenter.WaitAsyncProcess(result); + pPresenter->WaitAsyncProcess(result); return result; } @@ -3616,6 +3572,7 @@ _WebImpl::SetEventListenerCallback(void) const evas_object_smart_callback_add(pWebNativeNode, "requestToNative,json", OnHandleJavaScriptRequest, this); evas_object_smart_callback_add(pWinObject, "focus,in", OnWindowObjectFocusGained, this); + evas_object_smart_callback_add(pWinObject, "focus,out", OnWindowObjectFocusLost, this); evas_object_smart_callback_add(pWebNativeNode, "inputmethod,changed", OnWebKeypadStateChanged, this); evas_object_smart_callback_add(pWebNativeNode, "editorclient,ime,opened", OnWebKeypadOpened, this); @@ -3652,10 +3609,14 @@ _WebImpl::SetEventListenerCallback(void) const evas_object_smart_callback_add(pWebNativeNode, "touchmove,handled", OnWebPreventDefaultTriggered, this); evas_object_smart_callback_add(pWebNativeNode, "icon,received", OnFaviconReceived, this); - evas_object_smart_callback_add(pWebNativeNode, "text,selected", OnWebPageBlockSelected, this); - evas_object_smart_callback_add(pWebNativeNode, "frame,rendered", OnWebPageBlockSelectedByOrientation, this); + evas_object_smart_callback_add(pWebNativeNode, "magnifier,hide", OnWebPageBlockSelected, this); + + evas_object_smart_callback_add(pWebNativeNode, "fullscreen,enterfullscreen", OnFullScreenEntered, this); + evas_object_smart_callback_add(pWebNativeNode, "fullscreen,exitfullscreen", OnFullScreenExited, this); + + evas_object_smart_callback_add(pWebNativeNode, "keyevent,down,not,handled", OnFocusDownRequested, this); + evas_object_smart_callback_add(pWebNativeNode, "keyevent,up,not,handled", OnFocusUpRequested, this); - ewk_view_open_panel_callback_set(pWebNativeNode, OnSelectUploadFile, const_cast< _WebImpl* >(this)); Ewk_Context* pContext = ewk_view_context_get(pWebNativeNode); SysAssertf(pContext, "Failed to get webkit instance."); ewk_context_did_start_download_callback_set(pContext, OnDidStartDownloadCallback, const_cast< _WebImpl* >(this)); @@ -3667,6 +3628,7 @@ _WebImpl::SetEventListenerCallback(void) const ewk_view_exceeded_local_file_system_quota_callback_set(pWebNativeNode, OnLocalFileSystemQuotaExceeded, const_cast< _WebImpl* >(this)); evas_object_event_callback_add(pWebNativeNode, EVAS_CALLBACK_FOCUS_IN, OnWebNativeNodeFocusGained, this); + evas_object_event_callback_add(pWebNativeNode, EVAS_CALLBACK_FOCUS_OUT, OnWebNativeNodeFocusLost, this); } } @@ -3694,10 +3656,12 @@ _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); evas_object_smart_callback_del_full(pWinObject, "focus,in", OnWindowObjectFocusGained, this); + evas_object_smart_callback_del_full(pWinObject, "focus,out", OnWindowObjectFocusLost, this); evas_object_smart_callback_del(pWebNativeNode, "inputmethod,changed", OnWebKeypadStateChanged); evas_object_smart_callback_del(pWebNativeNode, "editorclient,ime,opened", OnWebKeypadOpened); @@ -3708,9 +3672,9 @@ _WebImpl::RemoveEventListenerCallback(void) const evas_object_smart_callback_del(pWebNativeNode, "geolocation,permission,request", OnGeolocationPermissionRequested); - ewk_view_javascript_alert_callback_set(null, null, null); - ewk_view_javascript_prompt_callback_set(null, null, null); - ewk_view_javascript_confirm_callback_set(null, null, null); + 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); evas_object_smart_callback_del(pWebNativeNode, "policy,response,decide", OnWebDataReceived); @@ -3734,10 +3698,14 @@ _WebImpl::RemoveEventListenerCallback(void) const evas_object_smart_callback_del(pWebNativeNode, "touchmove,handled", OnWebPreventDefaultTriggered); evas_object_smart_callback_del(pWebNativeNode, "icon,received", OnFaviconReceived); - evas_object_smart_callback_del(pWebNativeNode, "text,selected", OnWebPageBlockSelected); - evas_object_smart_callback_del(pWebNativeNode, "frame,rendered", OnWebPageBlockSelectedByOrientation); + evas_object_smart_callback_del(pWebNativeNode, "magnifier,hide", OnWebPageBlockSelected); + + evas_object_smart_callback_del(pWebNativeNode, "fullscreen,enterfullscreen", OnFullScreenEntered); + evas_object_smart_callback_del(pWebNativeNode, "fullscreen,exitfullscreen", OnFullScreenExited); + + evas_object_smart_callback_del(pWebNativeNode, "keyevent,down,not,handled", OnFocusDownRequested); + evas_object_smart_callback_del(pWebNativeNode, "keyevent,up,not,handled", OnFocusUpRequested); - ewk_view_open_panel_callback_set(null, null, null); Ewk_Context* pContext = ewk_view_context_get(pWebNativeNode); SysAssertf(pContext, "Failed to get webkit instance."); ewk_context_vibration_client_callbacks_set(pContext, null, null, null); @@ -3748,6 +3716,7 @@ _WebImpl::RemoveEventListenerCallback(void) const ewk_view_exceeded_local_file_system_quota_callback_set(pWebNativeNode, null, null); evas_object_event_callback_del(pWebNativeNode, EVAS_CALLBACK_FOCUS_IN, OnWebNativeNodeFocusGained); + evas_object_event_callback_del(pWebNativeNode, EVAS_CALLBACK_FOCUS_OUT, OnWebNativeNodeFocusLost); } } @@ -3788,42 +3757,37 @@ _WebImpl::SetBlockSelectionPosition(const Point& startPoint) result _WebImpl::SetBlockSelectionPosition(const FloatPoint& startPoint) { - Evas_Object* pView = __pWebCore->GetWebNativeNode(); - Ewk_View_Smart_Data* pSmartData = (Ewk_View_Smart_Data*) evas_object_smart_data_get(pView); - if (pSmartData && pSmartData->api) + Evas_Object* pWebview = __pWebCore->GetWebNativeNode(); + if (!pWebview) { - Point absPoint( _CoordinateSystemUtils::ConvertToInteger(__pWebCore->GetAbsoluteCoordinate(startPoint))); + return E_SUCCESS; + } - Eina_Bool ret = pSmartData->api->text_selection_down(pSmartData, absPoint.x, absPoint.y); - if (ret) - { - pSmartData->api->text_selection_up(pSmartData, absPoint.x, absPoint.y); + Ewk_View_Smart_Data* pSmartData = reinterpret_cast< Ewk_View_Smart_Data* >(evas_object_smart_data_get(pWebview)); + SysAssertf(pSmartData && pSmartData->api, "Failed to get webkit instance."); + Point absPoint(_CoordinateSystemUtils::ConvertToInteger(__pWebCore->GetAbsoluteCoordinate(startPoint))); - Ewk_Hit_Test* pEwkHitTest = ewk_view_hit_test_new(pView, absPoint.x, absPoint.y, EWK_HIT_TEST_MODE_ALL); - SysTryReturnResult(NID_WEB_CTRL, pEwkHitTest, E_SYSTEM, "Failed to get hit test."); + Eina_Bool ret = pSmartData->api->text_selection_down(pSmartData, absPoint.x, absPoint.y); + if (ret) + { + pSmartData->api->text_selection_up(pSmartData, absPoint.x, absPoint.y); - String tagName(ewk_hit_test_tag_name_get(pEwkHitTest)); + Ewk_Hit_Test* pEwkHitTest = ewk_view_hit_test_new(pWebview, absPoint.x, absPoint.y, EWK_HIT_TEST_MODE_ALL); + SysTryReturnResult(NID_WEB_CTRL, pEwkHitTest, E_SYSTEM, "Failed to get hit test."); - if (tagName.Equals(L"INPUT", false) || tagName.Equals(L"TEXTAREA", false)) - { - ewk_view_command_execute(pView, "SelectWord", 0); - } - else - { - Eina_Hash* pAttrHash = ewk_hit_test_attribute_hash_get(pEwkHitTest); - char* pValue = reinterpret_cast< char* >(eina_hash_find(pAttrHash, "contenteditable")); - if(pValue) - { - ewk_view_command_execute(pView, "SelectWord", 0); - } - } + String tagName(ewk_hit_test_tag_name_get(pEwkHitTest)); + + Eina_Hash* pAttrHash = ewk_hit_test_attribute_hash_get(pEwkHitTest); + char* pValue = reinterpret_cast< char* >(eina_hash_find(pAttrHash, "contenteditable")); + if (tagName.Equals(L"INPUT", false) || tagName.Equals(L"TEXTAREA", false) || pValue) + { + ewk_view_command_execute(pWebview, "SelectWord", 0); + evas_object_smart_callback_call(pWebview, "magnifier,hide", NULL); } } SysTryReturnResult(NID_WEB_CTRL, GetTextFromBlock().GetLength() > 0, E_INVALID_ARG, "Failed to set text selection up."); - evas_object_smart_callback_call(pView, "text,selected", NULL); - return E_SUCCESS; } @@ -3949,6 +3913,36 @@ _WebImpl::GetPageSize(void) const } +result +_WebImpl::AddHttpHeaderField(const String& name, const String& value) +{ + SysTryReturnResult(NID_WEB_CTRL, name.GetLength() > 0, E_INVALID_ARG, "Invalid argument(s) is used. name key is missing."); + + std::unique_ptr pName(_StringConverter::CopyToCharArrayN(name)); + SysTryReturn(NID_WEB_CTRL, pName.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult())); + + std::unique_ptr pValue(_StringConverter::CopyToCharArrayN(value)); + + ewk_view_custom_header_add(__pWebCore->GetWebNativeNode(), pName.get(), pValue.get()); + + return E_SUCCESS; +} + + +result +_WebImpl::RemoveHttpHeaderField(const String& name) +{ + SysTryReturnResult(NID_WEB_CTRL, name.GetLength() > 0, E_INVALID_ARG, "Invalid argument(s) is used. name key is missing."); + + std::unique_ptr pName(_StringConverter::CopyToCharArrayN(name)); + SysTryReturn(NID_WEB_CTRL, pName.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult())); + + ewk_view_custom_header_remove(__pWebCore->GetWebNativeNode(), pName.get()); + + return E_SUCCESS; +} + + void _WebImpl::SetLoadingErrorOccurred(bool arg) { @@ -4019,20 +4013,6 @@ _WebImpl::IsCertificateConfirmed(void) const } -void -_WebImpl::SetOrientationChanged(bool arg) -{ - __isOrientationChanged = arg; -} - - -bool -_WebImpl::IsOrientationChanged(void) const -{ - return __isOrientationChanged; -} - - result _WebImpl::SetFullScreenKeypad(void) { @@ -4111,6 +4091,20 @@ _WebImpl::SetKeypadOpened(bool isKeypadOpened) } +bool +_WebImpl::IsWinFocusLost(void) const +{ + return __isWinFocusLost; +} + + +void +_WebImpl::SetWinFocusLost(bool isWinFocusLost) +{ + __isWinFocusLost = isWinFocusLost; +} + + Rectangle _WebImpl::GetPreviousKeypadBounds(void) const { @@ -4550,13 +4544,14 @@ _WebImpl::ShowAuthenticationPopup(const String& host, const String& realm, Authe int modalResult = 0; - __pAuthPopup->SetOwner(&GetPublic()); - r = __pAuthPopup->ShowAndWait(modalResult); SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); CATCH: - __pAuthPopup.reset(); + if (__pAuthPopup) + { + __pAuthPopup.reset(); + } return r; } @@ -4577,18 +4572,19 @@ _WebImpl::ShowCertificateConfirmPopup(_CertificatePopupMode userConfirmMode, Ewk int modalResult = 0; - __pCertConfirmPopup->SetOwner(&GetPublic()); - r = __pCertConfirmPopup->ShowAndWait(modalResult); SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); - if (userConfirmMode == CERTIFICATE_POPUP_MODE_USER_CONFIRM) + if (__pCertConfirmPopup.get() && userConfirmMode == CERTIFICATE_POPUP_MODE_USER_CONFIRM) { __isCertificateConfirmed = __pCertConfirmPopup->GetConfirmResult(); } CATCH: - __pCertConfirmPopup.reset(); + if (__pCertConfirmPopup.get()) + { + __pCertConfirmPopup.reset(); + } return r; } @@ -4602,13 +4598,11 @@ _WebImpl::ShowPromptPopup(String msg, String defVal) std::unique_ptr< _PromptPopup > pPromptPopup(new (std::nothrow) _PromptPopup()); SysTryReturnResult(NID_WEB_CTRL, pPromptPopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed."); - r = pPromptPopup->Construct(msg, defVal, __pWebCore->GetWebNativeNode()); + r = pPromptPopup->Construct(msg, defVal, __pWebCore->GetWebNativeNode(), this); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); __pPromptPopup = std::move(pPromptPopup); - __pPromptPopup->SetOwner(&GetPublic()); - r = __pPromptPopup->ShowPopup(); SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); @@ -4630,22 +4624,96 @@ _WebImpl::ShowUserConfirmPopup(_UserConfirmMode userConfirmMode, void* pPolicy, std::unique_ptr<_UserConfirmPopup> pUserConfirmPopup(new (std::nothrow) _UserConfirmPopup()); SysTryReturnResult(NID_WEB_CTRL, pUserConfirmPopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed."); - r = pUserConfirmPopup->Construct(userConfirmMode, pPolicy, true, msg); + r = pUserConfirmPopup->Construct(userConfirmMode, pPolicy, this, true, msg); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); - __pUserConfirmPopup = std::move(pUserConfirmPopup); - int modalResult = 0; - __pUserConfirmPopup->SetOwner(&GetPublic()); - - r = __pUserConfirmPopup->ShowAndWait(modalResult); - SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); - -CATCH: - __pUserConfirmPopup.reset(); + switch(userConfirmMode) + { + case USER_CONTENT_HANDLER: + { + __pContentHandlerConfirmPopup = std::move(pUserConfirmPopup); - return r; + r = __pContentHandlerConfirmPopup->ShowAndWait(modalResult); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pContentHandlerConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + __pContentHandlerConfirmPopup.reset(); + + ewk_view_resume(__pWebCore->GetWebNativeNode()); + + break; + } + case USER_PROTOCOL_HANDLER: + { + __pProtocolHandlerConfirmPopup = std::move(pUserConfirmPopup); + + r = __pProtocolHandlerConfirmPopup->ShowAndWait(modalResult); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pProtocolHandlerConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + __pProtocolHandlerConfirmPopup.reset(); + + ewk_view_resume(__pWebCore->GetWebNativeNode()); + + break; + } + case USER_CONFIRM_APP_CACHE: + { + __pAppCacheConfirmPopup = std::move(pUserConfirmPopup); + + r = __pAppCacheConfirmPopup->ShowAndWait(modalResult); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pAppCacheConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + __pAppCacheConfirmPopup.reset(); + + ewk_view_resume(__pWebCore->GetWebNativeNode()); + + break; + } + case USER_CONFIRM_DB_QUOTA_EXCEDED: + { + __pDbQuotaConfirmPopup = std::move(pUserConfirmPopup); + + r = __pDbQuotaConfirmPopup->ShowAndWait(modalResult); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pDbQuotaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + __pDbQuotaConfirmPopup.reset(); + + ewk_view_resume(__pWebCore->GetWebNativeNode()); + + break; + } + case USER_CONFIRM_LOCAL_FS_QUOTA_EXCEDED: + { + __pLocalFsQuotaConfirmPopup = std::move(pUserConfirmPopup); + + r = __pLocalFsQuotaConfirmPopup->ShowAndWait(modalResult); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pLocalFsQuotaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + __pLocalFsQuotaConfirmPopup.reset(); + + ewk_view_resume(__pWebCore->GetWebNativeNode()); + + break; + } + case USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED: + { + __pIndexedDbQuotaConfirmPopup = std::move(pUserConfirmPopup); + + r = __pIndexedDbQuotaConfirmPopup->ShowAndWait(modalResult); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pIndexedDbQuotaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + __pIndexedDbQuotaConfirmPopup.reset(); + + ewk_view_resume(__pWebCore->GetWebNativeNode()); + + break; + } + default: + break; + } +CATCH: + return r; } @@ -4657,46 +4725,96 @@ _WebImpl::ShowUserConfirmPopupAsync(_UserConfirmMode userConfirmMode, void* pPol std::unique_ptr<_UserConfirmPopup> pUserConfirmPopup(new (std::nothrow) _UserConfirmPopup()); SysTryReturnResult(NID_WEB_CTRL, pUserConfirmPopup.get(), E_OUT_OF_MEMORY, "Memory Allocation failed."); - r = pUserConfirmPopup->Construct(userConfirmMode, pPolicy, false, msg); + r = pUserConfirmPopup->Construct(userConfirmMode, pPolicy, this, false, msg); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); - __pUserConfirmPopup = std::move(pUserConfirmPopup); + switch(userConfirmMode) + { + case USER_CONFIRM_USERMEDIA: + { + __pUserMediaConfirmPopup.reset(); + + __pUserMediaConfirmPopup = std::move(pUserConfirmPopup); - __pUserConfirmPopup->SetOwner(&GetPublic()); + r = __pUserMediaConfirmPopup->ShowPopup(); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pUserMediaConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); - r = __pUserConfirmPopup->ShowPopup(); - SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); + break; + } + case USER_CONFIRM_GEOLOCATION: + { + __pGeolocationConfirmPopup.reset(); + + __pGeolocationConfirmPopup = std::move(pUserConfirmPopup); + + r = __pGeolocationConfirmPopup->ShowPopup(); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pGeolocationConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + break; + } + case USER_CONFIRM_NOTIFICATION: + { + __pNotificationConfirmPopup.reset(); + + __pNotificationConfirmPopup = std::move(pUserConfirmPopup); - __pUserConfirmPopup.release(); + r = __pNotificationConfirmPopup->ShowPopup(); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pNotificationConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + break; + } + case USER_SCRIPT_ALERT: + { + __pScriptAlertConfirmPopup.reset(); + + __pScriptAlertConfirmPopup = std::move(pUserConfirmPopup); + + r = __pScriptAlertConfirmPopup->ShowPopup(); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pScriptAlertConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + break; + } + case USER_SCRIPT_CONFIRM: + { + __pScriptConfirmPopup.reset(); + + __pScriptConfirmPopup = std::move(pUserConfirmPopup); + + r = __pScriptConfirmPopup->ShowPopup(); + SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, __pScriptConfirmPopup.reset(), r, "[%s] Propagating.", GetErrorMessage(r)); + + break; + } + default: + break; + } return E_SUCCESS; CATCH: - __pUserConfirmPopup.reset(); - return r; } -_Form* -_WebImpl::GetParentFormCore(_Control* pControlCore) +_FormImpl* +_WebImpl::GetParentFormImpl(_ControlImpl* pControlImpl) { String parentName; - _Form* pFormCore = null; + _FormImpl* pFormImpl = null; - _Control* pParentControlCore = dynamic_cast< _Control* >(pControlCore->GetParent()); - if (!pParentControlCore) + _ControlImpl* pParentControlImpl = dynamic_cast< _ControlImpl* >(pControlImpl->GetParent()); + if (!pParentControlImpl) { return null; } - pFormCore = dynamic_cast< _Form* >(pParentControlCore); - if (pFormCore) + pFormImpl = dynamic_cast< _FormImpl* >(pParentControlImpl); + if (pFormImpl) { - return pFormCore; + return pFormImpl; } - return GetParentFormCore(pParentControlCore); + return GetParentFormImpl(pParentControlImpl); } @@ -4710,15 +4828,17 @@ _WebImpl::OnFocusGained(const _ControlImpl& source) bool _WebImpl::OnFocusLost(const _ControlImpl& source) { + Evas_Object* pWebview = __pWebCore->GetWebNativeNode(); + if (!pWebview) + { + return false; + } + if(IsKeypadVisible() == true) { SetKeypadOpened(true); - - SetKeypadVisibleState(false); } - evas_object_focus_set(__pWebCore->GetWebNativeNode(), EINA_FALSE); - return false; } @@ -4740,13 +4860,44 @@ _WebImpl::OnPreAttachedToMainTree(void) { result r = E_SUCCESS; - r = __pWebCore->InitializeWebNativeNode(); - SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); + if (IsVisible() == true) + { + _WebManager* pWebManager = _WebManager::GetInstance(); + pWebManager->SetActiveWeb(this); + } - r = InitializeSetting(); + r = _ContainerImpl::OnPreAttachedToMainTree(); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); - r = _ContainerImpl::OnPreAttachedToMainTree(); + if (!HasValidNativeNode()) + { + r = __pWebCore->InitializeWebNativeNode(); + SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); + + _ControlManager* pControlManager = _ControlManager::GetInstance(); + SysTryReturnResult(NID_WEB_CTRL, pControlManager, E_SYSTEM, "Failed to get the ControlManager instance."); + OnChangeLayout(pControlManager->GetScreenRotation()); + + r = InitializeSetting(); + SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); + + _WebManager* pWebManager = _WebManager::GetInstance(); + pWebManager->AddWeb(reinterpret_cast< int >(this)); + } + + return E_SUCCESS; +} + + +result +_WebImpl::OnDetachingFromMainTree(void) +{ + result r = E_SUCCESS; + + _WebManager* pWebManager = _WebManager::GetInstance(); + pWebManager->RemoveActiveWeb(this); + + r = _ContainerImpl::OnDetachingFromMainTree(); SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r)); return E_SUCCESS; @@ -4754,12 +4905,36 @@ _WebImpl::OnPreAttachedToMainTree(void) void +_WebImpl::OnChangeLayout(_ControlRotation rotation) +{ + int degree = 0; + + switch (rotation) + { + case _CONTROL_ROTATION_0: + degree = 0; + break; + case _CONTROL_ROTATION_90: + degree = 90; + break; + case _CONTROL_ROTATION_180: + degree = 180; + break; + case _CONTROL_ROTATION_270: + degree = -90; + break; + default: + SysAssert(false); + } + ewk_view_orientation_send(__pWebCore->GetWebNativeNode(), degree); +} + + +void _WebImpl::OnChangeLayout(_ControlOrientation orientation) { _ContainerImpl::OnChangeLayout(orientation); - __isOrientationChanged = true; - if (__pColorPicker.get()) { __pColorPicker->ChangeLayout(orientation); @@ -4781,12 +4956,15 @@ _WebImpl::OnChangeLayout(_ControlOrientation orientation) void _WebImpl::OnAncestorVisibleStateChanged(const _Control& control) { + _WebManager* pWebManager = _WebManager::GetInstance(); if (IsVisible() == true) { + pWebManager->SetActiveWeb(this); ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, false); } else { + pWebManager->RemoveActiveWeb(this); ewk_view_page_visibility_state_set(__pWebCore->GetWebNativeNode(), EWK_PAGE_VISIBILITY_STATE_HIDDEN, false); } } @@ -4805,12 +4983,26 @@ _WebImpl::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::ILi case ID_PROMPT_POPUP_CLOSE: __pPromptPopup.reset(); break; - case ID_USER_CONFIRM_POPUP_CLOSE: - __pUserConfirmPopup.reset(); + case ID_USER_CONFIRM_USERMEDIA_CLOSE: + __pUserMediaConfirmPopup.reset(); + break; + case ID_USER_CONFIRM_GEOLOCATION_CLOSE: + __pGeolocationConfirmPopup.reset(); + break; + case ID_USER_CONFIRM_NOTIFICATION_CLOSE: + __pNotificationConfirmPopup.reset(); + break; + case ID_USER_SCRIPT_ALERT_CLOSE: + __pScriptAlertConfirmPopup.reset(); + break; + case ID_USER_SCRIPT_CONFIRM_CLOSE: + __pScriptConfirmPopup.reset(); break; default: break; } + + Resume(); } @@ -4826,6 +5018,8 @@ _WebImpl::HideColorPicker(void) { __pColorPicker.reset(); + Resume(); + return EINA_TRUE; } @@ -4848,12 +5042,17 @@ _WebImpl::ShowColorPicker(int red, int green, int blue, int alpha, Color& color) r = __pColorPicker->ShowPopup(); SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); - color = __pColorPicker->GetColor(); - - return E_SUCCESS; + if (__pColorPicker) + { + color = __pColorPicker->GetColor(); + } CATCH: - __pColorPicker.reset(); + if (__pColorPicker) + { + __pColorPicker.reset(); + Resume(); + } return r; } @@ -4875,10 +5074,17 @@ _WebImpl::ShowDatePicker(Ewk_Input_Type inputType, const char* inputValue, Strin r = __pDatePicker->ShowPopup(); SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r)); - dateStr = __pDatePicker->GetDate(); + if (__pDatePicker) + { + dateStr = __pDatePicker->GetDate(); + } CATCH: - __pDatePicker.reset(); + if (__pDatePicker) + { + __pDatePicker.reset(); + Resume(); + } return r; } @@ -5206,11 +5412,4 @@ _WebImpl::SetWebNotification(_WebNotification* pWebNotification) } -void -_WebImpl::OnDownloadCompleted(RequestId reqId, const String &path) -{ - _ContentManagerImpl::ScanFile(path); -} - - }}} // Tizen::Web::Controls