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

Side by Side Diff: Source/core/html/parser/HTMLSrcsetParser.cpp

Issue 656723005: Use C++11 features in core/html (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: mike's comments Created 6 years, 1 month 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Apple Inc. All rights reserved. 2 * Copyright (C) 2013 Apple Inc. All rights reserved.
3 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 StringBuilder errorMessage; 189 StringBuilder errorMessage;
190 errorMessage.append("Failed parsing 'srcset' attribute value since "); 190 errorMessage.append("Failed parsing 'srcset' attribute value since ");
191 errorMessage.append(message); 191 errorMessage.append(message);
192 document->frame()->console().addMessage(ConsoleMessage::create(OtherMess ageSource, ErrorMessageLevel, errorMessage.toString())); 192 document->frame()->console().addMessage(ConsoleMessage::create(OtherMess ageSource, ErrorMessageLevel, errorMessage.toString()));
193 } 193 }
194 } 194 }
195 195
196 template<typename CharType> 196 template<typename CharType>
197 static bool parseDescriptors(const CharType* attribute, Vector<DescriptorToken>& descriptors, DescriptorParsingResult& result, Document* document) 197 static bool parseDescriptors(const CharType* attribute, Vector<DescriptorToken>& descriptors, DescriptorParsingResult& result, Document* document)
198 { 198 {
199 for (Vector<DescriptorToken>::iterator it = descriptors.begin(); it != descr iptors.end(); ++it) { 199 for (DescriptorToken& descriptor : descriptors) {
200 if (it->length == 0) 200 if (descriptor.length == 0)
201 continue; 201 continue;
202 CharType c = attribute[it->lastIndex()]; 202 CharType c = attribute[descriptor.lastIndex()];
203 bool isValid = false; 203 bool isValid = false;
204 if (RuntimeEnabledFeatures::pictureSizesEnabled() && c == 'w') { 204 if (RuntimeEnabledFeatures::pictureSizesEnabled() && c == 'w') {
205 if (result.hasDensity() || result.hasWidth()) { 205 if (result.hasDensity() || result.hasWidth()) {
206 srcsetError(document, "it has multiple 'w' descriptors or a mix of 'x' and 'w' descriptors."); 206 srcsetError(document, "it has multiple 'w' descriptors or a mix of 'x' and 'w' descriptors.");
207 return false; 207 return false;
208 } 208 }
209 int resourceWidth = it->toInt(attribute, isValid); 209 int resourceWidth = descriptor.toInt(attribute, isValid);
210 if (!isValid || resourceWidth <= 0) { 210 if (!isValid || resourceWidth <= 0) {
211 srcsetError(document, "its 'w' descriptor is invalid."); 211 srcsetError(document, "its 'w' descriptor is invalid.");
212 return false; 212 return false;
213 } 213 }
214 result.setResourceWidth(resourceWidth); 214 result.setResourceWidth(resourceWidth);
215 } else if (RuntimeEnabledFeatures::pictureSizesEnabled() && c == 'h') { 215 } else if (RuntimeEnabledFeatures::pictureSizesEnabled() && c == 'h') {
216 // This is here only for future compat purposes. 216 // This is here only for future compat purposes.
217 // The value of the 'h' descriptor is not used. 217 // The value of the 'h' descriptor is not used.
218 if (result.hasDensity() || result.hasHeight()) { 218 if (result.hasDensity() || result.hasHeight()) {
219 srcsetError(document, "it has multiple 'h' descriptors or a mix of 'x' and 'h' descriptors."); 219 srcsetError(document, "it has multiple 'h' descriptors or a mix of 'x' and 'h' descriptors.");
220 return false; 220 return false;
221 } 221 }
222 int resourceHeight = it->toInt(attribute, isValid); 222 int resourceHeight = descriptor.toInt(attribute, isValid);
223 if (!isValid || resourceHeight <= 0) { 223 if (!isValid || resourceHeight <= 0) {
224 srcsetError(document, "its 'h' descriptor is invalid."); 224 srcsetError(document, "its 'h' descriptor is invalid.");
225 return false; 225 return false;
226 } 226 }
227 result.setResourceHeight(resourceHeight); 227 result.setResourceHeight(resourceHeight);
228 } else if (c == 'x') { 228 } else if (c == 'x') {
229 if (result.hasDensity() || result.hasHeight() || result.hasWidth()) { 229 if (result.hasDensity() || result.hasHeight() || result.hasWidth()) {
230 srcsetError(document, "it has multiple 'x' descriptors or a mix of 'x' and 'w'/'h' descriptors."); 230 srcsetError(document, "it has multiple 'x' descriptors or a mix of 'x' and 'w'/'h' descriptors.");
231 return false; 231 return false;
232 } 232 }
233 float density = it->toFloat(attribute, isValid); 233 float density = descriptor.toFloat(attribute, isValid);
234 if (!isValid || density < 0) { 234 if (!isValid || density < 0) {
235 srcsetError(document, "its 'x' descriptor is invalid."); 235 srcsetError(document, "its 'x' descriptor is invalid.");
236 return false; 236 return false;
237 } 237 }
238 result.setDensity(density); 238 result.setDensity(density);
239 } else { 239 } else {
240 srcsetError(document, "it has an unknown descriptor."); 240 srcsetError(document, "it has an unknown descriptor.");
241 return false; 241 return false;
242 } 242 }
243 } 243 }
(...skipping 14 matching lines...) Expand all
258 258
259 // http://picture.responsiveimages.org/#parse-srcset-attr 259 // http://picture.responsiveimages.org/#parse-srcset-attr
260 template<typename CharType> 260 template<typename CharType>
261 static void parseImageCandidatesFromSrcsetAttribute(const String& attribute, con st CharType* attributeStart, unsigned length, Vector<ImageCandidate>& imageCandi dates, Document* document) 261 static void parseImageCandidatesFromSrcsetAttribute(const String& attribute, con st CharType* attributeStart, unsigned length, Vector<ImageCandidate>& imageCandi dates, Document* document)
262 { 262 {
263 const CharType* position = attributeStart; 263 const CharType* position = attributeStart;
264 const CharType* attributeEnd = position + length; 264 const CharType* attributeEnd = position + length;
265 265
266 while (position < attributeEnd) { 266 while (position < attributeEnd) {
267 // 4. Splitting loop: Collect a sequence of characters that are space ch aracters or U+002C COMMA characters. 267 // 4. Splitting loop: Collect a sequence of characters that are space ch aracters or U+002C COMMA characters.
268 skipWhile<CharType, isHTMLSpaceOrComma<CharType> >(position, attributeEn d); 268 skipWhile<CharType, isHTMLSpaceOrComma<CharType>>(position, attributeEnd );
269 if (position == attributeEnd) { 269 if (position == attributeEnd) {
270 // Contrary to spec language - descriptor parsing happens on each ca ndidate, so when we reach the attributeEnd, we can exit. 270 // Contrary to spec language - descriptor parsing happens on each ca ndidate, so when we reach the attributeEnd, we can exit.
271 break; 271 break;
272 } 272 }
273 const CharType* imageURLStart = position; 273 const CharType* imageURLStart = position;
274 274
275 // 6. Collect a sequence of characters that are not space characters, an d let that be url. 275 // 6. Collect a sequence of characters that are not space characters, an d let that be url.
276 skipUntil<CharType, isHTMLSpace<CharType> >(position, attributeEnd); 276 skipUntil<CharType, isHTMLSpace<CharType>>(position, attributeEnd);
277 const CharType* imageURLEnd = position; 277 const CharType* imageURLEnd = position;
278 278
279 DescriptorParsingResult result; 279 DescriptorParsingResult result;
280 280
281 // 8. If url ends with a U+002C COMMA character (,) 281 // 8. If url ends with a U+002C COMMA character (,)
282 if (isComma(*(position - 1))) { 282 if (isComma(*(position - 1))) {
283 // Remove all trailing U+002C COMMA characters from url. 283 // Remove all trailing U+002C COMMA characters from url.
284 imageURLEnd = position - 1; 284 imageURLEnd = position - 1;
285 reverseSkipWhile<CharType, isComma>(imageURLEnd, imageURLStart); 285 reverseSkipWhile<CharType, isComma>(imageURLEnd, imageURLStart);
286 ++imageURLEnd; 286 ++imageURLEnd;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 } 369 }
370 370
371 static ImageCandidate pickBestImageCandidate(float deviceScaleFactor, float sour ceSize, Vector<ImageCandidate>& imageCandidates, Document* document = nullptr) 371 static ImageCandidate pickBestImageCandidate(float deviceScaleFactor, float sour ceSize, Vector<ImageCandidate>& imageCandidates, Document* document = nullptr)
372 { 372 {
373 const float defaultDensityValue = 1.0; 373 const float defaultDensityValue = 1.0;
374 bool ignoreSrc = false; 374 bool ignoreSrc = false;
375 if (imageCandidates.isEmpty()) 375 if (imageCandidates.isEmpty())
376 return ImageCandidate(); 376 return ImageCandidate();
377 377
378 // http://picture.responsiveimages.org/#normalize-source-densities 378 // http://picture.responsiveimages.org/#normalize-source-densities
379 for (Vector<ImageCandidate>::iterator it = imageCandidates.begin(); it != im ageCandidates.end(); ++it) { 379 for (ImageCandidate& image : imageCandidates) {
380 if (it->resourceWidth() > 0) { 380 if (image.resourceWidth() > 0) {
381 it->setDensity((float)it->resourceWidth() / sourceSize); 381 image.setDensity((float)image.resourceWidth() / sourceSize);
382 ignoreSrc = true; 382 ignoreSrc = true;
383 } else if (it->density() < 0) { 383 } else if (image.density() < 0) {
384 it->setDensity(defaultDensityValue); 384 image.setDensity(defaultDensityValue);
385 } 385 }
386 } 386 }
387 387
388 std::stable_sort(imageCandidates.begin(), imageCandidates.end(), compareByDe nsity); 388 std::stable_sort(imageCandidates.begin(), imageCandidates.end(), compareByDe nsity);
389 389
390 unsigned winner = selectionLogic(imageCandidates, deviceScaleFactor, ignoreS rc); 390 unsigned winner = selectionLogic(imageCandidates, deviceScaleFactor, ignoreS rc);
391 ASSERT(winner < imageCandidates.size()); 391 ASSERT(winner < imageCandidates.size());
392 winner = avoidDownloadIfHigherDensityResourceIsInCache(imageCandidates, winn er, document); 392 winner = avoidDownloadIfHigherDensityResourceIsInCache(imageCandidates, winn er, document);
393 393
394 float winningDensity = imageCandidates[winner].density(); 394 float winningDensity = imageCandidates[winner].density();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 Vector<ImageCandidate> imageCandidates; 435 Vector<ImageCandidate> imageCandidates;
436 imageCandidates.append(srcsetImageCandidate); 436 imageCandidates.append(srcsetImageCandidate);
437 437
438 if (!srcAttribute.isEmpty()) 438 if (!srcAttribute.isEmpty())
439 imageCandidates.append(ImageCandidate(srcAttribute, 0, srcAttribute.leng th(), DescriptorParsingResult(), ImageCandidate::SrcOrigin)); 439 imageCandidates.append(ImageCandidate(srcAttribute, 0, srcAttribute.leng th(), DescriptorParsingResult(), ImageCandidate::SrcOrigin));
440 440
441 return pickBestImageCandidate(deviceScaleFactor, sourceSize, imageCandidates ).toString(); 441 return pickBestImageCandidate(deviceScaleFactor, sourceSize, imageCandidates ).toString();
442 } 442 }
443 443
444 } 444 }
OLDNEW
« no previous file with comments | « Source/core/html/parser/HTMLResourcePreloader.h ('k') | Source/core/html/parser/HTMLTreeBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698