fix ewk_view_user_agent_set
authorArnaud Renevier <a.renevier@samsung.com>
Fri, 25 Sep 2015 19:46:41 +0000 (12:46 -0700)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
Right now, even when setting user agent, this change is not seen by web
pages. In order for the user agent to be considered, we need to load url
with override_user_agent param.

In order to simplify the setting of this flag, this patch also refactor
EWebView GetURL/SetURL. Now they get/return GURL instead of strings

Also, this patch prevents webpage from reloading when a load is in
progress.

Bug: http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=14400

Reviewed by: a1.gomes, j.majnert

Change-Id: Ie170885f10927cdda7afd9d5352e6a24944a2d29
Signed-off-by: Arnaud Renevier <a.renevier@samsung.com>
tizen_src/chromium_impl/content/browser/web_contents/web_contents_impl_efl.cc
tizen_src/chromium_impl/content/browser/web_contents/web_contents_impl_efl.h
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/public/ewk_view.cc
tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc
tizen_src/ewk/unittest/utc_blink_ewk_view_user_agent_set_func.cpp

index 25291b4..72cc4a4 100644 (file)
@@ -81,6 +81,24 @@ WebContents* WebContentsImplEfl::Clone() {
   return NULL;
 }
 
+void WebContentsImplEfl::SetUserAgentOverride(const std::string& override) {
+  if (GetUserAgentOverride() == override)
+    return;
+
+  renderer_preferences_.user_agent_override = override;
+
+  // Send the new override string to the renderer.
+  RenderViewHost* host = GetRenderViewHost();
+  if (host)
+    host->SyncRendererPrefs();
+
+  // In chromium upstream, page is reloaded if a load is currently in progress.
+  // In chromium-efl port, the behaviour is different.
+
+  FOR_EACH_OBSERVER(WebContentsObserver, observers_,
+                    UserAgentOverrideSet(override));
+}
+
 void WebContentsImplEfl::CreateNewWindow(
     int render_process_id,
     int route_id,
index 23ed81d..62df9aa 100644 (file)
@@ -33,6 +33,8 @@ class CONTENT_EXPORT WebContentsImplEfl : public WebContentsImpl {
   // Overrides for WebContents
   WebContents* Clone() override;
 
+  void SetUserAgentOverride(const std::string& override) override;
+
  private:
   // Needed to access private WebContentsImplEfl constructor from
   // WebContents/WebContetnsImpl static Create* functions.
index da57d64..8660019 100644 (file)
@@ -432,14 +432,14 @@ Evas_Object* EWebView::GetHostWindowDelegate(
   return thiz->evas_object_;
 }
 
-void EWebView::SetURL(const char* url_string) {
-  GURL url(url_string);
+void EWebView::SetURL(const GURL& url) {
   NavigationController::LoadURLParams params(url);
+  params.override_user_agent = NavigationController::UA_OVERRIDE_TRUE;
   web_contents_->GetController().LoadURLWithParams(params);
 }
 
-const char* EWebView::GetURL() const {
-  return web_contents_->GetVisibleURL().possibly_invalid_spec().c_str();
+const GURL& EWebView::GetURL() const {
+  return web_contents_->GetVisibleURL();
 }
 
 void EWebView::Reload() {
@@ -817,8 +817,7 @@ bool EWebView::SetPrivateBrowsing(bool incognito) {
   }
 
   InitializeContent();
-  NavigationController::LoadURLParams params(url);
-  web_contents_->GetController().LoadURLWithParams(params);
+  SetURL(url);
   return true;
 }
 
@@ -938,6 +937,7 @@ void EWebView::LoadData(const char* data, size_t size, const char* mime_type, co
 
   data_params.load_type = NavigationController::LOAD_TYPE_DATA;
   data_params.should_replace_current_entry = false;
+  data_params.override_user_agent = NavigationController::UA_OVERRIDE_TRUE;
   web_contents_->GetController().LoadURLWithParams(data_params);
 }
 
@@ -1997,11 +1997,11 @@ bool EWebView::StopInspectorServer() {
 
 void EWebView::InvokeWebProcessCrashedCallback() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  const char* last_url = GetURL();
+  const GURL last_url = GetURL();
   bool callback_handled = false;
   SmartCallback<EWebViewCallbacks::WebProcessCrashed>().call(&callback_handled);
   if (!callback_handled)
-    LoadHTMLString(kRendererCrashedHTMLMessage, NULL, last_url);
+    LoadHTMLString(kRendererCrashedHTMLMessage, NULL, last_url.possibly_invalid_spec().c_str());
 }
 
 void EWebView::HandleRendererProcessCrash() {
@@ -2125,6 +2125,7 @@ void EWebView::UrlRequestSet(const char* url,
   content::NavigationController::LoadURLParams params =
       content::NavigationController::LoadURLParams(GURL(url));
   params.load_type = loadtype;
+  params.override_user_agent = NavigationController::UA_OVERRIDE_TRUE;
 
   if (body) {
     std::string s(body);
index e84f6ad..949708a 100644 (file)
@@ -232,8 +232,8 @@ class EWebView {
   void set_magnifier(bool status);
 
   // ewk_view api
-  void SetURL(const char* url_string);
-  const char* GetURL() const;
+  void SetURL(const GURL& url);
+  const GURL& GetURL() const;
   void Reload();
   void ReloadIgnoringCache();
   Eina_Bool CanGoBack();
index 849367c..a53502a 100644 (file)
@@ -49,6 +49,7 @@
 #include "private/ewk_view_private.h"
 #include "third_party/WebKit/public/web/WebViewModeEnums.h"
 #include "ui/events/gesture_detection/gesture_configuration.h"
+#include "url/gurl.h"
 #include "usermedia_permission_popup.h"
 #include "web_contents_delegate_efl.h"
 
@@ -129,10 +130,11 @@ Ewk_Context *ewk_view_context_get(const Evas_Object *view)
   return static_cast<Ewk_Context*>(impl->context());
 }
 
-Eina_Bool ewk_view_url_set(Evas_Object* view, const char* url)
+Eina_Bool ewk_view_url_set(Evas_Object* view, const char* url_string)
 {
   EWK_VIEW_IMPL_GET_OR_RETURN(view, impl, false);
-  EINA_SAFETY_ON_NULL_RETURN_VAL(url, false);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(url_string, false);
+  GURL url(url_string);
   impl->SetURL(url);
   return true;
 }
@@ -140,7 +142,7 @@ Eina_Bool ewk_view_url_set(Evas_Object* view, const char* url)
 const char* ewk_view_url_get(const Evas_Object* view)
 {
   EWK_VIEW_IMPL_GET_OR_RETURN(view, impl, 0);
-  return impl->GetURL();
+  return impl->GetURL().possibly_invalid_spec().c_str();
 }
 
 
index 0fca8da..f634aeb 100644 (file)
@@ -135,7 +135,7 @@ WebContents* WebContentsDelegateEfl::OpenURLFromTab(
     EWebView* wv = WebViewDelegateEwk::GetInstance().
       GetWebViewFromEvasObject(new_object);
     DCHECK(wv);
-    wv->SetURL(url.spec().c_str());
+    wv->SetURL(url);
     return NULL;
   }
 
index 1d28555..4530034 100755 (executable)
 class utc_blink_ewk_view_user_agent_set : public utc_blink_ewk_base
 {
 protected:
-  void LoadFinished(Evas_Object* webview)
+  void PostSetUp() override {
+    default_ua_ = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
+    ASSERT_TRUE(default_ua_);
+    ASSERT_STRNE(default_ua_, USER_AGENT_STRING);
+  }
+
+  void PreTearDown() override {
+    // reset user agent to default value
+    ewk_view_user_agent_set(GetEwkWebView(), "");
+    if (default_ua_) {
+      eina_stringshare_del(default_ua_);
+      default_ua_ = NULL;
+    }
+    if (current_ua_) {
+      eina_stringshare_del(current_ua_);
+      current_ua_ = NULL;
+    }
+  }
+
+  void LoadFinished(Evas_Object* webview) override
   {
-    EventLoopStop(utc_blink_ewk_base::Failure); // won't fail the test if EventLoopStop was already called
+    if (!ewk_view_script_execute(GetEwkWebView(), "navigator.userAgent", scriptExecutionFinished, this)) {
+      FAIL();
+    }
   }
+
+  /* Callback for script execution */
+  static void scriptExecutionFinished(Evas_Object* webview, const char* result_value, void* data) {
+    if (data) {
+      static_cast<utc_blink_ewk_view_user_agent_set*>(data)->current_ua_ = eina_stringshare_add(result_value);
+      static_cast<utc_blink_ewk_view_user_agent_set*>(data)->EventLoopStop(Success);
+    }
+  }
+
+  Eina_Stringshare* current_ua_;
+  Eina_Stringshare* default_ua_;
 };
 
+
 /**
  * @brief Positive test case of ewk_view_user_agent_set()
  */
 TEST_F(utc_blink_ewk_view_user_agent_set, POS_TEST)
 {
-  Eina_Stringshare* defaultUA = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
-  ASSERT_TRUE(defaultUA);
-  ASSERT_STRNE(defaultUA, USER_AGENT_STRING);
-
   EXPECT_TRUE(ewk_view_user_agent_set(GetEwkWebView(), USER_AGENT_STRING));
   Eina_Stringshare* ua = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
   ASSERT_TRUE(ua);
   EXPECT_STREQ(USER_AGENT_STRING, ua);
 
-  eina_stringshare_del(defaultUA);
+  ewk_view_url_set(GetEwkWebView(), "about:blank");
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_STREQ(USER_AGENT_STRING, current_ua_);
   eina_stringshare_del(ua);
 }
 
@@ -39,23 +70,23 @@ TEST_F(utc_blink_ewk_view_user_agent_set, POS_TEST)
  */
 TEST_F(utc_blink_ewk_view_user_agent_set, EmptyString)
 {
-  Eina_Stringshare* defaultUA = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
-  ASSERT_TRUE(defaultUA);
-  ASSERT_STRNE(defaultUA, USER_AGENT_STRING);
-
   EXPECT_TRUE(ewk_view_user_agent_set(GetEwkWebView(), USER_AGENT_STRING));
   Eina_Stringshare* ua = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
   ASSERT_TRUE(ua);
   EXPECT_STREQ(USER_AGENT_STRING, ua);
+  ewk_view_url_set(GetEwkWebView(), "about:blank");
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_STREQ(USER_AGENT_STRING, current_ua_);
+  eina_stringshare_del(ua);
 
   EXPECT_TRUE(ewk_view_user_agent_set(GetEwkWebView(), ""));
 
-  eina_stringshare_del(ua);
   ua = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
   ASSERT_TRUE(ua);
-  EXPECT_STREQ(defaultUA, ua);
-
-  eina_stringshare_del(defaultUA);
+  EXPECT_STREQ(default_ua_, ua);
+  ewk_view_url_set(GetEwkWebView(), "about:blank");
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_STREQ(default_ua_, current_ua_);
   eina_stringshare_del(ua);
 }
 
@@ -64,23 +95,20 @@ TEST_F(utc_blink_ewk_view_user_agent_set, EmptyString)
  */
 TEST_F(utc_blink_ewk_view_user_agent_set, NullString)
 {
-  Eina_Stringshare* defaultUA = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
-  ASSERT_TRUE(defaultUA);
-  ASSERT_STRNE(defaultUA, USER_AGENT_STRING);
-
   EXPECT_TRUE(ewk_view_user_agent_set(GetEwkWebView(), USER_AGENT_STRING));
   Eina_Stringshare* ua = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
   ASSERT_TRUE(ua);
   EXPECT_STREQ(USER_AGENT_STRING, ua);
+  ewk_view_url_set(GetEwkWebView(), "about:blank");
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_STREQ(USER_AGENT_STRING, current_ua_);
+  eina_stringshare_del(ua);
 
   EXPECT_TRUE(ewk_view_user_agent_set(GetEwkWebView(), NULL));
 
-  eina_stringshare_del(ua);
   ua = eina_stringshare_add(ewk_view_user_agent_get(GetEwkWebView()));
   ASSERT_TRUE(ua);
-  EXPECT_STREQ(defaultUA, ua);
-
-  eina_stringshare_del(defaultUA);
+  EXPECT_STREQ(default_ua_, ua);
   eina_stringshare_del(ua);
 }