1 // Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "runtime/web_view.h"
7 #include <ewk_chromium.h>
10 #include "runtime/native_window.h"
16 // TODO(sngn.lee) : It should be declare in common header
17 const char* kKeyNameBack = "back";
18 const char* kKeyNameMenu = "menu";
20 static int ToWebRotation(int r) {
36 WebView::WebView(NativeWindow* window, Ewk_Context* context)
45 window_->RemoveRotationHandler(rotation_handler_id_);
46 evas_object_del(ewk_view_);
49 void WebView::LoadUrl(const std::string& url) {
50 ewk_view_url_set(ewk_view_, url.c_str());
53 void WebView::Suspend() {
55 ewk_view_suspend(ewk_view_);
58 void WebView::Resume() {
60 ewk_view_resume(ewk_view_);
63 void WebView::Reload() {
64 ewk_view_reload(ewk_view_);
67 void WebView::SetVisibility(bool show) {
68 ewk_view_visibility_set(ewk_view_, show ? EINA_TRUE : EINA_FALSE);
72 bool WebView::EvalJavascript(const std::string& script) {
73 return ewk_view_script_execute(ewk_view_, script.c_str(), NULL, NULL);
76 void WebView::Initialize() {
77 ewk_view_ = ewk_view_add_with_context(window_->evas_object(), context_);
79 // TODO(sngn.lee): To be implemented - orientation lock
82 auto key_callback = [](void* user_data,
84 void* event_info) -> void {
85 WebView* self = static_cast<WebView*>(user_data);
86 Ea_Callback_Type key = static_cast<Ea_Callback_Type>(
87 reinterpret_cast<int>(event_info));
88 self->OnKeyEvent(key);
90 ea_object_event_callback_add(ewk_view_,
94 ea_object_event_callback_add(ewk_view_,
100 // load statred callback
101 auto loadstart_callback = [](void* user_data,
102 Evas_Object* /*obj*/,
104 WebView* self = static_cast<WebView*>(user_data);
106 self->listener_->OnLoadStart(self);
108 evas_object_smart_callback_add(ewk_view_,
112 // load finished callback
113 auto loadfinished_callback = [](void* user_data,
116 WebView* self = static_cast<WebView*>(user_data);
118 self->listener_->OnLoadFinished(self);
120 evas_object_smart_callback_add(ewk_view_,
122 loadfinished_callback,
125 // load progress callback
126 auto loadprogress_callback = [](void* user_data,
129 WebView* self = static_cast<WebView*>(user_data);
130 double* progress = static_cast<double*>(event_info);
132 self->listener_->OnLoadProgress(self, *progress);
134 evas_object_smart_callback_add(ewk_view_,
136 loadprogress_callback,
139 auto rendered_callback = [](void* user_data,
142 WebView* self = static_cast<WebView*>(user_data);
144 self->listener_->OnRendered(self);
146 evas_object_smart_callback_add(ewk_view_,
151 // "policy,navigation,decide"
152 auto navigation_decide_callback = [](void* user_data,
155 WebView* self = static_cast<WebView*>(user_data);
156 Ewk_Policy_Decision* policy =
157 static_cast<Ewk_Policy_Decision*>(event_info);
158 const char* url = ewk_policy_decision_url_get(policy);
160 if (self->listener_) {
161 if (self->listener_->OnDidNavigation(self, url))
162 ewk_policy_decision_use(policy);
164 ewk_policy_decision_ignore(policy);
166 ewk_policy_decision_use(policy);
169 evas_object_smart_callback_add(ewk_view_,
170 "policy,navigation,decide",
171 navigation_decide_callback,
174 // policy,newwindow,decide
175 auto newwindow_decide_callback = [](void* user_data,
178 WebView* self = static_cast<WebView*>(user_data);
179 Ewk_Policy_Decision* policy =
180 static_cast<Ewk_Policy_Decision*>(event_info);
182 const char* url = ewk_policy_decision_url_get(policy);
184 if (self->listener_) {
185 if (self->listener_->OnDidNavigation(self, url) &&
186 self->listener_->OnDidOpenWindow(self, url)) {
187 ewk_policy_decision_use(policy);
189 ewk_policy_decision_ignore(policy);
192 ewk_policy_decision_use(policy);
195 evas_object_smart_callback_add(ewk_view_,
196 "policy,newwindow,decide",
197 newwindow_decide_callback,
200 // callback for database quota exceeded
201 auto database_exceeded_callback = [](Evas_Object* view,
202 Ewk_Security_Origin* origin,
205 void*) -> Eina_Bool {
206 std::string protocol(ewk_security_origin_protocol_get(origin));
207 if (protocol == "file://" || protocol == "app://") {
208 // Allow for local origin
209 ewk_view_exceeded_database_quota_reply(view, EINA_TRUE);
211 // Deny for remote origin
212 ewk_view_exceeded_database_quota_reply(view, EINA_FALSE);
216 ewk_view_exceeded_database_quota_callback_set(
218 database_exceeded_callback,
221 // callback for indexed database quota exceeded
222 auto indexed_db_exceeded_callback = [](Evas_Object* view,
223 Ewk_Security_Origin* origin,
225 void*) -> Eina_Bool {
226 std::string protocol(ewk_security_origin_protocol_get(origin));
227 if (protocol == "file://" || protocol == "app://") {
228 // Allow for local origin
229 ewk_view_exceeded_indexed_database_quota_reply(view, EINA_TRUE);
231 // Deny for remote origin
232 ewk_view_exceeded_indexed_database_quota_reply(view, EINA_FALSE);
236 ewk_view_exceeded_indexed_database_quota_callback_set(
238 indexed_db_exceeded_callback,
241 // callback for localfile quota exceeded
242 auto localfile_exceeded_callback = [](Evas_Object* view,
243 Ewk_Security_Origin* origin,
245 void*) -> Eina_Bool {
246 std::string protocol(ewk_security_origin_protocol_get(origin));
247 if (protocol == "file://" || protocol == "app://") {
248 // Allow for local origin
249 ewk_view_exceeded_local_file_system_quota_reply(view, EINA_TRUE);
251 // Deny for remote origin
252 ewk_view_exceeded_local_file_system_quota_reply(view, EINA_FALSE);
256 ewk_view_exceeded_local_file_system_quota_callback_set(
258 localfile_exceeded_callback,
262 auto wrt_message_callback = [](void* user_data,
265 WebView* self = static_cast<WebView*>(user_data);
266 Ewk_IPC_Wrt_Message_Data* msg =
267 static_cast<Ewk_IPC_Wrt_Message_Data*>(event_info);
269 self->listener_->OnReceivedWrtMessage(self, *msg);
271 evas_object_smart_callback_add(ewk_view_,
273 wrt_message_callback,
277 ewk_view_orientation_send(ewk_view_, ToWebRotation(window_->rotation()));
278 rotation_handler_id_ = window_->AddRotationHandler(
279 std::bind(&WebView::OnRotation,
281 std::placeholders::_1));
283 evas_object_show(ewk_view_);
286 std::string WebView::GetUrl() {
287 return std::string(ewk_view_url_get(ewk_view_));
290 Evas_Object* WebView::evas_object() const {
294 void WebView::OnRotation(int degree) {
295 ewk_view_orientation_send(ewk_view_, ToWebRotation(degree));
298 void WebView::OnKeyEvent(Ea_Callback_Type key_type) {
300 if (key_type == EA_CALLBACK_BACK) {
301 if (EINA_TRUE == ewk_view_text_selection_clear(ewk_view_)) {
304 keyname = kKeyNameBack;
305 } else if (key_type == EA_CALLBACK_MORE) {
306 keyname = kKeyNameMenu;
312 listener_->OnHardwareKey(this, keyname);