Add Protocol & Content Handler
authorhs0219.yang <hs0219.yang@samsung.com>
Fri, 5 Apr 2013 08:01:28 +0000 (17:01 +0900)
committerhs0219.yang <hs0219.yang@samsung.com>
Fri, 5 Apr 2013 08:26:39 +0000 (17:26 +0900)
Change-Id: I52cd9f9566e42451607d0f69e19ce050f0107ed5
Signed-off-by: hs0219.yang <hs0219.yang@samsung.com>
src/controls/FWebCtrl_UserConfirmPopup.cpp
src/controls/FWebCtrl_UserConfirmPopup.h
src/controls/FWebCtrl_WebImpl.cpp
src/controls/FWebCtrl_WebImpl.h

index fee2180..8309036 100755 (executable)
@@ -58,6 +58,7 @@ namespace Tizen { namespace Web { namespace Controls
 _UserConfirmPopup::_UserConfirmPopup(void)
        : __pUserPolicyData(null)
        , __userConfirmMode(USER_CONFIRM_USERMEDIA)
+       , __sync(false)
        , __pCheckButton(null)
 {
 }
@@ -69,7 +70,7 @@ _UserConfirmPopup::~_UserConfirmPopup(void)
 
 
 result
-_UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo)
+_UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo, bool sync)
 {
        result r = E_SUCCESS;
        SysTryReturnResult(NID_WEB_CTRL, pEventInfo, E_INVALID_ARG, "Invalid argument(s) is used. pPolicy is null.");
@@ -81,6 +82,7 @@ _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo)
 
        __pUserPolicyData = pEventInfo;
        __userConfirmMode = userConfirmMode;
+       __sync = sync;
 
        int popupMaxHeight = 2*pPopupData->labelDim.height + 2*pPopupData->btnDim.height + 6*pPopupData->sideMargin;
        if (__userConfirmMode == USER_CONFIRM_GEOLOCATION)
@@ -196,7 +198,10 @@ _UserConfirmPopup::OnActionPerformed(const Control& source, int actionId)
                SysLogException(NID_WEB_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
        }
 
-       delete this;
+       if (!__sync)
+       {
+               delete this;
+       }
 }
 
 
@@ -212,6 +217,28 @@ _UserConfirmPopup::GetMessageFromPolicy(void)
                message = L"Do you want to allow acccess to media?\n";
                break;
        }
+       case USER_PROTOCOL_HANDLER:
+       {
+               Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(__pUserPolicyData);
+               SysAssertf(pHandlerData, "Failed to request");
+
+               String target(ewk_custom_handlers_data_target_get(pHandlerData));
+               String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
+
+               message = baseUri + String(L" is asking to register ") + target + String(L" protocol handler.");
+               break;
+       }
+       case USER_CONTENT_HANDLER:
+       {
+               Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(__pUserPolicyData);
+               SysAssertf(pHandlerData, "Failed to request");
+
+               String target(ewk_custom_handlers_data_target_get(pHandlerData));
+               String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
+
+               message = String(baseUri) + String(L" is asking to register ") + String(target) + String(L" content handler.");
+               break;
+       }
        case USER_CONFIRM_GEOLOCATION:
        {
                Ewk_Geolocation_Permission_Request* pGeoLocPermReq = reinterpret_cast< Ewk_Geolocation_Permission_Request* >(__pUserPolicyData);
@@ -240,6 +267,16 @@ _UserConfirmPopup::HandleUserAction(Eina_Bool allow)
                ewk_user_media_permission_request_set(pPolicy, allow);
                break;
        }
