Support security origin for W3C geolocation
authorJihoon Chung <jihoon.chung@samsung.com>
Fri, 23 Nov 2012 09:21:54 +0000 (18:21 +0900)
committerGerrit Code Review <gerrit2@kim11>
Fri, 23 Nov 2012 12:16:59 +0000 (21:16 +0900)
[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

src/view/webkit/view_logic.cpp
src/view/webkit/view_logic_geolocation_support_webkit2.cpp
src/view/webkit/view_logic_geolocation_support_webkit2.h

index 4c2d2fd..33d420a 100644 (file)
@@ -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<ViewLogic*>(data);
     Assert(eventInfo);
-    ViewModule::GeolocationSupport::Webkit2::
-        geolocationPermissionRequest(eventInfo);
-    return;
+    ViewModule::GeolocationSupport::Webkit2::geolocationPermissionRequest(
+        This->m_window,
+        This->m_securityOriginSupport->getSecurityOriginDAO(),
+        eventInfo);
 }
 
 void ViewLogic::notificationShowCallback(
index ab7a5b5..197d658 100644 (file)
 
 #include "view_logic_geolocation_support_webkit2.h"
 
+#include <string>
+#include <sstream>
 #include <dpl/log/log.h>
 #include <dpl/assert.h>
-#include <common/view_logic_geolocation_support.h>
+#include <wrt-commons/security-origin-dao/security_origin_dao_types.h>
+#include <wrt-commons/security-origin-dao/security_origin_dao.h>
 #include <EWebKit2.h>
-
-namespace {
-DPL::String s_tizenId;
-const double GEOLOCATION_POSITION_ACCURACY = 0.0;
-} // anonymous namespace
+#include <common/view_logic_security_origin_support.h>
+#include <Elementary.h>
 
 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<PermissionData*>(data);
+    Ewk_Geolocation_Permission_Data* permissionRequest =
+            static_cast<Ewk_Geolocation_Permission_Data*>(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<Ewk_Geolocation_Permission_Data*>(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
index 5afa6a7..bbe2600 100644 (file)
 #ifndef VIEW_LOGIC_GEOLOCATION_SUPPORT_WEBKIT2_H_
 #define VIEW_LOGIC_GEOLOCATION_SUPPORT_WEBKIT2_H_
 
-#include <dpl/string.h>
+#include <memory.h>
+#include <Elementary.h>
 
-#include <EWebKit2.h>
+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