Commit 53730250 authored by Junyi Qiu's avatar Junyi Qiu Committed by Commit Bot

Support specific referrer-policy in Page.navigate().

Currently Page.navigate() supports setting the referrer, but not
referrer-policy. It always uses the default referrer-policy. Some
clients want set a specific non-default `referrer-policy` along with
the URL set in referrer field.

BUG=b/149020493
R=alexmos@chromium.org, caseq@chromium.org, zoeclifford@chromium.org

Change-Id: I90be78f26e1cd1b05517fa3ba93771a545044886
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2053170
Commit-Queue: Andrey Kosyakov <caseq@chromium.org>
Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743758}
parent 63f518be
......@@ -409,10 +409,36 @@ void PageHandler::Reload(Maybe<bool> bypassCache,
false);
}
static network::mojom::ReferrerPolicy ParsePolicyFromString(
const std::string& policy) {
if (policy == Page::ReferrerPolicyEnum::NoReferrer)
return network::mojom::ReferrerPolicy::kNever;
if (policy == Page::ReferrerPolicyEnum::NoReferrerWhenDowngrade)
return network::mojom::ReferrerPolicy::kNoReferrerWhenDowngrade;
if (policy == Page::ReferrerPolicyEnum::Origin)
return network::mojom::ReferrerPolicy::kOrigin;
if (policy == Page::ReferrerPolicyEnum::OriginWhenCrossOrigin)
return network::mojom::ReferrerPolicy::kOriginWhenCrossOrigin;
if (policy == Page::ReferrerPolicyEnum::SameOrigin)
return network::mojom::ReferrerPolicy::kSameOrigin;
if (policy == Page::ReferrerPolicyEnum::StrictOrigin)
return network::mojom::ReferrerPolicy::kStrictOrigin;
if (policy == Page::ReferrerPolicyEnum::StrictOriginWhenCrossOrigin) {
return network::mojom::ReferrerPolicy::
kNoReferrerWhenDowngradeOriginWhenCrossOrigin;
}
if (policy == Page::ReferrerPolicyEnum::UnsafeUrl)
return network::mojom::ReferrerPolicy::kAlways;
DCHECK(policy.empty());
return network::mojom::ReferrerPolicy::kDefault;
}
void PageHandler::Navigate(const std::string& url,
Maybe<std::string> referrer,
Maybe<std::string> maybe_transition_type,
Maybe<std::string> frame_id,
Maybe<std::string> referrer_policy,
std::unique_ptr<NavigateCallback> callback) {
GURL gurl(url);
if (!gurl.is_valid()) {
......@@ -476,8 +502,9 @@ void PageHandler::Navigate(const std::string& url,
}
NavigationController::LoadURLParams params(gurl);
params.referrer = Referrer(GURL(referrer.fromMaybe("")),
network::mojom::ReferrerPolicy::kDefault);
network::mojom::ReferrerPolicy policy =
ParsePolicyFromString(referrer_policy.fromMaybe(""));
params.referrer = Referrer(GURL(referrer.fromMaybe("")), policy);
params.transition_type = type;
params.frame_tree_node_id = frame_tree_node->frame_tree_node_id();
frame_tree_node->navigator()->GetController()->LoadURLWithParams(params);
......
......@@ -107,6 +107,7 @@ class PageHandler : public DevToolsDomainHandler,
Maybe<std::string> referrer,
Maybe<std::string> transition_type,
Maybe<std::string> frame_id,
Maybe<std::string> referrer_policy,
std::unique_ptr<NavigateCallback> callback) override;
Response StopLoading() override;
......
......@@ -5392,6 +5392,18 @@ domain Page
# The list of error arguments (e.g. {name:'minimum-icon-size-in-pixels', value:'64'}).
array of InstallabilityErrorArgument errorArguments
# The referring-policy used for the navigation.
experimental type ReferrerPolicy extends string
enum
noReferrer
noReferrerWhenDowngrade
origin
originWhenCrossOrigin
sameOrigin
strictOrigin
strictOriginWhenCrossOrigin
unsafeUrl
# Deprecated, please use addScriptToEvaluateOnNewDocument instead.
experimental deprecated command addScriptToEvaluateOnLoad
parameters
......@@ -5581,6 +5593,8 @@ domain Page
optional TransitionType transitionType
# Frame id to navigate, if not specified navigates the top frame.
optional FrameId frameId
# Referrer-policy used for the navigation.
experimental optional ReferrerPolicy referrerPolicy
returns
# Frame id that has navigated (or failed to navigate)
FrameId frameId
......
Tests that Page.navigate() returns the results that match referrer-policy configs
Request referrer: https://www.google.com/
Request referrer-policy: origin
(async function(testRunner) {
var {page, session, dp} = await testRunner.startBlank(
`Tests that Page.navigate() returns the results that match referrer-policy configs`);
await dp.Page.enable();
await dp.Network.enable();
var navigatePromise = dp.Page.navigate({
url: 'http://example.com',
referrer: 'https://www.google.com/search?q=bing',
referrerPolicy: 'origin',
});
var requestWillBeSent = dp.Network.onRequestWillBeSent(event => {
const request = event.params.request;
testRunner.log('Request referrer: ' + request.headers.Referer);
testRunner.log('Request referrer-policy: ' + request.referrerPolicy);
});
const params = (await dp.Network.onceRequestWillBeSent()).params;
testRunner.completeTest();
})
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