Merge "fix: use EINA_* booleans instread of TRUE/FALSE" into tizen
[platform/framework/web/wrt.git] / src / view / webkit / view_logic_usermedia_support.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 445f754..cc5a76c
 #include <string>
 #include <dpl/log/log.h>
 #include <dpl/assert.h>
+#include <wrt-commons/security-origin-dao/security_origin_dao_types.h>
+#include <wrt-commons/security-origin-dao/security_origin_dao.h>
 #include <Elementary.h>
 #include <EWebKit2.h>
+#include <common/view_logic_security_origin_support.h>
+#include <common/view_logic_get_parent_window_util.h>
 
-namespace ViewModule {
+#if (ELM_VERSION_MAJOR == 1 && ELM_VERSION_MINOR == 7)
+#define POPUP_CLASSNAME "popup"
+#else
+//#if ELM_VERSION_MAJOR == 1 && ELM_VERSION_MINOR == 8)
+#define POPUP_CLASSNAME "elm_popup"
+#endif
 
+namespace ViewModule {
+using namespace SecurityOriginDB;
+using namespace ViewModule::SecurityOriginSupportUtil;
 namespace {
 const char* const USERMEDIA_USE_ASK_BODY =
     "This application wants to use your media";
 
 // function declare
-void askUserForUsermediaPermission(Evas_Object* window, void* data);
+void askUserForUsermediaPermission(Evas_Object* window, PermissionData* data);
 Evas_Object* getPopup(Evas_Object* button);
 static void popupCallback(void* data, Evas_Object* obj, void* eventInfo);
 
-void askUserForUsermediaPermission(Evas_Object* window, void* data)
+void askUserForUsermediaPermission(Evas_Object* window, PermissionData* data)
 {
     LogDebug("askUserForUsermediaPermission called");
 
-    Evas_Object* popup = elm_popup_add(window);
+    Evas_Object* parentWindow = PopupUtil::getParentWindow(window);
+    Evas_Object* popup = elm_popup_add(parentWindow);
     evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     elm_object_text_set(popup, USERMEDIA_USE_ASK_BODY);
 
@@ -62,7 +75,7 @@ Evas_Object* getPopup(Evas_Object* button)
     Assert(button);
 
     Evas_Object* popup = button;
-    while (strcmp(elm_object_widget_type_get(popup), "elm_popup")) {
+    while (strcmp(elm_object_widget_type_get(popup), POPUP_CLASSNAME)) {
         popup = elm_object_parent_widget_get(popup);
         if (!popup) {
             return NULL;
@@ -75,30 +88,57 @@ void popupCallback(void* data, Evas_Object* obj, void* /*eventInfo*/)
 {
     LogDebug("popupCallback");
     Assert(data);
-    Ewk_User_Media_Permission* usermediaPermission =
-        static_cast<Ewk_User_Media_Permission*>(data);
+    PermissionData* permData = static_cast<PermissionData*>(data);
+    Ewk_User_Media_Permission_Request* permissionRequest =
+        static_cast<Ewk_User_Media_Permission_Request*>(permData->m_data);
 
     Assert(obj);
     Evas_Object* popup = getPopup(obj);
     Assert(popup);
-    bool allow = !strcmp("Allow", elm_object_text_get(obj));
 
+    bool allow = !strcmp("Allow", elm_object_text_get(obj));
     Eina_Bool ret = allow ? EINA_TRUE : EINA_FALSE;
-    ewk_user_media_permission_set(usermediaPermission, ret);
-
+    ewk_user_media_permission_request_set(permissionRequest, ret);
+    delete permData;
     evas_object_hide(popup);
     evas_object_del(popup);
 }
 } // namespace
 
 void UsermediaSupport::usermediaPermissionRequest(Evas_Object* window,
-                                                   void* data)
+                                                  SecurityOriginDAO* securityOriginDAO,
+                                                  void* data)
 {
     LogDebug("usermediaPermissionRequest called");
-    Assert(window);
+    Assert(securityOriginDAO);
     Assert(data);
+    Ewk_User_Media_Permission_Request* permissionRequest =
+        static_cast<Ewk_User_Media_Permission_Request*>(data);
+
+    SecurityOriginData securityOriginData(
+        WrtDB::FEATURE_USER_MEDIA,
+        Origin(DPL::FromUTF8String(""), DPL::FromUTF8String(""), 0));
+
+    // In case of usermedia ewk doesn't support origin data
+    // cache data also only store allow data by privilege
+    Result result = securityOriginDAO->getResult(securityOriginData);
+    if (RESULT_ALLOW_ALWAYS == result) {
+        LogDebug("allow");
+        ewk_user_media_permission_request_set(permissionRequest, EINA_TRUE);
+        return;
+    } else if (RESULT_DENY_ALWAYS == result) {
+        LogDebug("deny");
+        ewk_user_media_permission_request_set(permissionRequest, EINA_FALSE);
+        return;
+    }
+
+    ewk_user_media_permission_request_suspend(permissionRequest);
     // ask to user
-    askUserForUsermediaPermission(window, data);
+    PermissionData* permissionData =
+        new PermissionData(securityOriginDAO,
+                           securityOriginData,
+                           data);
+    askUserForUsermediaPermission(window, permissionData);
     return;
 }
 } // namespace ViewModule