From: Jihoon Chung Date: Fri, 23 Nov 2012 09:21:54 +0000 (+0900) Subject: Support security origin for W3C geolocation X-Git-Tag: 2.1b_release~22^2~202 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2249eeaf6131734915f6f40392471f33c1287f43;p=platform%2Fframework%2Fweb%2Fwrt.git Support security origin for W3C geolocation [Issue#] N/A [Problem] Support security origin for geolocation permmision [Cause] N/A [Solution] Implement security origin stored database after user makes decision on the asking popup [SCMRequest] N/A Change-Id: Idd5fa1fb39491c84f6943e713b42346b6a163872 --- diff --git a/src/view/webkit/view_logic.cpp b/src/view/webkit/view_logic.cpp index 4c2d2fd..33d420a 100644 --- a/src/view/webkit/view_logic.cpp +++ b/src/view/webkit/view_logic.cpp @@ -479,10 +479,6 @@ void ViewLogic::initializeSupport() // temp // m_vibrationSupport->initialize(); - - ViewModule::GeolocationSupport::Webkit2::initialize(m_model->TizenId); - ViewModule::GeolocationSupport::Webkit2:: - adjustGeolocationModuleState(m_currentEwkView); } void ViewLogic::initializePluginLoading() @@ -499,9 +495,6 @@ void ViewLogic::initializePluginLoading() void ViewLogic::ewkClientInit(Evas_Object *wkView) { Assert(NULL != wkView && "ewk_view not created at this point"); - ViewModule::GeolocationSupport::Webkit2:: - initialize(m_model->TizenId); - // WKPageLoaderClient evas_object_smart_callback_add( wkView, @@ -1361,15 +1354,17 @@ void ViewLogic::formSubmitCallback( } void ViewLogic::geolocationPermissionRequestCallback( - void* /*data*/, + void* data, Evas_Object* /*obj*/, void* eventInfo) { - LogDebug("geolocationPermissionRequestCallback called"); + Assert(data); + ViewLogic* This = static_cast(data); Assert(eventInfo); - ViewModule::GeolocationSupport::Webkit2:: - geolocationPermissionRequest(eventInfo); - return; + ViewModule::GeolocationSupport::Webkit2::geolocationPermissionRequest( + This->m_window, + This->m_securityOriginSupport->getSecurityOriginDAO(), + eventInfo); } void ViewLogic::notificationShowCallback( diff --git a/src/view/webkit/view_logic_geolocation_support_webkit2.cpp b/src/view/webkit/view_logic_geolocation_support_webkit2.cpp index ab7a5b5..197d658 100644 --- a/src/view/webkit/view_logic_geolocation_support_webkit2.cpp +++ b/src/view/webkit/view_logic_geolocation_support_webkit2.cpp @@ -20,62 +20,127 @@ #include "view_logic_geolocation_support_webkit2.h" +#include +#include #include #include -#include +#include +#include #include - -namespace { -DPL::String s_tizenId; -const double GEOLOCATION_POSITION_ACCURACY = 0.0; -} // anonymous namespace +#include +#include namespace ViewModule { namespace GeolocationSupport { namespace Webkit2 { -void initialize(const DPL::String& tizenId) +using namespace SecurityOriginDB; +using namespace ViewModule::SecurityOriginSupportUtil; + +namespace { +const char* const GEOLOCATION_ASK_BODY = + "Application requests your current location. Do you allow it?"; +const char* const GEOLOCATION_ASK_CHECK = "Don't ask again"; + +// function declare +void askUserForGeolocationPermission( + Evas_Object* window, + PermissionData* data); +static void popupCallback(void* data, Evas_Object* obj, void* eventInfo); + +void askUserForGeolocationPermission( + Evas_Object* window, + PermissionData* data) { - s_tizenId = tizenId; + LogDebug("askUserForGeolocationPermission called"); + Evas_Object* popup = createPopup(window, + GEOLOCATION_ASK_BODY, + GEOLOCATION_ASK_CHECK, + popupCallback, + data); + + if (popup == NULL) { + LogError("Fail to create popup object"); + delete data; + return; + } else { + evas_object_show(popup); + } } -void geolocationPermissionRequest(void* data) +void popupCallback(void* data, Evas_Object* obj, void* /*eventInfo*/) { - LogDebug("geolocationPermissionRequest called"); - Assert(s_tizenId.length() > 0); + LogDebug("popupCallback"); Assert(data); + PermissionData* permData = static_cast(data); + Ewk_Geolocation_Permission_Data* permissionRequest = + static_cast(permData->m_data); - bool state = ViewModule::GeolocationSupport:: - getLocalizationState(s_tizenId, false); + Evas_Object* popup = getPopup(obj); + Result result = getResult(obj); + if (result != RESULT_UNKNOWN) { + permData->m_originDao->setSecurityOriginData(permData->m_originData, result); + } + Eina_Bool ret = + (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? + EINA_TRUE : EINA_FALSE; + ewk_geolocation_permission_request_allow_set( + ewk_geolocation_permission_request_get(permissionRequest), + ret); + delete permData; + evas_object_hide(popup); + evas_object_del(popup); +} +} // namespace + +void geolocationPermissionRequest( + Evas_Object* window, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + void* data) +{ + LogDebug("geolocationPermissionRequest called"); + Assert(securityOriginDAO); + Assert(data); Ewk_Geolocation_Permission_Data* permissionRequest = static_cast(data); + const Ewk_Security_Origin* ewkOrigin = + ewk_geolocation_permission_request_origin_get( + permissionRequest); + Assert(ewkOrigin); - // return permission - if (true == state) { - LogDebug("permit"); + SecurityOriginData securityOriginData( + FEATURE_GEOLOCATION, + Origin( + DPL::FromUTF8String(ewk_security_origin_protocol_get(ewkOrigin)), + DPL::FromUTF8String(ewk_security_origin_host_get(ewkOrigin)), + ewk_security_origin_port_get(ewkOrigin))); + + // check cache database + Result result = securityOriginDAO->getResult(securityOriginData); + if (RESULT_ALLOW_ONCE == result || RESULT_ALLOW_ALWAYS == result) { + LogDebug("allow"); ewk_geolocation_permission_request_allow_set( ewk_geolocation_permission_request_get(permissionRequest), EINA_TRUE); - } else { + return; + } else if (RESULT_DENY_ONCE == result || RESULT_DENY_ALWAYS == result) { LogDebug("deny"); ewk_geolocation_permission_request_allow_set( ewk_geolocation_permission_request_get(permissionRequest), EINA_FALSE); + return; } + // ask to user + PermissionData* permissionData = + new PermissionData(securityOriginDAO, + securityOriginData, + permissionRequest); + askUserForGeolocationPermission(window, permissionData); return; } - -void adjustGeolocationModuleState(const void* wkView) -{ - bool state = getGeolocationModuleState(s_tizenId); - LogDebug("Geolocation state: " << state); - Ewk_Settings* setting = ewk_view_settings_get((Evas_Object*)wkView); - Assert(setting); - ewk_settings_geolocation_enabled_set(setting,state); } -} } // namespace GeolocationSupport } // namespace ViewModule diff --git a/src/view/webkit/view_logic_geolocation_support_webkit2.h b/src/view/webkit/view_logic_geolocation_support_webkit2.h index 5afa6a7..bbe2600 100644 --- a/src/view/webkit/view_logic_geolocation_support_webkit2.h +++ b/src/view/webkit/view_logic_geolocation_support_webkit2.h @@ -21,19 +21,21 @@ #ifndef VIEW_LOGIC_GEOLOCATION_SUPPORT_WEBKIT2_H_ #define VIEW_LOGIC_GEOLOCATION_SUPPORT_WEBKIT2_H_ -#include +#include +#include -#include +namespace SecurityOriginDB { + class SecurityOriginDAO; +} namespace ViewModule { namespace GeolocationSupport { namespace Webkit2 { -void initialize(const DPL::String& tizenId); -void geolocationPermissionRequest(void* data); - -//initializeModule must be invoked before below callback is invoked -void adjustGeolocationModuleState(const void* /*view*/); +void geolocationPermissionRequest( + Evas_Object* window, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + void* data); } } // namespace GeolocationSupport