123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- // Copyright 2013 The Chromium Authors. All rights reserved.
- // 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();
- return std::string();
- }
- 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();
- return net::ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
- }
- 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
|