// 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"
#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"
// 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:
}
}
+ 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.
// 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());
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,
// 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);
}
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);
}
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);
}
// 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);
}
// 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);
}
// 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);
}
// 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);
}
// 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);
}
// 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);
}
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);
}
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);
}
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);
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);
+}