Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / referrer_policy_browsertest.cc
index a078fd7..852dfd6 100644 (file)
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/prefs/pref_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/chrome_command_ids.h"
@@ -12,6 +13,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/browser/navigation_controller.h"
@@ -73,7 +75,7 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
   // Returns the expected title for the tab with the given (full) referrer and
   // the expected modification of it.
   base::string16 GetExpectedTitle(const GURL& url,
-                            ExpectedReferrer expected_referrer) {
+                                  ExpectedReferrer expected_referrer) {
     std::string referrer;
     switch (expected_referrer) {
       case EXPECT_EMPTY_REFERRER:
@@ -118,16 +120,33 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
     }
   }
 
+  enum StartOnProtocol { START_ON_HTTP, START_ON_HTTPS, };
+
+  enum LinkType { REGULAR_LINK, LINk_WITH_TARGET_BLANK, };
+
+  enum RedirectType { NO_REDIRECT, SERVER_REDIRECT, SERVER_REDIRECT_ON_HTTP, };
+
+  std::string RedirectTypeToString(RedirectType redirect) {
+    switch (redirect) {
+      case NO_REDIRECT:
+        return "none";
+      case SERVER_REDIRECT:
+        return "https";
+      case SERVER_REDIRECT_ON_HTTP:
+        return "http";
+    }
+    NOTREACHED();
+    return "";
+  }
+
   // Navigates from a page with a given |referrer_policy| and checks that the
   // reported referrer matches the expectation.
   // Parameters:
   //  referrer_policy:   The referrer policy to test.
-  //  start_on_https:    True if the test should start on an HTTPS page.
-  //  target_blank:      True if the link that is generated should have the
-  //                     attribute target=_blank
-  //  redirect:          True if the link target should first do a server
-  //                     redirect before evaluating the passed referrer.
-  //  opens_new_tab:     True if this test opens a new tab.
+  //  start_protocol:    The protocol the test should start on.
+  //  link_type:         The link type that is used to trigger the navigation.
+  //  redirect:          Whether the link target should redirect and how.
+  //  disposition:       The disposition for the navigation.
   //  button:            If not WebMouseEvent::ButtonNone, click on the
   //                     link with the specified mouse button.
   //  expected_referrer: The kind of referrer to expect.
@@ -135,25 +154,25 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
   // Returns:
   //  The URL of the first page navigated to.
   GURL RunReferrerTest(const blink::WebReferrerPolicy referrer_policy,
-                       bool start_on_https,
-                       bool target_blank,
-                       bool redirect,
-                       bool opens_new_tab,
+                       StartOnProtocol start_protocol,
+                       LinkType link_type,
+                       RedirectType redirect,
+                       WindowOpenDisposition disposition,
                        blink::WebMouseEvent::Button button,
                        ExpectedReferrer expected_referrer) {
     GURL start_url;
-    net::SpawnedTestServer* start_server =
-        start_on_https ? ssl_test_server_.get() : test_server_.get();
+    net::SpawnedTestServer* start_server = start_protocol == START_ON_HTTPS
+                                               ? ssl_test_server_.get()
+                                               : test_server_.get();
     start_url = start_server->GetURL(
-        std::string("files/referrer-policy-start.html?") +
-        "policy=" + ReferrerPolicyToString(referrer_policy) +
-        "&port=" + base::IntToString(test_server_->host_port_pair().port()) +
+        std::string("files/referrer-policy-start.html?") + "policy=" +
+        ReferrerPolicyToString(referrer_policy) + "&port=" +
+        base::IntToString(test_server_->host_port_pair().port()) +
         "&ssl_port=" +
-            base::IntToString(ssl_test_server_->host_port_pair().port()) +
-        "&redirect=" + (redirect ? "true" : "false") +
-        "&link=" +
-            (button == blink::WebMouseEvent::ButtonNone ? "false" : "true") +
-        "&target=" + (target_blank ? "_blank" : ""));
+        base::IntToString(ssl_test_server_->host_port_pair().port()) +
+        "&redirect=" + RedirectTypeToString(redirect) + "&link=" +
+        (button == blink::WebMouseEvent::ButtonNone ? "false" : "true") +
+        "&target=" + (link_type == LINk_WITH_TARGET_BLANK ? "_blank" : ""));
 
     ui_test_utils::WindowedTabAddedNotificationObserver tab_added_observer(
         content::NotificationService::AllSources());
@@ -181,14 +200,14 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
       tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
     }
 
-    if (opens_new_tab) {
+    if (disposition == CURRENT_TAB) {
+      EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+    } else {
       tab_added_observer.Wait();
       tab = tab_added_observer.GetTab();
       EXPECT_TRUE(tab);
       content::WaitForLoadStop(tab);
       EXPECT_EQ(expected_title, tab->GetTitle());
-    } else {
-      EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
     }
 
     EXPECT_EQ(referrer_policy,
@@ -210,70 +229,110 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
 
 // Content initiated navigation, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Origin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonNone,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // Content initiated navigation, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsDefault) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonNone,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, LeftClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, target blank, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  LINk_WITH_TARGET_BLANK,
+                  NO_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, target blank, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  LINk_WITH_TARGET_BLANK,
+                  NO_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, target blank, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  LINk_WITH_TARGET_BLANK,
+                  NO_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, target blank, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickTargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  LINk_WITH_TARGET_BLANK,
+                  NO_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -282,7 +341,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickTargetBlankOrigin) {
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_ContextMenuOrigin) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonRight,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -291,35 +354,55 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_ContextMenuOrigin) {
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_HttpsContextMenuOrigin) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  NO_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonRight,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // Content initiated navigation, from HTTP to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Redirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonNone,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // Content initiated navigation, from HTTPS to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonNone,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTP to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, LeftClickRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTPS to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, false,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  CURRENT_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -327,7 +410,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickRedirect) {
 // User initiated navigation, middle click, from HTTP to HTTP via server
 // redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -335,7 +422,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickRedirect) {
 // User initiated navigation, middle click, from HTTPS to HTTP via server
 // redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -343,7 +434,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickRedirect) {
 // User initiated navigation, target blank, from HTTP to HTTP via server
 // redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  LINk_WITH_TARGET_BLANK,
