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)
46 window_->RemoveRotationHandler(rotation_handler_id_);
49 void WebView::LoadUrl(const std::string& url) {
50 ewk_view_url_set(ewk_view_, url.c_str());
53 void WebView::Suspend() {
54 // change the visibility
55 ewk_view_visibility_set(ewk_view_, EINA_FALSE);
59 ewk_view_suspend(ewk_view_);
63 void WebView::Resume() {
66 ewk_view_resume(ewk_view_);
68 // change the visiblity
69 ewk_view_visibility_set(ewk_view_, EINA_TRUE);
72 void WebView::Reload() {
73 ewk_view_reload(ewk_view_);
76 void WebView::AlwaysRun(bool run) {
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,
269 ewk_view_orientation_send(ewk_view_, ToWebRotation(window_->rotation()));
270 rotation_handler_id_ = window_->AddRotationHandler(
271 std::bind(&WebView::OnRotation,
273 std::placeholders::_1));
275 evas_object_show(ewk_view_);
278 std::string WebView::GetUrl() {
279 return std::string(ewk_view_url_get(ewk_view_));
282 Evas_Object* WebView::evas_object() const {
286 void WebView::OnRotation(int degree) {
287 ewk_view_orientation_send(ewk_view_, ToWebRotation(degree));
290 void WebView::OnKeyEvent(Ea_Callback_Type key_type) {
292 if (key_type == EA_CALLBACK_BACK) {
293 if (EINA_TRUE == ewk_view_text_selection_clear(ewk_view_)) {
296 keyname = kKeyNameBack;
297 } else if (key_type == EA_CALLBACK_MORE) {
298 keyname = kKeyNameMenu;
304 listener_->OnHardwareKey(this, keyname);