[M108 Migration][Webview] Migrate patches for ewk APIs 2/2 76/288176/4
authorayush.k123 <ayush.k123@samsung.com>
Thu, 9 Feb 2023 06:03:59 +0000 (11:33 +0530)
committerBot Blink <blinkbot@samsung.com>
Mon, 13 Feb 2023 13:01:31 +0000 (13:01 +0000)
Migrate patches for ewk APIs 2/2.

References:
https://review.tizen.org/gerrit/c/280052/
https://review.tizen.org/gerrit/c/281861/

Change-Id: Id06a021ac3052646e53a8dd3783edb099d2a32b2
Signed-off-by: Ayush Kumar <ayush.k123@samsung.com>
54 files changed:
base/threading/thread_restrictions.h
tizen_src/LICENSE
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h
tizen_src/ewk/efl_integration/browser/scoped_allow_wait_for_legacy_web_view_api.h
tizen_src/ewk/efl_integration/browser_context_efl.h
tizen_src/ewk/efl_integration/cookie_manager.cc
tizen_src/ewk/efl_integration/eweb_context.cc
tizen_src/ewk/efl_integration/eweb_context.h
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/private/ewk_context_private.cc
tizen_src/ewk/efl_integration/private/ewk_context_private.h
tizen_src/ewk/efl_integration/private/ewk_private.h
tizen_src/ewk/efl_integration/private/ewk_settings_private.cc
tizen_src/ewk/efl_integration/public/ewk_context.cc
tizen_src/ewk/efl_integration/public/ewk_settings.cc
tizen_src/ewk/efl_integration/public/ewk_view.cc
tizen_src/ewk/efl_integration/web_contents_observer_efl.cc
tizen_src/ewk/efl_integration/web_contents_observer_efl.h
tizen_src/ewk/unittest/BUILD.gn
tizen_src/ewk/unittest/resources/common/theme-color_1.html [new file with mode: 0644]
tizen_src/ewk/unittest/resources/common/theme-color_2.html [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_api_result_locked.h [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_auth_challenge_credential_cancel_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_auth_challenge_credential_use_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_auth_challenge_realm_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_auth_challenge_suspend_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_context_intercept_request_callback_set_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_context_web_database_usage_for_origin_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_context_web_storage_usage_for_origin_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_get_base.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_get_base.h [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_headers_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_http_method_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_ignore_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_base.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_base.h [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_body_set_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_header_add_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_header_map_add_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_set_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_status_set_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_write_chunk_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_scheme_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_url_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_did_change_theme_color_callback_set_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_horizontal_panning_hold_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_horizontal_panning_hold_set_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_page_visibility_state_set_func.cpp [changed mode: 0755->0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_scroll_pos_get_func.cpp [changed mode: 0755->0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_scroll_set_func.cpp [changed mode: 0755->0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_vertical_panning_hold_get_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_view_vertical_panning_hold_set_func.cpp [new file with mode: 0644]

index e15f87a..c089221 100644 (file)
@@ -116,6 +116,10 @@ class WebEngineBrowserMainParts;
 
 Profile* GetLastProfileMac();
 
+#if BUILDFLAG(IS_EFL)
+class ScopedAllowWaitForLegacyWebViewApi;
+#endif
+
 namespace android_webview {
 class AwFormDatabaseService;
 class CookieManager;
@@ -677,6 +681,9 @@ class BASE_EXPORT ScopedAllowBaseSyncPrimitivesOutsideBlockingScope {
   friend class ui::DrmThreadProxy;
   friend class viz::HostGpuMemoryBufferManager;
   friend class vr::VrShell;
+#if BUILDFLAG(IS_EFL)
+  friend class ::ScopedAllowWaitForLegacyWebViewApi;
+#endif
 
   // Usage that should be fixed:
   friend class ::chromeos::BlockingMethodCaller;  // http://crbug.com/125360
index 1eaa208..ded905b 100644 (file)
@@ -1,27 +1,42 @@
-// Copyright 2014 Samsung Electronics. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Samsung Electronics nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/*
+ * Copyright (C) 2016 Samsung Electronics.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * Copyright (C) 2014-2016 Samsung Electronics. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
index 8c38cba..1b07939 100644 (file)
@@ -1130,6 +1130,29 @@ const gfx::Size RWHVAuraOffscreenHelperEfl::GetScrollableSize() const {
   return gfx::Size(width, height);
 }
 
+#if BUILDFLAG(IS_TIZEN_TV)
+void RWHVAuraOffscreenHelperEfl::DrawLabel(Evas_Object* image,
+                                           Eina_Rectangle rect) {
+  // check view boundary
+  if (rect.x < 0 || rect.y < 0 || rect.x > GetViewBoundsInPix().width() ||
+      rect.y > GetViewBoundsInPix().height())
+    return;
+
+  evas_object_move(image, rect.x, rect.y);
+  evas_object_show(image);
+
+  voice_manager_labels_.push_back(image);
+}
+
+void RWHVAuraOffscreenHelperEfl::ClearLabels() {
+  for (size_t i = 0; i < voice_manager_labels_.size(); i++) {
+    evas_object_hide(voice_manager_labels_[i]);
+    evas_object_del(voice_manager_labels_[i]);
+  }
+  voice_manager_labels_.clear();
+}
+#endif
+
 void RWHVAuraOffscreenHelperEfl::OnGetFocusedNodeBounds(
     const gfx::RectF& rect) {
   web_contents_->GetDelegate()->OnDidChangeFocusedNodeBounds(rect);
index be12734..c024976 100644 (file)
@@ -72,6 +72,16 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl {
   gfx::Size GetPhysicalBackingSize() const;
   void OnGetFocusedNodeBounds(const gfx::RectF& rect);
 
+  bool GetHorizontalPanningHold() const { return horizontal_panning_hold_; }
+  void SetHorizontalPanningHold(bool hold) { horizontal_panning_hold_ = hold; }
+  bool GetVerticalPanningHold() const { return vertical_panning_hold_; }
+  void SetVerticalPanningHold(bool hold) { vertical_panning_hold_ = hold; }
+
+#if BUILDFLAG(IS_TIZEN_TV)
+  void DrawLabel(Evas_Object* image, Eina_Rectangle rect);
+  void ClearLabels();
+#endif
+
   gfx::Rect GetViewBoundsInPix() const;
   const gfx::Size GetScrollableSize() const;
   void SetScaledContentSize(const gfx::SizeF& size) {
@@ -189,6 +199,7 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl {
   bool radio_or_checkbox_focused_ = false;
   int password_input_minlength_ = -1;
   int input_maxlength_ = DEFAULT_MAX_LENGTH;
+  std::vector<Evas_Object*> voice_manager_labels_;
 #endif
   bool is_focused_node_editable_ = false;
   bool is_scrolling_needed_ = false;
@@ -206,6 +217,9 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl {
   base::IDMap<std::unique_ptr<ScreenshotCapturedCallback>>
       screen_capture_cb_map_;
 
+  bool horizontal_panning_hold_ = false;
+  bool vertical_panning_hold_ = false;
+
   OnFocusCallback on_focus_in_callback_;
   OnFocusCallback on_focus_out_callback_;
 
index e011f79..28f19c4 100644 (file)
@@ -15,7 +15,7 @@
 // added in the public API, and no new uses of this will be allowed.
 class ScopedAllowWaitForLegacyWebViewApi {
  private:
-  base::ThreadRestrictions::ScopedAllowWait wait;
+  base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope allow_wait;
 };
 
 #endif  // TIZEN_WEBVIEW_BROWSER_SCOPED_ALLOW_WAIT_FOR_LEGACY_WEB_VIEW_API_H
index abfdb2e..9fa369c 100644 (file)
@@ -120,6 +120,10 @@ class BrowserContextEfl : public BrowserContext,
   std::unique_ptr<ZoomLevelDelegate> CreateZoomLevelDelegate(
       const base::FilePath& partition_path);
 
+#if BUILDFLAG(IS_TIZEN)
+  void SetOffTheRecord(bool incognito) { incognito_ = incognito; }
+#endif
+
   // These methods map to Add methods in visitedlink::VisitedLinkMaster.
   void AddVisitedURLs(const std::vector<GURL>& urls);
 
@@ -154,7 +158,7 @@ class BrowserContextEfl : public BrowserContext,
   base::ScopedTempDir temp_dir_;
   bool temp_dir_creation_attempted_;
   std::unique_ptr<PrefService> user_pref_service_;
-  const bool incognito_;
+  bool incognito_;
   std::unique_ptr<net::NetworkDelegate> network_delegate_for_getter_;
   std::unique_ptr<SSLHostStateDelegateEfl> ssl_host_state_delegate_;
   std::unique_ptr<BackgroundSyncController> background_sync_controller_;
index bf62e59..d71ce4c 100644 (file)
@@ -11,6 +11,7 @@
 #include "base/stl_util.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/thread_pool.h"
+#include "browser/scoped_allow_wait_for_legacy_web_view_api.h"
 #include "browser_context_efl.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -345,6 +346,7 @@ std::string CookieManager::GetCookiesForURL(const std::string& url) {
       base::BindOnce(GetCookieValueOnIOThread, cookie_store, GURL(url),
                      &cookie_value, &completion));
   // allow wait temporarily.
+  ScopedAllowWaitForLegacyWebViewApi allow_wait;
   completion.Wait();
   return cookie_value;
 }
index 980ee81..c678e03 100644 (file)
@@ -21,6 +21,7 @@
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/password_manager/core/browser/password_form.h"
 #include "components/password_manager/core/browser/password_store.h"
+#include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -97,14 +98,14 @@ class WebStorageGetAllOriginsDispatcher
     DCHECK(user_data_);
   }
 
-  void Dispatch(const std::vector<content::StorageUsageInfo>& local_storage) {
+  void Dispatch(const std::vector<content::StorageUsageInfo>& infos) {
     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
     Eina_List* lorigins = NULL;
 
     std::vector<content::StorageUsageInfo>::const_iterator it;
 
-    for (it = local_storage.begin(); it != local_storage.end(); it++) {
+    for (it = infos.begin(); it != infos.end(); it++) {
       _Ewk_Security_Origin* origin =
           new _Ewk_Security_Origin(it->storage_key.origin().GetURL());
       lorigins = eina_list_append(lorigins, origin);
@@ -182,6 +183,13 @@ void OnGetWebDBOrigins(storage::DatabaseQuotaClient* client,
                              base::BindOnce(callback, origin_list, user_data));
 }
 
+void OnGetWebDBUsageForOrigin(Ewk_Web_Database_Usage_Get_Callback callback,
+                              void* user_data,
+                              int64_t usage) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  callback(usage, user_data);
+}
+
 void OnGetFileSystemOrigins(
     storage::FileSystemQuotaClient* client,
     Ewk_Local_File_System_Origins_Get_Callback callback,
@@ -601,6 +609,34 @@ void EWebContext::GetApplicationCacheUsage(
 #endif
 }
 
+void EWebContext::GetLocalStorageUsageForOrigin(
+    const GURL& origin,
+    Ewk_Web_Storage_Usage_Get_Callback callback,
+    void* user_data) {
+  content::StoragePartition* partition =
+      browser_context_->GetStoragePartition(NULL);
+
+  partition->GetDOMStorageContext()->GetLocalStorageUsage(
+      base::BindOnce(&EWebContext::LocalStorageUsageForOrigin, origin,
+                     base::Unretained(callback), base::Unretained(user_data)));
+}
+
+void EWebContext::LocalStorageUsageForOrigin(
+    const GURL& origin,
+    Ewk_Web_Storage_Usage_Get_Callback callback,
+    void* user_data,
+    const std::vector<content::StorageUsageInfo>& infos) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  for (const auto& elem : infos) {
+    if (elem.storage_key.origin() == url::Origin::Create(origin)) {
+      callback(elem.total_size_bytes, user_data);
+      return;
+    }
+  }
+  callback(0, user_data);
+}
+
 void EWebContext::WebStorageDelete() {
   if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
     base::ThreadPool::PostTask(
@@ -684,6 +720,24 @@ void EWebContext::GetAllOriginsWithWebDB(
                      callback, user_data));
 }
 
+void EWebContext::GetWebDBUsageForOrigin(
+    const GURL& origin,
+    Ewk_Web_Database_Usage_Get_Callback callback,
+    void* user_data) {
+  content::StoragePartition* partition =
+      browser_context()->GetDefaultStoragePartition();
+  if (!partition)
+    return;
+  auto client = std::make_unique<storage::DatabaseQuotaClient>(
+      *partition->GetDatabaseTracker());
+  client->GetBucketUsage(
+      storage::BucketLocator(
+          storage::BucketId::FromUnsafeValue(0),
+          blink::StorageKey::CreateFromStringForTesting(origin.spec()),
+          blink::mojom::StorageType::kTemporary, false),
+      base::BindOnce(&OnGetWebDBUsageForOrigin, callback, user_data));
+}
+
 void EWebContext::FileSystemDelete(const GURL& host) {
   if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
     base::ThreadPool::PostTask(FROM_HERE, {BrowserThread::UI},
index f8e9444..ef6c20c 100644 (file)
@@ -19,6 +19,7 @@ class EwkFaviconDatabase;
 
 namespace content {
 class BrowserContextEfl;
+struct StorageUsageInfo;
 }
 
 class EWebContextNotificationCallback {
@@ -124,8 +125,15 @@ class EWebContext {
       const GURL& url,
       Ewk_Web_Application_Cache_Usage_For_Origin_Get_Callback callback,
       void* user_data);
+  void GetLocalStorageUsageForOrigin(
+      const GURL& origin,
+      Ewk_Web_Storage_Usage_Get_Callback callback,
+      void* user_data);
   void GetAllOriginsWithWebDB(Ewk_Web_Database_Origins_Get_Callback callback, void* user_data);
   void WebDBDelete(const GURL& host);
+  void GetWebDBUsageForOrigin(const GURL& origin,
+                              Ewk_Web_Database_Usage_Get_Callback callback,
+                              void* user_data);
   void IndexedDBDelete();
   void WebStorageDelete();
   void WebStorageDeleteForOrigin(const GURL& origin);
@@ -202,6 +210,11 @@ class EWebContext {
   EWebContext(bool incognito, const std::string& injectedBundlePath);
   ~EWebContext();
   friend class Ewk_Context;
+  static void LocalStorageUsageForOrigin(
+      const GURL& origin,
+      Ewk_Web_Storage_Usage_Get_Callback callback,
+      void* user_data,
+      const std::vector<content::StorageUsageInfo>& infos);
 
   std::unique_ptr<WebCacheManagerEfl> web_cache_manager_;
   std::unique_ptr<content::BrowserContextEfl> browser_context_;
index e61ce5c..b99454e 100644 (file)
@@ -15,6 +15,7 @@
 #include "base/json/json_string_value_serializer.h"
 #include "base/logging.h"
 #include "base/pickle.h"
+#include "base/strings/escape.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/task_runner_util.h"
 #include "browser/javascript_dialog_manager_efl.h"
@@ -361,16 +362,9 @@ EWebView::~EWebView() {
   // because WebContents depends on BrowserContext which
   // is deleted along with EwkContext.
   CHECK(!web_contents_);
-  if (old_context_.get()) {
-    Ewk_Context::Delete(context_.get());
-    context_ = old_context_;
-    old_context_ = nullptr;
-  }
 
   permission_popup_manager_.reset();
 
-  if (context_->GetImpl()->browser_context()->IsOffTheRecord())
-    Ewk_Context::Delete(context_.get());
   gin_native_bridge_dispatcher_host_.reset();
 
   if (evas_object_) {
@@ -919,39 +913,24 @@ bool EWebView::SetUserAgentAppName(const char* application_name) {
   return true;
 }
 
+void EWebView::set_magnifier(bool status) {
+#if !defined(USE_AURA)
+  rwhv()->set_magnifier(status);
+#endif
+}
+
+#if BUILDFLAG(IS_TIZEN)
 bool EWebView::SetPrivateBrowsing(bool incognito) {
   if (context_->GetImpl()->browser_context()->IsOffTheRecord() == incognito)
     return false;
-
-  GURL url = web_contents_->GetVisibleURL();
-  if (old_context_.get()) {
-    DCHECK(!incognito);
-    web_contents_.reset();
-    web_contents_delegate_.reset();
-    Ewk_Context::Delete(context_.get());
-    context_ = old_context_;
-    old_context_ = nullptr;
-  } else {
-    if (incognito) {
-      old_context_ = context_;
-    }
-    context_ = Ewk_Context::Create(incognito);
-  }
-
-  InitializeContent();
-  SetURL(url);
+  context_->GetImpl()->browser_context()->SetOffTheRecord(incognito);
   return true;
 }
 
 bool EWebView::GetPrivateBrowsing() const {
   return context_->GetImpl()->browser_context()->IsOffTheRecord();
 }
-
-void EWebView::set_magnifier(bool status) {
-#if !defined(USE_AURA)
-  rwhv()->set_magnifier(status);
 #endif
-}
 
 const char* EWebView::GetUserAgent() const {
   std::string user_agent =
@@ -1053,7 +1032,10 @@ void EWebView::LoadData(const char* data,
   url_str.append(";charset=");
   url_str.append(encoding);
   url_str.append(",");
-  url_str.append(str_data);
+
+  // GURL constructor performs canonicalization of url string, but this is not
+  // enough for correctly escaping contents of "data:" url.
+  url_str.append(base::EscapeUrlEncodedData(str_data, false));
 
   NavigationController::LoadURLParams data_params(GURL(url_str.c_str()));
 
@@ -1608,7 +1590,6 @@ _Ewk_Hit_Test* EWebView::RequestHitTestDataAtBlinkCoords(
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   RenderViewHost* render_view_host = web_contents_->GetRenderViewHost();
-  DCHECK(render_view_host);
 
   if (render_view_host) {
     // We wait on UI thread till hit test data is updated.
@@ -1620,7 +1601,7 @@ _Ewk_Hit_Test* EWebView::RequestHitTestDataAtBlinkCoords(
     return new _Ewk_Hit_Test(hit_test_params_);
   }
 
-  return NULL;
+  return nullptr;
 }
 
 void EWebView::EvasToBlinkCords(int x, int y, int* view_x, int* view_y) {
@@ -2667,6 +2648,28 @@ void EWebView::HandleZoomGesture(blink::WebGestureEvent& event) {
   }
 }
 
+bool EWebView::GetHorizontalPanningHold() const {
+  if (!rwhva())
+    return false;
+  return rwhva()->offscreen_helper()->GetHorizontalPanningHold();
+}
+
+void EWebView::SetHorizontalPanningHold(bool hold) {
+  if (rwhva())
+    rwhva()->offscreen_helper()->SetHorizontalPanningHold(hold);
+}
+
+bool EWebView::GetVerticalPanningHold() const {
+  if (!rwhva())
+    return false;
+  return rwhva()->offscreen_helper()->GetVerticalPanningHold();
+}
+
+void EWebView::SetVerticalPanningHold(bool hold) {
+  if (rwhva())
+    rwhva()->offscreen_helper()->SetVerticalPanningHold(hold);
+}
+
 void EWebView::SendDelayedMessages(RenderViewHost* render_view_host) {
   DCHECK(render_view_host);
 
@@ -2711,6 +2714,28 @@ void EWebView::OnOverscrolled(const gfx::Vector2dF& accumulated_overscroll,
   }
 }
 
+void EWebView::SetDidChangeThemeColorCallback(
+    Ewk_View_Did_Change_Theme_Color_Callback callback,
+    void* user_data) {
+  did_change_theme_color_callback_.Set(callback, user_data);
+}
+
+void EWebView::DidChangeThemeColor(const SkColor& color) {
+  did_change_theme_color_callback_.Run(evas_object_, color);
+}
+
+#if BUILDFLAG(IS_TIZEN_TV)
+void EWebView::DrawLabel(Evas_Object* image, Eina_Rectangle rect) {
+  if (rwhva())
+    rwhva()->offscreen_helper()->DrawLabel(image, rect);
+}
+
+void EWebView::ClearLabels() {
+  if (rwhva())
+    rwhva()->offscreen_helper()->ClearLabels();
+}
+#endif
+
 void EWebView::RequestManifest(Ewk_View_Request_Manifest_Callback callback,
                                void* user_data) {
   web_contents_delegate_->RequestManifestInfo(callback, user_data);
index 5f48a75..676d285 100644 (file)
@@ -246,6 +246,24 @@ class WebApplicationCapableGetCallback {
   void* user_data_;
 };
 
+class DidChangeThemeColorCallback {
+ public:
+  DidChangeThemeColorCallback() : callback_(nullptr), user_data_(nullptr) {}
+  void Set(Ewk_View_Did_Change_Theme_Color_Callback callback, void* user_data) {
+    callback_ = callback;
+    user_data_ = user_data;
+  }
+  void Run(Evas_Object* o, const SkColor& color) {
+    if (callback_)
+      callback_(o, SkColorGetR(color), SkColorGetG(color), SkColorGetB(color),
+                SkColorGetA(color), user_data_);
+  }
+
+ private:
+  Ewk_View_Did_Change_Theme_Color_Callback callback_;
+  void* user_data_;
+};
+
 class WebViewAsyncRequestHitTestDataCallback;
 class JavaScriptDialogManagerEfl;
 class PermissionPopupManager;
@@ -322,8 +340,10 @@ class EWebView {
                          void* userdata);
   bool SetUserAgent(const char* userAgent);
   bool SetUserAgentAppName(const char* application_name);
+#if BUILDFLAG(IS_TIZEN)
   bool SetPrivateBrowsing(bool incognito);
   bool GetPrivateBrowsing() const;
+#endif
   const char* GetUserAgent() const;
   const char* GetUserAgentAppName() const;
   const char* CacheSelectedText();
@@ -549,6 +569,11 @@ class EWebView {
   bool GetLinkMagnifierEnabled() const;
   void SetLinkMagnifierEnabled(bool enabled);
 
+  bool GetHorizontalPanningHold() const;
+  void SetHorizontalPanningHold(bool hold);
+  bool GetVerticalPanningHold() const;
+  void SetVerticalPanningHold(bool hold);
+
   void SetQuotaPermissionRequestCallback(
       Ewk_Quota_Permission_Request_Callback callback,
       void* user_data);
@@ -618,6 +643,16 @@ class EWebView {
 
   bool ShouldIgnoreNavigation(content::NavigationHandle* navigation_handle);
 
+#if BUILDFLAG(IS_TIZEN_TV)
+  void DrawLabel(Evas_Object* image, Eina_Rectangle rect);
+  void ClearLabels();
+#endif  // IS_TIZEN_TV
+
+  void SetDidChangeThemeColorCallback(
+      Ewk_View_Did_Change_Theme_Color_Callback callback,
+      void* user_data);
+  void DidChangeThemeColor(const SkColor& color);
+
  private:
   void InitializeContent();
   void InitializeWindowTreeHost();
@@ -670,7 +705,6 @@ class EWebView {
 
   scoped_refptr<WebViewEvasEventHandler> evas_event_handler_;
   scoped_refptr<Ewk_Context> context_;
-  scoped_refptr<Ewk_Context> old_context_;
   std::unique_ptr<content::WebContents> web_contents_;
   std::unique_ptr<content::WebContentsDelegateEfl> web_contents_delegate_;
   std::string pending_url_request_;
@@ -754,6 +788,9 @@ class EWebView {
   WebViewCallback<Ewk_View_Scale_Changed_Callback, double> scale_changed_cb_;
 
   std::unique_ptr<content::InputPicker> input_picker_;
+
+  DidChangeThemeColorCallback did_change_theme_color_callback_;
+
   base::IDMap<WebApplicationIconUrlGetCallback*>
       web_app_icon_url_get_callback_map_;
   base::IDMap<WebApplicationIconUrlsGetCallback*>
index 1433c19..4778ae5 100644 (file)
@@ -9,19 +9,26 @@
 
 using content::BrowserContextEfl;
 
-static Ewk_Context* default_context_ = NULL;
+static Ewk_Context* default_context_ = nullptr;
+static Ewk_Context* incognito_context_ = nullptr;
 
 // static
 Ewk_Context* Ewk_Context::DefaultContext() {
-  if (!default_context_) {
-    // default context is not incognito
+  if (!default_context_)
     default_context_ = Ewk_Context::Create(false);
-  }
 
   return default_context_;
 }
 
 // static
+Ewk_Context* Ewk_Context::IncognitoContext() {
+  if (!incognito_context_)
+    incognito_context_ = Ewk_Context::Create(true);
+
+  return incognito_context_;
+}
+
+// static
 void Ewk_Context::DefaultContextRelease() {
   if (default_context_) {
     // this method should be called from ewk_shutdown and ewk_shutdown should
@@ -38,7 +45,8 @@ void Ewk_Context::DefaultContextRelease() {
 // static
 Ewk_Context* Ewk_Context::Create(bool incognito) {
   Ewk_Context* context = new Ewk_Context(incognito);
-  context->AddRef();
+  if (!incognito)
+    context->AddRef();
   return context;
 }
 
@@ -72,7 +80,9 @@ Ewk_Context::Ewk_Context(const std::string& injectedBundlePath)
 
 Ewk_Context::~Ewk_Context() {
   if (this == default_context_)
-    default_context_= NULL;
+    default_context_ = nullptr;
+  else if (this == incognito_context_)
+    incognito_context_ = nullptr;
   delete impl;
 }
 
@@ -161,6 +171,13 @@ void Ewk_Context::GetApplicationCacheUsage(const GURL& url, Ewk_Web_Application_
   impl->GetApplicationCacheUsage(url, callback, user_data);
 }
 
+void Ewk_Context::GetLocalStorageUsageForOrigin(
+    const GURL& origin,
+    Ewk_Web_Storage_Usage_Get_Callback callback,
+    void* user_data) {
+  impl->GetLocalStorageUsageForOrigin(origin, callback, user_data);
+}
+
 void Ewk_Context::DeleteAllApplicationCache() {
   impl->DeleteAllApplicationCache();
 }
@@ -177,6 +194,13 @@ void Ewk_Context::WebDBDelete(const GURL& host) {
   impl->WebDBDelete(host);
 }
 
+void Ewk_Context::GetWebDBUsageForOrigin(
+    const GURL& origin,
+    Ewk_Web_Database_Usage_Get_Callback callback,
+    void* userData) {
+  impl->GetWebDBUsageForOrigin(origin, callback, userData);
+}
+
 void Ewk_Context::IndexedDBDelete() {
   impl->IndexedDBDelete();
 }
index 4306bc0..a7af91a 100644 (file)
@@ -25,6 +25,7 @@ class BrowserContextEfl;
 struct Ewk_Context : public base::RefCounted<Ewk_Context> {
  public:
   static Ewk_Context* DefaultContext();
+  static Ewk_Context* IncognitoContext();
   static void DefaultContextRelease();
   static Ewk_Context* Create(bool incognito = false);
   static Ewk_Context* Create(const std::string& injectedBundlePath);
@@ -70,9 +71,14 @@ struct Ewk_Context : public base::RefCounted<Ewk_Context> {
   // Application Cache
   void GetAllOriginsWithApplicationCache(
       Ewk_Web_Application_Cache_Origins_Get_Callback callback, void* user_data);
-  void GetApplicationCacheUsage(const GURL& url,
+  void GetApplicationCacheUsage(
+      const GURL& url,
       Ewk_Web_Application_Cache_Usage_For_Origin_Get_Callback callback,
       void* user_data);
+  void GetLocalStorageUsageForOrigin(
+      const GURL& origin,
+      Ewk_Web_Storage_Usage_Get_Callback callback,
+      void* user_data);
   void DeleteAllApplicationCache();
   void DeleteApplicationCacheForSite(const GURL& url);
 
@@ -80,6 +86,9 @@ struct Ewk_Context : public base::RefCounted<Ewk_Context> {
   void GetAllOriginsWithWebDB(Ewk_Web_Database_Origins_Get_Callback callback,
       void* user_data);
   void WebDBDelete(const GURL& host);
+  void GetWebDBUsageForOrigin(const GURL& origin,
+                              Ewk_Web_Database_Usage_Get_Callback callback,
+                              void* userData);
 
   // Indexed DB
   void IndexedDBDelete();
index abf2702..a66388f 100644 (file)
@@ -13,6 +13,7 @@
 #define COMPILE_ASSERT_MATCHING_ENUM(ewkName, webcoreName) \
         COMPILE_ASSERT(int(ewkName) == int(webcoreName), mismatchingEnums)
 
+// Temporarily added in order to track not-yet-implemented ewk api calls.
 #define LOG_EWK_API_MOCKUP(msg)                                          \
   LOG(INFO) << "[EWK_API_MOCKUP] "                                       \
             << " " << __FUNCTION__ << std::string(msg);
index b069a31..0bbdaa5 100644 (file)
@@ -6,19 +6,8 @@
 
 #include "net/http/http_stream_factory.h"
 
-void Ewk_Settings::setSpdyEnabled(bool flag)
-{
-#if !defined(EWK_BRINGUP)  // FIXME: m67 bringup
-  // FIXME: EWK_BRINGUP definition should be removed.
-  net::HttpStreamFactory::set_spdy_enabled(flag);
-#endif  // !defined(EWK_BRINGUP)
-}
-
 void Ewk_Settings::setCurrentLegacyFontSizeMode(Ewk_Legacy_Font_Size_Mode mode) {
   m_currentLegacyFontSizeMode = mode;
-#if !defined(EWK_BRINGUP)  // FIXME: m67 bringup
-  m_preferences.current_legacy_font_size_mode = static_cast<content::LegacyFontSizeMode>(mode);
-#endif
 }
 
 void Ewk_Settings::setDefaultTextEncoding(const char* encoding) {
index 2fc9073..04e4678 100644 (file)
@@ -302,8 +302,11 @@ Eina_Bool ewk_context_web_storage_path_set(Ewk_Context* /*context*/, const char*
 
 Eina_Bool ewk_context_web_storage_usage_for_origin_get(Ewk_Context* context, Ewk_Security_Origin* origin, Ewk_Web_Storage_Usage_Get_Callback callback, void* userData)
 {
-  LOG_EWK_API_MOCKUP();
-  return false;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EINA_FALSE);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(origin, EINA_FALSE);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
+  context->GetLocalStorageUsageForOrigin(origin->GetURL(), callback, userData);
+  return EINA_TRUE;
 }
 
 Eina_Bool ewk_context_soup_data_directory_set(Ewk_Context* /*context*/, const char* /*path*/)
@@ -840,8 +843,11 @@ void ewk_context_emp_certificate_file_set(Ewk_Context *context, const char* empC
 
 Eina_Bool ewk_context_web_database_usage_for_origin_get(Ewk_Context* context, Ewk_Web_Database_Usage_Get_Callback callback, void* user_data, Ewk_Security_Origin* origin)
 {
-  LOG_EWK_API_MOCKUP();
-  return false;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EINA_FALSE);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(origin, EINA_FALSE);
+  context->GetWebDBUsageForOrigin(origin->GetURL(), callback, user_data);
+  return EINA_TRUE;
 }
 
 void ewk_context_form_password_data_update(Ewk_Context* context, const char* url, Eina_Bool useFingerprint)
index 9b918f3..de9436d 100644 (file)
@@ -218,16 +218,32 @@ const char* ewk_settings_default_encoding_get(const Ewk_Settings* settings)
 
 Eina_Bool ewk_settings_private_browsing_enabled_set(Ewk_Settings* settings, Eina_Bool enable)
 {
-  EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false);
-  EWebView* impl = EWebView::FromEvasObject(settings->getEvasObject());
-  return impl->SetPrivateBrowsing(enable);
+#if BUILDFLAG(IS_TIZEN_TV)
+  LOG_EWK_API_DEPRECATED("Use ewk_view_add_in_incognito_mode() instead.");
+#elif BUILDFLAG(IS_TIZEN)
+  if (IsMobileProfile()) {
+    EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE);
+    EWebView* impl = EWebView::FromEvasObject(settings->getEvasObject());
+    return impl->SetPrivateBrowsing(enable);
+  }
+#endif
+  return EINA_FALSE;
 }
 
 Eina_Bool ewk_settings_private_browsing_enabled_get(const Ewk_Settings* settings)
 {
-  EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false);
-  EWK_VIEW_IMPL_GET_OR_RETURN(const_cast<Ewk_Settings *>(settings)->getEvasObject(), webview, EINA_FALSE);
-  return webview->GetPrivateBrowsing();
+#if BUILDFLAG(IS_TIZEN_TV)
+  LOG_EWK_API_DEPRECATED("Use ewk_view_add_in_incognito_mode() instead.");
+#elif BUILDFLAG(IS_TIZEN)
+  if (IsMobileProfile()) {
+    EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE);
+    EWK_VIEW_IMPL_GET_OR_RETURN(
+        const_cast<Ewk_Settings*>(settings)->getEvasObject(), webview,
+        EINA_FALSE);
+    return webview->GetPrivateBrowsing();
+  }
+#endif
+  return EINA_FALSE;
 }
 
 Eina_Bool ewk_settings_editable_link_behavior_set(Ewk_Settings* settings, Ewk_Editable_Link_Behavior behavior)
index 0bf8c29..482c88e 100644 (file)
@@ -125,8 +125,9 @@ Evas_Object* ewk_view_add(Evas* e)
 
 Evas_Object* ewk_view_add_in_incognito_mode(Evas* e)
 {
-  Ewk_Context* context = Ewk_Context::Create(true);
-  EINA_SAFETY_ON_NULL_RETURN_VAL(context, NULL);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(e, nullptr);
+  Ewk_Context* context = Ewk_Context::IncognitoContext();
+  EINA_SAFETY_ON_NULL_RETURN_VAL(context, nullptr);
   return ewk_view_add_with_context(e, context);
 }
 
@@ -726,19 +727,26 @@ const char* ewk_view_focused_input_element_value_get(Evas_Object* ewkView)
   return NULL;
 }
 
+Eina_Bool ewk_view_horizontal_panning_hold_get(Evas_Object* ewkView) {
+  EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, EINA_FALSE);
+  return impl->GetHorizontalPanningHold();
+}
+
+void ewk_view_horizontal_panning_hold_set(Evas_Object* ewkView,
+                                          Eina_Bool hold) {
+  EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl);
+  impl->SetHorizontalPanningHold(hold);
+}
+
 Eina_Bool ewk_view_vertical_panning_hold_get(Evas_Object* ewkView)
 {
-  LOG_EWK_API_MOCKUP();
-  return false;
+  EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, EINA_FALSE);
+  return impl->GetVerticalPanningHold();
 }
 
-void ewk_view_vertical_panning_hold_set(Evas_Object* view, Eina_Bool hold)
-{
-  LOG_EWK_API_MOCKUP();
+void ewk_view_vertical_panning_hold_set(Evas_Object* view, Eina_Bool hold) {
   EWK_VIEW_IMPL_GET_OR_RETURN(view, impl);
-  // FIX ME: Currently the pan support is not present.
-  // In WK2 panning was implemented with evas directly, here its with chorme gesture reconignation
-  // So paning is not present yet
+  impl->SetVerticalPanningHold(hold);
 }
 
 void ewk_view_orientation_lock_callback_set(Evas_Object* ewkView, Ewk_Orientation_Lock_Cb func, void* data)
@@ -1167,31 +1175,22 @@ Evas_Object* ewk_view_widget_get(Evas_Object* view)
   return NULL;
 }
 
-Eina_Bool ewk_view_horizontal_panning_hold_get(Evas_Object* o)
-{
-  LOG_EWK_API_MOCKUP();
-  return false;
-}
-
-void ewk_view_horizontal_panning_hold_set(Evas_Object* o, Eina_Bool hold)
-{
-  LOG_EWK_API_MOCKUP();
-}
-
 Eina_Bool ewk_view_draws_transparent_background_get(Evas_Object* o)
 {
   LOG_EWK_API_MOCKUP();
   return false;
 }
 
-Eina_Bool ewk_view_split_scroll_overflow_enabled_get(const Evas_Object* o)
-{
-  LOG_EWK_API_MOCKUP();
-  return false;
+Eina_Bool ewk_view_did_change_theme_color_callback_set(
+    Evas_Object* o,
+    Ewk_View_Did_Change_Theme_Color_Callback callback,
+    void* user_data) {
+  EWK_VIEW_IMPL_GET_OR_RETURN(o, impl, EINA_FALSE);
+  impl->SetDidChangeThemeColorCallback(callback, user_data);
+  return EINA_TRUE;
 }
 
-Eina_Bool ewk_view_did_change_theme_color_callback_set(Evas_Object* o, Ewk_View_Did_Change_Theme_Color_Callback callback, void* user_data)
-{
+Eina_Bool ewk_view_split_scroll_overflow_enabled_get(const Evas_Object* o) {
   LOG_EWK_API_MOCKUP();
   return false;
 }
@@ -1259,15 +1258,6 @@ Eina_Bool ewk_view_text_matches_count(Evas_Object* o, const char* text, Ewk_Find
   return false;
 }
 
-void ewk_view_voicemanager_label_draw(Evas_Object* view, Evas_Object* image, Eina_Rectangle rect){
-  LOG_EWK_API_MOCKUP();
-}
-
-void ewk_view_voicemanager_labels_clear(Evas_Object* view)
-{
-  LOG_EWK_API_MOCKUP();
-}
-
 void ewk_view_mirrored_blur_set(Evas_Object* o, Eina_Bool state)
 {
   LOG_EWK_API_MOCKUP();
@@ -1536,6 +1526,27 @@ Eina_Bool ewk_view_script_execute_all_frames(Evas_Object *o, const char *script,
   return EINA_FALSE;
 }
 
+void ewk_view_voicemanager_label_draw(Evas_Object* view,
+                                      Evas_Object* image,
+                                      Eina_Rectangle rect) {
+#if BUILDFLAG(IS_TIZEN_TV)
+  EINA_SAFETY_ON_NULL_RETURN(image);
+  EWK_VIEW_IMPL_GET_OR_RETURN(view, impl);
+  impl->DrawLabel(image, rect);
+#else
+  LOG_EWK_API_MOCKUP("Only for Tizen TV.");
+#endif
+}
+
+void ewk_view_voicemanager_labels_clear(Evas_Object* view) {
+#if BUILDFLAG(IS_TIZEN_TV)
+  EWK_VIEW_IMPL_GET_OR_RETURN(view, impl);
+  impl->ClearLabels();
+#else
+  LOG_EWK_API_MOCKUP("Only for Tizen TV.");
+#endif
+}
+
 void ewk_view_floating_window_state_changed(const Evas_Object *o, Eina_Bool status)
 {
   LOG_EWK_API_MOCKUP();
index 55f54ec..76e1d5e 100644 (file)
@@ -216,6 +216,11 @@ void WebContentsObserverEfl::DidUpdateFaviconURL(
   }
 }
 
+void WebContentsObserverEfl::DidChangeThemeColor() {
+  web_view_->DidChangeThemeColor(
+      web_contents_.GetThemeColor().value_or(SK_ColorTRANSPARENT));
+}
+
 bool WebContentsObserverEfl::OnMessageReceived(
     const IPC::Message& message,
     RenderFrameHost* render_frame_host) {
index 3e54d14..255067e 100644 (file)
@@ -64,6 +64,7 @@ class WebContentsObserverEfl : public WebContentsObserver, public IPC::Sender {
       const std::vector<blink::mojom::FaviconURLPtr>& candidates) override;
   bool OnMessageReceived(const IPC::Message& message,
                          RenderFrameHost* render_frame_host) override;
+  void DidChangeThemeColor() override;
 
   // IPC message handlers:
   void OnDidCreateDocumentElement();
index b6b12ab..fef672f 100644 (file)
@@ -45,6 +45,7 @@ test("ewk_unittests") {
   include_dirs = [ "../efl_integration/public" ]
   sources = [
     "execute_utc_blink.cpp",
+    "utc_blink_api_result_locked.h",
     "utc_blink_cb_contextmenu_allowed.cpp",
     "utc_blink_cb_contextmenu_willshow.cpp",
     "utc_blink_cb_editorclient_candidate_closed.cpp",
@@ -129,6 +130,7 @@ test("ewk_unittests") {
     "utc_blink_ewk_context_icon_database_path_set_func.cpp",
     "utc_blink_ewk_context_inspector_server_start_func.cpp",
     "utc_blink_ewk_context_inspector_server_stop_func.cpp",
+    "utc_blink_ewk_context_intercept_request_callback_set_func.cpp",
     "utc_blink_ewk_context_local_file_system_all_delete_func.cpp",
     "utc_blink_ewk_context_menu.h",
     "utc_blink_ewk_context_menu_item_append_as_action_func.cpp",
@@ -148,10 +150,12 @@ test("ewk_unittests") {
     "utc_blink_ewk_context_web_database_delete_all_func.cpp",
     "utc_blink_ewk_context_web_database_delete_func.cpp",
     "utc_blink_ewk_context_web_database_origins_get_func.cpp",
+    "utc_blink_ewk_context_web_database_usage_for_origin_get_func.cpp",
     "utc_blink_ewk_context_web_indexed_database_delete_all_func.cpp",
     "utc_blink_ewk_context_web_storage_delete_all_func.cpp",
     "utc_blink_ewk_context_web_storage_origin_delete_func.cpp",
     "utc_blink_ewk_context_web_storage_origins_get_func.cpp",
+    "utc_blink_ewk_context_web_storage_usage_for_origin_get_func.cpp",
     "utc_blink_ewk_cookie_manager_accept_policy_async_get_func.cpp",
     "utc_blink_ewk_cookie_manager_accept_policy_set_func.cpp",
     "utc_blink_ewk_cookie_manager_cookies_clear_func.cpp",
@@ -187,6 +191,21 @@ test("ewk_unittests") {
     "utc_blink_ewk_hit_test_request_base.cpp",
     "utc_blink_ewk_hit_test_result_context_get_func.cpp",
     "utc_blink_ewk_hit_test_tag_name_get_func.cpp",
+    "utc_blink_ewk_intercept_request_get_base.cpp",
+    "utc_blink_ewk_intercept_request_get_base.h",
+    "utc_blink_ewk_intercept_request_headers_get_func.cpp",
+    "utc_blink_ewk_intercept_request_http_method_get_func.cpp",
+    "utc_blink_ewk_intercept_request_ignore_func.cpp",
+    "utc_blink_ewk_intercept_request_response_base.cpp",
+    "utc_blink_ewk_intercept_request_response_base.h",
+    "utc_blink_ewk_intercept_request_response_body_set_func.cpp",
+    "utc_blink_ewk_intercept_request_response_header_add_func.cpp",
+    "utc_blink_ewk_intercept_request_response_header_map_add_func.cpp",
+    "utc_blink_ewk_intercept_request_response_set_func.cpp",
+    "utc_blink_ewk_intercept_request_response_status_set_func.cpp",
+    "utc_blink_ewk_intercept_request_response_write_chunk_func.cpp",
+    "utc_blink_ewk_intercept_request_scheme_get_func.cpp",
+    "utc_blink_ewk_intercept_request_url_get_func.cpp",
     "utc_blink_ewk_notification_body_get_func.cpp",
     "utc_blink_ewk_notification_callbacks_reset_func.cpp",
     "utc_blink_ewk_notification_callbacks_set_func.cpp",
@@ -298,6 +317,7 @@ test("ewk_unittests") {
     "utc_blink_ewk_view_context_get_func.cpp",
     "utc_blink_ewk_view_custom_header_add_func.cpp",
     "utc_blink_ewk_view_custom_header_remove_func.cpp",
+    "utc_blink_ewk_view_did_change_theme_color_callback_set_func.cpp",
     "utc_blink_ewk_view_draws_transparent_background_set_func.cpp",
     "utc_blink_ewk_view_encoding_custom_set_func.cpp",
     "utc_blink_ewk_view_forward_func.cpp",
@@ -308,6 +328,8 @@ test("ewk_unittests") {
     "utc_blink_ewk_view_history_get_func.cpp",
     "utc_blink_ewk_view_hit_test_new_func.cpp",
     "utc_blink_ewk_view_hit_test_request_func.cpp",
+    "utc_blink_ewk_view_horizontal_panning_hold_get_func.cpp",
+    "utc_blink_ewk_view_horizontal_panning_hold_set_func.cpp",
     "utc_blink_ewk_view_html_contents_set_func.cpp",
     "utc_blink_ewk_view_html_string_load_func.cpp",
     "utc_blink_ewk_view_inspector_server_stop_func.cpp",
@@ -349,6 +371,8 @@ test("ewk_unittests") {
     "utc_blink_ewk_view_use_settings_font_func.cpp",
     "utc_blink_ewk_view_user_agent_get_func.cpp",
     "utc_blink_ewk_view_user_agent_set_func.cpp",
+    "utc_blink_ewk_view_vertical_panning_hold_get_func.cpp",
+    "utc_blink_ewk_view_vertical_panning_hold_set_func.cpp",
     "utc_blink_ewk_view_visibility_set_func.cpp",
     "utc_blink_ewk_view_web_application_capable_get_func.cpp",
     "utc_blink_ewk_view_web_application_icon_url_get_func.cpp",
diff --git a/tizen_src/ewk/unittest/resources/common/theme-color_1.html b/tizen_src/ewk/unittest/resources/common/theme-color_1.html
new file mode 100644 (file)
index 0000000..22f5f84
--- /dev/null
@@ -0,0 +1,7 @@
+<html>
+<head>
+<meta name="theme-color" content="#326496">
+</head>
+<body>
+</body>
+</html>
diff --git a/tizen_src/ewk/unittest/resources/common/theme-color_2.html b/tizen_src/ewk/unittest/resources/common/theme-color_2.html
new file mode 100644 (file)
index 0000000..13f2b99
--- /dev/null
@@ -0,0 +1,7 @@
+<html>
+<head>
+<meta name="theme-color" content="#6496C8">
+</head>
+<body>
+</body>
+</html>
diff --git a/tizen_src/ewk/unittest/utc_blink_api_result_locked.h b/tizen_src/ewk/unittest/utc_blink_api_result_locked.h
new file mode 100644 (file)
index 0000000..4b75f51
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UTC_BLINK_API_RESULT_LOCKED_H_
+#define UTC_BLINK_API_RESULT_LOCKED_H_
+
+#include <mutex>
+
+template <typename T>
+class ApiResultLocked {
+ public:
+  ApiResultLocked() : is_set_(false) {}
+
+  void operator=(const T& t) { Set(t); }
+  void Set(const T& t) {
+    lock_.lock();
+    result_ = t;
+    is_set_ = true;
+    lock_.unlock();
+  }
+  T Get() {
+    lock_.lock();
+    auto t = result_;
+    lock_.unlock();
+    return t;
+  }
+  bool IsSet() {
+    lock_.lock();
+    auto is_set = is_set_;
+    lock_.unlock();
+    return is_set;
+  }
+
+ private:
+  bool is_set_;
+  T result_;
+  std::mutex lock_;
+};
+
+#endif  // UTC_BLINK_API_RESULT_LOCKED_H_
index 36271af..d387baf 100644 (file)
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 #include "utc_blink_ewk_base.h"
-#define URL "http://reference.vodafone.com/widgets/"
+#define URL "https://review.tizen.org/gerrit/#/"
 
 static Eina_Bool is_failed;
 static Eina_Bool is_Authenticated;
index fec6ae6..c03be25 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "utc_blink_ewk_base.h"
 
-#define URL "http://reference.vodafone.com/widgets/"
+#define URL "https://review.tizen.org/gerrit/#/"
 
 class utc_blink_ewk_auth_challenge_credential_use : public utc_blink_ewk_base
 {
index edd5125..963f1ac 100644 (file)
@@ -4,6 +4,8 @@
 
 #include "utc_blink_ewk_base.h"
 
+static const char* const kUrl = "https://review.tizen.org/gerrit/#/";
+
 class utc_blink_ewk_auth_challenge_realm_get : public utc_blink_ewk_base
 {
 protected:
@@ -31,9 +33,9 @@ protected:
     if (auth_challenge)
     {
       std::string realm = ewk_auth_challenge_realm_get(auth_challenge);
-      if (realm == "Widget TestCases EARLY ACCESS") {
-          owner->EventLoopStop(utc_blink_ewk_base::Success);
-          return;
+      if (realm == "Tizen.org ACCOUNT") {
+        owner->EventLoopStop(utc_blink_ewk_base::Success);
+        return;
       }
     }
     owner->EventLoopStop(utc_blink_ewk_base::Failure);
@@ -45,7 +47,7 @@ protected:
  */
 TEST_F(utc_blink_ewk_auth_challenge_realm_get, POS_TEST)
 {
-  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), "http://reference.vodafone.com/widgets/"));
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kUrl));
   EXPECT_EQ(Success, EventLoopStart());
 }
 
@@ -54,5 +56,5 @@ TEST_F(utc_blink_ewk_auth_challenge_realm_get, POS_TEST)
  */
 TEST_F(utc_blink_ewk_auth_challenge_realm_get, NEG_TEST)
 {
-  ASSERT_FALSE(ewk_view_url_set(NULL, "http://reference.vodafone.com/widgets/"));
+  ASSERT_FALSE(ewk_view_url_set(NULL, kUrl));
 }
index 59721f2..988a57c 100644 (file)
@@ -4,6 +4,8 @@
 
 #include "utc_blink_ewk_base.h"
 
+static const char* const kUrl = "https://review.tizen.org/gerrit/#/";
+
 class utc_blink_ewk_auth_challenge_suspend : public utc_blink_ewk_base
 {
 protected:
@@ -47,7 +49,7 @@ protected:
  */
 TEST_F(utc_blink_ewk_auth_challenge_suspend, POS_TEST)
 {
-  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), "http://reference.vodafone.com/widgets/"));
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), kUrl));
   EXPECT_EQ(Success, EventLoopStart());
 }
 
@@ -56,5 +58,5 @@ TEST_F(utc_blink_ewk_auth_challenge_suspend, POS_TEST)
  */
 TEST_F(utc_blink_ewk_auth_challenge_suspend, NEG_TEST)
 {
-  ASSERT_EQ(EINA_FALSE, ewk_view_url_set(NULL,"http://reference.vodafone.com/widgets/"));
+  ASSERT_EQ(EINA_FALSE, ewk_view_url_set(NULL, kUrl));
 }
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_context_intercept_request_callback_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_context_intercept_request_callback_set_func.cpp
new file mode 100644 (file)
index 0000000..2676c2b
--- /dev/null
@@ -0,0 +1,77 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+#include <atomic>
+
+class utc_blink_ewk_context_intercept_request_callback_set
+    : public utc_blink_ewk_base {
+ protected:
+  utc_blink_ewk_context_intercept_request_callback_set()
+      : callback_called_(false) {}
+
+  static const char* kInterceptURL;
+
+  void LoadFinished(Evas_Object* webview) override {
+    // Should not load without decision about interception.
+    EventLoopStop(Failure);
+  }
+
+  static void intercept_request_callback(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_context_intercept_request_callback_set*>(
+            user_data);
+    owner->callback_called_.store(true);
+  }
+
+  std::atomic<bool> callback_called_;
+};
+
+const char*
+    utc_blink_ewk_context_intercept_request_callback_set::kInterceptURL =
+        "http://www.google.com/";
+
+/**
+ * @brief Tests if intercept request callback is called.
+ */
+TEST_F(utc_blink_ewk_context_intercept_request_callback_set,
+       POS_TEST_CALLBACK_SET) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()), intercept_request_callback, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(callback_called_.load());
+}
+
+/**
+ * @brief Tests if function resets callback in case of NULL of a callback.
+ */
+TEST_F(utc_blink_ewk_context_intercept_request_callback_set,
+       POS_TEST_CALLBACK_RESET) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()), intercept_request_callback, this);
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()), nullptr, nullptr);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+
+  // Expected value Failure, because LoadFinished sets this status
+  // if url loads normally.
+  ASSERT_EQ(Failure, EventLoopStart());
+  ASSERT_FALSE(callback_called_.load());
+}
+
+/**
+ * @brief Tests if function works properly in case of NULL of a context.
+ */
+TEST_F(utc_blink_ewk_context_intercept_request_callback_set,
+       NEG_TEST_NULL_CONTEXT) {
+  ewk_context_intercept_request_callback_set(
+      nullptr, intercept_request_callback, nullptr);
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_context_web_database_usage_for_origin_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_context_web_database_usage_for_origin_get_func.cpp
new file mode 100644 (file)
index 0000000..b9b8961
--- /dev/null
@@ -0,0 +1,157 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+#define SAMPLE_ORIGIN "dwieleverece.github.io"
+const char* const WEB_DATABASE_SAMPLE_URL =
+    "https://" SAMPLE_ORIGIN "/tests/web_database_test/";
+
+class utc_blink_ewk_context_web_database_usage_for_origin_get
+    : public utc_blink_ewk_base {
+ protected:
+  utc_blink_ewk_context_web_database_usage_for_origin_get()
+      : context_(nullptr),
+        usage_(0),
+        neg_test_(false),
+        neg_result_1_(false),
+        neg_result_2_(false),
+        neg_result_3_(false),
+        usage_get_result_(false) {}
+
+  void PostSetUp() override {
+    ASSERT_TRUE(context_ = ewk_view_context_get(GetEwkWebView()));
+    // we want empty web database at test start
+    ASSERT_TRUE(ewk_context_web_database_delete_all(context_));
+  }
+
+  void LoadFinished(Evas_Object*) override { EventLoopStop(Success); }
+
+  void NegTest(Eina_List* origins) {
+    utc_message("NegTest: %p", origins);
+
+    Ewk_Security_Origin* origin = nullptr;
+    Ewk_Security_Origin* chosen_origin = nullptr;
+    Eina_List* it;
+    void* vorigin = nullptr;
+    EINA_LIST_FOREACH(origins, it, vorigin) {
+      origin = static_cast<Ewk_Security_Origin*>(vorigin);
+
+      const char* host = ewk_security_origin_host_get(origin);
+      if (host && !strcmp(host, SAMPLE_ORIGIN)) {
+        chosen_origin = origin;
+        break;
+      }
+    }
+    if (!chosen_origin)
+      EventLoopStop(Failure);
+    neg_result_1_ = ewk_context_web_database_usage_for_origin_get(
+        nullptr, UsageGetCb, this, origin);
+    neg_result_2_ = ewk_context_web_database_usage_for_origin_get(
+        context_, nullptr, this, origin);
+    neg_result_3_ = ewk_context_web_database_usage_for_origin_get(
+        context_, UsageGetCb, this, nullptr);
+    EventLoopStop(Success);
+  }
+
+  void FindSecurityOrigin(Eina_List* origins) {
+    utc_message("FindSecurityOrigin: %p", origins);
+
+    Ewk_Security_Origin* origin = nullptr;
+    Eina_List* it;
+    void* vorigin = nullptr;
+    EINA_LIST_FOREACH(origins, it, vorigin) {
+      origin = static_cast<Ewk_Security_Origin*>(vorigin);
+
+      const char* host = ewk_security_origin_host_get(origin);
+      if (host && !strcmp(host, SAMPLE_ORIGIN)) {
+        usage_get_result_ = ewk_context_web_database_usage_for_origin_get(
+            context_, UsageGetCb, this, origin);
+        EventLoopStop(Success);
+      }
+    }
+    EventLoopStop(Failure);
+  }
+
+  static void OriginsGetCb(Eina_List* origins, void* user_data) {
+    utc_message("OriginsGetCb: %p, %p", origins, user_data);
+    if (!user_data) {
+      ewk_context_origins_free(origins);
+      return;
+    }
+
+    auto self =
+        static_cast<utc_blink_ewk_context_web_database_usage_for_origin_get*>(
+            user_data);
+
+    if (!origins) {
+      self->EventLoopStop(Failure);
+      return;
+    }
+
+    if (self->neg_test_)
+      self->NegTest(origins);
+    else
+      self->FindSecurityOrigin(origins);
+  }
+
+  static void UsageGetCb(uint64_t usage, void* user_data) {
+    utc_message("UsageGetCb: %lu, %p", usage, user_data);
+    if (!user_data)
+      return;
+
+    auto self =
+        static_cast<utc_blink_ewk_context_web_database_usage_for_origin_get*>(
+            user_data);
+
+    self->usage_ = usage;
+    self->EventLoopStop(Success);
+  }
+
+ protected:
+  Ewk_Context* context_;
+  uint64_t usage_;
+  bool neg_test_;
+  bool neg_result_1_;
+  bool neg_result_2_;
+  bool neg_result_3_;
+  bool usage_get_result_;
+};
+
+/**
+ * @brief Tests if usage can be obtained when websql is used
+ */
+TEST_F(utc_blink_ewk_context_web_database_usage_for_origin_get, POS_TEST) {
+  utc_message("Loading web page: %s", WEB_DATABASE_SAMPLE_URL);
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), WEB_DATABASE_SAMPLE_URL));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  // testcase is hosted on github pages (github.io) for free, so it can be slow
+  EventLoopWait(10.0);
+  ASSERT_TRUE(
+      ewk_context_web_database_origins_get(context_, OriginsGetCb, this));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(usage_get_result_);
+  ASSERT_GT(usage_, 0);
+}
+
+/**
+ * @brief Tests if returns false when parameters are null.
+ */
+TEST_F(utc_blink_ewk_context_web_database_usage_for_origin_get, NEG_TEST) {
+  utc_message("Loading web page: %s", WEB_DATABASE_SAMPLE_URL);
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), WEB_DATABASE_SAMPLE_URL));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  // testcase is hosted on github pages (github.io) for free, so it can be slow
+  EventLoopWait(10.0);
+  neg_test_ = true;
+  ASSERT_TRUE(
+      ewk_context_web_database_origins_get(context_, OriginsGetCb, this));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_FALSE(neg_result_1_);
+  ASSERT_FALSE(neg_result_2_);
+  ASSERT_FALSE(neg_result_3_);
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_context_web_storage_usage_for_origin_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_context_web_storage_usage_for_origin_get_func.cpp
new file mode 100644 (file)
index 0000000..7c9bf82
--- /dev/null
@@ -0,0 +1,147 @@
+// Copyright 2015 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/* Define those macros _before_ you include the utc_blink_ewk.h header file. */
+
+#include "utc_blink_ewk_base.h"
+
+#define SAMPLE_ORIGIN "jmajnert.github.io"
+const char* const WEB_STORAGE_SAMPLE_URL =
+    "http://" SAMPLE_ORIGIN
+    "/tests/"
+    "localStorage_test/web_storage_create_simple.html";
+
+class utc_blink_ewk_context_web_storage_usage_for_origin_get
+    : public utc_blink_ewk_base {
+ protected:
+  utc_blink_ewk_context_web_storage_usage_for_origin_get()
+      : utc_blink_ewk_base(), context_(nullptr), usage_(0), neg_test_(false) {}
+
+  void PostSetUp() override {
+    ASSERT_TRUE(context_ = ewk_view_context_get(GetEwkWebView()));
+    // we want empty web storage at test start
+    ASSERT_TRUE(ewk_context_web_storage_delete_all(context_));
+  }
+
+  void LoadFinished(Evas_Object*) override { EventLoopStop(Success); }
+
+  void NegTest(Eina_List* origins) {
+    utc_message("NegTest: %p", origins);
+
+    Ewk_Security_Origin* origin = nullptr;
+    Ewk_Security_Origin* chosen_origin = nullptr;
+    Eina_List* it;
+    void* vorigin = nullptr;
+    EINA_LIST_FOREACH(origins, it, vorigin) {
+      origin = static_cast<Ewk_Security_Origin*>(vorigin);
+
+      const char* host = ewk_security_origin_host_get(origin);
+      if (host && !strcmp(host, SAMPLE_ORIGIN)) {
+        chosen_origin = origin;
+        break;
+      }
+    }
+    if (!chosen_origin)
+      EventLoopStop(Failure);
+    ASSERT_FALSE(ewk_context_web_storage_usage_for_origin_get(
+        nullptr, origin, usage_get_cb, this));
+    ASSERT_FALSE(ewk_context_web_storage_usage_for_origin_get(
+        context_, nullptr, usage_get_cb, this));
+    ASSERT_FALSE(ewk_context_web_storage_usage_for_origin_get(context_, origin,
+                                                              nullptr, this));
+    EventLoopStop(Success);
+  }
+
+  void FindSecurityOrigin(Eina_List* origins) {
+    utc_message("FindSecurityOrigin: %p", origins);
+
+    Ewk_Security_Origin* origin = nullptr;
+    Eina_List* it;
+    void* vorigin = nullptr;
+    EINA_LIST_FOREACH(origins, it, vorigin) {
+      origin = static_cast<Ewk_Security_Origin*>(vorigin);
+
+      const char* host = ewk_security_origin_host_get(origin);
+      if (host && !strcmp(host, SAMPLE_ORIGIN)) {
+        ASSERT_TRUE(ewk_context_web_storage_usage_for_origin_get(
+            context_, origin, usage_get_cb, this));
+        return;
+      }
+    }
+    EventLoopStop(Failure);
+  }
+
+  static void origins_get_cb(Eina_List* origins, void* user_data) {
+    utc_message("origins_get_cb: %p, %p", origins, user_data);
+    if (!user_data) {
+      ewk_context_origins_free(origins);
+      FAIL();
+    }
+
+    auto* self =
+        static_cast<utc_blink_ewk_context_web_storage_usage_for_origin_get*>(
+            user_data);
+
+    if (!origins) {
+      self->EventLoopStop(Failure);
+      return;
+    }
+
+    if (self->neg_test_)
+      self->NegTest(origins);
+    else
+      self->FindSecurityOrigin(origins);
+  }
+
+  static void usage_get_cb(uint64_t usage, void* user_data) {
+    utc_message("usage_get_cb: %lu, %p", usage, user_data);
+    if (!user_data) {
+      FAIL();
+      return;
+    }
+
+    auto* self =
+        static_cast<utc_blink_ewk_context_web_storage_usage_for_origin_get*>(
+            user_data);
+
+    self->usage_ = usage;
+    self->EventLoopStop(Success);
+  }
+
+ protected:
+  Ewk_Context* context_;
+  uint64_t usage_;
+  bool neg_test_;
+};
+
+/**
+ * @brief Tests if usage can be obtained when localstorage is used
+ */
+TEST_F(utc_blink_ewk_context_web_storage_usage_for_origin_get, POS_TEST) {
+  utc_message("Loading web page: %s", WEB_STORAGE_SAMPLE_URL);
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), WEB_STORAGE_SAMPLE_URL));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  EventLoopWait(10.0);
+  ASSERT_TRUE(
+      ewk_context_web_storage_origins_get(context_, origins_get_cb, this));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(usage_);
+}
+
+/**
+ * @brief Tests if returns false when parameters are null.
+ */
+TEST_F(utc_blink_ewk_context_web_storage_usage_for_origin_get, NEG_TEST) {
+  utc_message("Loading web page: %s", WEB_STORAGE_SAMPLE_URL);
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), WEB_STORAGE_SAMPLE_URL));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  EventLoopWait(10.0);
+  neg_test_ = true;
+  ASSERT_TRUE(
+      ewk_context_web_storage_origins_get(context_, origins_get_cb, this));
+  ASSERT_EQ(Success, EventLoopStart());
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_get_base.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_get_base.cpp
new file mode 100644 (file)
index 0000000..48b250b
--- /dev/null
@@ -0,0 +1,59 @@
++  // Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_intercept_request_get_base.h"
+
+    const std::string utc_blink_ewk_intercept_request_get_base::kInterceptURL =
+        "http://www.google.com/";
+
+utc_blink_ewk_intercept_request_get_base::
+    utc_blink_ewk_intercept_request_get_base()
+    : api_executed_(false) {}
+
+utc_blink_ewk_intercept_request_get_base::
+    ~utc_blink_ewk_intercept_request_get_base() {}
+
+void utc_blink_ewk_intercept_request_get_base::LoadFinished(
+    Evas_Object* webview) {
+  // Should not load without decision about interception.
+  EventLoopStop(Failure);
+}
+
+void utc_blink_ewk_intercept_request_get_base::callback_positive(
+    Ewk_Context* /*ctx*/,
+    Ewk_Intercept_Request* intercept_request,
+    void* user_data) {
+  auto* owner =
+      static_cast<utc_blink_ewk_intercept_request_get_base*>(user_data);
+  owner->test_func(intercept_request);
+  owner->api_executed_.store(true);
+}
+
+void utc_blink_ewk_intercept_request_get_base::callback_negative(
+    Ewk_Context* /*ctx*/,
+    Ewk_Intercept_Request* /*intercept_request*/,
+    void* user_data) {
+  auto* owner =
+      static_cast<utc_blink_ewk_intercept_request_get_base*>(user_data);
+  owner->test_func(nullptr);
+  owner->api_executed_.store(true);
+}
+
+void utc_blink_ewk_intercept_request_get_base::pos_test() {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()), callback_positive, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL.c_str()));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(api_executed_.load());
+}
+
+void utc_blink_ewk_intercept_request_get_base::neg_test() {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()), callback_negative, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL.c_str()));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(api_executed_.load());
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_get_base.h b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_get_base.h
new file mode 100644 (file)
index 0000000..3a9cb83
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef EWK_UNITTEST_UTC_BLINK_EWK_INTERCEPT_REQUEST_GET_BASE_H_
+#define EWK_UNITTEST_UTC_BLINK_EWK_INTERCEPT_REQUEST_GET_BASE_H_
+
+#include "utc_blink_ewk_base.h"
+
+#include <atomic>
+
+class utc_blink_ewk_intercept_request_get_base : public utc_blink_ewk_base {
+ protected:
+  static const std::string kInterceptURL;
+
+  utc_blink_ewk_intercept_request_get_base();
+  ~utc_blink_ewk_intercept_request_get_base() override;
+
+  void LoadFinished(Evas_Object* webview) override;
+  void pos_test();
+  void neg_test();
+  virtual void test_func(Ewk_Intercept_Request* intercept_request) = 0;
+
+ private:
+  static void callback_positive(Ewk_Context* /*ctx*/,
+                                Ewk_Intercept_Request* intercept_request,
+                                void* user_data);
+  static void callback_negative(Ewk_Context* /*ctx*/,
+                                Ewk_Intercept_Request* /*intercept_request*/,
+                                void* user_data);
+
+  std::atomic<bool> api_executed_;
+};
+
+#endif  // EWK_UNITTEST_UTC_BLINK_EWK_INTERCEPT_REQUEST_GET_BASE_H_
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_headers_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_headers_get_func.cpp
new file mode 100644 (file)
index 0000000..e196fcf
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_get_base.h"
+
+class utc_blink_ewk_intercept_request_headers_get
+    : public utc_blink_ewk_intercept_request_get_base {
+ public:
+  utc_blink_ewk_intercept_request_headers_get() : headers_from_ewk_(nullptr) {}
+
+ protected:
+  void test_func(Ewk_Intercept_Request* intercept_request) override {
+    headers_from_ewk_ = ewk_intercept_request_headers_get(intercept_request);
+    if (headers_from_ewk_) {
+      const char* accept =
+          static_cast<const char*>(eina_hash_find(headers_from_ewk_, "Accept"));
+      if (accept) {
+        accept_header_from_ewk_ = accept;
+      }
+      const char* user_agent = static_cast<const char*>(
+          eina_hash_find(headers_from_ewk_, "User-Agent"));
+      if (user_agent) {
+        user_agent_header_from_ewk_ = user_agent;
+      }
+    }
+  }
+
+  const Eina_Hash* headers_from_ewk_;
+  std::string accept_header_from_ewk_;
+  std::string user_agent_header_from_ewk_;
+};
+
+/**
+ * @brief Tests if headers are returned for intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_headers_get, POS_TEST_HEADERS_GET) {
+  pos_test();
+  ASSERT_NE(nullptr, headers_from_ewk_);
+  EXPECT_NE(std::string::npos, accept_header_from_ewk_.find("text/html"))
+      << "Substring \"text/html\" not in "
+      << "\"" << accept_header_from_ewk_ << "\"." << std::endl;
+  EXPECT_NE(std::string::npos, user_agent_header_from_ewk_.find("KHTML"))
+      << "Substring \"KHTML\" not in "
+      << "\"" << user_agent_header_from_ewk_ << "\"." << std::endl;
+}
+
+/**
+ * @brief Tests if null headers are returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_headers_get, NEG_TEST_HEADERS_GET_NULL) {
+  neg_test();
+  ASSERT_EQ(nullptr, headers_from_ewk_);
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_http_method_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_http_method_get_func.cpp
new file mode 100644 (file)
index 0000000..7b13314
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_get_base.h"
+
+class utc_blink_ewk_intercept_request_http_method_get
+    : public utc_blink_ewk_intercept_request_get_base {
+ public:
+  utc_blink_ewk_intercept_request_http_method_get()
+      : http_method_from_ewk_ptr_(nullptr) {}
+
+ protected:
+  void test_func(Ewk_Intercept_Request* intercept_request) override {
+    http_method_from_ewk_ptr_ =
+        ewk_intercept_request_http_method_get(intercept_request);
+    if (http_method_from_ewk_ptr_) {
+      http_method_from_ewk_ = http_method_from_ewk_ptr_;
+    }
+  }
+
+  std::string http_method_from_ewk_;
+  const char* http_method_from_ewk_ptr_;
+};
+
+/**
+ * @brief Tests if correct http method is returned for intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_http_method_get, POS_TEST_METHOD_GET) {
+  pos_test();
+  ASSERT_EQ("GET", http_method_from_ewk_);
+}
+
+/**
+ * @brief Tests if null http method is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_http_method_get,
+       NEG_TEST_METHOD_GET_NULL) {
+  neg_test();
+  ASSERT_EQ(nullptr, http_method_from_ewk_ptr_);
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_ignore_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_ignore_func.cpp
new file mode 100644 (file)
index 0000000..5ec0e5f
--- /dev/null
@@ -0,0 +1,110 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+#include <string>
+
+#include "utc_blink_api_result_locked.h"
+
+static const char* const kTitleChangedCb = "title,changed";
+
+class utc_blink_ewk_intercept_request_ignore : public utc_blink_ewk_base {
+ protected:
+  static const char* kInterceptURL;
+
+  void LoadFinished(Evas_Object* webview) override {
+    // URL loads normally if intercept request is ignored in callback
+    const char* url = ewk_view_url_get(webview);
+    if (url)
+      url_ = url;
+    if (!title_.empty())
+      EventLoopStop(Success);
+  }
+
+  void PostSetUp() override {
+    evas_object_smart_callback_add(GetEwkWebView(), kTitleChangedCb,
+                                   TitleChanged, this);
+  }
+
+  void PreTearDown() override {
+    evas_object_smart_callback_del(GetEwkWebView(), kTitleChangedCb,
+                                   TitleChanged);
+  }
+
+  static void TitleChanged(void* data, Evas_Object*, void* event_info) {
+    if (!data) {
+      utc_message("TitleChanged :: data is null");
+      return;
+    }
+    auto owner = static_cast<utc_blink_ewk_intercept_request_ignore*>(data);
+    if (!event_info) {
+      utc_message("TitleChanged :: event_info is null");
+      return;
+    }
+    auto title = static_cast<char*>(event_info);
+    owner->title_ = title;
+    if (!owner->url_.empty())
+      owner->EventLoopStop(Success);
+  }
+
+  static void intercept_request_callback_ignore(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_ignore*>(user_data);
+    owner->api_result_ = ewk_intercept_request_ignore(intercept_request);
+  }
+
+  static void intercept_request_callback_ignore_null(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* /*intercept_request*/,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_ignore*>(user_data);
+    owner->api_result_ = ewk_intercept_request_ignore(nullptr);
+  }
+
+  std::string url_;
+  std::string title_;
+  ApiResultLocked<Eina_Bool> api_result_;
+};
+
+const char* utc_blink_ewk_intercept_request_ignore::kInterceptURL =
+    "http://www.google.com/";
+
+/**
+ * @brief Tests if url loads if intercept request is ignored.
+ */
+TEST_F(utc_blink_ewk_intercept_request_ignore, POS_TEST_IGNORE) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()), intercept_request_callback_ignore,
+      this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(api_result_.IsSet());
+  EXPECT_TRUE(api_result_.Get());
+  EXPECT_NE(std::string::npos, url_.find("google"))
+      << "Substring \"google\" not in "
+      << "\"" << url_ << "\"." << std::endl;
+  EXPECT_NE(std::string::npos, title_.find("Google"))
+      << "Substring \"Google\" not in "
+      << "\"" << title_ << "\"." << std::endl;
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_ignore, NEG_TEST_IGNORE_NULL) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()),
+      intercept_request_callback_ignore_null, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(api_result_.IsSet());
+  ASSERT_FALSE(api_result_.Get());
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_base.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_base.cpp
new file mode 100644 (file)
index 0000000..0462f08
--- /dev/null
@@ -0,0 +1,166 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <cstring>
+
+#include "utc_blink_ewk_intercept_request_response_base.h"
+
+const char* utc_blink_ewk_intercept_request_response_base::kInterceptURL =
+    "http://www.google.com/";
+
+const char* utc_blink_ewk_intercept_request_response_base::kBodyAjaxPart1 =
+    "<html><head><title>first intercepted</title></head>"
+    "<body><script>"
+    "function ajax_listener() {";
+
+const char* utc_blink_ewk_intercept_request_response_base::kBodyAjaxPart2 =
+    "}"
+    "var ajax = new XMLHttpRequest();"
+    "ajax.onload = ajax_listener;"
+    "ajax.open('GET', '";
+
+const char* utc_blink_ewk_intercept_request_response_base::kInterceptAjaxURL =
+    "http://www.google.com/ewk-test/";
+
+const char* utc_blink_ewk_intercept_request_response_base::kBodyAjaxPart3 =
+    "', true);"
+    "ajax.send();"
+    "</script>"
+    "</body></html>";
+
+utc_blink_ewk_intercept_request_response_base::
+    utc_blink_ewk_intercept_request_response_base()
+    : body_ajax_response_("AJAX"),
+      custom_response_status_text_(nullptr),
+      intercept_request_null_(false) {}
+
+utc_blink_ewk_intercept_request_response_base::
+    ~utc_blink_ewk_intercept_request_response_base() {}
+
+void utc_blink_ewk_intercept_request_response_base::PostSetUp() {
+  evas_object_smart_callback_add(GetEwkWebView(), "title,changed",
+                                 title_changed, this);
+}
+
+void utc_blink_ewk_intercept_request_response_base::PreTearDown() {
+  evas_object_smart_callback_del(GetEwkWebView(), "title,changed",
+                                 title_changed);
+}
+
+void utc_blink_ewk_intercept_request_response_base::LoadFinished(
+    Evas_Object* webview) {
+  // different title for first intercepted request
+  first_title_ = ewk_view_title_get(webview);
+}
+
+void utc_blink_ewk_intercept_request_response_base::check_results(
+    ApiResultLocked<ewk_callback_results>& results) {
+  ASSERT_TRUE(results.IsSet());
+  auto res = results.Get();
+  EXPECT_TRUE(res.status_set_);
+  EXPECT_TRUE(res.header_add_content_type_);
+  EXPECT_TRUE(res.header_add_content_length_);
+  EXPECT_TRUE(res.header_add_access_control_);
+  EXPECT_TRUE(res.body_set_);
+}
+
+void utc_blink_ewk_intercept_request_response_base::construct_page() {
+  body_ajax_ = kBodyAjaxPart1;
+  body_ajax_ += get_js_title_test();
+  body_ajax_ += kBodyAjaxPart2;
+  body_ajax_ += kInterceptAjaxURL;
+  body_ajax_ += kBodyAjaxPart3;
+}
+
+void utc_blink_ewk_intercept_request_response_base::title_changed(
+    void* data,
+    Evas_Object* webview,
+    void* event_info) {
+  auto* owner =
+      static_cast<utc_blink_ewk_intercept_request_response_base*>(data);
+  const char* title = ewk_view_title_get(owner->GetEwkWebView());
+
+  if (strcmp(title, "first intercepted") != 0) {
+    owner->EventLoopStop(Success);
+  }
+}
+
+void utc_blink_ewk_intercept_request_response_base::
+    intercept_request_callback_response_header_add(
+        Ewk_Context* /*ctx*/,
+        Ewk_Intercept_Request* intercept_request,
+        void* user_data) {
+  auto* owner =
+      static_cast<utc_blink_ewk_intercept_request_response_base*>(user_data);
+  const char* url = ewk_intercept_request_url_get(intercept_request);
+  int body_length;
+  const char* body;
+  ApiResultLocked<ewk_callback_results>* results;
+
+  if (strcmp(url, kInterceptAjaxURL) == 0) {
+    // intercept ajax request
+    body_length = strlen(owner->body_ajax_response_);
+    body = owner->body_ajax_response_;
+    results = &owner->ajax_ewk_results_;
+  } else if (strcmp(url, kInterceptURL) == 0) {
+    // intercept first page request
+    body_length = owner->body_ajax_.length();
+    body = owner->body_ajax_.c_str();
+    results = &owner->page_ewk_results_;
+  } else {
+    ewk_intercept_request_ignore(intercept_request);
+    return;
+  }
+  ewk_callback_results res;
+  res.status_set_ = ewk_intercept_request_response_status_set(
+      intercept_request, 200, owner->custom_response_status_text_);
+  res.header_add_content_type_ = ewk_intercept_request_response_header_add(
+      intercept_request, "Content-Type", "text/html; charset=UTF-8");
+  res.header_add_content_length_ = ewk_intercept_request_response_header_add(
+      intercept_request, "Content-Length", std::to_string(body_length).c_str());
+  res.header_add_access_control_ = ewk_intercept_request_response_header_add(
+      intercept_request, "Access-Control-Allow-Origin", "*");
+  owner->pos_func(intercept_request);
+  res.body_set_ = ewk_intercept_request_response_body_set(intercept_request,
+                                                          body, body_length);
+  results->Set(std::move(res));
+}
+
+void utc_blink_ewk_intercept_request_response_base::
+    intercept_request_callback_response_header_add_null(
+        Ewk_Context* /*ctx*/,
+        Ewk_Intercept_Request* intercept_request,
+        void* user_data) {
+  auto* owner =
+      static_cast<utc_blink_ewk_intercept_request_response_base*>(user_data);
+
+  intercept_request =
+      owner->intercept_request_null_ ? nullptr : intercept_request;
+  owner->neg_api_result_ = owner->neg_func(intercept_request);
+}
+
+void utc_blink_ewk_intercept_request_response_base::pos_test() {
+  construct_page();
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()),
+      intercept_request_callback_response_header_add, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Success, EventLoopStart());
+  // initial title from HTML
+  EXPECT_EQ("first intercepted", first_title_);
+  check_results(page_ewk_results_);
+  check_results(ajax_ewk_results_);
+}
+
+void utc_blink_ewk_intercept_request_response_base::neg_test() {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()),
+      intercept_request_callback_response_header_add_null, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(neg_api_result_.IsSet());
+  ASSERT_EQ(EINA_FALSE, neg_api_result_.Get());
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_base.h b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_base.h
new file mode 100644 (file)
index 0000000..f08a45a
--- /dev/null
@@ -0,0 +1,72 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can b
+// found in the LICENSE file.
+
+#ifndef EWK_UNITTEST_UTC_BLINK_EWK_INTERCEPT_REQUEST_RESPONSE_BASE_H_
+#define EWK_UNITTEST_UTC_BLINK_EWK_INTERCEPT_REQUEST_RESPONSE_BASE_H_
+
+#include "utc_blink_ewk_base.h"
+
+#include <string>
+
+#include "utc_blink_api_result_locked.h"
+
+class utc_blink_ewk_intercept_request_response_base
+    : public utc_blink_ewk_base {
+ protected:
+  utc_blink_ewk_intercept_request_response_base();
+  ~utc_blink_ewk_intercept_request_response_base() override;
+
+  virtual void pos_func(Ewk_Intercept_Request* intercept_request) = 0;
+  virtual bool neg_func(Ewk_Intercept_Request* intercept_request) = 0;
+  virtual std::string get_js_title_test() = 0;
+
+  void PostSetUp() override;
+  void PreTearDown() override;
+  void LoadFinished(Evas_Object* webview) override;
+
+  void pos_test();
+  void neg_test();
+
+  const char* body_ajax_response_;
+  const char* custom_response_status_text_;
+  bool intercept_request_null_;
+
+ private:
+  struct ewk_callback_results {
+    bool status_set_;
+    bool header_add_content_type_;
+    bool header_add_content_length_;
+    bool header_add_access_control_;
+    bool body_set_;
+  };
+
+  static const char* kInterceptURL;
+  static const char* kInterceptAjaxURL;
+  static const char* kBodyAjaxPart1;
+  static const char* kBodyAjaxPart2;
+  static const char* kBodyAjaxPart3;
+
+  void check_results(ApiResultLocked<ewk_callback_results>& results);
+  void construct_page();
+
+  static void title_changed(void* data, Evas_Object* webview, void* event_info);
+
+  static void intercept_request_callback_response_header_add(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data);
+
+  static void intercept_request_callback_response_header_add_null(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data);
+
+  ApiResultLocked<ewk_callback_results> page_ewk_results_;
+  ApiResultLocked<ewk_callback_results> ajax_ewk_results_;
+  ApiResultLocked<Eina_Bool> neg_api_result_;
+  std::string first_title_;
+  std::string body_ajax_;
+};
+
+#endif  // EWK_UNITTEST_UTC_BLINK_EWK_INTERCEPT_REQUEST_RESPONSE_BASE_H_
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_body_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_body_set_func.cpp
new file mode 100644 (file)
index 0000000..d07e409
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_response_base.h"
+
+class utc_blink_ewk_intercept_request_response_body_set
+    : public utc_blink_ewk_intercept_request_response_base {
+ protected:
+  std::string get_js_title_test() override {
+    return std::string(body_ajax_test_);
+  }
+
+  void pos_func(Ewk_Intercept_Request* intercept_request) override {}
+
+  bool neg_func(Ewk_Intercept_Request* intercept_request) override {
+    return ewk_intercept_request_response_body_set(
+        intercept_request, body_ajax_response_, body_ajax_length_);
+  }
+
+  const char* body_ajax_test_ =
+      "document.title = this.responseText + ': ' + this.responseText.length;";
+
+  int body_ajax_length_;
+};
+
+/**
+ * @brief Tests if headers are correctly added from header map.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_body_set,
+       POS_TEST_RESPONSE_BODY_SET) {
+  body_ajax_response_ = "HELLO EWK API";
+  pos_test();
+  // title set in JS after ajax response:
+  // <AJAX_RESPONSE>: length(<AJAX_RESPONSE>)
+  EXPECT_STREQ("HELLO EWK API: 13", ewk_view_title_get(GetEwkWebView()));
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for NULL body
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_body_set, NEG_TEST_NULL_BODY) {
+  body_ajax_response_ = nullptr;
+  // some positive value, so safety checks for length won't interfere
+  body_ajax_length_ = 1;
+  neg_test();
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for negative body length
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_body_set,
+       NEG_TEST_NEGATIVE_BODY_LENGTH) {
+  body_ajax_length_ = -1;
+  neg_test();
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_body_set,
+       NEG_TEST_NULL_INTERCEPT_RESPONSE) {
+  intercept_request_null_ = true;
+  body_ajax_length_ = strlen(body_ajax_response_);
+  neg_test();
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_header_add_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_header_add_func.cpp
new file mode 100644 (file)
index 0000000..638fd24
--- /dev/null
@@ -0,0 +1,87 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_response_base.h"
+
+class utc_blink_ewk_intercept_request_response_header_add
+    : public utc_blink_ewk_intercept_request_response_base {
+ protected:
+  std::string get_js_title_test() override {
+    return std::string(body_ajax_test_);
+  }
+
+  void pos_func(Ewk_Intercept_Request* intercept_request) override {
+    header_add_result_field_1_ = ewk_intercept_request_response_header_add(
+        intercept_request, "TEST_FIELD_1", "TEST_VALUE_1");
+    header_add_result_field_2_ = ewk_intercept_request_response_header_add(
+        intercept_request, "TEST_FIELD_2", "TEST_VALUE_2");
+  }
+
+  bool neg_func(Ewk_Intercept_Request* intercept_request) override {
+    return ewk_intercept_request_response_header_add(
+        intercept_request, header_field_name_, header_field_value_);
+  }
+
+  const char* body_ajax_test_ =
+      "document.title = 'TEST_FIELD_1: '"
+      "+ this.getResponseHeader('TEST_FIELD_1') + ', TEST_FIELD_2: '"
+      "+ this.getResponseHeader('TEST_FIELD_2');";
+
+  const char* header_field_name_;
+  const char* header_field_value_;
+  bool header_add_result_field_1_;
+  bool header_add_result_field_2_;
+};
+
+/**
+ * @brief Tests if headers are correctly added.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_header_add,
+       POS_TEST_RESPONSE_HEADER_ADD) {
+  pos_test();
+  EXPECT_TRUE(header_add_result_field_1_);
+  EXPECT_TRUE(header_add_result_field_2_);
+  /*
+   * title set in JS after ajax response:
+   * TEST_FIELD_1: <header('TEST_FIELD_1')>, \
+   * TEST_FIELD_2: <header('TEST_FIELD_2')>
+   */
+  EXPECT_STREQ("TEST_FIELD_1: TEST_VALUE_1, TEST_FIELD_2: TEST_VALUE_2",
+               ewk_view_title_get(GetEwkWebView()));
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null header field name.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_header_add,
+       NEG_TEST_NULL_HEADER_FIELD_NAME) {
+  intercept_request_null_ = false;
+  header_field_name_ = nullptr;
+  header_field_value_ = "TEST";
+  neg_test();
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null header field value.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_header_add,
+       NEG_TEST_NULL_HEADER_FIELD_VALUE) {
+  intercept_request_null_ = false;
+  header_field_name_ = "Server";
+  header_field_value_ = nullptr;
+  neg_test();
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_header_add,
+       NEG_TEST_NULL_INTERCEPT_RESPONSE) {
+  intercept_request_null_ = true;
+  header_field_name_ = "Server";
+  header_field_value_ = "TEST";
+  neg_test();
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_header_map_add_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_header_map_add_func.cpp
new file mode 100644 (file)
index 0000000..a564eb1
--- /dev/null
@@ -0,0 +1,84 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_response_base.h"
+
+class utc_blink_ewk_intercept_request_response_header_map_add
+    : public utc_blink_ewk_intercept_request_response_base {
+ protected:
+  utc_blink_ewk_intercept_request_response_header_map_add()
+      : header_map_(nullptr) {}
+
+  ~utc_blink_ewk_intercept_request_response_header_map_add() override {
+    if (header_map_)
+      eina_hash_free(header_map_);
+  }
+
+  std::string get_js_title_test() override {
+    return std::string(body_ajax_test_);
+  }
+
+  void pos_func(Ewk_Intercept_Request* intercept_request) override {
+    header_add_map_result_ = ewk_intercept_request_response_header_map_add(
+        intercept_request, header_map_);
+  }
+
+  bool neg_func(Ewk_Intercept_Request* intercept_request) override {
+    return ewk_intercept_request_response_header_map_add(intercept_request,
+                                                         header_map_);
+  }
+
+  void build_header_map() {
+    header_map_ = eina_hash_string_small_new(nullptr);
+    eina_hash_add(header_map_, "TEST_FIELD_1", "TEST_VALUE_1");
+    eina_hash_add(header_map_, "TEST_FIELD_2", "TEST_VALUE_2");
+  }
+
+  const char* body_ajax_test_ =
+      "document.title = 'TEST_FIELD_1: '"
+      "+ this.getResponseHeader('TEST_FIELD_1') + ', TEST_FIELD_2: '"
+      "+ this.getResponseHeader('TEST_FIELD_2');";
+
+  bool header_add_map_result_;
+  Eina_Hash* header_map_;
+};
+
+/**
+ * @brief Tests if headers are correctly added from header map.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_header_map_add,
+       POS_TEST_RESPONSE_HEADER_ADD) {
+  build_header_map();
+  pos_test();
+  EXPECT_TRUE(header_add_map_result_);
+  /*
+   * title set in JS after ajax response:
+   * TEST_FIELD_1: <header('TEST_FIELD_1')>, \
+   * TEST_FIELD_2: <header('TEST_FIELD_2')>
+   */
+  EXPECT_STREQ("TEST_FIELD_1: TEST_VALUE_1, TEST_FIELD_2: TEST_VALUE_2",
+               ewk_view_title_get(GetEwkWebView()));
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null header map.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_header_map_add,
+       NEG_TEST_NULL_HEADER_FIELD_NAME) {
+  intercept_request_null_ = false;
+  header_map_ = nullptr;
+  neg_test();
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_header_map_add,
+       NEG_TEST_NULL_INTERCEPT_RESPONSE) {
+  intercept_request_null_ = true;
+  build_header_map();
+  neg_test();
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_set_func.cpp
new file mode 100644 (file)
index 0000000..54256fe
--- /dev/null
@@ -0,0 +1,262 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+#include <cstring>
+#include <string>
+
+#include "utc_blink_api_result_locked.h"
+
+class utc_blink_ewk_intercept_request_response_set : public utc_blink_ewk_base {
+ public:
+  utc_blink_ewk_intercept_request_response_set() {
+    body_length_ = strlen(kBody);
+    int headers_length =
+        snprintf(nullptr, 0, kHeadersTemplate, body_length_) + 1;  // for '\0'
+    headers_ = new char[headers_length];
+    snprintf(headers_, headers_length, kHeadersTemplate, body_length_);
+
+    body_ajax_length_ = strlen(kBodyAjax);
+    int headers_ajax_length =
+        snprintf(nullptr, 0, kHeadersTemplate, body_ajax_length_) +
+        1;  // for '\0'
+    headers_ajax_ = new char[headers_ajax_length];
+    snprintf(headers_ajax_, headers_ajax_length, kHeadersTemplate,
+             body_ajax_length_);
+
+    body_ajax_response_length_ = strlen(kBodyAjaxResponse);
+    int headers_ajax_response_length =
+        snprintf(nullptr, 0, kHeadersTemplate, body_ajax_response_length_) +
+        1;  // for '\0'
+    headers_ajax_response_ = new char[headers_ajax_response_length];
+    snprintf(headers_ajax_response_, headers_ajax_response_length,
+             kHeadersTemplate, body_ajax_response_length_);
+  }
+
+  ~utc_blink_ewk_intercept_request_response_set() override {
+    delete[] headers_;
+    delete[] headers_ajax_;
+    delete[] headers_ajax_response_;
+  }
+
+ protected:
+  static const char* kInterceptURL;
+  static const char* kHeadersTemplate;
+  static const char* kBody;
+  static const char* kBodyAjax;
+  static const char* kBodyAjaxResponse;
+
+  void PostSetUp() override {
+    evas_object_smart_callback_add(GetEwkWebView(), "title,changed",
+                                   title_changed, this);
+  }
+
+  void PreTearDown() override {
+    evas_object_smart_callback_del(GetEwkWebView(), "title,changed",
+                                   title_changed);
+  }
+
+  void LoadFinished(Evas_Object* webview) override {
+    // different title for first intercepted request
+    first_title_ = ewk_view_title_get(webview);
+  }
+
+  static void title_changed(void* data,
+                            Evas_Object* webview,
+                            void* event_info) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_set*>(data);
+    const char* title = ewk_view_title_get(owner->GetEwkWebView());
+    if (strcmp(title, "first intercepted") != 0) {
+      owner->EventLoopStop(Success);
+    }
+  }
+
+  static void intercept_request_callback_response_set_ajax(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
+
+    const char* url = ewk_intercept_request_url_get(intercept_request);
+    if (strcmp(url, "http://www.google.com/ewk-test/") == 0) {
+      // intercept ajax request
+      owner->api_result_ajax_ = ewk_intercept_request_response_set(
+          intercept_request, owner->headers_ajax_response_, kBodyAjaxResponse,
+          owner->body_ajax_response_length_);
+    } else {
+      // intercept first page request
+      owner->api_result_page_ = ewk_intercept_request_response_set(
+          intercept_request, owner->headers_ajax_, kBodyAjax,
+          owner->body_ajax_length_);
+    }
+  }
+
+  static void intercept_request_callback_response_set_null_request_intercept(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* /*intercept_request*/,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
+    owner->api_result_ = ewk_intercept_request_response_set(
+        nullptr, owner->headers_, kBody, owner->body_length_);
+  }
+
+  static void intercept_request_callback_response_set_null_headers(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
+    owner->api_result_ = ewk_intercept_request_response_set(
+        intercept_request, nullptr, kBody, owner->body_length_);
+  }
+
+  static void intercept_request_callback_response_set_null_body(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
+    owner->api_result_ = ewk_intercept_request_response_set(
+        intercept_request, owner->headers_, nullptr, owner->body_length_)
+  }
+
+  static void intercept_request_callback_response_set_negative_length(
+      Evas_Object* o,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
+    if (ewk_intercept_request_response_set(intercept_request, owner->headers_,
+                                           kBody, -1))
+      owner->EventLoopStop(Failure);
+    else
+      owner->EventLoopStop(Success);
+  }
+
+  int body_length_;
+  int body_ajax_length_;
+  int body_ajax_response_length_;
+  char* headers_;
+  char* headers_ajax_;
+  char* headers_ajax_response_;
+  std::string first_title_;
+  ApiResultLocked<Eina_Bool> api_result_;
+  ApiResultLocked<Eina_Bool> api_result_ajax_;
+  ApiResultLocked<Eina_Bool> api_result_page_;
+};
+
+const char* utc_blink_ewk_intercept_request_response_set::kInterceptURL =
+    "http://www.google.com/";
+
+const char* utc_blink_ewk_intercept_request_response_set::kHeadersTemplate =
+    "HTTP/1.1 200 OK\r\n"
+    "Content-Type: text/html; charset=UTF-8\r\n"
+    "Content-Length: %d\r\n"
+    "Access-Control-Allow-Origin: *\r\n"
+    "Server: TEST\r\n\r\n";
+
+const char* utc_blink_ewk_intercept_request_response_set::kBody =
+    "<html><head><title>intercepted</title></head>"
+    "<body>Hello, Request Intercept!</body></html>";
+
+const char* utc_blink_ewk_intercept_request_response_set::kBodyAjax =
+    "<html><head><title>first intercepted</title></head>"
+    "<body><script>"
+    "function ajax_listener() {"
+    "document.title = this.responseText + ' ' + this.status + ' ' + "
+    "this.statusText + ' ' + this.getResponseHeader('Server');"
+    "}"
+    "var ajax = new XMLHttpRequest();"
+    "ajax.onload = ajax_listener;"
+    "ajax.open('GET', 'http://www.google.com/ewk-test/', true);"
+    "ajax.send();"
+    "</script>"
+    "</body></html>";
+
+const char* utc_blink_ewk_intercept_request_response_set::kBodyAjaxResponse =
+    "AJAX";
+
+/**
+ * @brief Tests if body and custom headers are set.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_set, POS_TEST_RESPONSE_SET) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()),
+      intercept_request_callback_response_set_ajax, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Success, EventLoopStart());
+  EXPECT_FALSE(first_title_.empty());
+  EXPECT_EQ(std::string::npos, first_title_.find("Google"))
+      << "Substring \"Google\" in "
+      << "\"" << first_title_ << "\"." << std::endl;
+  EXPECT_NE(std::string::npos, first_title_.find("first intercepted"))
+      << "Substring \"first intercepted\" not in "
+      << "\"" << first_title_ << "\"." << std::endl;
+  ASSERT_TRUE(api_result_page_.IsSet());
+  ASSERT_EQ(EINA_TRUE, api_result_page_.Get());
+  ASSERT_TRUE(api_result_ajax_.IsSet());
+  ASSERT_EQ(EINA_TRUE, api_result_ajax_.Get());
+  // title set in JS after ajax response:
+  // <response_body> <status_code> <status_text> <header('Server')>
+  EXPECT_STREQ("AJAX 200 OK TEST", ewk_view_title_get(GetEwkWebView()));
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_set,
+       NEG_TEST_NULL_INTERCEPT_RESPONSE) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()),
+      intercept_request_callback_response_set_null_request_intercept, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(api_result_.IsSet());
+  ASSERT_EQ(EINA_FALSE, api_result_.Get());
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null headers.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_set, NEG_TEST_NULL_HEADERS) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()),
+      intercept_request_callback_response_set_null_headers, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(api_result_.IsSet());
+  ASSERT_EQ(EINA_FALSE, api_result_.Get());
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null body.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_set, NEG_TEST_NULL_BODY) {
+  ewk_view_intercept_request_callback_set(
+      GetEwkWebView(), intercept_request_callback_response_set_null_body, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Success, EventLoopStart());
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for negative body length.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_set, NEG_TEST_NEGATIVE_LENGTH) {
+  ewk_context_intercept_request_callback_set(
+      ewk_view_context_get(GetEwkWebView()),
+      intercept_request_callback_response_set_negative_length, this);
+
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(api_result_.IsSet());
+  ASSERT_EQ(EINA_FALSE, api_result_.Get());
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_status_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_status_set_func.cpp
new file mode 100644 (file)
index 0000000..2f48e4a
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_response_base.h"
+
+class utc_blink_ewk_intercept_request_response_status_set
+    : public utc_blink_ewk_intercept_request_response_base {
+ protected:
+  std::string get_js_title_test() override {
+    return std::string(body_ajax_test_);
+  }
+
+  void pos_func(Ewk_Intercept_Request* intercept_request) override {}
+
+  bool neg_func(Ewk_Intercept_Request* intercept_request) override {
+    return ewk_intercept_request_response_status_set(nullptr, 200, "OK");
+  }
+
+  const char* body_ajax_test_ =
+      "document.title = this.status + ' ' + this.statusText;";
+};
+
+/**
+ * @brief Tests if status code and custom status text are set.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_status_set,
+       POS_TEST_RESPONSE_STATUS_SET) {
+  custom_response_status_text_ = "COOL";
+  pos_test();
+  // title set in JS after ajax response: <status_code> <status_text>
+  EXPECT_STREQ("200 COOL", ewk_view_title_get(GetEwkWebView()));
+}
+
+/**
+ * @brief Tests if status code and default status text are set.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_status_set,
+       POS_TEST_RESPONSE_STATUS_SET_DEFAULT_TEXT) {
+  custom_response_status_text_ = nullptr;
+  pos_test();
+  // title set in JS after ajax response: <status_code ><status_text>
+  EXPECT_STREQ("200 OK", ewk_view_title_get(GetEwkWebView()));
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_status_set,
+       NEG_TEST_NULL_INTERCEPT_RESPONSE) {
+  intercept_request_null_ = true;
+  neg_test();
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_write_chunk_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_response_write_chunk_func.cpp
new file mode 100644 (file)
index 0000000..9d2e002
--- /dev/null
@@ -0,0 +1,191 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <algorithm>
+#include <atomic>
+#include <cstring>
+#include <string>
+
+#include "ewk/unittest/utc_blink_ewk_base.h"
+
+class utc_blink_ewk_intercept_request_response_write_chunk
+    : public utc_blink_ewk_base {
+ public:
+  utc_blink_ewk_intercept_request_response_write_chunk()
+      : status_set_result_(false),
+        content_type_header_result_(false),
+        content_length_header_result_(false),
+        last_write_(true),
+        null_intercept_request_(false),
+        null_chunk_(false),
+        data_written_(0),
+        chunk_write_timer_(nullptr),
+        intercept_request_(nullptr),
+        callback_called_(false) {
+    body_.append(kBodyPre);
+    body_.append(kTitle);
+    body_.append(kBodyPost);
+    body_length_ = body_.length();
+    data_to_write_ = body_length_;
+  }
+
+ protected:
+  static const char* kInterceptURL;
+  static const char* kBodyPre;
+  static const char* kTitle;
+  static const char* kBodyPost;
+  // Chunk should be smaller than payload for this test.
+  static const size_t kDefaultChunkLength;
+
+  void LoadFinished(Evas_Object* webview) override { EventLoopStop(Success); }
+
+  void PostSetUp() override {
+    ewk_context_intercept_request_callback_set(
+        ewk_view_context_get(GetEwkWebView()), intercept_request_callback,
+        this);
+  }
+
+  void PreTearDown() override {
+    if (chunk_write_timer_)
+      ecore_timer_del(chunk_write_timer_);
+  }
+
+  void PrepareAndStartChunkWrite(MainLoopResult expected_result) {
+    ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
+    ASSERT_EQ(Timeout, EventLoopStart(3.0));
+    ASSERT_TRUE(callback_called_.load());
+    EXPECT_TRUE(status_set_result_);
+    EXPECT_TRUE(content_type_header_result_);
+    EXPECT_TRUE(content_length_header_result_);
+    SetTestJob(utc_blink_ewk_intercept_request_response_write_chunk::
+                   job_do_chunk_write);
+    ASSERT_EQ(expected_result, EventLoopStart());
+  }
+
+  static void intercept_request_callback(
+      Ewk_Context* /*ctx*/,
+      Ewk_Intercept_Request* intercept_request,
+      void* user_data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_write_chunk*>(
+            user_data);
+
+    const char* url = ewk_intercept_request_url_get(intercept_request);
+    if (strcmp(url, kInterceptURL) == 0) {
+      owner->status_set_result_ = ewk_intercept_request_response_status_set(
+          intercept_request, 200, nullptr);
+      owner->content_type_header_result_ =
+          ewk_intercept_request_response_header_add(
+              intercept_request, "Content-Type", "text/html; charset=UTF-8");
+      owner->content_length_header_result_ =
+          ewk_intercept_request_response_header_add(
+              intercept_request, "Content-Length",
+              std::to_string(owner->body_length_).c_str());
+      if (owner->null_intercept_request_)
+        owner->intercept_request_ = nullptr;
+      else
+        owner->intercept_request_ = intercept_request;
+    } else {
+      // Ignore any other request.
+      ewk_intercept_request_ignore(intercept_request);
+    }
+    owner->callback_called_.store(true);
+  }
+
+  static Eina_Bool chunk_write_callback(void* data) {
+    auto* owner =
+        static_cast<utc_blink_ewk_intercept_request_response_write_chunk*>(
+            data);
+    size_t to_write = std::min(kDefaultChunkLength, owner->data_to_write_);
+    if (to_write) {
+      const char* chunk = owner->null_chunk_
+                              ? nullptr
+                              : owner->body_.c_str() + owner->data_written_;
+      Eina_Bool write_success = ewk_intercept_request_response_write_chunk(
+          owner->intercept_request_, chunk, to_write);
+      if (!write_success) {
+        owner->EventLoopStop(Failure);
+        owner->chunk_write_timer_ = nullptr;
+        return ECORE_CALLBACK_CANCEL;
+      }
+      owner->data_to_write_ -= to_write;
+      owner->data_written_ += to_write;
+      return ECORE_CALLBACK_RENEW;
+    } else {
+      owner->last_write_ = ewk_intercept_request_response_write_chunk(
+          owner->intercept_request_, nullptr, 0);
+      owner->chunk_write_timer_ = nullptr;
+      return ECORE_CALLBACK_CANCEL;
+    }
+  }
+
+  static void job_do_chunk_write(utc_blink_ewk_base* data) {
+    auto owner =
+        static_cast<utc_blink_ewk_intercept_request_response_write_chunk*>(
+            data);
+    // Writing happens outside of callback.
+    // Use timer with non-zero timeout to show async nature of this API.
+    owner->chunk_write_timer_ =
+        ecore_timer_add(0.01, (Ecore_Task_Cb)chunk_write_callback, owner);
+  }
+
+  bool status_set_result_;
+  bool content_type_header_result_;
+  bool content_length_header_result_;
+  bool last_write_;
+
+  bool null_intercept_request_;
+  bool null_chunk_;
+  size_t data_to_write_;
+  size_t data_written_;
+  std::string body_;
+  size_t body_length_;
+  Ecore_Timer* chunk_write_timer_;
+  Ewk_Intercept_Request* intercept_request_;
+  std::atomic<bool> callback_called_;
+};
+
+const char*
+    utc_blink_ewk_intercept_request_response_write_chunk::kInterceptURL =
+        "http://request.intercept.ewk.api.test/";
+
+const char* utc_blink_ewk_intercept_request_response_write_chunk::kBodyPre =
+    "<html><head><title>";
+const char* utc_blink_ewk_intercept_request_response_write_chunk::kBodyPost =
+    "</title></head>"
+    "<body>Hello, Request Intercept!</body></html>";
+const char* utc_blink_ewk_intercept_request_response_write_chunk::kTitle =
+    "CHUNKED WRITE SUCCESS";
+const size_t
+    utc_blink_ewk_intercept_request_response_write_chunk::kDefaultChunkLength =
+        5;
+
+/**
+ * @brief Tests if writing response in chunks for intercepted request results
+ *        in expected web page.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_write_chunk,
+       POS_TEST_WRITE_RESPONSE_IN_CHUNKS) {
+  PrepareAndStartChunkWrite(Success);
+  EXPECT_FALSE(last_write_);
+  EXPECT_STREQ(kTitle, ewk_view_title_get(GetEwkWebView()));
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_write_chunk,
+       NEG_TEST_NULL_INTERCEPT_REQUEST) {
+  null_intercept_request_ = true;
+  PrepareAndStartChunkWrite(Failure);
+}
+
+/**
+ * @brief Tests if EINA_FALSE is returned for null body chunk.
+ */
+TEST_F(utc_blink_ewk_intercept_request_response_write_chunk,
+       NEG_TEST_NULL_BODY_CHUNK) {
+  null_chunk_ = true;
+  PrepareAndStartChunkWrite(Failure);
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_scheme_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_scheme_get_func.cpp
new file mode 100644 (file)
index 0000000..bb249f6
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_get_base.h"
+
+class utc_blink_ewk_intercept_request_scheme_get
+    : public utc_blink_ewk_intercept_request_get_base {
+ public:
+  utc_blink_ewk_intercept_request_scheme_get()
+      : scheme_from_ewk_ptr_(nullptr) {}
+
+ protected:
+  void test_func(Ewk_Intercept_Request* intercept_request) override {
+    scheme_from_ewk_ptr_ = ewk_intercept_request_scheme_get(intercept_request);
+    if (scheme_from_ewk_ptr_) {
+      scheme_from_ewk_ = scheme_from_ewk_ptr_;
+    }
+  }
+
+  std::string scheme_from_ewk_;
+  const char* scheme_from_ewk_ptr_;
+  static const std::string kInterceptScheme;
+};
+
+const std::string utc_blink_ewk_intercept_request_scheme_get::kInterceptScheme =
+    kInterceptURL.substr(0, kInterceptURL.find(':'));
+
+/**
+ * @brief Tests if correct scheme is returned for intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_scheme_get, POS_TEST_SCHEME_GET) {
+  pos_test();
+  ASSERT_EQ(kInterceptScheme, scheme_from_ewk_);
+}
+
+/**
+ * @brief Tests if null scheme is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_scheme_get, NEG_TEST_SCHEME_GET_NULL) {
+  neg_test();
+  ASSERT_EQ(nullptr, scheme_from_ewk_ptr_);
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_url_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_intercept_request_url_get_func.cpp
new file mode 100644 (file)
index 0000000..206b867
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "utc_blink_ewk_intercept_request_get_base.h"
+
+class utc_blink_ewk_intercept_request_url_get
+    : public utc_blink_ewk_intercept_request_get_base {
+ public:
+  utc_blink_ewk_intercept_request_url_get() : url_from_ewk_ptr_(nullptr) {}
+
+ protected:
+  void test_func(Ewk_Intercept_Request* intercept_request) override {
+    url_from_ewk_ptr_ = ewk_intercept_request_url_get(intercept_request);
+    if (url_from_ewk_ptr_) {
+      url_from_ewk_ = url_from_ewk_ptr_;
+    }
+  }
+
+  std::string url_from_ewk_;
+  const char* url_from_ewk_ptr_;
+};
+
+/**
+ * @brief Tests if correct url is returned for intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_url_get, POS_TEST_URL_GET) {
+  pos_test();
+  ASSERT_EQ(kInterceptURL, url_from_ewk_);
+}
+
+/**
+ * @brief Tests if null url is returned for null intercept request.
+ */
+TEST_F(utc_blink_ewk_intercept_request_url_get, NEG_TEST_URL_GET_NULL) {
+  neg_test();
+  ASSERT_EQ(nullptr, url_from_ewk_ptr_);
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_view_did_change_theme_color_callback_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_view_did_change_theme_color_callback_set_func.cpp
new file mode 100644 (file)
index 0000000..758f974
--- /dev/null
@@ -0,0 +1,179 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+static const char* const kThemeColor1Url = "common/theme-color_1.html";
+static const char* const kThemeColor2Url = "common/theme-color_2.html";
+static const char* const kNoThemeColorUrl = "common/sample.html";
+
+class utc_blink_ewk_view_did_change_theme_color_callback_set
+    : public utc_blink_ewk_base {
+ public:
+  utc_blink_ewk_view_did_change_theme_color_callback_set()
+      : evas_object_(nullptr), url_loaded_(false) {}
+
+  void LoadFinished(Evas_Object* o) override { url_loaded_ = true; }
+
+  static void DidChangeThemeColorCallback(Evas_Object* o,
+                                          int r,
+                                          int g,
+                                          int b,
+                                          int a,
+                                          void* user_data) {
+    if (!user_data)
+      return;
+    auto owner =
+        static_cast<utc_blink_ewk_view_did_change_theme_color_callback_set*>(
+            user_data);
+    owner->evas_object_ = o;
+    owner->r_ = r;
+    owner->g_ = g;
+    owner->b_ = b;
+    owner->a_ = a;
+    owner->EventLoopStop(Success);
+  }
+
+  static void ThemeColor1UrlSetJob(utc_blink_ewk_base* data) {
+    auto owner =
+        static_cast<utc_blink_ewk_view_did_change_theme_color_callback_set*>(
+            data);
+    ewk_view_url_set(owner->GetEwkWebView(),
+                     owner->GetResourceUrl(kThemeColor1Url).c_str());
+  }
+
+  static void ThemeColor2UrlSetJob(utc_blink_ewk_base* data) {
+    auto owner =
+        static_cast<utc_blink_ewk_view_did_change_theme_color_callback_set*>(
+            data);
+    ewk_view_url_set(owner->GetEwkWebView(),
+                     owner->GetResourceUrl(kThemeColor2Url).c_str());
+  }
+
+  static void NoThemeColorUrlSetJob(utc_blink_ewk_base* data) {
+    auto owner =
+        static_cast<utc_blink_ewk_view_did_change_theme_color_callback_set*>(
+            data);
+    ewk_view_url_set(owner->GetEwkWebView(),
+                     owner->GetResourceUrl(kNoThemeColorUrl).c_str());
+  }
+
+ protected:
+  int r_;
+  int g_;
+  int b_;
+  int a_;
+  Evas_Object* evas_object_;
+  Eina_Bool url_loaded_;
+};
+
+/**
+ * @brief Checks if color received in callback is same as in "theme-color" meta
+ *        tag.
+ **/
+TEST_F(utc_blink_ewk_view_did_change_theme_color_callback_set,
+       POS_THEME_COLOR) {
+  ASSERT_EQ(EINA_TRUE, ewk_view_did_change_theme_color_callback_set(
+                           GetEwkWebView(), DidChangeThemeColorCallback, this));
+  SetTestJob(ThemeColor1UrlSetJob);
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(GetEwkWebView(), evas_object_);
+  EXPECT_EQ(50, r_);
+  EXPECT_EQ(100, g_);
+  EXPECT_EQ(150, b_);
+  EXPECT_EQ(255, a_);
+}
+
+/**
+ * @brief Checks if callback is received only first time, when urls with same
+ *        theme color are loaded one after another.
+ **/
+TEST_F(utc_blink_ewk_view_did_change_theme_color_callback_set,
+       POS_THEME_COLORS_SAME) {
+  ASSERT_EQ(EINA_TRUE, ewk_view_did_change_theme_color_callback_set(
+                           GetEwkWebView(), DidChangeThemeColorCallback, this));
+  SetTestJob(ThemeColor1UrlSetJob);
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(GetEwkWebView(), evas_object_);
+  SetTestJob(ThemeColor1UrlSetJob);
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(url_loaded_);
+}
+
+/**
+ * @brief Checks if callback is received twice first time, when urls with
+ *        different theme color are loaded one after another.
+ **/
+TEST_F(utc_blink_ewk_view_did_change_theme_color_callback_set,
+       POS_THEME_COLORS_DIFFERENT) {
+  ASSERT_EQ(EINA_TRUE, ewk_view_did_change_theme_color_callback_set(
+                           GetEwkWebView(), DidChangeThemeColorCallback, this));
+  SetTestJob(ThemeColor1UrlSetJob);
+  ASSERT_EQ(Success, EventLoopStart());
+  evas_object_ = nullptr;
+  SetTestJob(ThemeColor2UrlSetJob);
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(GetEwkWebView(), evas_object_);
+  EXPECT_EQ(100, r_);
+  EXPECT_EQ(150, g_);
+  EXPECT_EQ(200, b_);
+  EXPECT_EQ(255, a_);
+}
+
+/**
+ * @brief Checks if color is not received if url with no theme color is loaded
+ *        as first one.
+ **/
+TEST_F(utc_blink_ewk_view_did_change_theme_color_callback_set,
+       POS_NO_THEME_COLOR) {
+  ASSERT_EQ(EINA_TRUE, ewk_view_did_change_theme_color_callback_set(
+                           GetEwkWebView(), DidChangeThemeColorCallback, this));
+  SetTestJob(NoThemeColorUrlSetJob);
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(url_loaded_);
+}
+
+/**
+ * @brief Checks if callback is received if url with no theme color is loaded
+ *        after url with theme color.
+ **/
+TEST_F(utc_blink_ewk_view_did_change_theme_color_callback_set,
+       POS_NO_THEME_COLOR_AFTER_THEME_COLOR) {
+  ASSERT_EQ(EINA_TRUE, ewk_view_did_change_theme_color_callback_set(
+                           GetEwkWebView(), DidChangeThemeColorCallback, this));
+  SetTestJob(ThemeColor1UrlSetJob);
+  ASSERT_EQ(Success, EventLoopStart());
+  SetTestJob(NoThemeColorUrlSetJob);
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(GetEwkWebView(), evas_object_);
+  EXPECT_EQ(0, r_);
+  EXPECT_EQ(0, g_);
+  EXPECT_EQ(0, b_);
+  EXPECT_EQ(0, a_);
+}
+
+/**
+ * @brief Checks if callback is reset properly.
+ **/
+TEST_F(utc_blink_ewk_view_did_change_theme_color_callback_set,
+       POS_RESET_CALLBACK) {
+  ASSERT_EQ(EINA_TRUE, ewk_view_did_change_theme_color_callback_set(
+                           GetEwkWebView(), DidChangeThemeColorCallback, this));
+  SetTestJob(ThemeColor1UrlSetJob);
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(EINA_TRUE, ewk_view_did_change_theme_color_callback_set(
+                           GetEwkWebView(), nullptr, this));
+  SetTestJob(ThemeColor2UrlSetJob);
+  ASSERT_EQ(Timeout, EventLoopStart(3.0));
+  ASSERT_TRUE(url_loaded_);
+}
+
+/**
+ * @brief Checks if fails with webview being null.
+ **/
+TEST_F(utc_blink_ewk_view_did_change_theme_color_callback_set,
+       NEG_INVALID_WEBVIEW) {
+  ASSERT_EQ(EINA_FALSE, ewk_view_did_change_theme_color_callback_set(
+                            nullptr, DidChangeThemeColorCallback, this));
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_view_horizontal_panning_hold_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_view_horizontal_panning_hold_get_func.cpp
new file mode 100644 (file)
index 0000000..207c505
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+static const char* kURL = "/ewk_view/index_big_red_square.html";
+
+class utc_blink_ewk_view_horizontal_panning_hold_get
+    : public utc_blink_ewk_base {
+ protected:
+  void LoadFinished(Evas_Object*) override { EventLoopStop(Success); }
+};
+
+TEST_F(utc_blink_ewk_view_horizontal_panning_hold_get, POS_HOLD_DEFAULT) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_FALSE(ewk_view_horizontal_panning_hold_get(GetEwkWebView()));
+}
+
+TEST_F(utc_blink_ewk_view_horizontal_panning_hold_get, POS_HOLD_TRUE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_horizontal_panning_hold_set(GetEwkWebView(), EINA_TRUE);
+  ASSERT_TRUE(ewk_view_horizontal_panning_hold_get(GetEwkWebView()));
+}
+
+TEST_F(utc_blink_ewk_view_horizontal_panning_hold_get, POS_HOLD_FALSE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_horizontal_panning_hold_set(GetEwkWebView(), EINA_FALSE);
+  ASSERT_FALSE(ewk_view_horizontal_panning_hold_get(GetEwkWebView()));
+}
+
+TEST_F(utc_blink_ewk_view_horizontal_panning_hold_get, NEG_INVALID_VIEW) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_horizontal_panning_hold_set(GetEwkWebView(), EINA_TRUE);
+  ASSERT_FALSE(ewk_view_horizontal_panning_hold_get(nullptr));
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_view_horizontal_panning_hold_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_view_horizontal_panning_hold_set_func.cpp
new file mode 100644 (file)
index 0000000..5796b88
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+static const char* kURL = "/ewk_view/index_big_red_square.html";
+static const int kFirstTouchPosition = 500;
+static const double kTouchEventInterval = 0.012;
+
+class utc_blink_ewk_view_horizontal_panning_hold_set
+    : public utc_blink_ewk_base {
+ protected:
+  void LoadFinished(Evas_Object*) override { EventLoopStop(Success); }
+
+  // Move touch point from (500, 500) to (400, 400).
+  void Panning() {
+    Ewk_Touch_Point* touch_point = new Ewk_Touch_Point;
+    touch_point->id = 0;
+    touch_point->x = kFirstTouchPosition;
+    touch_point->y = kFirstTouchPosition;
+    touch_point->state = EVAS_TOUCH_POINT_DOWN;
+
+    Eina_List* list = nullptr;
+    list = eina_list_append(list, touch_point);
+
+    ewk_view_feed_touch_event(GetEwkWebView(), EWK_TOUCH_START, list, nullptr);
+
+    for (int i = 1; i <= 10; ++i) {
+      touch_point->x = kFirstTouchPosition - i * 10;
+      touch_point->y = kFirstTouchPosition - i * 10;
+      touch_point->state = EVAS_TOUCH_POINT_MOVE;
+
+      ewk_view_feed_touch_event(GetEwkWebView(), EWK_TOUCH_MOVE, list, nullptr);
+      EventLoopWait(kTouchEventInterval);
+    }
+
+    eina_list_free(list);
+    delete touch_point;
+  }
+};
+
+TEST_F(utc_blink_ewk_view_horizontal_panning_hold_set, POS_HOLD_TRUE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_touch_events_enabled_set(GetEwkWebView(), EINA_TRUE);
+  ewk_view_horizontal_panning_hold_set(GetEwkWebView(), EINA_TRUE);
+  Panning();
+  EventLoopWait(1.0);
+
+  int x, y;
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  EXPECT_NE(0, y);
+  EXPECT_EQ(0, x);
+}
+
+TEST_F(utc_blink_ewk_view_horizontal_panning_hold_set, POS_HOLD_FALSE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_touch_events_enabled_set(GetEwkWebView(), EINA_TRUE);
+  ewk_view_horizontal_panning_hold_set(GetEwkWebView(), EINA_FALSE);
+  Panning();
+  EventLoopWait(1.0);
+
+  int x, y;
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  EXPECT_NE(0, x);
+  EXPECT_NE(0, y);
+}
+
+TEST_F(utc_blink_ewk_view_horizontal_panning_hold_set, NEG_INVALID_VIEW) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_touch_events_enabled_set(GetEwkWebView(), EINA_TRUE);
+  ewk_view_horizontal_panning_hold_set(nullptr, EINA_TRUE);
+  Panning();
+  EventLoopWait(1.0);
+
+  int x, y;
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  EXPECT_NE(0, x);
+  EXPECT_NE(0, y);
+}
old mode 100755 (executable)
new mode 100644 (file)
index 1ba7418..ce332da
@@ -4,27 +4,63 @@
 
 #include "utc_blink_ewk_base.h"
 
-class utc_blink_ewk_view_page_visibility_state_set : public utc_blink_ewk_base
-{
+static const char* const kUrl = "common/sample.html";
+
+class utc_blink_ewk_view_page_visibility_state_set : public utc_blink_ewk_base {
+ private:
+  void LoadFinished(Evas_Object* webview) override { EventLoopStop(Success); }
 };
 
-TEST_F(utc_blink_ewk_view_page_visibility_state_set, POS_TEST1)
-{
-  Ewk_Page_Visibility_State test_state = EWK_PAGE_VISIBILITY_STATE_HIDDEN;
-  Eina_Bool result = ewk_view_page_visibility_state_set(GetEwkWebView(), test_state, EINA_TRUE);
-  utc_check_eq(result, EINA_TRUE);
+TEST_F(utc_blink_ewk_view_page_visibility_state_set, POS_STATE_HIDDEN) {
+  Eina_Bool result =
+      ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str());
+  ASSERT_EQ(EINA_TRUE, result);
+  ASSERT_EQ(Success, EventLoopStart());
+  result = ewk_view_page_visibility_state_set(
+      GetEwkWebView(), EWK_PAGE_VISIBILITY_STATE_HIDDEN, EINA_TRUE);
+  ASSERT_EQ(EINA_TRUE, result);
+}
+
+TEST_F(utc_blink_ewk_view_page_visibility_state_set, POS_STATE_VISIBLE) {
+  Eina_Bool result =
+      ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str());
+  ASSERT_EQ(EINA_TRUE, result);
+  ASSERT_EQ(Success, EventLoopStart());
+  result = ewk_view_page_visibility_state_set(
+      GetEwkWebView(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, EINA_FALSE);
+  ASSERT_EQ(EINA_TRUE, result);
+}
+
+TEST_F(utc_blink_ewk_view_page_visibility_state_set,
+       NEG_NO_CONTEXT_STATE_HIDDEN) {
+  Eina_Bool result = ewk_view_page_visibility_state_set(
+      GetEwkWebView(), EWK_PAGE_VISIBILITY_STATE_HIDDEN, EINA_TRUE);
+  ASSERT_EQ(EINA_FALSE, result);
+}
+
+TEST_F(utc_blink_ewk_view_page_visibility_state_set,
+       NEG_NO_CONTEXT_STATE_VISIBLE) {
+  Eina_Bool result = ewk_view_page_visibility_state_set(
+      GetEwkWebView(), EWK_PAGE_VISIBILITY_STATE_VISIBLE, EINA_TRUE);
+  ASSERT_EQ(EINA_FALSE, result);
 }
 
-TEST_F(utc_blink_ewk_view_page_visibility_state_set, POS_TEST2)
-{
-  Ewk_Page_Visibility_State test_state = EWK_PAGE_VISIBILITY_STATE_VISIBLE;
-  Eina_Bool result = ewk_view_page_visibility_state_set(GetEwkWebView(), test_state, EINA_FALSE);
-  utc_check_eq(result, EINA_TRUE);
+TEST_F(utc_blink_ewk_view_page_visibility_state_set, NEG_INVALID_WEBVIEW) {
+  Eina_Bool result =
+      ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str());
+  ASSERT_EQ(EINA_TRUE, result);
+  ASSERT_EQ(Success, EventLoopStart());
+  result = ewk_view_page_visibility_state_set(
+      NULL, EWK_PAGE_VISIBILITY_STATE_HIDDEN, EINA_TRUE);
+  ASSERT_EQ(EINA_FALSE, result);
 }
 
-TEST_F(utc_blink_ewk_view_page_visibility_state_set, NEG_TEST)
-{
-  Ewk_Page_Visibility_State test_state = EWK_PAGE_VISIBILITY_STATE_HIDDEN;
-  Eina_Bool result = ewk_view_page_visibility_state_set(NULL, test_state, EINA_FALSE);
-  utc_check_eq(result, EINA_FALSE);
+TEST_F(utc_blink_ewk_view_page_visibility_state_set, NEG_PRERENDER_STATE) {
+  Eina_Bool result =
+      ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str());
+  ASSERT_EQ(EINA_TRUE, result);
+  ASSERT_EQ(Success, EventLoopStart());
+  result = ewk_view_page_visibility_state_set(
+      GetEwkWebView(), EWK_PAGE_VISIBILITY_STATE_PRERENDER, EINA_TRUE);
+  ASSERT_EQ(EINA_FALSE, result);
 }
old mode 100755 (executable)
new mode 100644 (file)
index 7941ed4..96b9c08
 
 #include "utc_blink_ewk_base.h"
 
-class utc_blink_ewk_view_scroll_pos_get : public utc_blink_ewk_base
-{
- protected:
-  void PostSetUp() override
-  {
-    evas_object_smart_callback_add(GetEwkWebView(), "contents,size,changed", contentsSizeChanged, this);
-  }
-
-  void PreTearDown() override
-  {
-    evas_object_smart_callback_del(GetEwkWebView(), "contents,size,changed", contentsSizeChanged);
-  }
-
-  static void contentsSizeChanged(void* data, Evas_Object* eObject, void* dataFinished)
-  {
-    utc_message("[contentsSizeChanged] :: \n");
-    if(data)
-      static_cast<utc_blink_ewk_view_scroll_pos_get*>(data)->EventLoopStop(Success);
-  }
-protected:
-  static const char* resource;
-};
+const char* const kUrl = "ewk_view/index_big_red_square.html";
+
+const int kScrollX = 2;
+const int kScrollY = 3;
 
-const char* utc_blink_ewk_view_scroll_pos_get::resource="/ewk_view/index_big_red_square.html";
+class utc_blink_ewk_view_scroll_pos_get : public utc_blink_ewk_base {
+ private:
+  void LoadFinished(Evas_Object* o) override { EventLoopStop(Success); }
+};
 
 /**
- * @brief Positive test case of ewk_view_scroll_pos_get(), setting scroll position against after set, and scroll
- */
-TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST1)
-{
-  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+ *  * @brief Check if api succeeds with no scroll previously set
+ *   */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_NO_SET) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
   ASSERT_EQ(Success, EventLoopStart());
 
   int x = 0, y = 0;
-  const int valScrollSet = 2;
-
-  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), valScrollSet, valScrollSet));
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-
-  ASSERT_TRUE(x == valScrollSet && y == valScrollSet);
+  Eina_Bool result = ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_EQ(0, x);
+  EXPECT_EQ(0, y);
 }
 
 /**
- * @brief Positive test case of ewk_view_scroll_pos_get(), setting scroll position against after set, and scroll
- */
-TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST2)
-{
-  int x = 0, y = 0;
-  const int valScrollSet = -12 ;
-
-  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), valScrollSet, valScrollSet));
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+ *  * @brief Check if scroll value got equals to positive value set
+ *   */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 
-  ASSERT_TRUE(x == 0 && y == 0);
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), kScrollX, kScrollY);
+  ASSERT_EQ(EINA_TRUE, result);
+  int x = 0, y = 0;
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_EQ(kScrollX, x);
+  EXPECT_EQ(kScrollY, y);
 }
 
 /**
- * @brief ewk_view_scroll_pos_get() should return the same value as it has been set if main loop wasn't fired
- */
-TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST3)
-{
-  int x = 0, y = 0;
-
-  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+ *  * @brief Check if scroll value got equals to positive value set called
+ *  twice
+ *   */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TWICE) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
   ASSERT_EQ(Success, EventLoopStart());
 
