OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/loader/LinkHeader.h" | 6 #include "core/loader/LinkHeader.h" |
7 | 7 |
8 #include "platform/ParsingUtilities.h" | 8 #include "platform/ParsingUtilities.h" |
9 | 9 |
10 namespace blink { | 10 namespace blink { |
(...skipping 22 matching lines...) Expand all Loading... |
33 { | 33 { |
34 return chr == ';' || chr == ','; | 34 return chr == ';' || chr == ','; |
35 } | 35 } |
36 | 36 |
37 template <typename CharType> | 37 template <typename CharType> |
38 static bool isValidParameterValueChar(CharType chr) | 38 static bool isValidParameterValueChar(CharType chr) |
39 { | 39 { |
40 return !isWhitespace(chr) && !isValidParameterValueEnd(chr); | 40 return !isWhitespace(chr) && !isValidParameterValueEnd(chr); |
41 } | 41 } |
42 | 42 |
| 43 static bool isExtensionParameter(LinkHeader::LinkParameterName name) |
| 44 { |
| 45 return name > LinkHeader::LinkParameterAnchor; |
| 46 } |
| 47 |
43 // Before: | 48 // Before: |
44 // | 49 // |
45 // <cat.jpg>; rel=preload | 50 // <cat.jpg>; rel=preload |
46 // ^ ^ | 51 // ^ ^ |
47 // position end | 52 // position end |
48 // | 53 // |
49 // After (if successful: otherwise the method returns false) | 54 // After (if successful: otherwise the method returns false) |
50 // | 55 // |
51 // <cat.jpg>; rel=preload | 56 // <cat.jpg>; rel=preload |
52 // ^ ^ | 57 // ^ ^ |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 return true; | 114 return true; |
110 } | 115 } |
111 | 116 |
112 static LinkHeader::LinkParameterName paramterNameFromString(String name) | 117 static LinkHeader::LinkParameterName paramterNameFromString(String name) |
113 { | 118 { |
114 // FIXME: Add support for more header parameters as neccessary. | 119 // FIXME: Add support for more header parameters as neccessary. |
115 if (equalIgnoringCase(name, "rel")) | 120 if (equalIgnoringCase(name, "rel")) |
116 return LinkHeader::LinkParameterRel; | 121 return LinkHeader::LinkParameterRel; |
117 else if (equalIgnoringCase(name, "anchor")) | 122 else if (equalIgnoringCase(name, "anchor")) |
118 return LinkHeader::LinkParameterAnchor; | 123 return LinkHeader::LinkParameterAnchor; |
| 124 else if (equalIgnoringCase(name, "crossorigin")) |
| 125 return LinkHeader::LinkParameterCrossOrigin; |
119 return LinkHeader::LinkParameterUnknown; | 126 return LinkHeader::LinkParameterUnknown; |
120 } | 127 } |
121 | 128 |
122 // Before: | 129 // Before: |
123 // | 130 // |
124 // <cat.jpg>; rel=preload | 131 // <cat.jpg>; rel=preload |
125 // ^ ^ | 132 // ^ ^ |
126 // position end | 133 // position end |
127 // | 134 // |
128 // After (if successful: otherwise the method returns false) | 135 // After (if successful: otherwise the method returns false) |
129 // | 136 // |
130 // <cat.jpg>; rel=preload | 137 // <cat.jpg>; rel=preload |
131 // ^ ^ | 138 // ^ ^ |
132 // position end | 139 // position end |
133 template <typename CharType> | 140 template <typename CharType> |
134 static bool parseParameterName(CharType*& position, CharType* end, LinkHeader::L
inkParameterName& name) | 141 static bool parseParameterName(CharType*& position, CharType* end, LinkHeader::L
inkParameterName& name) |
135 { | 142 { |
136 CharType* nameStart = position; | 143 CharType* nameStart = position; |
137 skipWhile<CharType, isValidParameterNameChar>(position, end); | 144 skipWhile<CharType, isValidParameterNameChar>(position, end); |
138 CharType* nameEnd = position; | 145 CharType* nameEnd = position; |
139 skipWhile<CharType, isWhitespace>(position, end); | 146 skipWhile<CharType, isWhitespace>(position, end); |
140 if (!skipExactly<CharType>(position, end, '=')) | 147 bool hasEqual = skipExactly<CharType>(position, end, '='); |
141 return false; | |
142 skipWhile<CharType, isWhitespace>(position, end); | 148 skipWhile<CharType, isWhitespace>(position, end); |
143 name = paramterNameFromString(String(nameStart, nameEnd - nameStart)); | 149 name = paramterNameFromString(String(nameStart, nameEnd - nameStart)); |
144 return true; | 150 return hasEqual || isExtensionParameter(name); |
145 } | 151 } |
146 | 152 |
147 // Before: | 153 // Before: |
148 // | 154 // |
149 // <cat.jpg>; rel="preload"; type="image/jpeg"; | 155 // <cat.jpg>; rel="preload"; type="image/jpeg"; |
150 // ^ ^ | 156 // ^ ^ |
151 // position end | 157 // position end |
152 // | 158 // |
153 // After (if the parameter starts with a quote, otherwise the method returns fal
se) | 159 // After (if the parameter starts with a quote, otherwise the method returns fal
se) |
154 // | 160 // |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 { | 199 { |
194 CharType* valueStart = position; | 200 CharType* valueStart = position; |
195 CharType* valueEnd = position; | 201 CharType* valueEnd = position; |
196 bool completeQuotes; | 202 bool completeQuotes; |
197 bool hasQuotes = skipQuotesIfNeeded(position, end, completeQuotes); | 203 bool hasQuotes = skipQuotesIfNeeded(position, end, completeQuotes); |
198 if (!hasQuotes) { | 204 if (!hasQuotes) { |
199 skipWhile<CharType, isValidParameterValueChar>(position, end); | 205 skipWhile<CharType, isValidParameterValueChar>(position, end); |
200 } | 206 } |
201 valueEnd = position; | 207 valueEnd = position; |
202 skipWhile<CharType, isWhitespace>(position, end); | 208 skipWhile<CharType, isWhitespace>(position, end); |
203 if ((!completeQuotes && valueStart == valueEnd) || (position != end && !isVa
lidParameterValueEnd(*position))) | 209 if ((!completeQuotes && valueStart == valueEnd) || (position != end && !isVa
lidParameterValueEnd(*position))) { |
| 210 value = String(""); |
204 return false; | 211 return false; |
| 212 } |
205 if (hasQuotes) | 213 if (hasQuotes) |
206 ++valueStart; | 214 ++valueStart; |
207 if (completeQuotes) | 215 if (completeQuotes) |
208 --valueEnd; | 216 --valueEnd; |
209 value = String(valueStart, valueEnd - valueStart); | 217 value = String(valueStart, valueEnd - valueStart); |
210 return !hasQuotes || completeQuotes; | 218 return !hasQuotes || completeQuotes; |
211 } | 219 } |
212 | 220 |
213 void LinkHeader::setValue(LinkParameterName name, String value) | 221 void LinkHeader::setValue(LinkParameterName name, String value) |
214 { | 222 { |
215 // FIXME: Add support for more header parameters as neccessary. | 223 // FIXME: Add support for more header parameters as neccessary. |
216 if (name == LinkParameterRel && !m_rel) | 224 if (name == LinkParameterRel && !m_rel) |
217 m_rel = value.lower(); | 225 m_rel = value.lower(); |
218 else if (name == LinkParameterAnchor) | 226 else if (name == LinkParameterAnchor) |
219 m_isValid = false; | 227 m_isValid = false; |
| 228 else if (name == LinkParameterCrossOrigin) |
| 229 m_crossOrigin = crossOriginAttributeValue(value); |
220 } | 230 } |
221 | 231 |
222 template <typename CharType> | 232 template <typename CharType> |
223 static void findNextHeader(CharType*& position, CharType* end) | 233 static void findNextHeader(CharType*& position, CharType* end) |
224 { | 234 { |
225 skipUntil<CharType>(position, end, ','); | 235 skipUntil<CharType>(position, end, ','); |
226 skipExactly<CharType>(position, end, ','); | 236 skipExactly<CharType>(position, end, ','); |
227 } | 237 } |
228 | 238 |
229 template <typename CharType> | 239 template <typename CharType> |
230 LinkHeader::LinkHeader(CharType*& position, CharType* end) | 240 LinkHeader::LinkHeader(CharType*& position, CharType* end) |
231 : m_isValid(true) | 241 : m_crossOrigin(CrossOriginAttributeNotSet) |
| 242 , m_isValid(true) |
232 { | 243 { |
233 if (!parseURL(position, end, m_url)) { | 244 if (!parseURL(position, end, m_url)) { |
234 m_isValid = false; | 245 m_isValid = false; |
235 findNextHeader(position, end); | 246 findNextHeader(position, end); |
236 return; | 247 return; |
237 } | 248 } |
238 | 249 |
239 while (m_isValid && position < end) { | 250 while (m_isValid && position < end) { |
240 if (!parseParameterDelimiter(position, end, m_isValid)) { | 251 if (!parseParameterDelimiter(position, end, m_isValid)) { |
241 findNextHeader(position, end); | 252 findNextHeader(position, end); |
242 return; | 253 return; |
243 } | 254 } |
244 | 255 |
245 LinkParameterName parameterName; | 256 LinkParameterName parameterName; |
246 if (!parseParameterName(position, end, parameterName)) { | 257 if (!parseParameterName(position, end, parameterName)) { |
247 findNextHeader(position, end); | 258 findNextHeader(position, end); |
248 m_isValid = false; | 259 m_isValid = false; |
249 return; | 260 return; |
250 } | 261 } |
251 | 262 |
252 String parameterValue; | 263 String parameterValue; |
253 if (!parseParameterValue(position, end, parameterValue)) { | 264 if (!parseParameterValue(position, end, parameterValue) && !isExtensionP
arameter(parameterName)) { |
254 findNextHeader(position, end); | 265 findNextHeader(position, end); |
255 m_isValid = false; | 266 m_isValid = false; |
256 return; | 267 return; |
257 } | 268 } |
258 | 269 |
259 setValue(parameterName, parameterValue); | 270 setValue(parameterName, parameterValue); |
260 } | 271 } |
261 } | 272 } |
262 | 273 |
263 LinkHeaderSet::LinkHeaderSet(const String& header) | 274 LinkHeaderSet::LinkHeaderSet(const String& header) |
(...skipping 10 matching lines...) Expand all Loading... |
274 template <typename CharType> | 285 template <typename CharType> |
275 void LinkHeaderSet::init(CharType* headerValue, unsigned len) | 286 void LinkHeaderSet::init(CharType* headerValue, unsigned len) |
276 { | 287 { |
277 CharType* position = headerValue; | 288 CharType* position = headerValue; |
278 CharType* end = headerValue + len; | 289 CharType* end = headerValue + len; |
279 while (position < end) | 290 while (position < end) |
280 m_headerSet.append(LinkHeader(position, end)); | 291 m_headerSet.append(LinkHeader(position, end)); |
281 } | 292 } |
282 | 293 |
283 } | 294 } |
OLD | NEW |