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