-  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), 10, 10));
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-  ASSERT_EQ(10, x);
-  ASSERT_EQ(10, y);
-
-  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), 20, 20));
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-  ASSERT_EQ(20, x);
-  ASSERT_EQ(20, y);
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), kScrollX, kScrollY);
+  ASSERT_EQ(EINA_TRUE, result);
+  int x = 0, y = 0;
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_EQ(kScrollX, x);
+  EXPECT_EQ(kScrollY, y);
+  result = ewk_view_scroll_set(GetEwkWebView(), kScrollY, kScrollX);
+  ASSERT_EQ(EINA_TRUE, result);
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_EQ(kScrollY, x);
+  EXPECT_EQ(kScrollX, y);
 }
 
 /**
- * @brief ewk_view_scroll_pos_get() should return proper value after the engine tries to scroll over the page size
- */
-TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST4)
-{
-  int x = 0, y = 0;
-
-  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+ *  * @brief Check if x scroll value got equals to positive x value set
+ *   *        while y passed is null.
+ *    */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_SCROLL_Y_NULL) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
   ASSERT_EQ(Success, EventLoopStart());
 
-  int scrollSizeX = -1, scrollSizeY = -1;
-  ASSERT_TRUE(ewk_view_scroll_size_get(GetEwkWebView(), &scrollSizeX, &scrollSizeY));
-
-  int oversizeX = scrollSizeX + 100;
-  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), oversizeX, 10));
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-  ASSERT_EQ(scrollSizeX, x);
-  ASSERT_EQ(10, y);
-
-  ASSERT_TRUE(EventLoopWait(1));
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), kScrollX, kScrollY);
+  ASSERT_EQ(EINA_TRUE, result);
+  int x = 0;
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), &x, NULL);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_EQ(kScrollX, x);
+}
 
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-  ASSERT_NE(scrollSizeX, x);
-  ASSERT_EQ(10, y);
+/**
+ *  * @brief Check if y scroll value got equals to positive y value set
+ *   *        while x passed is null.
+ *    */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_SCROLL_X_NULL) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 
-  // Now at the end of the page
-  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), oversizeX, 10));
-  ASSERT_TRUE(EventLoopWait(1));
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-  ASSERT_EQ(scrollSizeX, x);
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), kScrollX, kScrollY);
+  ASSERT_EQ(EINA_TRUE, result);
+  int y = 0;
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), NULL, &y);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_EQ(kScrollY, y);
 }
 
 /**
- * @brief Same as POS_TEST4, but with negative value
- */
-TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_TEST5)
-{
-  int x = 0, y = 0;
-
-  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()));
+ *  * @brief Check if api succeeds if x and y values passed are null
+ *   */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, POS_SCROLL_X_Y_NULL) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
   ASSERT_EQ(Success, EventLoopStart());
 
