referrer_util.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ios/web/common/referrer_util.h"
  5. #include "base/notreached.h"
  6. #include "ios/web/public/navigation/referrer.h"
  7. #include "net/url_request/referrer_policy.h"
  8. #include "url/gurl.h"
  9. namespace web {
  10. std::string ReferrerHeaderValueForNavigation(const GURL& destination,
  11. const web::Referrer& referrer) {
  12. bool is_downgrade = referrer.url.SchemeIsCryptographic() &&
  13. !destination.SchemeIsCryptographic();
  14. switch (referrer.policy) {
  15. case ReferrerPolicyAlways:
  16. return referrer.url.GetAsReferrer().spec();
  17. case ReferrerPolicyNever:
  18. return std::string();
  19. case ReferrerPolicyOrigin:
  20. return referrer.url.DeprecatedGetOriginAsURL().spec();
  21. case ReferrerPolicyDefault:
  22. case ReferrerPolicyNoReferrerWhenDowngrade:
  23. if (is_downgrade)
  24. return std::string();
  25. return referrer.url.GetAsReferrer().spec();
  26. case ReferrerPolicyOriginWhenCrossOrigin:
  27. if (referrer.url.DeprecatedGetOriginAsURL() !=
  28. destination.DeprecatedGetOriginAsURL())
  29. return referrer.url.DeprecatedGetOriginAsURL().spec();
  30. return referrer.url.GetAsReferrer().spec();
  31. case ReferrerPolicySameOrigin:
  32. if (referrer.url.DeprecatedGetOriginAsURL() !=
  33. destination.DeprecatedGetOriginAsURL())
  34. return std::string();
  35. return referrer.url.GetAsReferrer().spec();
  36. case ReferrerPolicyStrictOrigin:
  37. if (is_downgrade)
  38. return std::string();
  39. return referrer.url.DeprecatedGetOriginAsURL().spec();
  40. case ReferrerPolicyStrictOriginWhenCrossOrigin:
  41. if (is_downgrade)
  42. return std::string();
  43. if (referrer.url.DeprecatedGetOriginAsURL() !=
  44. destination.DeprecatedGetOriginAsURL())
  45. return referrer.url.DeprecatedGetOriginAsURL().spec();
  46. return referrer.url.GetAsReferrer().spec();
  47. }
  48. NOTREACHED();
  49. return std::string();
  50. }
  51. net::ReferrerPolicy PolicyForNavigation(const GURL& destination,
  52. const web::Referrer& referrer) {
  53. // Based on the matching logic in content's
  54. // resource_dispatcher_host_impl.cc
  55. switch (referrer.policy) {
  56. case ReferrerPolicyAlways:
  57. return net::ReferrerPolicy::NEVER_CLEAR;
  58. case ReferrerPolicyNever:
  59. return net::ReferrerPolicy::NO_REFERRER;
  60. case ReferrerPolicyOrigin:
  61. return net::ReferrerPolicy::ORIGIN;
  62. case ReferrerPolicyNoReferrerWhenDowngrade:
  63. case ReferrerPolicyDefault:
  64. return net::ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
  65. case ReferrerPolicyOriginWhenCrossOrigin:
  66. return net::ReferrerPolicy::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN;
  67. case ReferrerPolicySameOrigin:
  68. return net::ReferrerPolicy::CLEAR_ON_TRANSITION_CROSS_ORIGIN;
  69. case ReferrerPolicyStrictOrigin:
  70. return net::ReferrerPolicy::
  71. ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
  72. case ReferrerPolicyStrictOriginWhenCrossOrigin:
  73. return net::ReferrerPolicy::REDUCE_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN;
  74. }
  75. NOTREACHED();
  76. return net::ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
  77. }
  78. ReferrerPolicy ReferrerPolicyFromString(const std::string& policy) {
  79. // https://w3c.github.io/webappsec-referrer-policy/#determine-policy-for-token
  80. if (policy == "never" || policy == "no-referrer")
  81. return ReferrerPolicyNever;
  82. if (policy == "origin")
  83. return ReferrerPolicyOrigin;
  84. if (policy == "default" || policy == "no-referrer-when-downgrade")
  85. return ReferrerPolicyNoReferrerWhenDowngrade;
  86. if (policy == "origin-when-cross-origin")
  87. return ReferrerPolicyOriginWhenCrossOrigin;
  88. if (policy == "always" || policy == "unsafe-url")
  89. return ReferrerPolicyAlways;
  90. if (policy == "same-origin")
  91. return ReferrerPolicySameOrigin;
  92. if (policy == "strict-origin")
  93. return ReferrerPolicyStrictOrigin;
  94. if (policy == "strict-origin-when-cross-origin")
  95. return ReferrerPolicyStrictOriginWhenCrossOrigin;
  96. return ReferrerPolicyDefault;
  97. }
  98. } // namespace web