+       case USER_PROTOCOL_HANDLER:
+       {
+               RegisterHandler(false, allow);
+               break;
+       }
+       case USER_CONTENT_HANDLER:
+       {
+               RegisterHandler(true, allow);
+               break;
+       }
        case USER_CONFIRM_GEOLOCATION:
        {
                Ewk_Geolocation_Permission_Request* pPolicy =  reinterpret_cast< Ewk_Geolocation_Permission_Request* >(__pUserPolicyData);
@@ -287,4 +324,68 @@ _UserConfirmPopup::AddGeolocationDb(Ewk_Geolocation_Permission_Request* pPolicy,
        return E_SUCCESS;
 }
 
+void
+_UserConfirmPopup::RegisterHandler(bool checkHandler, Eina_Bool allow)
+{
+       _DatabaseImpl db;
+       String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
+       String table;
+       int checkId = 0;
+       
+       if(checkHandler == true)
+       {
+               table = CUSTOM_CONTENT_TABLE_NAME;
+       }
+       else
+       {
+               table = CUSTOM_PROTOCOL_TABLE_NAME;
+       }
+       Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(__pUserPolicyData);
+       SysAssertf(pHandlerData, "Failed to request");
+                       
+       String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
+       String uri = ewk_custom_handlers_data_url_get(pHandlerData);
+       String target = ewk_custom_handlers_data_target_get(pHandlerData);
+
+       result r = db.Construct(handlerPath, "r+", null);
+       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       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"'"));
+
+       if(pEnum.get())
+       {
+               pEnum->MoveNext();
+               pEnum->GetIntAt(0, checkId);
+               
+               std::unique_ptr<DbStatement> pUpdateStmt(db.CreateStatementN(L"Update " + table + L" Set allow = (?) Where id = (?)"));
+               SysTryReturnVoidResult(NID_WEB_CTRL, pUpdateStmt.get(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+
+               pUpdateStmt->BindInt(0, static_cast < int >(allow));
+               pUpdateStmt->BindInt(1, checkId);
+
+               db.BeginTransaction();
+               
+               std::unique_ptr<DbEnumerator> pEnum(db.ExecuteStatementN(*pUpdateStmt));
+               
+               db.CommitTransaction();
+               
+       }
+       else
+       {
+               std::unique_ptr<DbStatement> pStmt(db.CreateStatementN(L"Insert Into " + table + L" (baseUrl, url, mime, allow) Values (?, ?, ?, ?)"));
+               SysTryReturnVoidResult(NID_WEB_CTRL, pStmt.get(),  GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+                                               
+               pStmt->BindString(0, baseUri);
+               pStmt->BindString(1, uri);
+               pStmt->BindString(2, target);
+               pStmt->BindInt(3, static_cast < int >(allow));
+               
+               db.BeginTransaction();
+               
+               std::unique_ptr<DbEnumerator> pRegisterEnum(db.ExecuteStatementN(*pStmt));
+               
+               db.CommitTransaction();
+       }
+}
+
 }}} // Tizen::Web::Controls
index 2dd039d..e285e4b 100755 (executable)
@@ -46,6 +46,8 @@ enum _UserConfirmPopupButtonId
 enum _UserConfirmMode
 {
        USER_CONFIRM_USERMEDIA,
+       USER_CONTENT_HANDLER,
+       USER_PROTOCOL_HANDLER,
        USER_CONFIRM_GEOLOCATION
 };
 
@@ -64,7 +66,7 @@ public:
         */
        virtual ~_UserConfirmPopup(void);
 
-       result Construct(_UserConfirmMode userConfirmMode, void* pEventInfo);
+       result Construct(_UserConfirmMode userConfirmMode, void* pEventInfo, bool sync = false);
 
        virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId);
 
@@ -77,6 +79,7 @@ private:
 
        void HandleUserAction(Eina_Bool allow);
 
+       void RegisterHandler(bool checkhandler, Eina_Bool allow);
        result AddGeolocationDb(Ewk_Geolocation_Permission_Request* pPolicy, bool enable);
 
 private:
@@ -84,6 +87,7 @@ private:
        _UserConfirmMode __userConfirmMode;
        Tizen::Ui::Controls::CheckButton* __pCheckButton;
 
+       bool __sync;
 }; // _UserConfirmPopup
 
 }}} // Tizen::Web::Controls
index 48adf55..6492352 100755 (executable)
@@ -618,63 +618,107 @@ OnNotificationCancel(void* pUserData, Evas_Object* pView, void* pEventInfo)
 void
 OnProtocolHandlerRegistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
 {
+       result r = E_SUCCESS;
        _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
-       Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
-       SysAssertf(pImpl && pHandlerData, "Failed to request");
+       SysAssertf(pImpl, "Failed to request");
 
-       ewk_custom_handlers_data_target_get(pHandlerData);
-       ewk_custom_handlers_data_base_url_get(pHandlerData);
-       ewk_custom_handlers_data_url_get(pHandlerData);
-       ewk_custom_handlers_data_title_get(pHandlerData);
+       r = pImpl->ShowUserConfirmPopup(USER_PROTOCOL_HANDLER, pEventInfo);
+       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 }
 
 
 void
 OnIsProtocolHandlerRegistered(void* pUserData, Evas_Object* pView, void* pEventInfo)
 {
+       int checkHandler = 0;
        _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
        Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
        SysAssertf(pImpl && pHandlerData, "Failed to request");
 
-       ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_REGISTERED);
+       checkHandler = pImpl->SearchHandler(pHandlerData, false);
+       SysTryReturnVoidResult(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+       switch (checkHandler)
+       {
+       case -1:
+               return;
+       case 0:
+               ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_DECLINED);
+               break;
+       case 1:
+               ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_REGISTERED);
+               break;
+       case 2:
+               ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_NEW);
+               break;
+       default:
+               SysAssert(false);
+       }
 }
 
