Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: Source/core/loader/LinkHeader.cpp

Issue 1135203002: Add <link rel=preconnect> crossorigin attribute (take 2) (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Todo Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/loader/LinkHeader.h ('k') | Source/core/loader/LinkHeaderTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « Source/core/loader/LinkHeader.h ('k') | Source/core/loader/LinkHeaderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698