+                  SERVER_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -351,7 +446,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankRedirect) {
 // User initiated navigation, target blank, from HTTPS to HTTP via server
 // redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  LINk_WITH_TARGET_BLANK,
+                  SERVER_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonLeft,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -359,7 +458,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankRedirect) {
 // User initiated navigation, middle click, target blank, from HTTP to HTTP via
 // server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  LINk_WITH_TARGET_BLANK,
+                  SERVER_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -368,7 +471,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankRedirect) {
 // via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest,
                        HttpsMiddleClickTargetBlankRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  LINk_WITH_TARGET_BLANK,
+                  SERVER_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonMiddle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -377,7 +484,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest,
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_ContextMenuRedirect) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTP,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonRight,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -386,7 +497,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_ContextMenuRedirect) {
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_HttpsContextMenuRedirect) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, true,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                  START_ON_HTTPS,
+                  REGULAR_LINK,
+                  SERVER_REDIRECT,
+                  NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::ButtonRight,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -396,10 +511,10 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_HttpsContextMenuRedirect) {
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, History) {
   // Navigate from A to B.
   GURL start_url = RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                                   true,
-                                   false,
-                                   true,
-                                   false,
+                                   START_ON_HTTPS,
+                                   REGULAR_LINK,
+                                   SERVER_REDIRECT,
+                                   CURRENT_TAB,
                                    blink::WebMouseEvent::ButtonLeft,
                                    EXPECT_ORIGIN_AS_REFERRER);
 
@@ -434,3 +549,82 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, History) {
   chrome::ReloadIgnoringCache(browser(), CURRENT_TAB);
   EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle());
 }
+
+// Tests that reloading a site for "request tablet version" correctly clears
+// the referrer.
+IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, RequestTabletSite) {
+  GURL start_url = RunReferrerTest(blink::WebReferrerPolicyOrigin,
+                                   START_ON_HTTPS,
+                                   REGULAR_LINK,
+                                   SERVER_REDIRECT_ON_HTTP,
+                                   CURRENT_TAB,
+                                   blink::WebMouseEvent::ButtonLeft,
+                                   EXPECT_ORIGIN_AS_REFERRER);
+
+  base::string16 expected_title =
+      GetExpectedTitle(start_url, EXPECT_EMPTY_REFERRER);
+  content::WebContents* tab =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::TitleWatcher title_watcher(tab, expected_title);
+
+  // Watch for all possible outcomes to avoid timeouts if something breaks.
+  AddAllPossibleTitles(start_url, &title_watcher);
+
+  // Request tablet version.
+  chrome::ToggleRequestTabletSite(browser());
+  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+}
+
+// Test that an iframes gets the parent frames referrer and referrer policy if
+// the load was triggered by the parent, or from the iframe itself, if the
+// navigations was started by the iframe.
+IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, IFrame) {
+  browser()->profile()->GetPrefs()->SetBoolean(
+      prefs::kWebKitAllowRunningInsecureContent, true);
+  content::WebContents* tab =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  base::string16 expected_title(base::ASCIIToUTF16("loaded"));
+  scoped_ptr<content::TitleWatcher> title_watcher(
+      new content::TitleWatcher(tab, expected_title));
+
+  // Load a page that loads an iframe.
+  ui_test_utils::NavigateToURL(
+      browser(),
+      ssl_test_server_->GetURL(
+          std::string("files/referrer-policy-iframe.html?") +
+          base::IntToString(test_server_->host_port_pair().port())));
+  EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle());
+
+  // Verify that the referrer policy was honored and the main page's origin was
+  // send as referrer.
+  std::string title;
+  EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractString(
+      tab,
+      "//iframe",
+      "window.domAutomationController.send(document.title)",
+      &title));
+  EXPECT_EQ("Referrer is " + ssl_test_server_->GetURL(std::string()).spec(),
+            title);
+
+  // Reload the iframe.
+  expected_title = base::ASCIIToUTF16("reset");
+  title_watcher.reset(new content::TitleWatcher(tab, expected_title));
+  EXPECT_TRUE(content::ExecuteScript(tab, "document.title = 'reset'"));
+  EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle());
+
+  expected_title = base::ASCIIToUTF16("loaded");
+  title_watcher.reset(new content::TitleWatcher(tab, expected_title));
+  EXPECT_TRUE(
+      content::ExecuteScriptInFrame(tab, "//iframe", "location.reload()"));
+  EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle());
+
+  // Verify that the full url of the iframe was used as referrer.
+  EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractString(
+      tab,
+      "//iframe",
+      "window.domAutomationController.send(document.title)",
+      &title));
+  EXPECT_EQ("Referrer is " +
+                test_server_->GetURL("files/referrer-policy-log.html").spec(),
+            title);
+}