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

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

Issue 23861003: Enable srcset support in HTMLImageElement (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Enable srcset support in HTMLImageElement Created 7 years, 3 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2010 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 11 matching lines...) Expand all
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */ 23 */
24 24
25 #include "config.h" 25 #include "config.h"
26 #include "core/html/parser/HTMLParserIdioms.h" 26 #include "core/html/parser/HTMLParserIdioms.h"
27 27
28 #include <limits> 28 #include <limits>
29 #include "core/dom/QualifiedName.h" 29 #include "core/dom/QualifiedName.h"
30 #include "core/html/parser/HTMLIdentifier.h" 30 #include "core/html/parser/HTMLIdentifier.h"
31 #include "core/platform/Decimal.h" 31 #include "core/platform/Decimal.h"
32 #include "weborigin/KURL.h"
32 #include "wtf/MathExtras.h" 33 #include "wtf/MathExtras.h"
33 #include "wtf/text/AtomicString.h" 34 #include "wtf/text/AtomicString.h"
34 #include "wtf/text/StringBuilder.h" 35 #include "wtf/text/StringBuilder.h"
35 36
36 namespace WebCore { 37 namespace WebCore {
37 38
38 template <typename CharType> 39 template <typename CharType>
39 static String stripLeadingAndTrailingHTMLSpaces(String string, CharType characte rs, unsigned length) 40 static String stripLeadingAndTrailingHTMLSpaces(String string, CharType characte rs, unsigned length)
40 { 41 {
41 unsigned numLeadingSpaces = 0; 42 unsigned numLeadingSpaces = 0;
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 bool threadSafeMatch(const QualifiedName& a, const QualifiedName& b) 290 bool threadSafeMatch(const QualifiedName& a, const QualifiedName& b)
290 { 291 {
291 return threadSafeEqual(a.localName().impl(), b.localName().impl()); 292 return threadSafeEqual(a.localName().impl(), b.localName().impl());
292 } 293 }
293 294
294 bool threadSafeMatch(const HTMLIdentifier& localName, const QualifiedName& qName ) 295 bool threadSafeMatch(const HTMLIdentifier& localName, const QualifiedName& qName )
295 { 296 {
296 return threadSafeEqual(localName.asStringImpl(), qName.localName().impl()); 297 return threadSafeEqual(localName.asStringImpl(), qName.localName().impl());
297 } 298 }
298 299
300 struct ImageWithScale {
301 String imageURL;
302 float scaleFactor;
303 bool operator==(const ImageWithScale& image) const
304 {
305 return scaleFactor == image.scaleFactor && imageURL == image.imageURL;
306 }
307 };
308 typedef Vector<ImageWithScale> ImageCandidates;
309
310 static inline bool compareByScaleFactor(const ImageWithScale& first, const Image WithScale& second)
311 {
312 return first.scaleFactor < second.scaleFactor;
299 } 313 }
314
315 String bestFitSourceForImageAttributes(float deviceScaleFactor, const String& sr cAttribute, const String& srcSetAttribute)
316 {
317 ImageCandidates imageCandidates;
318
319 const String srcSetAttributeValue = srcSetAttribute.simplifyWhiteSpace(isHTM LSpace);
320 Vector<String> srcSetTokens;
321
322 srcSetAttributeValue.split(',', srcSetTokens);
323 for (size_t i = 0; i < srcSetTokens.size(); ++i) {
324 Vector<String> data;
325 float imgScaleFactor = 1.0;
326 bool validScaleFactor = false;
327
328 srcSetTokens[i].stripWhiteSpace().split(' ', data);
329 // There must be at least one candidate descriptor, and the last one mus t
330 // be a scale factor. Since we don't support descriptors other than scal e,
331 // it's better to discard any rule with such descriptors rather than acc ept
332 // only the scale data.
333 if (data.size() != 2)
334 continue;
335 if (!data.last().endsWith('x'))
336 continue;
337
338 imgScaleFactor = data.last().substring(0, data.last().length() - 1).toFl oat(&validScaleFactor);
339 if (!validScaleFactor)
340 continue;
341
342 ImageWithScale image;
343 image.imageURL = decodeURLEscapeSequences(data[0]);
cbiesinger 2013/09/06 22:45:36 why decode them?
344 image.scaleFactor = imgScaleFactor;
345
346 imageCandidates.append(image);
347 }
348
349 const String src = srcAttribute.simplifyWhiteSpace(isHTMLSpace);
350 if (!src.isEmpty()) {
351 ImageWithScale image;
352 image.imageURL = decodeURLEscapeSequences(src);
cbiesinger 2013/09/06 22:45:36 same
353 image.scaleFactor = 1.0;
354
355 imageCandidates.append(image);
356 }
357
358 if (imageCandidates.isEmpty())
359 return String();
360
361 std::stable_sort(imageCandidates.begin(), imageCandidates.end(), compareBySc aleFactor);
362
363 for (size_t i = 0; i < imageCandidates.size() - 1; ++i) {
364 if (imageCandidates[i].scaleFactor >= deviceScaleFactor)
365 return imageCandidates[i].imageURL;
366 }
367 return imageCandidates.last().imageURL;
368 }
369
370 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698