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 ewk_view_orientation_send(ewk_view_, ToWebRotation(window_->rotation()));
209 rotation_handler_id_ = window_->AddRotationHandler(
210 std::bind(&WebView::OnRotation,
212 std::placeholders::_1));
214 evas_object_show(ewk_view_);
217 std::string WebView::GetUrl() {
218 return std::string(ewk_view_url_get(ewk_view_));
221 Evas_Object* WebView::evas_object() const {
225 void WebView::OnRotation(int degree) {
226 ewk_view_orientation_send(ewk_view_, ToWebRotation(degree));
229 void WebView::OnKeyEvent(Ea_Callback_Type key_type) {
231 if (key_type == EA_CALLBACK_BACK) {
232 if (EINA_TRUE == ewk_view_text_selection_clear(ewk_view_)) {
235 keyname = kKeyNameBack;
236 } else if (key_type == EA_CALLBACK_MORE) {
237 keyname = kKeyNameMenu;
243 listener_->OnHardwareKey(this, keyname);