-
 void
 OnProtocolHandlerUnregistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
 {
+       result r = E_SUCCESS;
        _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
        Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
        SysAssertf(pImpl && pHandlerData, "Failed to request");
+
+       r = pImpl->UnregistrationHandler(pHandlerData, false);
+       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 }
 
 
 void
 OnContentHandlerRegistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
 {
+       result r = E_SUCCESS;
        _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
-       Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
-       SysAssertf(pImpl && pHandlerData, "Failed to request");
+       SysAssertf(pImpl, "Failed to request");
+       
+       r = pImpl->ShowUserConfirmPopup(USER_CONTENT_HANDLER, pEventInfo);
+       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 }
 
 
 void
 OnIsContentHandlerRegistered(void* pUserData, Evas_Object* pView, void* pEventInfo)
 {
+       int checkHandler = 0;
        _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
        Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
        SysAssertf(pImpl && pHandlerData, "Failed to request");
 
-       ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_REGISTERED);
+       checkHandler = pImpl->SearchHandler(pHandlerData, true);
+       SysTryReturnVoidResult(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+       
+       switch (checkHandler)
+       {
+       case -1:
+               return;
+       case 0:
+               ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_DECLINED);
+               break;
+       case 1:
+               ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_REGISTERED);
+               break;
+       case 2:
+               ewk_custom_handlers_data_result_set(pHandlerData, EWK_CUSTOM_HANDLERS_NEW);
+               break;
+       default:
+               SysAssert(false);
+       }
 }
 
-
 void
 OnContentHandlerUnregistrationRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
 {
+       result r = E_SUCCESS;
        _WebImpl* pImpl = reinterpret_cast<_WebImpl*>(pUserData);
        Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(pEventInfo);
        SysAssertf(pImpl && pHandlerData, "Failed to request");
+
+       r = pImpl->UnregistrationHandler(pHandlerData, true);
+       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 }
 
 
@@ -739,6 +783,16 @@ OnLoadingRequested(void* pUserData, Evas_Object* pView, void* pEventInfo)
                }
        }
 
+       String currentUrl = pImpl->GetUrl();
+
+       String redirectUrl = pImpl->GetProtocolFromUri(url,  currentUrl);
+       if (redirectUrl != null)
+       {
+               pImpl->LoadUrl(redirectUrl);
+               ewk_policy_decision_ignore(pPolicy);
+               return;
+       }
+       
        Uri uri;
        uri.SetUri(url);
 
@@ -884,6 +938,10 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
        SysLog(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));
