blob: 79a767e1f9c2555d0aab4466b9a26cef236cea3c [file] [log] [blame]
[email protected]dc3d1a32011-12-07 00:54:261// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/bind.h"
6#include "base/string_number_conversions.h"
7#include "base/utf_string_conversions.h"
8#include "chrome/browser/ui/browser.h"
9#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
10#include "chrome/test/base/in_process_browser_test.h"
11#include "chrome/test/base/ui_test_utils.h"
12#include "net/test/test_server.h"
13
14namespace {
15
16const FilePath::CharType kDocRoot[] =
17 FILE_PATH_LITERAL("chrome/test/data/referrer_policy");
18
19} // namespace
20
21class ReferrerPolicyTest : public InProcessBrowserTest {
22 public:
23 // Navigates to the given URL and waits for |num_navigations| to occur, and
24 // the title to change to |expected_title|.
25 void NavigateToURLAndWaitForTitle(const GURL& url,
26 const std::string& expected_title,
27 int num_navigations) {
28 ui_test_utils::TitleWatcher title_watcher(
[email protected]bb81f382012-01-03 22:45:4429 browser()->GetSelectedWebContents(),
[email protected]dc3d1a32011-12-07 00:54:2630 ASCIIToUTF16(expected_title));
31
32 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
33 browser(), url, num_navigations);
34
35 EXPECT_EQ(title_watcher.WaitAndGetTitle(), ASCIIToUTF16(expected_title));
36 }
37
38 enum ExpectedReferrer {
39 ExpectedReferrerIsEmpty,
40 ExpectedReferrerIsFull,
41 ExpectedReferrerIsOrigin
42 };
43
44 // Navigates from a page with a given |referrer_policy| (optionally on https)
45 // to a page on http that reports the passed referrer and checks that it
46 // matches the |expected_referrer|.
47 void RunReferrerTest(const std::string referrer_policy,
48 bool start_on_https,
49 ExpectedReferrer expected_referrer) {
50 net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
51 ASSERT_TRUE(test_server.Start());
52 net::TestServer ssl_test_server(net::TestServer::TYPE_HTTPS,
53 FilePath(kDocRoot));
54 ASSERT_TRUE(ssl_test_server.Start());
55
56 GURL start_url = test_server.GetURL(
57 std::string("files/referrer-policy-start.html?") + referrer_policy +
58 "&port=" + base::IntToString(test_server.host_port_pair().port()));
59 if (start_on_https) {
60 start_url = ssl_test_server.GetURL(
61 std::string("files/referrer-policy-start.html?") + referrer_policy +
62 "&port=" + base::IntToString(test_server.host_port_pair().port()));
63 }
64
65 std::string referrer;
66 switch (expected_referrer) {
67 case ExpectedReferrerIsEmpty:
68 referrer = "Referrer is empty";
69 break;
70 case ExpectedReferrerIsFull:
71 referrer = "Referrer is " + start_url.spec();
72 break;
73 case ExpectedReferrerIsOrigin:
74 referrer = "Referrer is " + start_url.GetWithEmptyPath().spec();
75 break;
76 }
77
78 NavigateToURLAndWaitForTitle(start_url, referrer, 2);
79 }
80};
81
82IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Default) {
83 RunReferrerTest("default", false, ExpectedReferrerIsFull);
84}
85
86IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Always) {
87 RunReferrerTest("always", false, ExpectedReferrerIsFull);
88}
89
90IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Origin) {
91 RunReferrerTest("origin", false, ExpectedReferrerIsOrigin);
92}
93
94IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Never) {
95 RunReferrerTest("never", false, ExpectedReferrerIsEmpty);
96}
97
98IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsDefault) {
99 RunReferrerTest("default", true, ExpectedReferrerIsEmpty);
100}
101
102IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsAlways) {
103 RunReferrerTest("always", true, ExpectedReferrerIsFull);
104}
105
106IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsOrigin) {
107 RunReferrerTest("origin", true, ExpectedReferrerIsOrigin);
108}
109
110IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsNever) {
111 RunReferrerTest("never", true, ExpectedReferrerIsEmpty);
112}
113
114IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Redirect) {
115 net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
116 ASSERT_TRUE(test_server.Start());
117 net::TestServer ssl_test_server(net::TestServer::TYPE_HTTPS,
118 FilePath(kDocRoot));
119 ASSERT_TRUE(ssl_test_server.Start());
120 GURL start_url = test_server.GetURL(
121 std::string("files/referrer-policy-redirect.html?") +
122 "ssl_port=" + base::IntToString(ssl_test_server.host_port_pair().port()) +
123 "&port=" + base::IntToString(test_server.host_port_pair().port()));
124 std::string referrer = "Referrer is " + start_url.GetWithEmptyPath().spec();
125 NavigateToURLAndWaitForTitle(start_url, referrer, 2);
126}