2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FWebCtrl_UserConfirmPopup.cpp
20 * @brief The file contains the definition of _UserConfirmPopup class.
23 #include <FBaseColArrayList.h>
24 #include <FBaseSysLog.h>
25 #include <FBaseUtilUri.h>
26 #include <FGrpDimension.h>
27 #include <FGrpRectangle.h>
28 #include <FIoDbEnumerator.h>
29 #include <FIoDbStatement.h>
30 #include <FSecCertX509Certificate.h>
31 #include <FUiCtrlButton.h>
32 #include <FUiCtrlLabel.h>
33 #include <FUiCtrlPanel.h>
34 #include <FUiLayout.h>
35 #include <FUiVerticalBoxLayout.h>
36 #include <FIo_DatabaseImpl.h>
37 #include <FUi_ControlManager.h>
38 #include <FUi_ResourceManager.h>
39 #include "FWebCtrl_EflWebkit.h"
40 #include "FWebCtrl_UserConfirmPopup.h"
41 #include "FWebCtrl_Utility.h"
44 using namespace Tizen::Base;
45 using namespace Tizen::Base::Collection;
46 using namespace Tizen::Base::Utility;
47 using namespace Tizen::Graphics;
48 using namespace Tizen::Io;
49 using namespace Tizen::Security::Cert;
50 using namespace Tizen::Ui;
51 using namespace Tizen::Ui::Controls;
54 namespace Tizen { namespace Web { namespace Controls
58 _UserConfirmPopup::_UserConfirmPopup(void)
59 : __pUserPolicyData(null)
60 , __userConfirmMode(USER_CONFIRM_USERMEDIA)
61 , __pCheckButton(null)
67 _UserConfirmPopup::~_UserConfirmPopup(void)
73 _UserConfirmPopup::Construct(_UserConfirmMode userConfirmMode, void* pEventInfo, Tizen::Base::String msg, bool sync)
76 SysTryReturnResult(NID_WEB_CTRL, pEventInfo, E_INVALID_ARG, "Invalid argument(s) is used. pPolicy is null.");
77 SysTryReturnResult(NID_WEB_CTRL, userConfirmMode >= USER_CONFIRM_USERMEDIA && userConfirmMode <= USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED, E_INVALID_ARG,
78 "Invalid userConfirmMode is used. [%d]", userConfirmMode);
80 _WebPopupData* pPopupData = _WebPopup::GetPopupData();
81 SysTryReturn(NID_WEB_CTRL, pPopupData, r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
83 __pUserPolicyData = pEventInfo;
84 __userConfirmMode = userConfirmMode;
88 int popupMaxHeight = 2*pPopupData->labelDim.height + 2*pPopupData->btnDim.height + 6*pPopupData->sideMargin;
89 if (__userConfirmMode == USER_CONFIRM_GEOLOCATION)
91 popupMaxHeight += pPopupData->checkDim.height;
94 r = _WebPopup::Construct(true, Dimension(pPopupData->popupDim.width, popupMaxHeight));
95 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
97 SetTitleText("Security Warning");
99 Rectangle rect(0, 0, 0, 0);
102 rect.height = 2*pPopupData->labelDim.height;
103 rect.width = pPopupData->labelDim.width;
105 std::unique_ptr<Label> pLabel(new (std::nothrow) Label());
106 SysTryReturnResult(NID_WEB_CTRL, pLabel.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
108 String message = GetMessageFromPolicy();
109 r = pLabel->Construct(rect, message);
110 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
112 pLabel->SetTextConfig(pPopupData->labelFontSize, LABEL_TEXT_STYLE_NORMAL);
114 r = AddControl(*pLabel);
115 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
117 Label* pInfoLabel = pLabel.release();
119 if (__userConfirmMode == USER_CONFIRM_GEOLOCATION)
122 rect.height = pPopupData->checkDim.height;
124 std::unique_ptr<CheckButton> pCheckButton (new (std::nothrow) CheckButton());
125 SysTryReturnResult(NID_WEB_CTRL, pCheckButton.get(), E_OUT_OF_MEMORY, "Memory Allocation failed.");
127 r = pCheckButton->Construct(Rectangle(0, 0, rect.width, rect.height), CHECK_BUTTON_STYLE_MARK, BACKGROUND_STYLE_NONE, false, L"Remember Preference");
128 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
130 r = AddControl(*pCheckButton);
131 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
133 __pCheckButton = pCheckButton.release();
136 Panel* pButtonPanel = CreateAndAddPanel();
137 SysTryReturn(NID_WEB_CTRL, pButtonPanel, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
140 r = idList.Construct();
141 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
142 idList.Add(*(new Integer(ID_BUTTON_USER_ALLOW)));
143 idList.Add(*(new Integer(ID_BUTTON_USER_CANCEL)));
146 r = titleList.Construct();
147 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
148 titleList.Add(*(new String(L"Allow")));
149 titleList.Add(*(new String(L"Cancel")));
151 r = CreateAndAddButtons(idList, titleList, pButtonPanel);
152 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
154 std::unique_ptr<VerticalBoxLayout> pLayout(dynamic_cast< VerticalBoxLayout* >(GetLayoutN()));
155 SysTryReturn(NID_WEB_CTRL, pLayout.get(), r = GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
157 pLayout->SetHorizontalAlignment(*pInfoLabel, LAYOUT_HORIZONTAL_ALIGN_CENTER);
158 if (__userConfirmMode == USER_CONFIRM_GEOLOCATION)
160 pLayout->SetHorizontalAlignment(*__pCheckButton, LAYOUT_HORIZONTAL_ALIGN_CENTER);
162 pLayout->SetHorizontalAlignment(*pButtonPanel, LAYOUT_HORIZONTAL_ALIGN_CENTER);
164 pLayout->SetSpacing(*pButtonPanel, 2*pPopupData->sideMargin);
171 _UserConfirmPopup::OnActionPerformed(const Control& source, int actionId)
173 result r = E_SUCCESS;
177 case ID_BUTTON_USER_ALLOW:
178 HandleUserAction(EINA_TRUE);
181 case ID_BUTTON_USER_CANCEL:
182 HandleUserAction(EINA_FALSE);
192 SysLogException(NID_WEB_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
203 _UserConfirmPopup::GetMessageFromPolicy(void)
207 switch(__userConfirmMode)
209 case USER_CONFIRM_USERMEDIA:
211 message = L"Do you want to allow acccess to media?\n";
214 case USER_PROTOCOL_HANDLER:
216 Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(__pUserPolicyData);
217 SysAssertf(pHandlerData, "Failed to request");
219 String target(ewk_custom_handlers_data_target_get(pHandlerData));
220 String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
222 message = baseUri + String(L" is asking to register ") + target + String(L" protocol handler.");
225 case USER_CONTENT_HANDLER:
227 Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(__pUserPolicyData);
228 SysAssertf(pHandlerData, "Failed to request");
230 String target(ewk_custom_handlers_data_target_get(pHandlerData));
231 String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
233 message = String(baseUri) + String(L" is asking to register ") + String(target) + String(L" content handler.");
236 case USER_CONFIRM_GEOLOCATION:
238 Ewk_Geolocation_Permission_Request* pGeoLocPermReq = reinterpret_cast< Ewk_Geolocation_Permission_Request* >(__pUserPolicyData);
239 const Ewk_Security_Origin* pSecurityOrigin = ewk_geolocation_permission_request_origin_get(pGeoLocPermReq);
241 message = _Utility::CreateOrigin(pSecurityOrigin);
242 message.Append(" Requests your Location");
245 case USER_CONFIRM_APP_CACHE:
247 case USER_CONFIRM_DB_QUOTA_EXCEDED:
249 case USER_CONFIRM_LOCAL_FS_QUOTA_EXCEDED:
251 case USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED:
264 _UserConfirmPopup::HandleUserAction(Eina_Bool allow)
266 switch (__userConfirmMode)
268 case USER_CONFIRM_USERMEDIA:
270 Ewk_User_Media_Permission_Request* pPolicy = reinterpret_cast< Ewk_User_Media_Permission_Request* >(__pUserPolicyData);
271 ewk_user_media_permission_request_set(pPolicy, allow);
274 case USER_PROTOCOL_HANDLER:
276 RegisterHandler(false, allow);
279 case USER_CONTENT_HANDLER:
281 RegisterHandler(true, allow);
284 case USER_CONFIRM_GEOLOCATION:
286 Ewk_Geolocation_Permission_Request* pPolicy = reinterpret_cast< Ewk_Geolocation_Permission_Request* >(__pUserPolicyData);
287 if (__pCheckButton->IsSelected())
289 result r = AddGeolocationDb(pPolicy, static_cast < bool >(allow));
290 SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
293 ewk_geolocation_permission_request_set(pPolicy, allow);
296 case USER_CONFIRM_APP_CACHE:
298 Evas_Object *pObj = reinterpret_cast< Evas_Object* >(__pUserPolicyData);
299 ewk_view_application_cache_permission_reply(pObj, allow);
303 case USER_CONFIRM_DB_QUOTA_EXCEDED:
305 Evas_Object *pObj = reinterpret_cast< Evas_Object* >(__pUserPolicyData);
306 ewk_view_exceeded_database_quota_reply(pObj, allow);
310 case USER_CONFIRM_LOCAL_FS_QUOTA_EXCEDED:
312 Evas_Object *pObj = reinterpret_cast< Evas_Object* >(__pUserPolicyData);
313 ewk_view_exceeded_local_file_system_quota_reply(pObj, allow);
317 case USER_CONFIRM_INDEXED_DB_QUOTA_EXCEDED:
319 Evas_Object *pObj = reinterpret_cast< Evas_Object* >(__pUserPolicyData);
320 ewk_view_exceeded_indexed_database_quota_reply(pObj, allow);
331 _UserConfirmPopup::AddGeolocationDb(Ewk_Geolocation_Permission_Request* pPolicy, bool enable)
334 String geolocationPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
335 String table(GEOLOCATION_TABLE_NAME);
337 const Ewk_Security_Origin* pSecurityOrigin = ewk_geolocation_permission_request_origin_get(pPolicy);
338 String origin = _Utility::CreateOrigin(pSecurityOrigin);
340 result r = db.Construct(geolocationPath, "r+", null);
341 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
343 std::unique_ptr<DbStatement> pStmt(db.CreateStatementN(L"Insert Into " + table + L" (origin, permission) Values (?, ?)"));
344 SysTryReturn(NID_WEB_CTRL, pStmt.get(), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
346 SysLog(NID_WEB_CTRL, "The current value of stmt is %u, host is %ls", pStmt.get(), origin.GetPointer());
348 pStmt->BindString(0, origin);
349 pStmt->BindInt(1, static_cast < int >(enable));
351 db.BeginTransaction();
353 std::unique_ptr<DbEnumerator> pEnum(db.ExecuteStatementN(*pStmt));
355 db.CommitTransaction();
361 _UserConfirmPopup::RegisterHandler(bool checkHandler, Eina_Bool allow)
364 String handlerPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
368 if(checkHandler == true)
370 table = CUSTOM_CONTENT_TABLE_NAME;
374 table = CUSTOM_PROTOCOL_TABLE_NAME;
376 Ewk_Custom_Handlers_Data* pHandlerData = reinterpret_cast< Ewk_Custom_Handlers_Data* >(__pUserPolicyData);
377 SysAssertf(pHandlerData, "Failed to request");
379 String baseUri(ewk_custom_handlers_data_base_url_get(pHandlerData));
380 String uri = ewk_custom_handlers_data_url_get(pHandlerData);
381 String target = ewk_custom_handlers_data_target_get(pHandlerData);
383 result r = db.Construct(handlerPath, "r+", null);
384 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
386 std::unique_ptr<DbEnumerator> pEnum(db.QueryN(L"Select id From " + table + L" Where baseUrl = '" + baseUri + L"' AND url = '" + uri + L"' AND mime = '" + target + L"'"));
391 pEnum->GetIntAt(0, checkId);
393 std::unique_ptr<DbStatement> pUpdateStmt(db.CreateStatementN(L"Update " + table + L" Set allow = (?) Where id = (?)"));
394 SysTryReturnVoidResult(NID_WEB_CTRL, pUpdateStmt.get(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
396 pUpdateStmt->BindInt(0, static_cast < int >(allow));
397 pUpdateStmt->BindInt(1, checkId);
399 db.BeginTransaction();
401 std::unique_ptr<DbEnumerator> pEnum(db.ExecuteStatementN(*pUpdateStmt));
403 db.CommitTransaction();
408 std::unique_ptr<DbStatement> pStmt(db.CreateStatementN(L"Insert Into " + table + L" (baseUrl, url, mime, allow) Values (?, ?, ?, ?)"));
409 SysTryReturnVoidResult(NID_WEB_CTRL, pStmt.get(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
411 pStmt->BindString(0, baseUri);
412 pStmt->BindString(1, uri);
413 pStmt->BindString(2, target);
414 pStmt->BindInt(3, static_cast < int >(allow));
416 db.BeginTransaction();
418 std::unique_ptr<DbEnumerator> pRegisterEnum(db.ExecuteStatementN(*pStmt));
420 db.CommitTransaction();
424 }}} // Tizen::Web::Controls