+
+       
        if (pLoadingListener && ewk_frame_is_main_frame(ewk_policy_decision_frame_get(pPolicy)))
        {
                const Eina_Hash* pHeader = ewk_policy_decision_response_headers_get(pPolicy);
@@ -908,6 +966,15 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
        {
        case WEB_DECISION_CONTINUE:
        {
+
+               String currentUrl = pImpl->GetUrl();
+               String redirectUrl = pImpl->GetRedirectUri(url, currentUrl, mime);
+               if (redirectUrl != L"")
+               {
+                       pImpl->LoadUrl(redirectUrl);
+                       ewk_policy_decision_ignore(pPolicy);
+                       return;
+               }
                if (pImpl->IsMimeSupported(mime) || mime == L"")
                {
                        break;
@@ -915,7 +982,7 @@ OnWebDataReceived(void* pUserData, Evas_Object* pView, void* pEventInfo)
                
                else
                {
-                       SysLog(NID_WEB_CTRL, "Lauch native app to handle the mime");
+                       SysLog(NID_WEB_CTRL, "Launch native app to handle the mime");
 
                        ewk_policy_decision_ignore(pPolicy);
 
@@ -4200,6 +4267,28 @@ CATCH:
        return r;
 }
 
+result
+_WebImpl::ShowUserConfirmPopup(_UserConfirmMode userConfirmMode, void* pPolicy)
+{
+       result r = E_SUCCESS;
+
+       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);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       __pUserConfirmPopup = std::move(pUserConfirmPopup);
+
+       int modalResult = 0;
+       r = __pUserConfirmPopup->ShowAndWait(modalResult);
+       SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+       
+CATCH:
+       __pUserConfirmPopup.reset();
+
+       return r;
+}
 
 result
 _WebImpl::ShowUserConfirmPopupAsync(_UserConfirmMode userConfirmMode, void* pPolicy)
@@ -4209,7 +4298,7 @@ _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);
+       r = pUserConfirmPopup->Construct(userConfirmMode, pPolicy, false);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
        __pUserConfirmPopup = std::move(pUserConfirmPopup);
@@ -4435,5 +4524,229 @@ _WebImpl::GetInstance(const Web* pWeb)
        return dynamic_cast< const _WebImpl* >(_ControlImpl::GetInstance(*pWeb));
 }
 
+int 
+_WebImpl::SearchHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime)
+{
+       int checkReturn = 0;
+       _DatabaseImpl db;
+       String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
+
+       String table;
+       if( checkmime == true)
+       {
+               table = CUSTOM_CONTENT_TABLE_NAME;
+       }
+       else
+       {
+               table = CUSTOM_PROTOCOL_TABLE_NAME;
+       }
+       
+       String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
+       String uri(ewk_custom_handlers_data_url_get(pHandlerData));
+       String target(ewk_custom_handlers_data_target_get(pHandlerData));
+
+       SysLog(NID_WEB_CTRL, "BaseUrl : %s, Url : %s, mime : %s", baseUri.GetPointer(), uri.GetPointer(), target.GetPointer());
+       
+       result r = db.Construct(handlerPath, "r+", null);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       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"'"));
+       SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, -1, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+
+       if(pEnum.get())
+       {
+               r = pEnum->MoveNext();
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
+               r = pEnum->GetIntAt(0, checkReturn);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
+       }
+       else
+       {
+               checkReturn = 2;
+       }
+
+       return checkReturn;
+}
+
+result 
+_WebImpl::UnregistrationHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime)
+{
+       int checkId = 0;
+       _DatabaseImpl db;
+       String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
+
+       String table;
+       if( checkmime == true)
+       {
+               table = CUSTOM_CONTENT_TABLE_NAME;
+       }
+       else
+       {
+               table = CUSTOM_PROTOCOL_TABLE_NAME;
+       }
+
+       String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
+       String uri(ewk_custom_handlers_data_url_get(pHandlerData));
+       String target(ewk_custom_handlers_data_target_get(pHandlerData));
+       
+       SysLog(NID_WEB_CTRL, "BaseUrl : %s, Url : %s, mime : %s", baseUri.GetPointer(), uri.GetPointer(), target.GetPointer());
+       
+       result r = db.Construct(handlerPath, "r+", null);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       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"'"));
+       SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+
+       if(pEnum.get())
+       {
+               r = pEnum->MoveNext();
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+               r = pEnum->GetIntAt(0, checkId);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+               
+               std::unique_ptr<DbStatement> pDeleteStmt(db.CreateStatementN(L"Delete From " + table + L" Where id = (?)"));
+               SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
+
+               r = pDeleteStmt->BindInt(0, checkId);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+               
+               db.BeginTransaction();
+               
+               std::unique_ptr<DbEnumerator> pEnum(db.ExecuteStatementN(*pDeleteStmt));
+               
+               db.CommitTransaction();
+       }
+
+       return E_SUCCESS;
+}
+
+const Tizen::Base::String 
+_WebImpl::GetProtocolFromUri(const Tizen::Base::String& originUri, const Tizen::Base::String& currentUri)
+{
+       SysAssertf(currentUri != null, "Failed to get currenturi");
+
+       result r = E_SUCCESS;
+       String baseUri;
+       _DatabaseImpl db;
+       String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
+       String originReplace(originUri);
+       String table(CUSTOM_PROTOCOL_TABLE_NAME);
+       int found = 0;
+       int foundQuery = 0;
+
+       r = currentUri.LastIndexOf(L"/", currentUri.GetLength()-1, found);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+       
+       r = currentUri.SubString(0, found + 1, baseUri);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+               
+       r = db.Construct(handlerPath, "r+", null);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+       
+       std::unique_ptr<DbEnumerator> pEnum(db.QueryN(L"Select mime, url, allow From " + table + L" Where baseUrl = '" + baseUri + "'"));
+       SysTryReturn(NID_WEB_CTRL, GetLastResult() == E_SUCCESS, L"", GetLastResult(), "[%s] Propagating.", GetErrorMessage(r));
+
+       if(pEnum.get())
+       {
+               while (pEnum->MoveNext() == E_SUCCESS)
+               {                       
+                       String protocol;
+                       String queryUrl;
+                       int allow;
+                       String originScheme;
+
+                       r = pEnum->GetStringAt(0, protocol);
+                       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+               
+                       r = pEnum->GetStringAt(1, queryUrl);
+                       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+                       
+                       r = pEnum->GetIntAt(2, allow);
+                       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+
+                       if (allow == 0)
+                       {
+                               break;
+                       }
+
+                       String protocolScheme(protocol + L":");
+                       
+                       r = originReplace.SubString(0, protocolScheme.GetLength(), originScheme);
+                       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+                                               
+                       if ((originReplace.GetLength() >= protocolScheme.GetLength()) && originScheme.Equals(protocolScheme, false))
+                       {
+                               if (queryUrl.IndexOf(L"%s", 0, foundQuery) == E_SUCCESS)
+                               {
+                                       r = originReplace.Replace(originScheme, "");
+                                       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+                                       
+                                       queryUrl.Replace("%s", originReplace, 0);
+                                       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+
+                                       return queryUrl;
+                               }
+                       }               
+               }
+       }
+       
+       return L"";
+}
+
+
+const Tizen::Base::String 
+_WebImpl::GetRedirectUri(const Tizen::Base::String& originUri, const Tizen::Base::String& currentUri, const Tizen::Base::String& mime)
+{
+       SysAssertf(currentUri != null, "Failed to get currenturi");
+
+       result r = E_SUCCESS;
+       String baseUri;
+       String contentUrl;
+       String originUrlStr = originUri;
+       const String replaceStr = L"%s";
+       _DatabaseImpl db;
+       String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
+       String table(CUSTOM_CONTENT_TABLE_NAME);
+       int allow = 0;
+       int found = 0;
+       
+       r = currentUri.LastIndexOf(L"/", currentUri.GetLength()-1, found);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+               
+       r = currentUri.SubString(0, found + 1, baseUri);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+               
+       r = db.Construct(handlerPath, "r+", null);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+
+       std::unique_ptr<DbEnumerator> pEnum(db.QueryN(L"Select allow, url From " + table + L" Where baseUrl = '" + baseUri + "' AND mime = '" + mime + L"'"));
+       
+       if (pEnum.get())
+       {
+               r = pEnum->MoveNext();
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+               r = pEnum->GetIntAt(0, allow);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+               r = pEnum->GetStringAt(1, contentUrl);
+               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+                       
+               if (allow == 0)
+               {
+                       return L"";
+               }
+               else
+               {
+                       if (contentUrl != L"")
+                       {
+                               r = contentUrl.Replace(replaceStr, originUrlStr, 0);
+                               SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, L"", r, "[%s] Propagating.", GetErrorMessage(r));
+
+                               return contentUrl;
+                       }
+               }
+       }
+       
+       return L"";
+}
 
 }}} // Tizen::Web::Controls
index c8cfb24..3253c16 100755 (executable)
@@ -328,6 +328,7 @@ public:
 
        result ShowCertificateConfirmPopup(_CertificatePopupMode userConfirmMode, Ewk_Certificate_Policy_Decision *pPolicy);
 
+       result ShowUserConfirmPopup(_UserConfirmMode userConfirmMode, void* pPolicy);
        result ShowUserConfirmPopupAsync(_UserConfirmMode userConfirmMode, void* pPolicy);
 
        Tizen::Ui::Controls::_Form* GetParentFormCore(Tizen::Ui::_Control* pControlCore);
@@ -370,6 +371,14 @@ public:
 
        static const _WebImpl* GetInstance(const Web* pWeb);
 
+       int SearchHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime);
+
+       result UnregistrationHandler(Ewk_Custom_Handlers_Data* pHandlerData, bool checkmime);
+
+       const Tizen::Base::String GetProtocolFromUri(const Tizen::Base::String& originuri, const Tizen::Base::String& currenturi);
+
+       const Tizen::Base::String GetRedirectUri(const Tizen::Base::String& originuri, const Tizen::Base::String& currenturi, const Tizen::Base::String& mime);
+
 private:
        result InitializeSetting(void);
        result InitJsBridgeList(void);