Commit 09d47173 authored by Rulong Chen(陈汝龙)'s avatar Rulong Chen(陈汝龙) Committed by Commit Bot

Add Referrer for download request

We should contain Referrer header when a download is triggered
via anchor tag with download attribute.

Bug: 455987
Change-Id: I599abab8192095c7d4e6703807fa936b6c8e2024
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2262023
Commit-Queue: Nate Chapin <japhet@chromium.org>
Reviewed-by: default avatarNate Chapin <japhet@chromium.org>
Cr-Commit-Position: refs/heads/master@{#786346}
parent a4ea04f6
......@@ -844,6 +844,7 @@ Ruben Bridgewater <ruben@bridgewater.de>
Ruben Terrazas <rubentopo@gmail.com>
Rufus Hamade <rufus.hamade@imgtec.com>
Ruiyi Luo <luoruiyi2008@gmail.com>
Rulong Chen <rulong.crl@alibaba-inc.com>
Russell Davis <russell.davis@gmail.com>
Ryan Ackley <ryanackley@gmail.com>
Ryan Norton <rnorton10@gmail.com>
......
......@@ -223,6 +223,30 @@ const cc::ScrollNode* GetScrollNode(const cc::Layer* layer) {
->scroll_tree.FindNodeFromElementId(layer->element_id());
}
std::string GetHTMLStringForReferrerPolicy(const std::string& meta_policy,
const std::string& referrer_policy) {
std::string meta_tag =
meta_policy.empty()
? ""
: base::StringPrintf("<meta name='referrer' content='%s'>",
meta_policy.c_str());
std::string referrer_policy_attr =
referrer_policy.empty()
? ""
: base::StringPrintf("referrerpolicy='%s'", referrer_policy.c_str());
return base::StringPrintf(
"<!DOCTYPE html>"
"%s"
"<a id='dl' href='download_test' download='foo' %s>Click me</a>"
"<script>"
"(function () {"
" var evt = document.createEvent('MouseEvent');"
" evt.initMouseEvent('click', true, true);"
" document.getElementById('dl').dispatchEvent(evt);"
"})();"
"</script>",
meta_tag.c_str(), referrer_policy_attr.c_str());
}
} // namespace
const int kTouchPointPadding = 32;
......@@ -13503,4 +13527,79 @@ TEST_F(WebFrameTest, FormSubmitCancelsNavigation) {
RunPendingTasks();
}
class TestLocalFrameHostForAnchorWithDownloadAttr : public FakeLocalFrameHost {
public:
TestLocalFrameHostForAnchorWithDownloadAttr() = default;
~TestLocalFrameHostForAnchorWithDownloadAttr() override = default;
// FakeLocalFrameHost:
void DownloadURL(mojom::blink::DownloadURLParamsPtr params) override {
referrer_ = params->referrer ? params->referrer->url : KURL();
referrer_policy_ = params->referrer
? params->referrer->policy
: ReferrerPolicyResolveDefault(
network::mojom::ReferrerPolicy::kDefault);
}
KURL referrer_;
network::mojom::ReferrerPolicy referrer_policy_;
};
TEST_F(WebFrameTest, DownloadReferrerPolicy) {
TestLocalFrameHostForAnchorWithDownloadAttr frame_host;
frame_test_helpers::TestWebFrameClient web_frame_client;
frame_host.Init(web_frame_client.GetRemoteNavigationAssociatedInterfaces());
frame_test_helpers::WebViewHelper web_view_helper;
web_view_helper.Initialize(&web_frame_client);
WebLocalFrameImpl* frame = web_view_helper.LocalMainFrame();
KURL test_url = ToKURL("http://www.test.com/foo/index.html");
// 1.<meta name='referrer' content='no-referrer'>
frame_test_helpers::LoadHTMLString(
frame, GetHTMLStringForReferrerPolicy("no-referrer", std::string()),
test_url);
EXPECT_TRUE(frame_host.referrer_.IsEmpty());
EXPECT_EQ(frame_host.referrer_policy_,
network::mojom::ReferrerPolicy::kNever);
// 2.<meta name='referrer' content='origin'>
frame_test_helpers::LoadHTMLString(
frame, GetHTMLStringForReferrerPolicy("origin", std::string()), test_url);
EXPECT_EQ(frame_host.referrer_, ToKURL("http://www.test.com/"));
EXPECT_EQ(frame_host.referrer_policy_,
network::mojom::ReferrerPolicy::kOrigin);
// 3.Without any declared referrer-policy attribute
frame_test_helpers::LoadHTMLString(
frame, GetHTMLStringForReferrerPolicy(std::string(), std::string()),
test_url);
EXPECT_EQ(frame_host.referrer_, test_url);
EXPECT_EQ(
frame_host.referrer_policy_,
ReferrerPolicyResolveDefault(network::mojom::ReferrerPolicy::kDefault));
// 4.referrerpolicy='origin'
frame_test_helpers::LoadHTMLString(
frame, GetHTMLStringForReferrerPolicy(std::string(), "origin"), test_url);
EXPECT_EQ(frame_host.referrer_, ToKURL("http://www.test.com/"));
EXPECT_EQ(frame_host.referrer_policy_,
network::mojom::ReferrerPolicy::kOrigin);
// 5.referrerpolicy='same-origin'
frame_test_helpers::LoadHTMLString(
frame, GetHTMLStringForReferrerPolicy(std::string(), "same-origin"),
test_url);
EXPECT_EQ(frame_host.referrer_, test_url);
EXPECT_EQ(frame_host.referrer_policy_,
network::mojom::ReferrerPolicy::kSameOrigin);
// 6.referrerpolicy='no-referrer'
frame_test_helpers::LoadHTMLString(
frame, GetHTMLStringForReferrerPolicy(std::string(), "no-referrer"),
test_url);
EXPECT_TRUE(frame_host.referrer_.IsEmpty());
EXPECT_EQ(frame_host.referrer_policy_,
network::mojom::ReferrerPolicy::kNever);
web_view_helper.Reset();
}
} // namespace blink
......@@ -501,6 +501,14 @@ void HTMLAnchorElement::HandleClick(Event& event) {
static_cast<String>(FastGetAttribute(html_names::kDownloadAttr)));
request.SetRequestContext(mojom::RequestContextType::DOWNLOAD);
request.SetRequestorOrigin(window->GetSecurityOrigin());
network::mojom::ReferrerPolicy referrer_policy =
request.GetReferrerPolicy();
if (referrer_policy == network::mojom::ReferrerPolicy::kDefault)
referrer_policy = window->GetReferrerPolicy();
Referrer referrer = SecurityPolicy::GenerateReferrer(
referrer_policy, completed_url, window->OutgoingReferrer());
request.SetReferrerString(referrer.referrer);
request.SetReferrerPolicy(referrer.referrer_policy);
frame->DownloadURL(request, network::mojom::blink::RedirectMode::kManual);
return;
}
......
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