Merge "fix: use EINA_* booleans instread of TRUE/FALSE" into tizen
[platform/framework/web/wrt.git] / src / view / webkit / view_logic_usermedia_support.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 /**
17  * @file    view_logic_usermedia_support.cpp
18  * @author  Jihoon Chung (jihoon.chung@samsung.com)
19  */
20
21 #include "view_logic_usermedia_support.h"
22
23 #include <string>
24 #include <dpl/log/log.h>
25 #include <dpl/assert.h>
26 #include <wrt-commons/security-origin-dao/security_origin_dao_types.h>
27 #include <wrt-commons/security-origin-dao/security_origin_dao.h>
28 #include <Elementary.h>
29 #include <EWebKit2.h>
30 #include <common/view_logic_security_origin_support.h>
31 #include <common/view_logic_get_parent_window_util.h>
32
33 #if (ELM_VERSION_MAJOR == 1 && ELM_VERSION_MINOR == 7)
34 #define POPUP_CLASSNAME "popup"
35 #else
36 //#if ELM_VERSION_MAJOR == 1 && ELM_VERSION_MINOR == 8)
37 #define POPUP_CLASSNAME "elm_popup"
38 #endif
39
40 namespace ViewModule {
41 using namespace SecurityOriginDB;
42 using namespace ViewModule::SecurityOriginSupportUtil;
43 namespace {
44 const char* const USERMEDIA_USE_ASK_BODY =
45     "This application wants to use your media";
46
47 // function declare
48 void askUserForUsermediaPermission(Evas_Object* window, PermissionData* data);
49 Evas_Object* getPopup(Evas_Object* button);
50 static void popupCallback(void* data, Evas_Object* obj, void* eventInfo);
51
52 void askUserForUsermediaPermission(Evas_Object* window, PermissionData* data)
53 {
54     LogDebug("askUserForUsermediaPermission called");
55
56     Evas_Object* parentWindow = PopupUtil::getParentWindow(window);
57     Evas_Object* popup = elm_popup_add(parentWindow);
58     evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
59     elm_object_text_set(popup, USERMEDIA_USE_ASK_BODY);
60
61     Evas_Object* lButton = elm_button_add(popup);
62     elm_object_text_set(lButton, "Allow");
63     elm_object_part_content_set(popup, "button1", lButton);
64     evas_object_smart_callback_add(lButton, "clicked", popupCallback, data);
65
66     Evas_Object* rButton = elm_button_add(popup);
67     elm_object_text_set(rButton, "Deny");
68     elm_object_part_content_set(popup, "button2", rButton);
69     evas_object_smart_callback_add(rButton, "clicked", popupCallback, data);
70     evas_object_show(popup);
71 }
72
73 Evas_Object* getPopup(Evas_Object* button)
74 {
75     Assert(button);
76
77     Evas_Object* popup = button;
78     while (strcmp(elm_object_widget_type_get(popup), POPUP_CLASSNAME)) {
79         popup = elm_object_parent_widget_get(popup);
80         if (!popup) {
81             return NULL;
82         }
83     }
84     return popup;
85 }
86
87 void popupCallback(void* data, Evas_Object* obj, void* /*eventInfo*/)
88 {
89     LogDebug("popupCallback");
90     Assert(data);
91     PermissionData* permData = static_cast<PermissionData*>(data);
92     Ewk_User_Media_Permission_Request* permissionRequest =
93         static_cast<Ewk_User_Media_Permission_Request*>(permData->m_data);
94
95     Assert(obj);
96     Evas_Object* popup = getPopup(obj);
97     Assert(popup);
98
99     bool allow = !strcmp("Allow", elm_object_text_get(obj));
100     Eina_Bool ret = allow ? EINA_TRUE : EINA_FALSE;
101     ewk_user_media_permission_request_set(permissionRequest, ret);
102     delete permData;
103     evas_object_hide(popup);
104     evas_object_del(popup);
105 }
106 } // namespace
107
108 void UsermediaSupport::usermediaPermissionRequest(Evas_Object* window,
109                                                   SecurityOriginDAO* securityOriginDAO,
110                                                   void* data)
111 {
112     LogDebug("usermediaPermissionRequest called");
113     Assert(securityOriginDAO);
114     Assert(data);
115     Ewk_User_Media_Permission_Request* permissionRequest =
116         static_cast<Ewk_User_Media_Permission_Request*>(data);
117
118     SecurityOriginData securityOriginData(
119         WrtDB::FEATURE_USER_MEDIA,
120         Origin(DPL::FromUTF8String(""), DPL::FromUTF8String(""), 0));
121
122     // In case of usermedia ewk doesn't support origin data
123     // cache data also only store allow data by privilege
124     Result result = securityOriginDAO->getResult(securityOriginData);
125     if (RESULT_ALLOW_ALWAYS == result) {
126         LogDebug("allow");
127         ewk_user_media_permission_request_set(permissionRequest, EINA_TRUE);
128         return;
129     } else if (RESULT_DENY_ALWAYS == result) {
130         LogDebug("deny");
131         ewk_user_media_permission_request_set(permissionRequest, EINA_FALSE);
132         return;
133     }
134
135     ewk_user_media_permission_request_suspend(permissionRequest);
136     // ask to user
137     PermissionData* permissionData =
138         new PermissionData(securityOriginDAO,
139                            securityOriginData,
140                            data);
141     askUserForUsermediaPermission(window, permissionData);
142     return;
143 }
144 } // namespace ViewModule