| 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 |