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

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

Issue 839783002: Ignore src candidates when looking for already in-cache resources (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 11 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 | « LayoutTests/fast/dom/HTMLImageElement/image-src-added-srcset-w-descriptors-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 349
350 currentDensity = imageCandidates[i].density(); 350 currentDensity = imageCandidates[i].density();
351 geometricMean = sqrt(currentDensity * nextDensity); 351 geometricMean = sqrt(currentDensity * nextDensity);
352 if (deviceScaleFactor >= geometricMean) 352 if (deviceScaleFactor >= geometricMean)
353 return next; 353 return next;
354 break; 354 break;
355 } 355 }
356 return i; 356 return i;
357 } 357 }
358 358
359 static unsigned avoidDownloadIfHigherDensityResourceIsInCache(Vector<ImageCandid ate>& imageCandidates, unsigned winner, Document* document) 359 static unsigned avoidDownloadIfHigherDensityResourceIsInCache(Vector<ImageCandid ate>& imageCandidates, unsigned winner, Document* document, bool ignoreSrc)
360 { 360 {
361 if (!document) 361 if (!document)
362 return winner; 362 return winner;
363 for (unsigned i = imageCandidates.size() - 1; i > winner; --i) { 363 for (unsigned i = imageCandidates.size() - 1; i > winner; --i) {
364 if (ignoreSrc && imageCandidates[i].srcOrigin())
365 continue;
364 KURL url = document->completeURL(stripLeadingAndTrailingHTMLSpaces(image Candidates[i].url())); 366 KURL url = document->completeURL(stripLeadingAndTrailingHTMLSpaces(image Candidates[i].url()));
365 if (memoryCache()->resourceForURL(url, document->fetcher()->getCacheIden tifier())) 367 if (memoryCache()->resourceForURL(url, document->fetcher()->getCacheIden tifier()))
366 return i; 368 return i;
367 } 369 }
368 return winner; 370 return winner;
369 } 371 }
370 372
371 static ImageCandidate pickBestImageCandidate(float deviceScaleFactor, float sour ceSize, Vector<ImageCandidate>& imageCandidates, Document* document = nullptr) 373 static ImageCandidate pickBestImageCandidate(float deviceScaleFactor, float sour ceSize, Vector<ImageCandidate>& imageCandidates, Document* document = nullptr)
372 { 374 {
373 const float defaultDensityValue = 1.0; 375 const float defaultDensityValue = 1.0;
374 bool ignoreSrc = false; 376 bool ignoreSrc = false;
375 if (imageCandidates.isEmpty()) 377 if (imageCandidates.isEmpty())
376 return ImageCandidate(); 378 return ImageCandidate();
377 379
378 // http://picture.responsiveimages.org/#normalize-source-densities 380 // http://picture.responsiveimages.org/#normalize-source-densities
379 for (ImageCandidate& image : imageCandidates) { 381 for (ImageCandidate& image : imageCandidates) {
380 if (image.resourceWidth() > 0) { 382 if (image.resourceWidth() > 0) {
381 image.setDensity((float)image.resourceWidth() / sourceSize); 383 image.setDensity((float)image.resourceWidth() / sourceSize);
382 ignoreSrc = true; 384 ignoreSrc = true;
383 } else if (image.density() < 0) { 385 } else if (image.density() < 0) {
384 image.setDensity(defaultDensityValue); 386 image.setDensity(defaultDensityValue);
385 } 387 }
386 } 388 }
387 389
388 std::stable_sort(imageCandidates.begin(), imageCandidates.end(), compareByDe nsity); 390 std::stable_sort(imageCandidates.begin(), imageCandidates.end(), compareByDe nsity);
389 391
390 unsigned winner = selectionLogic(imageCandidates, deviceScaleFactor, ignoreS rc); 392 unsigned winner = selectionLogic(imageCandidates, deviceScaleFactor, ignoreS rc);
391 ASSERT(winner < imageCandidates.size()); 393 ASSERT(winner < imageCandidates.size());
392 winner = avoidDownloadIfHigherDensityResourceIsInCache(imageCandidates, winn er, document); 394 winner = avoidDownloadIfHigherDensityResourceIsInCache(imageCandidates, winn er, document, ignoreSrc);
393 395
394 float winningDensity = imageCandidates[winner].density(); 396 float winningDensity = imageCandidates[winner].density();
395 // 16. If an entry b in candidates has the same associated ... pixel density as an earlier entry a in candidates, 397 // 16. If an entry b in candidates has the same associated ... pixel density as an earlier entry a in candidates,
396 // then remove entry b 398 // then remove entry b
397 while ((winner > 0) && (imageCandidates[winner - 1].density() == winningDens ity)) 399 while ((winner > 0) && (imageCandidates[winner - 1].density() == winningDens ity))
398 --winner; 400 --winner;
399 401
400 return imageCandidates[winner]; 402 return imageCandidates[winner];
401 } 403 }
402 404
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 Vector<ImageCandidate> imageCandidates; 437 Vector<ImageCandidate> imageCandidates;
436 imageCandidates.append(srcsetImageCandidate); 438 imageCandidates.append(srcsetImageCandidate);
437 439
438 if (!srcAttribute.isEmpty()) 440 if (!srcAttribute.isEmpty())
439 imageCandidates.append(ImageCandidate(srcAttribute, 0, srcAttribute.leng th(), DescriptorParsingResult(), ImageCandidate::SrcOrigin)); 441 imageCandidates.append(ImageCandidate(srcAttribute, 0, srcAttribute.leng th(), DescriptorParsingResult(), ImageCandidate::SrcOrigin));
440 442
441 return pickBestImageCandidate(deviceScaleFactor, sourceSize, imageCandidates ).toString(); 443 return pickBestImageCandidate(deviceScaleFactor, sourceSize, imageCandidates ).toString();
442 } 444 }
443 445
444 } 446 }
OLDNEW
« no previous file with comments | « LayoutTests/fast/dom/HTMLImageElement/image-src-added-srcset-w-descriptors-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698