Commit 25cd5f17 authored by jochen@chromium.org's avatar jochen@chromium.org

Fix referrer policy passing during redirects

We a redirect commits, we should take the referrer policy from the
request we actually send and not from the one we intended to send.

Also, when the renderer tells the browser about a new navigation, always
update the referrer together with the URL

Depends on https://codereview.chromium.org/126753002/ in blink

BUG=331941
R=nasko@chromium.org
TEST=browser_tests:ReferrerPolicyTest.*

Review URL: https://codereview.chromium.org/128173002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@244138 0039d316-1c4b-4281-b951-d872f2087c98
parent c4086a76
......@@ -14,6 +14,8 @@
#include "chrome/browser/ui/tabs/tab_strip_model.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"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
......@@ -99,11 +101,27 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
GetExpectedTitle(url, EXPECT_ORIGIN_AS_REFERRER));
}
// Returns a string representation of a given |referrer_policy|.
std::string ReferrerPolicyToString(blink::WebReferrerPolicy referrer_policy) {
switch (referrer_policy) {
case blink::WebReferrerPolicyDefault:
return "default";
case blink::WebReferrerPolicyOrigin:
return "origin";
case blink::WebReferrerPolicyAlways:
return "always";
case blink::WebReferrerPolicyNever:
return "never";
default:
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 ("default", "always",
// "origin", "never")
// 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
......@@ -116,7 +134,7 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
//
// Returns:
// The URL of the first page navigated to.
GURL RunReferrerTest(const std::string referrer_policy,
GURL RunReferrerTest(const blink::WebReferrerPolicy referrer_policy,
bool start_on_https,
bool target_blank,
bool redirect,
......@@ -128,7 +146,7 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
start_on_https ? ssl_test_server_.get() : test_server_.get();
start_url = start_server->GetURL(
std::string("files/referrer-policy-start.html?") +
"policy=" + referrer_policy +
"policy=" + ReferrerPolicyToString(referrer_policy) +
"&port=" + base::IntToString(test_server_->host_port_pair().port()) +
"&ssl_port=" +
base::IntToString(ssl_test_server_->host_port_pair().port()) +
......@@ -173,6 +191,9 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
}
EXPECT_EQ(referrer_policy,
tab->GetController().GetActiveEntry()->GetReferrer().policy);
return start_url;
}
......@@ -189,70 +210,70 @@ class ReferrerPolicyTest : public InProcessBrowserTest {
// Content initiated navigation, from HTTP to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Origin) {
RunReferrerTest("origin", false, false, false, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, false,
blink::WebMouseEvent::ButtonNone,
EXPECT_ORIGIN_AS_REFERRER);
}
// Content initiated navigation, from HTTPS to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsDefault) {
RunReferrerTest("origin", true, false, false, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, false,
blink::WebMouseEvent::ButtonNone,
EXPECT_ORIGIN_AS_REFERRER);
}
// User initiated navigation, from HTTP to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, LeftClickOrigin) {
RunReferrerTest("origin", false, false, false, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, false,
blink::WebMouseEvent::ButtonLeft,
EXPECT_ORIGIN_AS_REFERRER);
}
// User initiated navigation, from HTTPS to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickOrigin) {
RunReferrerTest("origin", true, false, false, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, false,
blink::WebMouseEvent::ButtonLeft,
EXPECT_ORIGIN_AS_REFERRER);
}
// User initiated navigation, middle click, from HTTP to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickOrigin) {
RunReferrerTest("origin", false, false, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, true,
blink::WebMouseEvent::ButtonMiddle,
EXPECT_ORIGIN_AS_REFERRER);
}
// User initiated navigation, middle click, from HTTPS to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickOrigin) {
RunReferrerTest("origin", true, false, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, true,
blink::WebMouseEvent::ButtonMiddle,
EXPECT_ORIGIN_AS_REFERRER);
}
// User initiated navigation, target blank, from HTTP to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankOrigin) {
RunReferrerTest("origin", false, true, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, false, true,
blink::WebMouseEvent::ButtonLeft,
EXPECT_ORIGIN_AS_REFERRER);
}
// User initiated navigation, target blank, from HTTPS to HTTP.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankOrigin) {
RunReferrerTest("origin", true, true, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, false, true,
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("origin", false, true, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, false, true,
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("origin", true, true, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, false, true,
blink::WebMouseEvent::ButtonMiddle,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -261,7 +282,7 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickTargetBlankOrigin) {
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_ContextMenuOrigin) {
ContextMenuNotificationObserver context_menu_observer(
IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
RunReferrerTest("origin", false, false, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, false, true,
blink::WebMouseEvent::ButtonRight,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -270,35 +291,35 @@ 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("origin", true, false, false, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, false, true,
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("origin", false, false, true, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, false,
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("origin", true, false, true, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, false,
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("origin", false, false, true, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, false,
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("origin", true, false, true, false,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, false,
blink::WebMouseEvent::ButtonLeft,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -306,7 +327,7 @@ 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("origin", false, false, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, true,
blink::WebMouseEvent::ButtonMiddle,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -314,7 +335,7 @@ 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("origin", true, false, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, true,
blink::WebMouseEvent::ButtonMiddle,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -322,7 +343,7 @@ 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("origin", false, true, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, true, true,
blink::WebMouseEvent::ButtonLeft,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -330,7 +351,7 @@ 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("origin", true, true, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, true, true,
blink::WebMouseEvent::ButtonLeft,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -338,7 +359,7 @@ 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("origin", false, true, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, true, true, true,
blink::WebMouseEvent::ButtonMiddle,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -347,7 +368,7 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankRedirect) {
// via server redirect.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest,
HttpsMiddleClickTargetBlankRedirect) {
RunReferrerTest("origin", true, true, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, true, true, true,
blink::WebMouseEvent::ButtonMiddle,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -356,7 +377,7 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest,
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_ContextMenuRedirect) {
ContextMenuNotificationObserver context_menu_observer(
IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
RunReferrerTest("origin", false, false, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, false, false, true, true,
blink::WebMouseEvent::ButtonRight,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -365,7 +386,7 @@ 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("origin", true, false, true, true,
RunReferrerTest(blink::WebReferrerPolicyOrigin, true, false, true, true,
blink::WebMouseEvent::ButtonRight,
EXPECT_ORIGIN_AS_REFERRER);
}
......@@ -374,7 +395,11 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MAYBE_HttpsContextMenuRedirect) {
// policy, then navigate to C, back to B, and reload.
IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, History) {
// Navigate from A to B.
GURL start_url = RunReferrerTest("origin", true, false, true, false,
GURL start_url = RunReferrerTest(blink::WebReferrerPolicyOrigin,
true,
false,
true,
false,
blink::WebMouseEvent::ButtonLeft,
EXPECT_ORIGIN_AS_REFERRER);
......
......@@ -308,6 +308,7 @@ void NavigationControllerImpl::ReloadInternal(bool check_for_repost,
// POST wasn't involved; the latter case avoids issues with sending data to
// the wrong page.
entry->SetURL(entry->GetOriginalRequestURL());
entry->SetReferrer(Referrer());
}
if (g_check_for_repost && check_for_repost &&
......@@ -1056,6 +1057,7 @@ void NavigationControllerImpl::RendererDidNavigateToExistingPage(
// The URL may have changed due to redirects.
entry->SetURL(params.url);
entry->SetReferrer(params.referrer);
if (entry->update_virtual_url_with_url())
UpdateVirtualURLToURL(entry, params.url);
......@@ -1109,6 +1111,7 @@ void NavigationControllerImpl::RendererDidNavigateToSamePage(
if (existing_entry->update_virtual_url_with_url())
UpdateVirtualURLToURL(existing_entry, params.url);
existing_entry->SetURL(params.url);
existing_entry->SetReferrer(params.referrer);
// The page may have been requested with a different HTTP method.
existing_entry->SetHasPostData(params.is_post);
......
......@@ -1176,7 +1176,6 @@ void RenderFrameImpl::willSendRequest(
blink::WebReferrerPolicy referrer_policy;
if (internal_data->is_referrer_policy_set()) {
referrer_policy = internal_data->referrer_policy();
internal_data->clear_referrer_policy();
} else {
referrer_policy = frame->document().referrerPolicy();
}
......
......@@ -1963,9 +1963,7 @@ void RenderViewImpl::UpdateURL(WebFrame* frame) {
params.transition = static_cast<PageTransition>(
params.transition | PAGE_TRANSITION_CLIENT_REDIRECT);
} else {
// Bug 654101: the referrer will be empty on https->http transitions. It
// would be nice if we could get the real referrer from somewhere.
params.referrer = GetReferrerFromRequest(frame, original_request);
params.referrer = GetReferrerFromRequest(frame, ds->request());
}
base::string16 method = request.httpMethod();
......@@ -3587,6 +3585,7 @@ void RenderViewImpl::didCommitProvisionalLoad(WebFrame* frame,
internal_data->set_must_reset_scroll_and_scale_state(false);
}
internal_data->set_use_error_page(false);
internal_data->clear_referrer_policy();
if (is_new_navigation) {
// When we perform a new navigation, we need to update the last committed
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment