2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
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.
18 #include "runtime/browser/web_view_impl.h"
20 #include <ewk_chromium.h>
24 #include "common/file_utils.h"
25 #include "common/logger.h"
26 #include "common/profiler.h"
27 #include "runtime/browser/native_window.h"
33 const char* kKeyNameBack = "back";
34 const char* kKeyNameMenu = "menu";
35 const char* kDefaultEncoding = "UTF-8";
36 const char* kSmartClassUserDataKey = "__SC_USERDATA__";
38 static int ToWebRotation(int r) {
48 static NativeWindow::ScreenOrientation ToNativeRotation(int r) {
50 (EWK_SCREEN_ORIENTATION_PORTRAIT_PRIMARY
51 | EWK_SCREEN_ORIENTATION_PORTRAIT_SECONDARY
52 | EWK_SCREEN_ORIENTATION_LANDSCAPE_PRIMARY
53 | EWK_SCREEN_ORIENTATION_LANDSCAPE_SECONDARY)) {
54 return NativeWindow::ScreenOrientation::ANY;
56 (EWK_SCREEN_ORIENTATION_PORTRAIT_PRIMARY
57 | EWK_SCREEN_ORIENTATION_LANDSCAPE_PRIMARY)) {
58 return NativeWindow::ScreenOrientation::NATURAL;
59 } else if (r & EWK_SCREEN_ORIENTATION_PORTRAIT_PRIMARY) {
60 return NativeWindow::ScreenOrientation::PORTRAIT_PRIMARY;
61 } else if (r & EWK_SCREEN_ORIENTATION_PORTRAIT_SECONDARY) {
62 return NativeWindow::ScreenOrientation::PORTRAIT_SECONDARY;
63 } else if (r & EWK_SCREEN_ORIENTATION_LANDSCAPE_PRIMARY) {
64 return NativeWindow::ScreenOrientation::LANDSCAPE_PRIMARY;
66 return NativeWindow::ScreenOrientation::LANDSCAPE_SECONDARY;
72 WebViewImpl::WebViewImpl(WebView* view,
79 rotation_handler_id_(0),
82 evas_smart_class_(NULL),
83 internal_popup_opened_(false) {
87 WebViewImpl::~WebViewImpl() {
88 if (internal_popup_opened_) {
89 ewk_view_javascript_alert_reply(ewk_view_);
92 evas_object_del(ewk_view_);
93 if (evas_smart_class_ != NULL)
94 evas_smart_free(evas_smart_class_);
97 void WebViewImpl::LoadUrl(const std::string& url, const std::string& mime) {
101 auto mime_override_cb = [](const char* url, const char* mime,
102 char** new_mime, void* data) -> Eina_Bool{
103 WebViewImpl* view = static_cast<WebViewImpl*>(data);
104 if (view != nullptr &&
105 common::utils::BaseName(url) ==
106 common::utils::BaseName(view->GetUrl())) {
107 *new_mime = strdup(view->mime().c_str());
108 LOGGER(DEBUG) << "ewk's new_mime: " << *new_mime;
113 ewk_context_mime_override_callback_set(context_, mime_override_cb, this);
115 ewk_view_url_set(ewk_view_, url.c_str());
118 void WebViewImpl::Suspend() {
120 ewk_view_suspend(ewk_view_);
123 void WebViewImpl::Resume() {
125 ewk_view_resume(ewk_view_);
128 void WebViewImpl::Reload() {
129 ewk_view_reload(ewk_view_);
132 void WebViewImpl::SetVisibility(bool show) {
133 ewk_view_visibility_set(ewk_view_, show ? EINA_TRUE : EINA_FALSE);
137 bool WebViewImpl::EvalJavascript(const std::string& script) {
138 return ewk_view_script_execute(ewk_view_, script.c_str(), NULL, NULL);
141 void WebViewImpl::Initialize() {
142 ewk_smart_class_ = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("WebView");
143 ewk_view_smart_class_set(&ewk_smart_class_);
144 ewk_smart_class_.orientation_lock = [](Ewk_View_Smart_Data *sd,
146 WebViewImpl* self = static_cast<WebViewImpl*>(
147 evas_object_data_get(sd->self, kSmartClassUserDataKey));
148 if (self == NULL || self->listener_ == NULL)
150 self->listener_->OnOrientationLock(self->view_,
152 ToNativeRotation(orientation));
156 ewk_smart_class_.orientation_unlock = [](Ewk_View_Smart_Data *sd) {
157 WebViewImpl* self = static_cast<WebViewImpl*>(
158 evas_object_data_get(sd->self, kSmartClassUserDataKey));
159 if (self == NULL || self->listener_ == NULL)
161 self->listener_->OnOrientationLock(
164 NativeWindow::ScreenOrientation::PORTRAIT_PRIMARY);
167 if (evas_smart_class_ != NULL)
168 evas_smart_free(evas_smart_class_);
169 evas_smart_class_ = evas_smart_class_new(&ewk_smart_class_.sc);
170 if (evas_smart_class_ == NULL) {
171 LOGGER(ERROR) << "Can't create evas smart class";
175 Ewk_Page_Group* page_group = ewk_page_group_create("");
176 ewk_view_ = ewk_view_smart_add(evas_object_evas_get(window_->evas_object()),
180 evas_object_data_set(ewk_view_, kSmartClassUserDataKey, this);
183 InitLoaderCallback();
184 InitPolicyDecideCallback();
185 InitQuotaExceededCallback();
186 InitIPCMessageCallback();
187 InitConsoleMessageCallback();
188 InitCustomContextMenuCallback();
189 InitRotationCallback();
190 InitWindowCreateCallback();
191 InitFullscreenCallback();
192 InitNotificationPermissionCallback();
193 InitGeolocationPermissionCallback();
194 InitAuthenticationCallback();
195 InitCertificateAllowCallback();
196 InitPopupWaitCallback();
197 InitUsermediaCallback();
199 Ewk_Settings* settings = ewk_view_settings_get(ewk_view_);
200 ewk_settings_scripts_can_open_windows_set(settings, EINA_TRUE);
201 ewk_settings_default_text_encoding_name_set(settings, kDefaultEncoding);
203 // TODO(sngn.lee): "protocolhandler,registration,requested"
204 // custom protocol handler
207 evas_object_show(ewk_view_);
210 void WebViewImpl::Deinitialize() {
211 auto it = smart_callbacks_.begin();
212 for ( ; it != smart_callbacks_.end(); ++it) {
213 evas_object_smart_callback_del(
218 eext_object_event_callback_del(ewk_view_,
220 smart_callbacks_["key_callback"]);
221 ewk_view_exceeded_database_quota_callback_set(
225 ewk_view_exceeded_indexed_database_quota_callback_set(
229 ewk_view_exceeded_local_file_system_quota_callback_set(
233 ewk_view_notification_permission_callback_set(
237 ewk_view_geolocation_permission_callback_set(
241 ewk_view_user_media_permission_callback_set(
245 window_->RemoveRotationHandler(rotation_handler_id_);
248 void WebViewImpl::InitKeyCallback() {
249 auto key_callback = [](void* user_data,
250 Evas_Object* /*obj*/,
251 void* event_info) -> void {
252 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
253 Eext_Callback_Type key = static_cast<Eext_Callback_Type>(
254 reinterpret_cast<long long>(event_info)); // NOLINT
255 self->OnKeyEvent(key);
257 eext_object_event_callback_add(ewk_view_,
261 eext_object_event_callback_add(ewk_view_,
265 smart_callbacks_["key_callback"] = key_callback;
268 void WebViewImpl::InitLoaderCallback() {
269 // load statred callback
270 auto loadstart_callback = [](void* user_data,
271 Evas_Object* /*obj*/,
273 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
275 self->listener_->OnLoadStart(self->view_);
277 evas_object_smart_callback_add(ewk_view_,
281 // load finished callback
282 auto loadfinished_callback = [](void* user_data,
285 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
287 self->listener_->OnLoadFinished(self->view_);
289 evas_object_smart_callback_add(ewk_view_,
291 loadfinished_callback,
294 // load progress callback
295 auto loadprogress_callback = [](void* user_data,
298 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
299 double* progress = static_cast<double*>(event_info);
301 self->listener_->OnLoadProgress(self->view_, *progress);
303 evas_object_smart_callback_add(ewk_view_,
305 loadprogress_callback,
308 auto rendered_callback = [](void* user_data,
311 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
313 self->listener_->OnRendered(self->view_);
315 evas_object_smart_callback_add(ewk_view_,
319 smart_callbacks_["load,started"] = loadstart_callback;
320 smart_callbacks_["load,finished"] = loadfinished_callback;
321 smart_callbacks_["load,progress"] = loadprogress_callback;
322 smart_callbacks_["frame,rendered"] = rendered_callback;
325 void WebViewImpl::InitPolicyDecideCallback() {
326 // "policy,navigation,decide"
327 auto navigation_decide_callback = [](void* user_data,
330 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
331 Ewk_Policy_Decision* policy =
332 static_cast<Ewk_Policy_Decision*>(event_info);
333 const char* url = ewk_policy_decision_url_get(policy);
335 if (self->listener_) {
336 if (self->listener_->OnDidNavigation(self->view_, url))
337 ewk_policy_decision_use(policy);
339 ewk_policy_decision_ignore(policy);
341 ewk_policy_decision_use(policy);
344 evas_object_smart_callback_add(ewk_view_,
345 "policy,navigation,decide",
346 navigation_decide_callback,
349 // policy,newwindow,decide
350 auto newwindow_decide_callback = [](void* user_data,
353 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
354 Ewk_Policy_Decision* policy =
355 static_cast<Ewk_Policy_Decision*>(event_info);
357 const char* url = ewk_policy_decision_url_get(policy);
359 if (self->listener_) {
360 if (self->listener_->OnDidNavigation(self->view_, url) &&
361 self->listener_->OnDidOpenWindow(self->view_, url)) {
362 ewk_policy_decision_use(policy);
364 ewk_policy_decision_ignore(policy);
367 ewk_policy_decision_use(policy);
370 evas_object_smart_callback_add(ewk_view_,
371 "policy,newwindow,decide",
372 newwindow_decide_callback,
374 smart_callbacks_["policy,navigation,decide"] = navigation_decide_callback;
375 smart_callbacks_["policy,newwindow,decide"] = newwindow_decide_callback;
378 void WebViewImpl::InitQuotaExceededCallback() {
379 // TODO(sngn.lee): Need callback interface - OnQutaExceed
380 // check http://tizen.org/privilege/unlimitedstorage
382 // callback for database quota exceeded
383 auto database_exceeded_callback = [](Evas_Object* view,
384 Ewk_Security_Origin* origin,
386 unsigned long long, // NOLINT
387 void* user_data) -> Eina_Bool {
388 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
389 if (self == NULL || self->listener_ == NULL)
392 auto result_handler = [view](bool result) {
393 LOGGER(DEBUG) << "database quota Permission Result : " << result;
394 ewk_view_exceeded_database_quota_reply(view, result);
396 std::stringstream url;
397 url << ewk_security_origin_protocol_get(origin)
399 << ewk_security_origin_host_get(origin)
401 << ewk_security_origin_port_get(origin);
402 self->listener_->OnQuotaExceed(
408 ewk_view_exceeded_database_quota_callback_set(
410 database_exceeded_callback,
413 // callback for indexed database quota exceeded
414 auto indexed_db_exceeded_callback = [](Evas_Object* view,
415 Ewk_Security_Origin* origin,
417 void* user_data) -> Eina_Bool {
418 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
419 if (self == NULL || self->listener_ == NULL)
422 auto result_handler = [view](bool result) {
423 LOGGER(DEBUG) << "indexed db quota Permission Result : " << result;
424 ewk_view_exceeded_indexed_database_quota_reply(view, result);
426 std::stringstream url;
427 url << ewk_security_origin_protocol_get(origin)
429 << ewk_security_origin_host_get(origin)
431 << ewk_security_origin_port_get(origin);
432 self->listener_->OnQuotaExceed(
438 ewk_view_exceeded_indexed_database_quota_callback_set(
440 indexed_db_exceeded_callback,
443 // callback for localfile quota exceeded
444 auto localfile_exceeded_callback = [](Evas_Object* view,
445 Ewk_Security_Origin* origin,
447 void* user_data) -> Eina_Bool {
448 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
449 if (self == NULL || self->listener_ == NULL)
452 auto result_handler = [view](bool result) {
453 LOGGER(DEBUG) << "local file quota Permission Result : " << result;
454 ewk_view_exceeded_local_file_system_quota_reply(view, result);
456 std::stringstream url;
457 url << ewk_security_origin_protocol_get(origin)
459 << ewk_security_origin_host_get(origin)
461 << ewk_security_origin_port_get(origin);
462 self->listener_->OnQuotaExceed(
468 ewk_view_exceeded_local_file_system_quota_callback_set(
470 localfile_exceeded_callback,
474 void WebViewImpl::InitIPCMessageCallback() {
476 auto wrt_message_callback = [](void* user_data,
479 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
480 Ewk_IPC_Wrt_Message_Data* msg =
481 static_cast<Ewk_IPC_Wrt_Message_Data*>(event_info);
483 self->listener_->OnReceivedWrtMessage(self->view_, msg);
485 evas_object_smart_callback_add(ewk_view_,
487 wrt_message_callback,
489 smart_callbacks_["wrt,message"] = wrt_message_callback;
492 void WebViewImpl::InitConsoleMessageCallback() {
494 auto console_message_callback = [](void* user_data,
497 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
498 if (!self->listener_) {
501 Ewk_Console_Message* msg = static_cast<Ewk_Console_Message*>(event_info);
502 unsigned int line_number = ewk_console_message_line_get(msg);
504 std::stringstream buf;
506 buf << common::utils::BaseName(ewk_console_message_source_get(msg))
507 << ":" << line_number << ": ";
509 buf << ewk_console_message_text_get(msg);
510 int level = ewk_console_message_level_get(msg);
511 self->listener_->OnConsoleMessage(buf.str(), level);
513 evas_object_smart_callback_add(ewk_view_,
515 console_message_callback,
517 smart_callbacks_["console,message"] = console_message_callback;
520 void WebViewImpl::InitCustomContextMenuCallback() {
521 auto custom_context_menu_callback = [](void* user_data,
524 Ewk_Context_Menu* contextmenu = static_cast<Ewk_Context_Menu*>(event_info);
525 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
526 bool disabled = false;
527 if (self->listener_ &&
528 self->listener_->OnContextMenuDisabled(self->view_)) {
531 int cnt = ewk_context_menu_item_count(contextmenu);
532 for (int idx = cnt-1; idx >= 0; --idx) {
533 auto* item = ewk_context_menu_nth_item_get(contextmenu, idx);
534 Ewk_Context_Menu_Item_Tag tag = ewk_context_menu_item_tag_get(item);
536 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW:
537 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW:
538 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_FRAME_IN_NEW_WINDOW:
539 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
540 case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK:
541 ewk_context_menu_item_remove(contextmenu, item);
545 ewk_context_menu_item_remove(contextmenu, item);
549 evas_object_smart_callback_add(ewk_view_,
550 "contextmenu,customize",
551 custom_context_menu_callback,
553 smart_callbacks_["contextmenu,customize"] = custom_context_menu_callback;
556 void WebViewImpl::InitRotationCallback() {
558 ewk_view_orientation_send(ewk_view_, ToWebRotation(window_->rotation()));
559 rotation_handler_id_ = window_->AddRotationHandler(
560 std::bind(&WebViewImpl::OnRotation,
562 std::placeholders::_1));
565 void WebViewImpl::InitWindowCreateCallback() {
566 auto create_callback = [](void* user_data,
569 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
570 if (!self->listener_) {
573 WebView* new_view = new WebView(self->window_, self->context_);
574 self->listener_->OnCreatedNewWebView(self->view_, new_view);
575 *(static_cast<Evas_Object **>(event_info)) = new_view->evas_object();
578 auto close_callback = [](void* user_data,
581 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
582 if (!self->listener_) {
585 self->listener_->OnClosedWebView(self->view_);
587 evas_object_smart_callback_add(ewk_view_,
591 evas_object_smart_callback_add(ewk_view_,
596 smart_callbacks_["create,window"] = create_callback;
597 smart_callbacks_["close,window"] = close_callback;
600 void WebViewImpl::InitFullscreenCallback() {
601 auto enter_callback = [](void* user_data,
603 void* /*event_info*/) {
604 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
605 self->fullscreen_ = true;
606 self->window_->FullScreen(true);
608 auto exit_callback = [](void* user_data,
610 void* /*event_info*/) {
611 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
612 self->fullscreen_ = false;
613 self->window_->FullScreen(false);
615 evas_object_smart_callback_add(ewk_view_,
616 "fullscreen,enterfullscreen",
619 evas_object_smart_callback_add(ewk_view_,
620 "fullscreen,exitfullscreen",
623 smart_callbacks_["fullscreen,enterfullscreen"] = enter_callback;
624 smart_callbacks_["fullscreen,exitfullscreen"] = exit_callback;
627 void WebViewImpl::InitNotificationPermissionCallback() {
628 auto request_callback = [](Evas_Object*,
629 Ewk_Notification_Permission_Request* request,
631 LOGGER(DEBUG) << "Notification Permission Request";
632 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
633 if (!self->listener_) {
634 ewk_notification_permission_reply(request, EINA_FALSE);
638 ewk_notification_permission_request_suspend(request);
639 auto result_handler = [request](bool result) {
640 LOGGER(DEBUG) << "Notification Permission Result : %d" << result;
641 ewk_notification_permission_reply(request, result);
643 const Ewk_Security_Origin* ewk_origin =
644 ewk_notification_permission_request_origin_get(request);
646 std::stringstream url;
647 url << ewk_security_origin_protocol_get(ewk_origin)
649 << ewk_security_origin_host_get(ewk_origin)
651 << ewk_security_origin_port_get(ewk_origin);
652 self->listener_->OnNotificationPermissionRequest(
658 ewk_view_notification_permission_callback_set(ewk_view_,
663 void WebViewImpl::InitGeolocationPermissionCallback() {
664 auto permission_callback = [](
666 Ewk_Geolocation_Permission_Request* request,
668 LOGGER(DEBUG) << "Geolocation Permission Request";
669 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
670 if (self == NULL || self->listener_ == NULL) {
671 ewk_geolocation_permission_reply(request, EINA_FALSE);
674 ewk_geolocation_permission_request_suspend(request);
676 const Ewk_Security_Origin* ewk_origin =
677 ewk_geolocation_permission_request_origin_get(request);
678 auto result_handler = [request](bool result) {
679 LOGGER(DEBUG) << "Geolocation Permission Result : " << result;
680 ewk_geolocation_permission_reply(request, result);
683 std::stringstream url;
684 url << ewk_security_origin_protocol_get(ewk_origin)
686 << ewk_security_origin_host_get(ewk_origin)
688 << ewk_security_origin_port_get(ewk_origin);
690 self->listener_->OnGeolocationPermissionRequest(
696 ewk_view_geolocation_permission_callback_set(ewk_view_,
701 void WebViewImpl::InitAuthenticationCallback() {
702 auto auth_callback = [](void* user_data,
705 LOGGER(DEBUG) << "Authentication Request";
706 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
707 Ewk_Auth_Challenge* auth_challenge =
708 static_cast<Ewk_Auth_Challenge*>(event_info);
710 if (self == NULL || self->listener_ == NULL) {
711 ewk_auth_challenge_credential_cancel(auth_challenge);
714 auto result_handler = [auth_challenge](bool submit,
715 const std::string& id,
716 const std::string& password) {
717 LOGGER(DEBUG) << "Authentication Result : submit = " << submit;
719 ewk_auth_challenge_credential_cancel(auth_challenge);
722 ewk_auth_challenge_credential_use(auth_challenge,
726 ewk_auth_challenge_suspend(auth_challenge);
727 const char* message =
728 ewk_auth_challenge_realm_get(auth_challenge);
729 std::string url = self->GetUrl();
730 self->listener_->OnAuthenticationRequest(self->view_,
735 // "authentication,challenge"
736 evas_object_smart_callback_add(ewk_view_,
737 "authentication,challenge",
740 smart_callbacks_["authentication,challenge"] = auth_callback;
743 void WebViewImpl::InitCertificateAllowCallback() {
744 auto certi_callback = [](void* user_data,
747 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
748 Ewk_Certificate_Policy_Decision* policy =
749 static_cast<Ewk_Certificate_Policy_Decision*>(event_info);
751 if (self == NULL || self->listener_ == NULL) {
752 ewk_certificate_policy_decision_allowed_set(policy, EINA_FALSE);
756 ewk_certificate_policy_decision_suspend(policy);
757 auto result_handler = [policy](bool allow) {
758 ewk_certificate_policy_decision_allowed_set(policy, allow);
761 auto ptr = ewk_certificate_policy_decision_url_get(policy);
762 std::string url(ptr ? ptr : "");
763 ptr = ewk_certificate_policy_decision_certificate_pem_get(policy);
764 std::string pem(ptr ? ptr : "");
765 self->listener_->OnCertificateAllowRequest(self->view_,
770 evas_object_smart_callback_add(ewk_view_,
771 "request,certificate,confirm",
774 smart_callbacks_["request,certificate,confirm"] = certi_callback;
777 void WebViewImpl::InitPopupWaitCallback() {
778 evas_object_smart_callback_add(ewk_view_,
779 "popup,reply,wait,start",
780 [](void* user_data, Evas_Object* /*obj*/, void*) {
781 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
782 self->internal_popup_opened_ = true;
784 evas_object_smart_callback_add(ewk_view_,
785 "popup,reply,wait,finish",
786 [](void* user_data, Evas_Object* /*obj*/, void*) {
787 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
788 self->internal_popup_opened_ = false;
792 void WebViewImpl::InitUsermediaCallback() {
793 auto callback = [](Evas_Object*,
794 Ewk_User_Media_Permission_Request* request,
796 WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
797 if (self == NULL || self->listener_ == NULL) {
798 ewk_user_media_permission_reply(request, EINA_FALSE);
802 ewk_user_media_permission_request_suspend(request);
803 const Ewk_Security_Origin* origin =
804 ewk_user_media_permission_request_origin_get(request);
805 std::stringstream url;
806 url << ewk_security_origin_protocol_get(origin)
808 << ewk_security_origin_host_get(origin)
810 << ewk_security_origin_port_get(origin);
812 auto result_handler = [request](bool result) {
813 LOGGER(DEBUG) << "Getusermedia Permission Result : " << result;
814 ewk_user_media_permission_reply(request, result);
816 std::string test = url.str();
817 self->listener_->OnUsermediaPermissionRequest(self->view_,
822 ewk_view_user_media_permission_callback_set(ewk_view_, callback, this);
825 std::string WebViewImpl::GetUrl() {
826 return std::string(ewk_view_url_get(ewk_view_));
829 Evas_Object* WebViewImpl::evas_object() const {
833 void WebViewImpl::OnRotation(int degree) {
834 ewk_view_orientation_send(ewk_view_, ToWebRotation(degree));
837 void WebViewImpl::OnKeyEvent(Eext_Callback_Type key_type) {
839 if (key_type == EEXT_CALLBACK_BACK) {
841 ewk_view_fullscreen_exit(ewk_view_);
844 if (EINA_TRUE == ewk_view_text_selection_clear(ewk_view_)) {
847 keyname = kKeyNameBack;
848 } else if (key_type == EEXT_CALLBACK_MORE) {
849 keyname = kKeyNameMenu;
855 listener_->OnHardwareKey(view_, keyname);
858 void WebViewImpl::SetEventListener(WebView::EventListener* listener) {
859 listener_ = listener;
862 void WebViewImpl::SetAppInfo(const std::string& app_name,
863 const std::string& version) {
864 std::string ua = app_name + "/" + version;
865 ewk_view_application_name_for_user_agent_set(ewk_view_, ua.c_str());
867 bool WebViewImpl::SetUserAgent(const std::string& user_agent) {
868 return ewk_view_user_agent_set(ewk_view_, user_agent.c_str());
871 void WebViewImpl::SetCSPRule(const std::string& rule, bool report_only) {
872 ewk_view_content_security_policy_set(
875 report_only ? EWK_REPORT_ONLY : EWK_ENFORCE_POLICY);
878 void WebViewImpl::SetDefaultEncoding(const std::string& encoding) {
879 if (ewk_settings_is_encoding_valid(encoding.c_str())) {
880 Ewk_Settings* settings = ewk_view_settings_get(ewk_view_);
881 ewk_settings_default_text_encoding_name_set(settings, encoding.c_str());
885 } // namespace runtime