-  ASSERT_TRUE(ewk_view_scroll_set(GetEwkWebView(), -100, 10));
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-  ASSERT_EQ(0, x);
-  ASSERT_EQ(10, y);
-
-  ASSERT_TRUE(EventLoopWait(1));
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), kScrollX, kScrollY);
+  ASSERT_EQ(EINA_TRUE, result);
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), NULL, NULL);
+  ASSERT_EQ(EINA_TRUE, result);
+}
 
-  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
-  ASSERT_EQ(0, x);
-  ASSERT_EQ(10, y);
+/**
+ *  * @brief Check if api returns EINA_FALSE for no context initialized
+ *   */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, NEG_NO_CONTEXT) {
+  int x, y;
+  ASSERT_EQ(EINA_FALSE, ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
 }
 
 /**
- * @brief Negative test case of ewk_view_scroll_pos_get(), testing for null
- */
-TEST_F(utc_blink_ewk_view_scroll_pos_get, NEG_TEST)
-{
-  int x,y;
-  Eina_Bool result = ewk_view_scroll_pos_get(NULL, &x, &y);
-  utc_check_eq(result, EINA_FALSE);
+ *  * @brief Check if api returns EINA_FALSE for null webview
+ *   */
+TEST_F(utc_blink_ewk_view_scroll_pos_get, NEG_INVALID_WEBVIEW) {
+  int x, y;
+  ASSERT_EQ(EINA_FALSE, ewk_view_scroll_pos_get(NULL, &x, &y));
 }
old mode 100755 (executable)
new mode 100644 (file)
index 8f90e07..4a61aac
 
 #include "utc_blink_ewk_base.h"
 
-class utc_blink_ewk_view_scroll_set : public utc_blink_ewk_base
-{
- protected:
-  static void contentsSizeChanged(void* data, Evas_Object* eObject, void* dataFinished)
-  {
-    utc_message("[contentsSizeChanged] :: \n");
-    if(data)
-      static_cast<utc_blink_ewk_view_scroll_set*>(data)->EventLoopStop(Success);
-  }
+const int kScrollX = 2;
+const int kScrollY = 3;
 
-   /* Startup function */
-  void PostSetUp() override
-  {
-    evas_object_smart_callback_add(GetEwkWebView(), "contents,size,changed", contentsSizeChanged, this);
-  }
-
-  /* Cleanup function */
-  void PreTearDown() override
-  {
-    evas_object_smart_callback_del(GetEwkWebView(), "contents,size,changed", contentsSizeChanged);
-  }
-
-protected:
-  static const char*const resource;
+class utc_blink_ewk_view_scroll_set : public utc_blink_ewk_base {
+ private:
+  void LoadFinished(Evas_Object* o) override { EventLoopStop(Success); }
 };
 
-const char*const utc_blink_ewk_view_scroll_set::resource="/ewk_view/index_big_red_square.html";
-
 /**
- * @brief Positive test case of ewk_view_scroll_set(),tseting scroll postion against after set, and scroll
+ * @brief Check if setting positive scroll values works
  */
+TEST_F(utc_blink_ewk_view_scroll_set, POS_SCROLL_POSITIVE) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 
-TEST_F(utc_blink_ewk_view_scroll_set, POS_TEST1)
-{
-  if(!ewk_view_url_set(GetEwkWebView(),GetResourceUrl(resource).c_str()))
-     utc_fail();
-  if(Success!=EventLoopStart())
-    utc_fail();
-
-  const int valScrollSet = 2;
-  Eina_Bool result = EINA_FALSE;
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), kScrollX, kScrollY);
+  ASSERT_EQ(EINA_TRUE, result);
+}
 
-  result = ewk_view_scroll_set(GetEwkWebView(), valScrollSet, valScrollSet);
-  utc_check_eq(result, EINA_TRUE);
+/**
+ * @brief Check if positive scroll values set works with no context
+ */
+TEST_F(utc_blink_ewk_view_scroll_set, POS_SCROLL_POSITIVE_NO_CONTEXT) {
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), kScrollX, kScrollY);
+  ASSERT_EQ(EINA_TRUE, result);
 }
 
 /**
- * @brief Positive test case of ewk_view_scroll_set(),tseting scroll postion against after set, and scroll
+ * @brief Check if positive scroll values over max scroll positions are not set
  */
