2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 * Created on: Apr 1, 2014
26 #if defined(USE_EWEBKIT)
27 #include <ewk_chromium.h>
30 #include <boost/format.hpp>
31 #include <boost/regex.hpp>
32 #include <boost/algorithm/string/regex.hpp>
33 #include <boost/algorithm/string/classification.hpp>
34 #include <boost/algorithm/string/split.hpp>
35 #include <Elementary.h>
38 #include "AbstractWebEngine/AbstractWebEngine.h"
39 #include "AbstractWebEngine/TabThumbCache.h"
40 #include "BrowserAssert.h"
41 #include "BrowserLogger.h"
43 #include "GeneralTools.h"
44 #include "Tools/WorkQueue.h"
45 #include "ServiceManager.h"
47 #define certificate_crt_path CERTS_DIR
48 #define APPLICATION_NAME_FOR_USER_AGENT "SamsungBrowser/1.0"
50 using namespace tizen_browser::tools;
52 namespace tizen_browser {
53 namespace basic_webengine {
54 namespace webkitengine_service {
56 WebView::WebView(Evas_Object * obj, TabId tabId)
63 config.load("whatever");
68 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
71 unregisterCallbacks();
75 void WebView::init(Evas_Object * opener)
77 #if defined(USE_EWEBKIT)
78 Ewk_Context *context = ewk_context_default_get();
81 ewk_context_cache_model_set(context, EWK_CACHE_MODEL_PRIMARY_WEBBROWSER);
82 ewk_context_certificate_file_set(context, certificate_crt_path);
85 m_ewkView = ewk_view_add(evas_object_evas_get(m_parent));
87 evas_object_data_set(m_ewkView, "_container", this);
88 BROWSER_LOGD("%s:%d %s self=%p", __FILE__, __LINE__, __func__, this);
90 evas_object_color_set(m_ewkView, 255, 255, 255, 255);
91 evas_object_size_hint_weight_set(m_ewkView, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
92 evas_object_size_hint_align_set(m_ewkView, EVAS_HINT_FILL, EVAS_HINT_FILL);
93 ewk_view_application_name_for_user_agent_set(m_ewkView, APPLICATION_NAME_FOR_USER_AGENT);
94 //\todo: when value is other than 1.0, scroller is located improperly
95 // ewk_view_device_pixel_ratio_set(m_ewkView, 1.0f);
98 ewk_view_resume(m_ewkView);
101 // set local storage, favion, cookies
102 std::string webkit_path = boost::any_cast <std::string> (config.get("webkit/dir"));
103 // ewk_context_web_storage_path_set(context, (webkit_path + std::string("/storage")).c_str());
104 ewk_context_favicon_database_directory_set(context, (webkit_path + std::string("/favicon")).c_str());
105 ewk_cookie_manager_persistent_storage_set(ewk_context_cookie_manager_get(context)
106 , (webkit_path + std::string("/cookies.db")).c_str()
107 , EWK_COOKIE_PERSISTENT_STORAGE_SQLITE);
109 ///\note Odroid modification - not exists in WebKit API
110 // ewk_cookie_manager_widget_cookie_directory_set(ewk_context_cookie_manager_get(context), webkit_path.c_str());
115 m_ewkView = evas_object_rectangle_add(evas_object_evas_get(m_parent));
119 void WebView::registerCallbacks()
121 #if defined(USE_EWEBKIT)
122 evas_object_smart_callback_add(m_ewkView, "load,started", __loadStarted, this);
123 evas_object_smart_callback_add(m_ewkView, "load,stop", __loadStop, this);
124 evas_object_smart_callback_add(m_ewkView, "load,finished", __loadFinished, this);
125 evas_object_smart_callback_add(m_ewkView, "load,progress", __loadProgress, this);
126 evas_object_smart_callback_add(m_ewkView, "load,error", __loadError, this);
128 evas_object_smart_callback_add(m_ewkView, "title,changed", __titleChanged, this);
129 evas_object_smart_callback_add(m_ewkView, "url,changed", __urlChanged, this);
131 evas_object_smart_callback_add(m_ewkView, "back,forward,list,changed", __backForwardListChanged, this);
133 evas_object_smart_callback_add(m_ewkView, "create,window", __newWindowRequest, this);
134 evas_object_smart_callback_add(m_ewkView, "close,window", __closeWindowRequest, this);
136 evas_object_smart_callback_add(m_ewkView, "geolocation,permission,request", __geolocationPermissionRequest, this);
137 evas_object_smart_callback_add(m_ewkView, "usermedia,permission,request", __usermediaPermissionRequest, this);
138 evas_object_smart_callback_add(m_ewkView, "notification,permission,request", __notificationPermissionRequest, this);
139 evas_object_smart_callback_add(m_ewkView, "authentication,request", __authenticationRequest, this);
140 evas_object_smart_callback_add(m_ewkView, "request,certificate,confirm", __requestCertificationConfirm, this);
142 evas_object_event_callback_add(m_ewkView, EVAS_CALLBACK_MOUSE_DOWN, __setFocusToEwkView, this);
143 evas_object_smart_callback_add(m_ewkView, "icon,received", __faviconChanged, this);
145 evas_object_smart_callback_add(m_ewkView, "editorclient,ime,closed", __IMEClosed, this);
146 evas_object_smart_callback_add(m_ewkView, "editorclient,ime,opened", __IMEOpened, this);
150 void WebView::unregisterCallbacks()
152 #if defined(USE_EWEBKIT)
153 evas_object_smart_callback_del_full(m_ewkView, "load,started", __loadStarted, this);
154 evas_object_smart_callback_del_full(m_ewkView, "load,stop", __loadStop, this);
155 evas_object_smart_callback_del_full(m_ewkView, "load,finished", __loadFinished, this);
156 evas_object_smart_callback_del_full(m_ewkView, "load,progress", __loadProgress, this);
157 evas_object_smart_callback_del_full(m_ewkView, "load,error", __loadError, this);
159 evas_object_smart_callback_del_full(m_ewkView, "title,changed", __titleChanged, this);
160 evas_object_smart_callback_del_full(m_ewkView, "url,changed", __urlChanged, this);
162 evas_object_smart_callback_del_full(m_ewkView, "back,forward,list,changed", __backForwardListChanged, this);
164 evas_object_smart_callback_del_full(m_ewkView, "create,window", __newWindowRequest, this);
165 evas_object_smart_callback_del_full(m_ewkView, "close,window", __closeWindowRequest, this);
167 evas_object_smart_callback_del_full(m_ewkView, "geolocation,permission,request", __geolocationPermissionRequest, this);
168 evas_object_smart_callback_del_full(m_ewkView, "usermedia,permission,request", __usermediaPermissionRequest, this);
169 evas_object_smart_callback_del_full(m_ewkView, "notification,permission,request", __notificationPermissionRequest, this);
170 evas_object_smart_callback_del_full(m_ewkView, "authentication,request", __authenticationRequest, this);
171 evas_object_smart_callback_del_full(m_ewkView, "request,certificate,confirm", __requestCertificationConfirm, this);
173 evas_object_event_callback_del(m_ewkView, EVAS_CALLBACK_MOUSE_DOWN, __setFocusToEwkView);
174 evas_object_smart_callback_del_full(m_ewkView, "icon,received", __faviconChanged, this);
176 evas_object_smart_callback_del_full(m_ewkView, "editorclient,ime,closed", __IMEClosed, this);
177 evas_object_smart_callback_del_full(m_ewkView, "editorclient,ime,opened", __IMEOpened, this);
181 void WebView::setupEwkSettings()
183 #if defined(USE_EWEBKIT)
185 Ewk_Settings * settings = ewk_view_settings_get(m_ewkView);
186 ewk_settings_uses_keypad_without_user_action_set(settings, EINA_FALSE);
191 Evas_Object * WebView::getLayout()
196 void WebView::setURI(const std::string & uri)
198 BROWSER_LOGD("%s:%d %s uri=%s", __FILE__, __LINE__, __func__, uri.c_str());
199 #if defined(USE_EWEBKIT)
200 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
201 ewk_view_url_set(m_ewkView, uri.c_str());
206 std::string WebView::getURI(void)
208 #if defined(USE_EWEBKIT)
209 BROWSER_LOGD("%s:%d %s uri=%s", __FILE__, __LINE__, __func__, ewk_view_url_get(m_ewkView));
210 return tizen_browser::tools::fromChar(ewk_view_url_get(m_ewkView));
212 return std::string();
216 std::string WebView::getTitle(void)
221 void WebView::stopLoading(void)
223 #if defined(USE_EWEBKIT)
224 ewk_view_stop(m_ewkView);
229 void WebView::reload(void)
231 #if defined(USE_EWEBKIT)
235 ewk_view_url_set(m_ewkView, ewk_view_url_get(m_ewkView));
238 ewk_view_reload(m_ewkView);
242 void WebView::back(void)
244 #if defined(USE_EWEBKIT)
246 ewk_view_back(m_ewkView);
250 void WebView::forward(void)
252 #if defined(USE_EWEBKIT)
254 ewk_view_forward(m_ewkView);
258 bool WebView::isBackEnabled(void)
260 #if defined(USE_EWEBKIT)
261 return ewk_view_back_possible(m_ewkView);
267 bool WebView::isForwardEnabled(void)
269 #if defined(USE_EWEBKIT)
270 return ewk_view_forward_possible(m_ewkView);
276 bool WebView::isLoading()
281 bool WebView::isLoadError() const
287 void WebView::setPrivateMode(bool state)
289 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
292 #if defined(USE_EWEBKIT)
294 Ewk_Settings * settings = ewk_view_settings_get(m_ewkView);
296 Ewk_Settings * settings = ewk_page_group_settings_get(ewk_view_page_group_get(m_ewkView));
298 ewk_settings_private_browsing_enabled_set(settings, state);
300 ewk_cookie_manager_accept_policy_set(ewk_context_cookie_manager_get(ewk_context_default_get()), EWK_COOKIE_ACCEPT_POLICY_NEVER);
303 ewk_cookie_manager_accept_policy_set(ewk_context_cookie_manager_get(ewk_context_default_get()), EWK_COOKIE_ACCEPT_POLICY_ALWAYS);
308 void WebView::confirmationResult(WebConfirmationPtr confirmation)
310 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
312 #if defined(USE_EWEBKIT)
314 switch(confirmation->getConfirmationType()) {
315 case WebConfirmation::ConfirmationType::Geolocation: {
316 Ewk_Geolocation_Permission_Request *request = m_confirmationGeolocationMap[confirmation];
318 if (confirmation->getResult() == WebConfirmation::ConfirmationResult::Confirmed)
320 else if (confirmation->getResult() == WebConfirmation::ConfirmationResult::Rejected)
323 BROWSER_LOGE("Wrong ConfirmationResult");
326 // set geolocation permission
327 ewk_geolocation_permission_reply(request, result);
328 ewk_view_resume(m_ewkView);
331 m_confirmationGeolocationMap.erase(confirmation);
334 case WebConfirmation::ConfirmationType::UserMedia: {
335 Ewk_User_Media_Permission_Request *request = m_confirmationUserMediaMap[confirmation];
337 if (confirmation->getResult() == WebConfirmation::ConfirmationResult::Confirmed)
339 else if (confirmation->getResult() == WebConfirmation::ConfirmationResult::Rejected)
342 BROWSER_LOGE("Wrong ConfirmationResult");
346 // set usermedia permission
347 ewk_user_media_permission_reply(request, result);
348 ewk_view_resume(m_ewkView);
351 m_confirmationUserMediaMap.erase(confirmation);
354 case WebConfirmation::ConfirmationType::Notification: {
355 Ewk_Notification_Permission_Request *request = m_confirmationNotificationMap[confirmation];
357 if (confirmation->getResult() == WebConfirmation::ConfirmationResult::Confirmed)
359 else if (confirmation->getResult() == WebConfirmation::ConfirmationResult::Rejected)
362 BROWSER_LOGE("Wrong ConfirmationResult");
366 // set notification permission
367 ewk_notification_permission_reply(request, result);
368 ewk_view_resume(m_ewkView);
371 m_confirmationNotificationMap.erase(confirmation);
374 case WebConfirmation::ConfirmationType::CertificateConfirmation: {
375 CertificateConfirmationPtr cert = std::dynamic_pointer_cast<CertificateConfirmation, WebConfirmation>(confirmation);
376 Ewk_Certificate_Policy_Decision *request = m_confirmationCertificatenMap[cert];
378 if (cert->getResult() == WebConfirmation::ConfirmationResult::Confirmed)
380 else if (cert->getResult() == WebConfirmation::ConfirmationResult::Rejected)
383 BROWSER_LOGE("Wrong ConfirmationResult");
387 // set certificate confirmation
388 ewk_certificate_policy_decision_allowed_set(request, result);
391 m_confirmationCertificatenMap.erase(cert);
394 case WebConfirmation::ConfirmationType::Authentication: {
395 AuthenticationConfirmationPtr auth = std::dynamic_pointer_cast<AuthenticationConfirmation, WebConfirmation>(confirmation);
396 Ewk_Auth_Request *request = m_confirmationAuthenticationMap[auth];
397 if (auth->getResult() == WebConfirmation::ConfirmationResult::Confirmed) {
398 // set auth challange credential
399 ewk_auth_request_authenticate(request, const_cast<char*>(auth->getLogin().c_str()), const_cast<char*>(auth->getPassword().c_str()));
400 // ewk_object_unref(request);
401 } else if (auth->getResult() == WebConfirmation::ConfirmationResult::Rejected) {
402 ewk_auth_request_cancel(request);
403 // ewk_object_unref(request);
405 BROWSER_LOGE("Wrong ConfirmationResult");
410 m_confirmationAuthenticationMap.erase(auth);
422 std::shared_ptr<tizen_browser::tools::BrowserImage> WebView::captureSnapshot(int targetWidth, int targetHeight)
424 BROWSER_LOGD("%s:%d %s NOT IMPLEMENTED, returning empty BrowserImage object", __FILE__, __LINE__, __func__);
426 M_ASSERT(targetWidth);
427 M_ASSERT(targetHeight);
429 std::shared_ptr<tizen_browser::tools::BrowserImage> noImage = std::make_shared<tizen_browser::tools::BrowserImage>();
430 evas_object_geometry_get(m_ewkView, NULL, NULL, &vw, &vh);
431 if (vw == 0 || vh == 0)
435 double snapshotProportions = (double)(targetWidth) /(double)(targetHeight);
436 double webkitProportions = (double)(vw) /(double)(vh);
437 if (webkitProportions >= snapshotProportions) {
438 // centring position of screenshot
439 area.x = (vw*getZoomFactor()/2) - (vh*getZoomFactor()*snapshotProportions/2);
441 area.w = vh*getZoomFactor()*snapshotProportions;
442 area.h = vh*getZoomFactor();
447 area.w = vw*getZoomFactor();
448 area.h = vw*getZoomFactor()/snapshotProportions;
450 if (area.w == 0 || area.h == 0)
453 double scaleW = (double)targetWidth / (double)(area.w);
454 double scaleH = (double)targetHeight / (double)(area.h);
456 #if defined(USE_EWEBKIT)
458 Evas_Object *snapshot = nullptr;
459 // TODO use ewk_view_screenshot_contents_get_async API here
461 return tizen_browser::tools::EflTools::getBrowserImage(snapshot);
468 #if defined(USE_EWEBKIT)
469 void WebView::__setFocusToEwkView(void * data, Evas * /* e */, Evas_Object * /* obj */, void * /* event_info */)
471 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
473 WebView * self = reinterpret_cast<WebView *>(data);
475 if(!self->hasFocus())
476 self->ewkViewClicked();
479 void WebView::__newWindowRequest(void *data, Evas_Object *, void *out)
481 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
483 WebView * self = reinterpret_cast<WebView *>(data);
484 BROWSER_LOGD("%s:%d %s self=%p", __FILE__, __LINE__, __func__, self);
485 BROWSER_LOGD("Window creating in tab: %s", self->getTabId().toString().c_str());
486 std::shared_ptr<basic_webengine::AbstractWebEngine<Evas_Object>> m_webEngine;
487 m_webEngine = std::dynamic_pointer_cast
489 basic_webengine::AbstractWebEngine<Evas_Object>,tizen_browser::core::AbstractService
491 (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.webkitengineservice"));
492 M_ASSERT(m_webEngine);
494 /// \todo: Choose newly created tab.
495 TabId id = m_webEngine->addTab(std::string(), &self->getTabId());
496 BROWSER_LOGD("Created tab: %s", id.toString().c_str());
498 Evas_Object* tab_ewk_view = m_webEngine->getTabView(id);
499 *static_cast<Evas_Object**>(out) = tab_ewk_view;
502 void WebView::__closeWindowRequest(void *data, Evas_Object *, void *)
504 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
505 WebView * self = reinterpret_cast<WebView *>(data);
506 std::shared_ptr<AbstractWebEngine<Evas_Object>> m_webEngine =
507 std::dynamic_pointer_cast
508 <basic_webengine::AbstractWebEngine<Evas_Object>,tizen_browser::core::AbstractService>
509 (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.webkitengineservice"));
510 m_webEngine->closeTab(self->getTabId());
513 void WebView::__loadStarted(void * data, Evas_Object * /* obj */, void * /* event_info */)
515 WebView * self = reinterpret_cast<WebView *>(data);
517 BROWSER_LOGD("%s:%d\n\t %s", __func__, __LINE__, ewk_view_url_get(self->m_ewkView));
519 self->m_isLoading = true;
521 tizen_browser::services::TabThumbCache* cache = tizen_browser::services::TabThumbCache::getInstance();
522 cache->clearThumb(self->m_tabId);
525 void WebView::__loadStop(void * data, Evas_Object * /* obj */, void * /* event_info */)
527 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
529 WebView * self = reinterpret_cast<WebView *>(data);
530 self->m_isLoading = false;
535 void WebView::__loadFinished(void * data, Evas_Object * /* obj */, void * /* event_info */)
537 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
539 WebView * self = reinterpret_cast<WebView *>(data);
540 self->m_isLoading = false;
541 self->m_loadProgress = 1;
543 self->loadFinished();
544 self->loadProgress(self->m_loadProgress);
545 tizen_browser::services::TabThumbCache* cache = tizen_browser::services::TabThumbCache::getInstance();
546 cache->updateThumb(self->m_tabId);
549 void WebView::__loadProgress(void * data, Evas_Object * /* obj */, void * event_info)
551 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
553 WebView * self = reinterpret_cast<WebView *>(data);
554 self->m_loadProgress = *(double *)event_info;
556 self->loadProgress(self->m_loadProgress);
559 void WebView::__loadError(void* data, Evas_Object * obj, void* ewkError)
561 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
563 WebView *self = reinterpret_cast<WebView*>(data);
564 Ewk_Error *error = reinterpret_cast<Ewk_Error*>(ewkError);
565 Ewk_Error_Type errorType = ewk_error_type_get(error);
567 BROWSER_LOGD("[%s:%d] ewk_error_type: %d ",
568 __PRETTY_FUNCTION__, __LINE__, errorType);
570 BROWSER_LOGD("[%s:%d] emiting signal ", __PRETTY_FUNCTION__, __LINE__);
571 int errorCode = ewk_error_code_get(error);
572 if(errorCode == EWK_ERROR_NETWORK_STATUS_CANCELLED)
574 BROWSER_LOGD("Stop signal emitted");
575 BROWSER_LOGD("Error description: %s", ewk_error_description_get(error));
576 evas_object_smart_callback_call(obj, "load,stop", NULL);
581 self->m_loadError=true;
585 void WebView::__titleChanged(void * data, Evas_Object * obj, void * /* event_info */)
587 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
589 WebView * self = reinterpret_cast<WebView *>(data);
590 self->m_title = tizen_browser::tools::fromChar(ewk_view_title_get(obj));
592 self->titleChanged(self->m_title);
595 void WebView::__urlChanged(void * data, Evas_Object * /* obj */, void * event_info)
597 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
599 WebView * self = reinterpret_cast<WebView *>(data);
600 BROWSER_LOGD("URL changed for tab: %s", self->getTabId().toString().c_str());
601 std::shared_ptr<basic_webengine::AbstractWebEngine<Evas_Object>> m_webEngine;
602 m_webEngine = std::dynamic_pointer_cast<basic_webengine::AbstractWebEngine<Evas_Object>, tizen_browser::core::AbstractService>(
603 tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.webkitengineservice"));
604 M_ASSERT(m_webEngine);
605 self->uriChanged(tizen_browser::tools::fromChar(reinterpret_cast<const char *>(event_info)));
606 self->tabIdChecker(self->m_tabId);
609 void WebView::__backForwardListChanged(void * data, Evas_Object * /* obj */, void * /* event_info */)
611 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
613 WebView * self = reinterpret_cast<WebView *>(data);
614 self->backwardEnableChanged(self->isBackEnabled());
615 self->forwardEnableChanged(self->isForwardEnabled());
618 void WebView::__faviconChanged(void* data, Evas_Object*, void*)
622 WebView * self = static_cast<WebView *>(data);
623 Evas_Object * favicon = ewk_context_icon_database_icon_object_add(ewk_view_context_get(self->m_ewkView), ewk_view_url_get(self->m_ewkView),evas_object_evas_get(self->m_ewkView));
625 BROWSER_LOGD("[%s:%d] Favicon received", __PRETTY_FUNCTION__, __LINE__);
626 self->faviconImage = tizen_browser::tools::EflTools::getBrowserImage(favicon);
627 evas_object_unref(favicon);
628 self->favIconChanged(self->faviconImage);
633 void WebView::__IMEClosed(void* data, Evas_Object*, void*)
635 BROWSER_LOGD("%s", __func__);
636 WebView * self = reinterpret_cast<WebView *>(data);
637 self->IMEStateChanged(false);
640 void WebView::__IMEOpened(void* data, Evas_Object*, void*)
642 BROWSER_LOGD("%s", __func__);
643 WebView * self = reinterpret_cast<WebView *>(data);
644 self->IMEStateChanged(true);
647 std::string WebView::securityOriginToUri(const Ewk_Security_Origin *origin)
649 std::string protocol = tizen_browser::tools::fromChar(ewk_security_origin_protocol_get(origin));
650 std::string uri = tizen_browser::tools::fromChar(ewk_security_origin_host_get(origin));
651 std::string url = (boost::format("%1%://%2%") % protocol % uri).str();
655 void WebView::__geolocationPermissionRequest(void * data, Evas_Object * /* obj */, void * event_info)
657 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
659 WebView * self = reinterpret_cast<WebView *>(data);
661 Ewk_Geolocation_Permission_Request *request = reinterpret_cast<Ewk_Geolocation_Permission_Request *>(event_info);
666 ewk_view_suspend(self->m_ewkView);
668 std::string url = WebView::securityOriginToUri(ewk_geolocation_permission_request_origin_get(request));
670 ///\todo add translations
671 std::string message = (boost::format("%1% Requests your location") % url).str();
673 WebConfirmationPtr c = std::make_shared<WebConfirmation>(WebConfirmation::ConfirmationType::Geolocation, self->m_tabId, url, message);
676 self->m_confirmationGeolocationMap[c] = request;
678 self->cofirmationRequest(c);
682 void WebView::__usermediaPermissionRequest(void * data, Evas_Object * /* obj */, void * event_info)
684 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
686 WebView * self = reinterpret_cast<WebView *>(data);
688 Ewk_User_Media_Permission_Request *request = reinterpret_cast<Ewk_User_Media_Permission_Request *>(event_info);
693 ewk_view_suspend(self->m_ewkView);
695 ///\todo add translations
696 std::string message = "User media permission request";
698 WebConfirmationPtr c = std::make_shared<WebConfirmation>(WebConfirmation::ConfirmationType::UserMedia, self->m_tabId, std::string(), message);
701 self->m_confirmationUserMediaMap[c] = request;
703 self->cofirmationRequest(c);
707 void WebView::__notificationPermissionRequest(void * data, Evas_Object * /* obj */, void * event_info)
709 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
711 WebView * self = reinterpret_cast<WebView *>(data);
713 Ewk_Notification_Permission_Request *request = reinterpret_cast<Ewk_Notification_Permission_Request *>(event_info);
718 ewk_view_suspend(self->m_ewkView);
720 ///\todo add translations
721 std::string message = (boost::format("%1% wants to display notifications") % self->getURI()).str();
723 WebConfirmationPtr c = std::make_shared<WebConfirmation>(WebConfirmation::ConfirmationType::Notification, self->m_tabId, self->getURI(), message);
726 self->m_confirmationNotificationMap[c] = request;
728 self->cofirmationRequest(c);
732 void WebView::__authenticationRequest(void * data, Evas_Object * /* obj */, void * event_info)
734 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
736 WebView * self = reinterpret_cast<WebView *>(data);
738 Ewk_Auth_Request *request = reinterpret_cast<Ewk_Auth_Request *>(event_info);
739 EINA_SAFETY_ON_NULL_RETURN(request);
741 std::string realm = tizen_browser::tools::fromChar(ewk_auth_request_realm_get(request));
742 // std::string url = tizen_browser::tools::fromChar(ewk_auth_request_host_get(request));
744 // ewk_object_ref(request);
746 ///\todo add translations
747 // std::string message = (boost::format("A username and password are being requested by %1%. The site says: \"%2%\"") % url % realm).str();
749 // AuthenticationConfirmationPtr c = std::make_shared<AuthenticationConfirmation>(self->m_tabId, url, message);
752 // self->m_confirmationAuthenticationMap[c] = request;
754 // self->cofirmationRequest(c);
758 void WebView::__requestCertificationConfirm(void * data , Evas_Object * /* obj */, void * event_info)
760 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
762 WebView * self = reinterpret_cast<WebView *>(data);
764 Ewk_Certificate_Policy_Decision *request = reinterpret_cast<Ewk_Certificate_Policy_Decision *>(event_info);
769 ewk_certificate_policy_decision_suspend(request);
771 std::string url = tizen_browser::tools::fromChar(ewk_certificate_policy_decision_url_get(request));
773 ///\todo add translations
774 std::string message = (boost::format("There are problems with the security certificate for this site.<br>%1%") % url).str();
776 CertificateConfirmationPtr c = std::make_shared<CertificateConfirmation>(self->m_tabId, url, message);
778 c->setResult(tizen_browser::basic_webengine::WebConfirmation::ConfirmationResult::Confirmed);
781 self->m_confirmationCertificatenMap[c] = request;
783 self->cofirmationRequest(c);
788 void WebView::setFocus()
790 elm_object_focus_set(m_ewkView, EINA_TRUE);
793 void WebView::clearFocus()
795 elm_object_focus_set(m_ewkView, EINA_FALSE);
798 bool WebView::hasFocus() const
800 return elm_object_focus_get(m_ewkView) == EINA_TRUE ? true : false;
803 double WebView::getZoomFactor() const
805 if(EINA_UNLIKELY(m_ewkView == NULL)){
809 #if defined(USE_EWEBKIT)
810 return ewk_view_page_zoom_get(m_ewkView);
816 void WebView::setZoomFactor(double zoomFactor)
818 #if defined(USE_EWEBKIT)
820 //using zoomFactor = 0 sets zoom "fit to screen"
822 ewk_view_page_zoom_set(m_ewkView, zoomFactor);
828 const TabId& WebView::getTabId(){
833 std::shared_ptr<tizen_browser::tools::BrowserImage> WebView::getFavicon() {
834 BROWSER_LOGD("%s:%d, TabId: %s", __PRETTY_FUNCTION__, __LINE__, m_tabId.toString().c_str());
837 #if defined(USE_EWEBKIT)
838 if (faviconImage.get() == NULL) {
841 // Evas_Object * favicon = ewk_view_favicon_get(m_ewkView);
842 Evas_Object * favicon = ewk_context_icon_database_icon_object_add(ewk_view_context_get(m_ewkView), ewk_view_url_get(m_ewkView),evas_object_evas_get(m_ewkView));
844 Ewk_Favicon_Database * database = ewk_context_favicon_database_get(ewk_view_context_get(m_ewkView));
845 Evas_Object * favicon = ewk_favicon_database_icon_get(database, ewk_view_url_get(m_ewkView), evas_object_evas_get(m_ewkView));
850 evas_object_image_size_get(favicon, &w, &h);
851 BROWSER_LOGD("[%s]: Info about favicon: w:%d h:%d, type: %s", __func__, w, h, evas_object_type_get(favicon));
854 std::shared_ptr<tizen_browser::tools::BrowserImage>
855 image = tizen_browser::tools::EflTools::getBrowserImage(favicon);
857 evas_object_unref(favicon);
866 BROWSER_LOGE("[%s:%d]: Returned favicon is empty!", __PRETTY_FUNCTION__, __LINE__);
867 return std::make_shared<tizen_browser::tools::BrowserImage>();
870 void WebView::clearPrivateData()
872 BROWSER_LOGD("Clearing private data");
873 #if defined(USE_EWEBKIT)
874 Ewk_Context * context = ewk_context_default_get();
875 ewk_context_web_storage_delete_all(context);
876 ewk_cookie_manager_cookies_clear(ewk_context_cookie_manager_get(context));
880 void WebView::searchOnWebsite(const std::string & searchString, int flags)
882 ///\todo: it should be "0" instead of "1024" for unlimited match count but it doesn't work properly in WebKit
883 Eina_Bool result = ewk_view_text_find(m_ewkView, searchString.c_str(), static_cast<Ewk_Find_Options>(flags), 1024);
884 BROWSER_LOGD("Ewk search; word: %s, result: %d", searchString.c_str(), result);
887 } /* namespace webkitengine_service */
888 } /* end of basic_webengine */
889 } /* end of tizen_browser */