blob: 80aa6cf2393614c9507905d59daa1783ff8e242d [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/web/common/referrer_util.h"
#include "base/notreached.h"
#include "ios/web/public/navigation/referrer.h"
#include "net/url_request/referrer_policy.h"
#include "url/gurl.h"
namespace web {
std::string ReferrerHeaderValueForNavigation(const GURL& destination,
const web::Referrer& referrer) {
bool is_downgrade = referrer.url.SchemeIsCryptographic() &&
!destination.SchemeIsCryptographic();
switch (referrer.policy) {
case ReferrerPolicyAlways:
return referrer.url.GetAsReferrer().spec();
case ReferrerPolicyNever:
return std::string();
case ReferrerPolicyOrigin:
return referrer.url.DeprecatedGetOriginAsURL().spec();
case ReferrerPolicyDefault:
case ReferrerPolicyNoReferrerWhenDowngrade:
if (is_downgrade) {
return std::string();
}
return referrer.url.GetAsReferrer().spec();
case ReferrerPolicyOriginWhenCrossOrigin:
if (referrer.url.DeprecatedGetOriginAsURL() !=
destination.DeprecatedGetOriginAsURL()) {
return referrer.url.DeprecatedGetOriginAsURL().spec();
}
return referrer.url.GetAsReferrer().spec();
case ReferrerPolicySameOrigin:
if (referrer.url.DeprecatedGetOriginAsURL() !=
destination.DeprecatedGetOriginAsURL()) {
return std::string();
}
return referrer.url.GetAsReferrer().spec();
case ReferrerPolicyStrictOrigin:
if (is_downgrade) {
return std::string();
}
return referrer.url.DeprecatedGetOriginAsURL().spec();
case ReferrerPolicyStrictOriginWhenCrossOrigin:
if (is_downgrade) {
return std::string();
}
if (referrer.url.DeprecatedGetOriginAsURL() !=
destination.DeprecatedGetOriginAsURL()) {
return referrer.url.DeprecatedGetOriginAsURL().spec();
}
return referrer.url.GetAsReferrer().spec();
}
NOTREACHED();
}
net::ReferrerPolicy PolicyForNavigation(const GURL& destination,
const web::Referrer& referrer) {
// Based on the matching logic in content's
// resource_dispatcher_host_impl.cc
switch (referrer.policy) {
case ReferrerPolicyAlways:
return net::ReferrerPolicy::NEVER_CLEAR;
case ReferrerPolicyNever:
return net::ReferrerPolicy::NO_REFERRER;
case ReferrerPolicyOrigin:
return net::ReferrerPolicy::ORIGIN;
case ReferrerPolicyNoReferrerWhenDowngrade:
case ReferrerPolicyDefault:
return net::ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
case ReferrerPolicyOriginWhenCrossOrigin:
return net::ReferrerPolicy::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN;
case ReferrerPolicySameOrigin:
return net::ReferrerPolicy::CLEAR_ON_TRANSITION_CROSS_ORIGIN;
case ReferrerPolicyStrictOrigin:
return net::ReferrerPolicy::
ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
case ReferrerPolicyStrictOriginWhenCrossOrigin:
return net::ReferrerPolicy::REDUCE_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN;
}
NOTREACHED();
}
ReferrerPolicy ReferrerPolicyFromString(const std::string& policy) {
// https://w3c.github.io/webappsec-referrer-policy/#determine-policy-for-token
if (policy == "never" || policy == "no-referrer") {
return ReferrerPolicyNever;
}
if (policy == "origin") {
return ReferrerPolicyOrigin;
}
if (policy == "default" || policy == "no-referrer-when-downgrade") {
return ReferrerPolicyNoReferrerWhenDowngrade;
}
if (policy == "origin-when-cross-origin") {
return ReferrerPolicyOriginWhenCrossOrigin;
}
if (policy == "always" || policy == "unsafe-url") {
return ReferrerPolicyAlways;
}
if (policy == "same-origin") {
return ReferrerPolicySameOrigin;
}
if (policy == "strict-origin") {
return ReferrerPolicyStrictOrigin;
}
if (policy == "strict-origin-when-cross-origin") {
return ReferrerPolicyStrictOriginWhenCrossOrigin;
}
return ReferrerPolicyDefault;
}
} // namespace web