+TEST_F(utc_blink_ewk_view_scroll_set, POS_SCROLL_POSITIVE_OVERSCROLL) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 
-TEST_F(utc_blink_ewk_view_scroll_set, POS_TEST2)
-{
-  const int valScrollSet = 2;
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), 9999, 9999);
+  ASSERT_EQ(EINA_TRUE, result);
   int x = 0, y = 0;
-  Eina_Bool result = EINA_FALSE;
-  Eina_Bool getCheck = EINA_FALSE;
-  Eina_Bool finalCheck = EINA_FALSE;
-
-  int w=0, h=0;
-  ewk_view_scroll_size_get(GetEwkWebView(), &w, &h);
-
-  result = ewk_view_scroll_set(GetEwkWebView(), valScrollSet, valScrollSet);
-
-  if (result == EINA_TRUE) {
-    getCheck = ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
-    utc_check_eq(getCheck, EINA_TRUE);
-  } else {
-    utc_check_eq(result, EINA_TRUE);
-  }
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_LT(0, x);
+  EXPECT_LT(0, y);
 }
 
 /**
- * @brief Positive test case of ewk_view_scroll_set(),tseting scroll postion against after set, and scroll
+ * @brief Check if negative scroll values are not set
  */
+TEST_F(utc_blink_ewk_view_scroll_set, POS_SCROLL_NEGATIVE) {
+  ASSERT_EQ(EINA_TRUE,
+            ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kUrl).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 
-TEST_F(utc_blink_ewk_view_scroll_set, POS_TEST3)
-{
+  Eina_Bool result = ewk_view_scroll_set(GetEwkWebView(), -2, -3);
+  ASSERT_EQ(EINA_TRUE, result);
   int x = 0, y = 0;
-  const int valScrollSet = -12;
-
-  ewk_view_scroll_set(GetEwkWebView(), valScrollSet, valScrollSet);
-
-  ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
-
-  Eina_Bool result = EINA_FALSE;
-  if (x == 0 && y == 0)
-    result = EINA_TRUE;
-
-  utc_check_eq(result, EINA_TRUE);
+  result = ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y);
+  ASSERT_EQ(EINA_TRUE, result);
+  EXPECT_EQ(0, x);
+  EXPECT_EQ(0, y);
 }
 
