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