Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/net/ReferrerPolicy.h
Line
Count
Source (jump to first uncovered line)
1
/* This Source Code Form is subject to the terms of the Mozilla Public
2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
3
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5
#ifndef ReferrerPolicy_h__
6
#define ReferrerPolicy_h__
7
8
#include "nsString.h"
9
#include "nsIHttpChannel.h"
10
#include "nsUnicharUtils.h"
11
12
namespace mozilla { namespace net {
13
14
enum ReferrerPolicy {
15
  /* spec tokens: never no-referrer */
16
  RP_No_Referrer                 = nsIHttpChannel::REFERRER_POLICY_NO_REFERRER,
17
18
  /* spec tokens: origin */
19
  RP_Origin                      = nsIHttpChannel::REFERRER_POLICY_ORIGIN,
20
21
  /* spec tokens: default no-referrer-when-downgrade */
22
  RP_No_Referrer_When_Downgrade  = nsIHttpChannel::REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE,
23
24
  /* spec tokens: origin-when-cross-origin */
25
  RP_Origin_When_Crossorigin     = nsIHttpChannel::REFERRER_POLICY_ORIGIN_WHEN_XORIGIN,
26
27
  /* spec tokens: always unsafe-url */
28
  RP_Unsafe_URL                  = nsIHttpChannel::REFERRER_POLICY_UNSAFE_URL,
29
30
  /* spec tokens: same-origin */
31
  RP_Same_Origin                = nsIHttpChannel::REFERRER_POLICY_SAME_ORIGIN,
32
33
  /* spec tokens: strict-origin */
34
  RP_Strict_Origin               = nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN,
35
36
  /* spec tokens: strict-origin-when-cross-origin */
37
  RP_Strict_Origin_When_Cross_Origin = nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN_WHEN_XORIGIN,
38
39
  /* spec tokens: empty string */
40
  /* The empty string "" corresponds to no referrer policy, or unset policy */
41
  RP_Unset                       = nsIHttpChannel::REFERRER_POLICY_UNSET,
42
};
43
44
/* spec tokens: never no-referrer */
45
const char kRPS_Never[]                       = "never";
46
const char kRPS_No_Referrer[]                 = "no-referrer";
47
48
/* spec tokens: origin */
49
const char kRPS_Origin[]                      = "origin";
50
51
/* spec tokens: default no-referrer-when-downgrade */
52
const char kRPS_Default[]                     = "default";
53
const char kRPS_No_Referrer_When_Downgrade[]  = "no-referrer-when-downgrade";
54
55
/* spec tokens: origin-when-cross-origin */
56
const char kRPS_Origin_When_Cross_Origin[]    = "origin-when-cross-origin";
57
const char kRPS_Origin_When_Crossorigin[]     = "origin-when-crossorigin";
58
59
/* spec tokens: same-origin */
60
const char kRPS_Same_Origin[]                 = "same-origin";
61
62
/* spec tokens: strict-origin */
63
const char kRPS_Strict_Origin[]               = "strict-origin";
64
65
/* spec tokens: strict-origin-when-cross-origin */
66
const char kRPS_Strict_Origin_When_Cross_Origin[] = "strict-origin-when-cross-origin";
67
68
/* spec tokens: always unsafe-url */
69
const char kRPS_Always[]                      = "always";
70
const char kRPS_Unsafe_URL[]                  = "unsafe-url";
71
72
inline ReferrerPolicy
73
ReferrerPolicyFromString(const nsAString& content)
74
0
{
75
0
  if (content.IsEmpty()) {
76
0
    return RP_No_Referrer;
77
0
  }
78
0
79
0
  nsString lowerContent(content);
80
0
  ToLowerCase(lowerContent);
81
0
  // This is implemented step by step as described in the Referrer Policy
82
0
  // specification, section "Determine token's Policy".
83
0
  if (lowerContent.EqualsLiteral(kRPS_Never) ||
84
0
      lowerContent.EqualsLiteral(kRPS_No_Referrer)) {
85
0
    return RP_No_Referrer;
86
0
  }
87
0
  if (lowerContent.EqualsLiteral(kRPS_Origin)) {
88
0
    return RP_Origin;
89
0
  }
90
0
  if (lowerContent.EqualsLiteral(kRPS_Default) ||
91
0
      lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)) {
92
0
    return RP_No_Referrer_When_Downgrade;
93
0
  }
94
0
  if (lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin) ||
95
0
      lowerContent.EqualsLiteral(kRPS_Origin_When_Crossorigin)) {
96
0
    return RP_Origin_When_Crossorigin;
97
0
  }
98
0
  if (lowerContent.EqualsLiteral(kRPS_Same_Origin)) {
99
0
    return RP_Same_Origin;
100
0
  }
101
0
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin)) {
102
0
    return RP_Strict_Origin;
103
0
  }
104
0
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)) {
105
0
    return RP_Strict_Origin_When_Cross_Origin;
106
0
  }
107
0
  if (lowerContent.EqualsLiteral(kRPS_Always) ||
108
0
      lowerContent.EqualsLiteral(kRPS_Unsafe_URL)) {
109
0
    return RP_Unsafe_URL;
110
0
  }
111
0
  // Spec says if none of the previous match, use empty string.
112
0
  return RP_Unset;
113
0
114
0
}
115
116
inline ReferrerPolicy
117
AttributeReferrerPolicyFromString(const nsAString& content)
118
{
119
  // Specs : https://html.spec.whatwg.org/multipage/infrastructure.html#referrer-policy-attribute
120
  // Spec says the empty string "" corresponds to no referrer policy, or RP_Unset
121
  if (content.IsEmpty()) {
122
    return RP_Unset;
123
  }
124
125
  nsString lowerContent(content);
126
  ToLowerCase(lowerContent);
127
128
  if (lowerContent.EqualsLiteral(kRPS_No_Referrer)) {
129
    return RP_No_Referrer;
130
  }
131
  if (lowerContent.EqualsLiteral(kRPS_Origin)) {
132
    return RP_Origin;
133
  }
134
  if (lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)) {
135
    return RP_No_Referrer_When_Downgrade;
136
  }
137
  if (lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin)) {
138
    return RP_Origin_When_Crossorigin;
139
  }
140
  if (lowerContent.EqualsLiteral(kRPS_Unsafe_URL)) {
141
    return RP_Unsafe_URL;
142
  }
143
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin)) {
144
    return RP_Strict_Origin;
145
  }
146
  if (lowerContent.EqualsLiteral(kRPS_Same_Origin)) {
147
    return RP_Same_Origin;
148
  }
149
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)) {
150
    return RP_Strict_Origin_When_Cross_Origin;
151
  }
152
153
  // Spec says invalid value default is empty string state
154
  // So, return RP_Unset if none of the previous match, return RP_Unset
155
  return RP_Unset;
156
}
157
158
} // namespace net
159
} // namespace mozilla
160
161
#endif