-
 /**
- * @brief Negative test case of ewk_view_scroll_set(), testing for null
+ * @brief Check if api returns EINA_FALSE for null webview
  */
-TEST_F(utc_blink_ewk_view_scroll_set, NEG_TEST)
-{
-  utc_check_eq(ewk_view_scroll_set(NULL, 1916, 1993), EINA_FALSE);
+TEST_F(utc_blink_ewk_view_scroll_set, NEG_INVALID_WEBVIEW) {
+  ASSERT_EQ(EINA_FALSE, ewk_view_scroll_set(NULL, kScrollX, kScrollY));
 }
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_view_vertical_panning_hold_get_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_view_vertical_panning_hold_get_func.cpp
new file mode 100644 (file)
index 0000000..bdf91f7
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+static const char* kURL = "/ewk_view/index_big_red_square.html";
+
+class utc_blink_ewk_view_vertical_panning_hold_get : public utc_blink_ewk_base {
+ protected:
+  void LoadFinished(Evas_Object*) override { EventLoopStop(Success); }
+};
+
+TEST_F(utc_blink_ewk_view_vertical_panning_hold_get, POS_HOLD_DEFAULT) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_FALSE(ewk_view_vertical_panning_hold_get(GetEwkWebView()));
+}
+
+TEST_F(utc_blink_ewk_view_vertical_panning_hold_get, POS_HOLD_TRUE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_vertical_panning_hold_set(GetEwkWebView(), EINA_TRUE);
+  ASSERT_TRUE(ewk_view_vertical_panning_hold_get(GetEwkWebView()));
+}
+
+TEST_F(utc_blink_ewk_view_vertical_panning_hold_get, POS_HOLD_FALSE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_vertical_panning_hold_set(GetEwkWebView(), EINA_FALSE);
+  ASSERT_FALSE(ewk_view_vertical_panning_hold_get(GetEwkWebView()));
+}
+
+TEST_F(utc_blink_ewk_view_vertical_panning_hold_get, NEG_INVALID_VIEW) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_vertical_panning_hold_set(GetEwkWebView(), EINA_TRUE);
+  ASSERT_FALSE(ewk_view_vertical_panning_hold_get(nullptr));
+}
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_view_vertical_panning_hold_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_view_vertical_panning_hold_set_func.cpp
new file mode 100644 (file)
index 0000000..578d21f
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright 2016 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utc_blink_ewk_base.h"
+
+static const char* kURL = "/ewk_view/index_big_red_square.html";
+static const int kFirstTouchPosition = 500;
+static const double kTouchEventInterval = 0.012;
+
+class utc_blink_ewk_view_vertical_panning_hold_set : public utc_blink_ewk_base {
+ protected:
+  void LoadFinished(Evas_Object*) override { EventLoopStop(Success); }
+
+  // Move touch point from (500, 500) to (400, 400).
+  void Panning() {
+    Ewk_Touch_Point* touch_point = new Ewk_Touch_Point;
+    touch_point->id = 0;
+    touch_point->x = kFirstTouchPosition;
+    touch_point->y = kFirstTouchPosition;
+    touch_point->state = EVAS_TOUCH_POINT_DOWN;
+
+    Eina_List* list = nullptr;
+    list = eina_list_append(list, touch_point);
+
+    ewk_view_feed_touch_event(GetEwkWebView(), EWK_TOUCH_START, list, nullptr);
+
+    for (int i = 1; i <= 10; ++i) {
+      touch_point->x = kFirstTouchPosition - i * 10;
+      touch_point->y = kFirstTouchPosition - i * 10;
+      touch_point->state = EVAS_TOUCH_POINT_MOVE;
+
+      ewk_view_feed_touch_event(GetEwkWebView(), EWK_TOUCH_MOVE, list, nullptr);
+      EventLoopWait(kTouchEventInterval);
+    }
+
+    eina_list_free(list);
+    delete touch_point;
+  }
+};
+
+TEST_F(utc_blink_ewk_view_vertical_panning_hold_set, POS_HOLD_TRUE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_touch_events_enabled_set(GetEwkWebView(), EINA_TRUE);
+  ewk_view_vertical_panning_hold_set(GetEwkWebView(), EINA_TRUE);
+  Panning();
+  EventLoopWait(1.0);
+
+  int x, y;
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  EXPECT_NE(0, x);
+  EXPECT_EQ(0, y);
+}
+
+TEST_F(utc_blink_ewk_view_vertical_panning_hold_set, POS_HOLD_FALSE) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_touch_events_enabled_set(GetEwkWebView(), EINA_TRUE);
+  ewk_view_vertical_panning_hold_set(GetEwkWebView(), EINA_FALSE);
+  Panning();
+  EventLoopWait(1.0);
+
+  int x, y;
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  EXPECT_NE(0, x);
+  EXPECT_NE(0, y);
+}
+
+TEST_F(utc_blink_ewk_view_vertical_panning_hold_set, NEG_INVALID_VIEW) {
+  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(kURL).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ewk_view_touch_events_enabled_set(GetEwkWebView(), EINA_TRUE);
+  ewk_view_vertical_panning_hold_set(nullptr, EINA_TRUE);
+  Panning();
+  EventLoopWait(1.0);
+
+  int x, y;
+  ASSERT_TRUE(ewk_view_scroll_pos_get(GetEwkWebView(), &x, &y));
+  EXPECT_NE(0, x);
+  EXPECT_NE(0, y);
+}