Merge "fix: use EINA_* booleans instread of TRUE/FALSE" into tizen
[platform/framework/web/wrt.git] / src / view / webkit / view_logic_web_storage_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_web_storage_support.cpp
18  * @author  Jihoon Chung (jihoon.chung@samsung.com)
19  */
20
21 #include "view_logic_web_storage_support.h"
22
23 #include <string>
24 #include <sstream>
25 #include <dpl/log/secure_log.h>
26 #include <dpl/availability.h>
27 #include <dpl/assert.h>
28 #include <wrt-commons/security-origin-dao/security_origin_dao_types.h>
29 #include <wrt-commons/security-origin-dao/security_origin_dao.h>
30 #include <EWebKit2.h>
31 #include <common/view_logic_security_origin_support.h>
32 #include <Elementary.h>
33 #include <widget_string.h>
34
35 namespace ViewModule {
36 using namespace SecurityOriginDB;
37 using namespace ViewModule::SecurityOriginSupportUtil;
38
39 namespace {
40 struct WebStoragePermissionData {
41     WebStorageSupport::ewkQuotaReply m_replyEAPI;
42     Evas_Object* m_ewkView;
43     WebStoragePermissionData(WebStorageSupport::ewkQuotaReply replyEAPI,
44                              Evas_Object* ewkView) :
45         m_replyEAPI(replyEAPI),
46         m_ewkView(ewkView)
47     {}
48 };
49
50 // function declare
51 void askUserForWebStorageCreatePermission(
52     Evas_Object* window,
53     PermissionData* data);
54 void setPermissionResult(PermissionData* permData, Result result);
55 static void popupCallback(void* data, Evas_Object* obj, void* eventInfo);
56 static void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo);
57
58 void askUserForWebStorageCreatePermission(
59     Evas_Object* window,
60     PermissionData* data)
61 {
62     _D("called");
63     std::string origin = DPL::ToUTF8String(data->m_originData.origin.host);
64     if (origin.empty()) {
65         origin = "local";
66     }
67     std::string appname;
68     char* name = NULL;
69     if (app_get_name(&name) == APP_ERROR_NONE) {
70         appname = name;
71         free(name);
72     } else {
73         appname = "application";
74     }
75
76     std::string body =
77         WrtText::replacePS({WRT_POP_WEB_STORAGE_PERMISSION, appname, origin});
78     Evas_Object* popup = createPopup(window,
79                                      body.c_str(),
80                                      WRT_BODY_REMEMBER_PREFERENCE,
81                                      popupCallback,
82                                      eaKeyCallback,
83                                      data);
84
85     if (popup == NULL) {
86         _E("Fail to create popup object");
87         delete data;
88         return;
89     } else {
90         evas_object_show(popup);
91     }
92 }
93
94 void setPermissionResult(PermissionData* permData, Result result)
95 {
96     Assert(permData);
97     WebStoragePermissionData* webStoragePermissionData =
98         static_cast<WebStoragePermissionData*>(permData->m_data);
99
100     if (result != RESULT_UNKNOWN) {
101         permData->m_originDao->setSecurityOriginData(permData->m_originData, result);
102     }
103     Eina_Bool ret = (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? EINA_TRUE : EINA_FALSE;
104     webStoragePermissionData->m_replyEAPI(webStoragePermissionData->m_ewkView, ret);
105 }
106
107 void popupCallback(void* data, Evas_Object* obj, void* eventInfo)
108 {
109     Assert(data);
110     Assert(obj);
111
112     DPL_UNUSED_PARAM(eventInfo);
113
114     PermissionData* permData = static_cast<PermissionData*>(data);
115     setPermissionResult(permData, getResult(obj));
116     WebStoragePermissionData* webStoragePermissionData =
117         static_cast<WebStoragePermissionData*>(permData->m_data);
118     delete webStoragePermissionData;
119     delete permData;
120
121     Evas_Object* popup = getPopup(obj);
122     evas_object_hide(popup);
123     evas_object_del(popup);
124 }
125
126 void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo)
127 {
128     _D("called");
129
130     Assert(data);
131     Assert(obj);
132
133     DPL_UNUSED_PARAM(eventInfo);
134
135     PermissionData* permData = static_cast<PermissionData*>(data);
136     setPermissionResult(permData, RESULT_DENY_ONCE);
137
138     WebStoragePermissionData* webStoragePermissionData =
139         static_cast<WebStoragePermissionData*>(permData->m_data);
140     delete webStoragePermissionData;
141     delete permData;
142
143     evas_object_hide(obj);
144     evas_object_del(obj);
145 }
146 } // namespace
147
148 void WebStorageSupport::createPermissionRequest(
149     Evas_Object* window,
150     SecurityOriginDB::SecurityOriginDAO* securityOriginDAO,
151     Evas_Object* ewkView,
152     Ewk_Security_Origin* ewkOrigin,
153     ewkQuotaReply replyEAPI)
154 {
155     _D("called");
156     Assert(securityOriginDAO);
157     Assert(ewkOrigin);
158     Assert(ewkView);
159     SecurityOriginData securityOriginData(
160         WrtDB::FEATURE_WEB_DATABASE,
161         Origin(
162             DPL::FromUTF8String(ewk_security_origin_protocol_get(ewkOrigin)),
163             DPL::FromUTF8String(ewk_security_origin_host_get(ewkOrigin)),
164             ewk_security_origin_port_get(ewkOrigin)));
165
166     // check cache database
167     Result result = securityOriginDAO->getResult(securityOriginData);
168     if (result != RESULT_UNKNOWN) {
169         Eina_Bool ret =
170             (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ?
171                 EINA_TRUE : EINA_FALSE;
172         replyEAPI(ewkView, ret);
173         return;
174     }
175
176     // ask to user
177     WebStoragePermissionData* webStoragePermissionData =
178         new WebStoragePermissionData(replyEAPI, ewkView);
179     PermissionData* permissionData =
180         new PermissionData(securityOriginDAO,
181                            securityOriginData,
182                            webStoragePermissionData);
183     askUserForWebStorageCreatePermission(window, permissionData);
184     return;
185 }
186 } // namespace ViewModule