Fix invalid licenses
[platform/framework/web/crosswalk-tizen.git] / src / runtime / web_view.cc
index ba5c3b0..d76ef14 100755 (executable)
-// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
 
 #include "runtime/web_view.h"
 
 #include <ewk_chromium.h>
 #include <functional>
+#include <sstream>
 
 #include "runtime/native_window.h"
+#include "runtime/web_view_impl.h"
 
 namespace wrt {
 
-namespace {
-
-// TODO(sngn.lee) : It should be declare in common header
-const char* kKeyNameBack = "back";
-const char* kKeyNameMenu = "menu";
-
-static int ToWebRotation(int r) {
-  switch (r) {
-    case 90:
-      return -90;
-    case 270:
-      return 90;
-  }
-  return r;
-}
-
-static int ToNativeRotation(int r) {
-  switch (r) {
-    case -90:
-      return 90;
-    case 90:
-      return 270;
-  }
-  return r;
-}
-
-}  // namespace
-
-
-WebView::WebView(NativeWindow* window, Ewk_Context* context)
-    : window_(window),
-      context_(context),
-      ewk_view_(NULL),
-      listener_(NULL) {
-  Initialize();
+WebView::WebView(wrt::NativeWindow* window, Ewk_Context* context)
+    : impl_(new WebViewImpl(this, window, context)) {
 }
 
 WebView::~WebView() {
-  window_->RemoveRotationHandler(rotation_handler_id_);
-  evas_object_del(ewk_view_);
+  delete impl_;
 }
 
 void WebView::LoadUrl(const std::string& url) {
-  ewk_view_url_set(ewk_view_, url.c_str());
+  impl_->LoadUrl(url);
+}
+
+std::string WebView::GetUrl() {
+  return impl_->GetUrl();
 }
 
 void WebView::Suspend() {
-  // suspend webview
-  ewk_view_suspend(ewk_view_);
+  impl_->Suspend();
 }
 
 void WebView::Resume() {
-  // resume webview
-  ewk_view_resume(ewk_view_);
+  impl_->Resume();
 }
 
 void WebView::Reload() {
-  ewk_view_reload(ewk_view_);
+  impl_->Reload();
 }
 
 void WebView::SetVisibility(bool show) {
-  ewk_view_visibility_set(ewk_view_, show ? EINA_TRUE : EINA_FALSE);
+  impl_->SetVisibility(show);
 }
 
-
 bool WebView::EvalJavascript(const std::string& script) {
-  return ewk_view_script_execute(ewk_view_, script.c_str(), NULL, NULL);
+  return impl_->EvalJavascript(script);
 }
 
-void WebView::Initialize() {
-  ewk_view_ = ewk_view_add_with_context(window_->evas_object(), context_);
-
-  // TODO(sngn.lee): To be implemented - orientation lock
-
-
-  auto key_callback = [](void* user_data,
-                         Evas_Object* /*obj*/,
-                         void* event_info) -> void {
-    WebView* self = static_cast<WebView*>(user_data);
-    Ea_Callback_Type key = static_cast<Ea_Callback_Type>(
-                              reinterpret_cast<int>(event_info));
-    self->OnKeyEvent(key);
-  };
-  ea_object_event_callback_add(ewk_view_,
-                               EA_CALLBACK_BACK,
-                               key_callback,
-                               this);
-  ea_object_event_callback_add(ewk_view_,
-                               EA_CALLBACK_MORE,
-                               key_callback,
-                               this);
-
-
-  // load statred callback
-  auto loadstart_callback = [](void* user_data,
-                               Evas_Object* /*obj*/,
-                               void*) {
-    WebView* self = static_cast<WebView*>(user_data);
-    if (self->listener_)
-      self->listener_->OnLoadStart(self);
-  };
-  evas_object_smart_callback_add(ewk_view_,
-                                 "load,started",
-                                 loadstart_callback,
-                                 this);
-  // load finished callback
-  auto loadfinished_callback = [](void* user_data,
-                                  Evas_Object*,
-                                  void*) {
-    WebView* self = static_cast<WebView*>(user_data);
-    if (self->listener_)
-      self->listener_->OnLoadFinished(self);
-  };
-  evas_object_smart_callback_add(ewk_view_,
-                                 "load,finished",
-                                 loadfinished_callback,
-                                 this);
-
-  // load progress callback
-  auto loadprogress_callback = [](void* user_data,
-                                  Evas_Object*,
-                                  void* event_info) {
-    WebView* self = static_cast<WebView*>(user_data);
-    double* progress = static_cast<double*>(event_info);
-    if (self->listener_)
-      self->listener_->OnLoadProgress(self, *progress);
-  };
-  evas_object_smart_callback_add(ewk_view_,
-                                 "load,progress",
-                                 loadprogress_callback,
-                                 this);
-  // rendered callback
-  auto rendered_callback = [](void* user_data,
-                              Evas_Object*,
-                              void*) {
-    WebView* self = static_cast<WebView*>(user_data);
-    if (self->listener_)
-      self->listener_->OnRendered(self);
-  };
-  evas_object_smart_callback_add(ewk_view_,
-                                 "frame,rendered",
-                                 rendered_callback,
-                                 this);
-
-  // "policy,navigation,decide"
-  auto navigation_decide_callback = [](void* user_data,
-                                       Evas_Object*,
-                                       void* event_info) {
-    WebView* self = static_cast<WebView*>(user_data);
-    Ewk_Policy_Decision* policy =
-            static_cast<Ewk_Policy_Decision*>(event_info);
-    const char* url = ewk_policy_decision_url_get(policy);
-
-    if (self->listener_) {
-      if (self->listener_->OnDidNavigation(self, url))
-        ewk_policy_decision_use(policy);
-      else
-        ewk_policy_decision_ignore(policy);
-    } else {
-      ewk_policy_decision_use(policy);
-    }
-  };
-  evas_object_smart_callback_add(ewk_view_,
-                                 "policy,navigation,decide",
-                                 navigation_decide_callback,
-                                 this);
-
-  // policy,newwindow,decide
-  auto newwindow_decide_callback = [](void* user_data,
-                                      Evas_Object*,
-                                      void* event_info) {
-    WebView* self = static_cast<WebView*>(user_data);
-    Ewk_Policy_Decision* policy =
-            static_cast<Ewk_Policy_Decision*>(event_info);
-
-    const char* url = ewk_policy_decision_url_get(policy);
-
-    if (self->listener_) {
-      if (self->listener_->OnDidNavigation(self, url) &&
-         self->listener_->OnDidOpenWindow(self, url)) {
-         ewk_policy_decision_use(policy);
-      } else {
-        ewk_policy_decision_ignore(policy);
-      }
-    } else {
-      ewk_policy_decision_use(policy);
-    }
-  };
-  evas_object_smart_callback_add(ewk_view_,
-                                 "policy,newwindow,decide",
-                                 newwindow_decide_callback,
-                                 this);
-
-  // callback for database quota exceeded
-  auto database_exceeded_callback = [](Evas_Object* view,
-                                       Ewk_Security_Origin* origin,
-                                       const char*,
-                                       uint64_t,
-                                       void*) -> Eina_Bool {
-    std::string protocol(ewk_security_origin_protocol_get(origin));
-    if (protocol == "file://" || protocol == "app://") {
-      // Allow for local origin
-      ewk_view_exceeded_database_quota_reply(view, EINA_TRUE);
-    } else {
-      // Deny for remote origin
-      ewk_view_exceeded_database_quota_reply(view, EINA_FALSE);
-    }
-    return EINA_TRUE;
-  };
-  ewk_view_exceeded_database_quota_callback_set(
-    ewk_view_,
-    database_exceeded_callback,
-    NULL);
-
-  // callback for indexed database quota exceeded
-  auto indexed_db_exceeded_callback = [](Evas_Object* view,
-                                       Ewk_Security_Origin* origin,
-                                       int64_t,
-                                       void*) -> Eina_Bool {
-    std::string protocol(ewk_security_origin_protocol_get(origin));
-    if (protocol == "file://" || protocol == "app://") {
-      // Allow for local origin
-      ewk_view_exceeded_indexed_database_quota_reply(view, EINA_TRUE);
-    } else {
-      // Deny for remote origin
-      ewk_view_exceeded_indexed_database_quota_reply(view, EINA_FALSE);
-    }
-    return EINA_TRUE;
-  };
-  ewk_view_exceeded_indexed_database_quota_callback_set(
-    ewk_view_,
-    indexed_db_exceeded_callback,
-    NULL);
-
-  // callback for localfile quota exceeded
-  auto localfile_exceeded_callback = [](Evas_Object* view,
-                                       Ewk_Security_Origin* origin,
-                                       int64_t,
-                                       void*) -> Eina_Bool {
-    std::string protocol(ewk_security_origin_protocol_get(origin));
-    if (protocol == "file://" || protocol == "app://") {
-      // Allow for local origin
-      ewk_view_exceeded_local_file_system_quota_reply(view, EINA_TRUE);
-    } else {
-      // Deny for remote origin
-      ewk_view_exceeded_local_file_system_quota_reply(view, EINA_FALSE);
-    }
-    return EINA_TRUE;
-  };
-  ewk_view_exceeded_local_file_system_quota_callback_set(
-    ewk_view_,
-    localfile_exceeded_callback,
-    NULL);
-
-  // wrt,message
-  auto wrt_message_callback = [](void* user_data,
-                                 Evas_Object*,
-                                 void* event_info) {
-    WebView* self = static_cast<WebView*>(user_data);
-    Ewk_IPC_Wrt_Message_Data* msg =
-        static_cast<Ewk_IPC_Wrt_Message_Data*>(event_info);
-    if (self->listener_)
-      self->listener_->OnReceivedWrtMessage(self, msg);
-  };
-  evas_object_smart_callback_add(ewk_view_,
-                                 "wrt,message",
-                                 wrt_message_callback,
-                                 this);
-
-  // Orientation lock callback
-  auto orientation_lock_callback = [](Evas_Object* o,
-                                      Eina_Bool need_lock,
-                                      int orientation,
-                                      void* user_data) -> Eina_Bool {
-    WebView* self = static_cast<WebView*>(user_data);
-    if (self->listener_) {
-      self->listener_->OnOrientationLock(self,
-                                         need_lock,
-                                         ToNativeRotation(orientation));
-    }
-    return EINA_TRUE;
-  };
-  ewk_view_orientation_lock_callback_set(ewk_view_,
-                                         orientation_lock_callback,
-                                         this);
-
-  // rotation support
-  ewk_view_orientation_send(ewk_view_, ToWebRotation(window_->rotation()));
-  rotation_handler_id_ = window_->AddRotationHandler(
-                                  std::bind(&WebView::OnRotation,
-                                  this,
-                                  std::placeholders::_1));
-  // Show webview
-  evas_object_show(ewk_view_);
-}
-
-std::string WebView::GetUrl() {
-  return std::string(ewk_view_url_get(ewk_view_));
+void WebView::SetEventListener(EventListener* listener) {
+  impl_->SetEventListener(listener);
 }
 
 Evas_Object* WebView::evas_object() const {
-  return ewk_view_;
-}
-
-void WebView::OnRotation(int degree) {
-  ewk_view_orientation_send(ewk_view_, ToWebRotation(degree));
+  return impl_->evas_object();
 }
 
-void WebView::OnKeyEvent(Ea_Callback_Type key_type) {
-  std::string keyname;
-  if (key_type == EA_CALLBACK_BACK) {
-    if (EINA_TRUE == ewk_view_text_selection_clear(ewk_view_)) {
-      return;
-    }
-    keyname = kKeyNameBack;
-  } else if (key_type == EA_CALLBACK_MORE) {
-    keyname = kKeyNameMenu;
-  } else {
-    return;
-  }
-
-  if (listener_)
-    listener_->OnHardwareKey(this, keyname);
+void WebView::SetAppInfo(const std::string& app_name,
+                         const std::string& version) {
+  impl_->SetAppInfo(app_name, version);
 }
 
-void WebView::SetEventListener(EventListener* listener) {
-  listener_ = listener;
+bool WebView::SetUserAgent(const std::string& user_agent) {
+  return impl_->SetUserAgent(user_agent.c_str());
 }
-
-
 }  // namespace wrt
-