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>
11 #include "runtime/native_window.h"
17 // TODO(sngn.lee) : It should be declare in common header
18 const char* kKeyNameBack = "back";
19 const char* kKeyNameMenu = "menu";
21 static int ToWebRotation(int r) {
31 static int ToNativeRotation(int r) {
44 WebView::WebView(NativeWindow* window, Ewk_Context* context)
53 window_->RemoveRotationHandler(rotation_handler_id_);
54 evas_object_del(ewk_view_);
57 void WebView::LoadUrl(const std::string& url) {
58 ewk_view_url_set(ewk_view_, url.c_str());
61 void WebView::Suspend() {
63 ewk_view_suspend(ewk_view_);
66 void WebView::Resume() {
68 ewk_view_resume(ewk_view_);
71 void WebView::Reload() {
72 ewk_view_reload(ewk_view_);
75 void WebView::SetVisibility(bool show) {
76 ewk_view_visibility_set(ewk_view_, show ? EINA_TRUE : EINA_FALSE);
80 bool WebView::EvalJavascript(const std::string& script) {
81 return ewk_view_script_execute(ewk_view_, script.c_str(), NULL, NULL);
84 void WebView::Initialize() {
85 ewk_view_ = ewk_view_add_with_context(window_->evas_object(), context_);
87 // TODO(sngn.lee): To be implemented - orientation lock
90 auto key_callback = [](void* user_data,
92 void* event_info) -> void {
93 WebView* self = static_cast<WebView*>(user_data);
94 Ea_Callback_Type key = static_cast<Ea_Callback_Type>(
95 reinterpret_cast<int>(event_info));
96 self->OnKeyEvent(key);
98 ea_object_event_callback_add(ewk_view_,
102 ea_object_event_callback_add(ewk_view_,
108 // load statred callback
109 auto loadstart_callback = [](void* user_data,
110 Evas_Object* /*obj*/,
112 WebView* self = static_cast<WebView*>(user_data);
114 self->listener_->OnLoadStart(self);
116 evas_object_smart_callback_add(ewk_view_,
120 // load finished callback
121 auto loadfinished_callback = [](void* user_data,
124 WebView* self = static_cast<WebView*>(user_data);
126 self->listener_->OnLoadFinished(self);
128 evas_object_smart_callback_add(ewk_view_,
130 loadfinished_callback,
133 // load progress callback
134 auto loadprogress_callback = [](void* user_data,
137 WebView* self = static_cast<WebView*>(user_data);
138 double* progress = static_cast<double*>(event_info);
140 self->listener_->OnLoadProgress(self, *progress);
142 evas_object_smart_callback_add(ewk_view_,
144 loadprogress_callback,
147 auto rendered_callback = [](void* user_data,
150 WebView* self = static_cast<WebView*>(user_data);
152 self->listener_->OnRendered(self);
154 evas_object_smart_callback_add(ewk_view_,
159 // "policy,navigation,decide"
160 auto navigation_decide_callback = [](void* user_data,
163 WebView* self = static_cast<WebView*>(user_data);
164 Ewk_Policy_Decision* policy =
165 static_cast<Ewk_Policy_Decision*>(event_info);
166 const char* url = ewk_policy_decision_url_get(policy);
168 if (self->listener_) {
169 if (self->listener_->OnDidNavigation(self, url))
170 ewk_policy_decision_use(policy);
172 ewk_policy_decision_ignore(policy);
174 ewk_policy_decision_use(policy);
177 evas_object_smart_callback_add(ewk_view_,
178 "policy,navigation,decide",
179 navigation_decide_callback,
182 // policy,newwindow,decide
183 auto newwindow_decide_callback = [](void* user_data,
186 WebView* self = static_cast<WebView*>(user_data);
187 Ewk_Policy_Decision* policy =
188 static_cast<Ewk_Policy_Decision*>(event_info);
190 const char* url = ewk_policy_decision_url_get(policy);
192 if (self->listener_) {
193 if (self->listener_->OnDidNavigation(self, url) &&
194 self->listener_->OnDidOpenWindow(self, url)) {
195 ewk_policy_decision_use(policy);
197 ewk_policy_decision_ignore(policy);
200 ewk_policy_decision_use(policy);
203 evas_object_smart_callback_add(ewk_view_,
204 "policy,newwindow,decide",
205 newwindow_decide_callback,
208 // callback for database quota exceeded
209 auto database_exceeded_callback = [](Evas_Object* view,
210 Ewk_Security_Origin* origin,
213 void*) -> Eina_Bool {
214 std::string protocol(ewk_security_origin_protocol_get(origin));
215 if (protocol == "file://" || protocol == "app://") {
216 // Allow for local origin
217 ewk_view_exceeded_database_quota_reply(view, EINA_TRUE);
219 // Deny for remote origin
220 ewk_view_exceeded_database_quota_reply(view, EINA_FALSE);
224 ewk_view_exceeded_database_quota_callback_set(
226 database_exceeded_callback,
229 // callback for indexed database quota exceeded
230 auto indexed_db_exceeded_callback = [](Evas_Object* view,
231 Ewk_Security_Origin* origin,
233 void*) -> Eina_Bool {
234 std::string protocol(ewk_security_origin_protocol_get(origin));
235 if (protocol == "file://" || protocol == "app://") {
236 // Allow for local origin
237 ewk_view_exceeded_indexed_database_quota_reply(view, EINA_TRUE);
239 // Deny for remote origin
240 ewk_view_exceeded_indexed_database_quota_reply(view, EINA_FALSE);
244 ewk_view_exceeded_indexed_database_quota_callback_set(
246 indexed_db_exceeded_callback,
249 // callback for localfile quota exceeded
250 auto localfile_exceeded_callback = [](Evas_Object* view,
251 Ewk_Security_Origin* origin,
253 void*) -> Eina_Bool {
254 std::string protocol(ewk_security_origin_protocol_get(origin));
255 if (protocol == "file://" || protocol == "app://") {
256 // Allow for local origin
257 ewk_view_exceeded_local_file_system_quota_reply(view, EINA_TRUE);
259 // Deny for remote origin
260 ewk_view_exceeded_local_file_system_quota_reply(view, EINA_FALSE);
264 ewk_view_exceeded_local_file_system_quota_callback_set(
266 localfile_exceeded_callback,
270 auto wrt_message_callback = [](void* user_data,
273 WebView* self = static_cast<WebView*>(user_data);
274 Ewk_IPC_Wrt_Message_Data* msg =
275 static_cast<Ewk_IPC_Wrt_Message_Data*>(event_info);
277 self->listener_->OnReceivedWrtMessage(self, msg);
279 evas_object_smart_callback_add(ewk_view_,
281 wrt_message_callback,
284 // Orientation lock callback
285 auto orientation_lock_callback = [](Evas_Object* o,
288 void* user_data) -> Eina_Bool {
289 WebView* self = static_cast<WebView*>(user_data);
290 if (self->listener_) {
291 self->listener_->OnOrientationLock(self,
293 ToNativeRotation(orientation));
297 ewk_view_orientation_lock_callback_set(ewk_view_,
298 orientation_lock_callback,
301 auto console_message_callback = [](void* user_data,
304 WebView* self = static_cast<WebView*>(user_data);
305 if (!self->listener_) {
308 Ewk_Console_Message* msg = static_cast<Ewk_Console_Message*>(event_info);
309 unsigned int line_number = ewk_console_message_line_get(msg);
311 std::stringstream buf;
313 buf << ewk_console_message_source_get(msg) << ":";
314 buf << line_number << ":";
316 buf << ewk_console_message_text_get(msg);
317 int level = ewk_console_message_level_get(msg);
318 self->listener_->OnConsoleMessage(buf.str(), level);
321 evas_object_smart_callback_add(ewk_view_,
323 console_message_callback,
327 ewk_view_orientation_send(ewk_view_, ToWebRotation(window_->rotation()));
328 rotation_handler_id_ = window_->AddRotationHandler(
329 std::bind(&WebView::OnRotation,
331 std::placeholders::_1));
333 evas_object_show(ewk_view_);
336 std::string WebView::GetUrl() {
337 return std::string(ewk_view_url_get(ewk_view_));
340 Evas_Object* WebView::evas_object() const {
344 void WebView::OnRotation(int degree) {
345 ewk_view_orientation_send(ewk_view_, ToWebRotation(degree));
348 void WebView::OnKeyEvent(Ea_Callback_Type key_type) {
350 if (key_type == EA_CALLBACK_BACK) {
351 if (EINA_TRUE == ewk_view_text_selection_clear(ewk_view_)) {
354 keyname = kKeyNameBack;
355 } else if (key_type == EA_CALLBACK_MORE) {
356 keyname = kKeyNameMenu;
362 listener_->OnHardwareKey(this, keyname);
365 void WebView::SetEventListener(EventListener* listener) {
366 listener_ = listener;