| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/favicon/favicon_handler.h" | 5 #include "chrome/browser/favicon/favicon_handler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 const GURL& image_url, | 374 const GURL& image_url, |
| 375 const std::vector<SkBitmap>& bitmaps, | 375 const std::vector<SkBitmap>& bitmaps, |
| 376 const std::vector<gfx::Size>& original_bitmap_sizes) { | 376 const std::vector<gfx::Size>& original_bitmap_sizes) { |
| 377 DownloadRequests::iterator i = download_requests_.find(id); | 377 DownloadRequests::iterator i = download_requests_.find(id); |
| 378 if (i == download_requests_.end()) { | 378 if (i == download_requests_.end()) { |
| 379 // Currently WebContents notifies us of ANY downloads so that it is | 379 // Currently WebContents notifies us of ANY downloads so that it is |
| 380 // possible to get here. | 380 // possible to get here. |
| 381 return; | 381 return; |
| 382 } | 382 } |
| 383 | 383 |
| 384 DownloadRequest download_request = i->second; |
| 385 download_requests_.erase(i); |
| 386 |
| 384 if (current_candidate() && | 387 if (current_candidate() && |
| 385 DoUrlAndIconMatch(*current_candidate(), image_url, i->second.icon_type)) { | 388 DoUrlAndIconMatch(*current_candidate(), |
| 389 image_url, |
| 390 download_request.icon_type)) { |
| 386 bool request_next_icon = true; | 391 bool request_next_icon = true; |
| 387 float score = 0.0f; | 392 float score = 0.0f; |
| 388 gfx::ImageSkia image_skia; | 393 gfx::ImageSkia image_skia; |
| 389 if (download_largest_icon_ && !bitmaps.empty()) { | 394 if (download_largest_icon_ && !bitmaps.empty()) { |
| 390 int index = -1; | 395 int index = -1; |
| 391 // Use the largest bitmap if FaviconURL doesn't have sizes attribute. | 396 // Use the largest bitmap if FaviconURL doesn't have sizes attribute. |
| 392 if (current_candidate()->icon_sizes.empty()) { | 397 if (current_candidate()->icon_sizes.empty()) { |
| 393 index = GetLargestSizeIndex(original_bitmap_sizes); | 398 index = GetLargestSizeIndex(original_bitmap_sizes); |
| 394 } else { | 399 } else { |
| 395 index = GetIndexBySize(original_bitmap_sizes, | 400 index = GetIndexBySize(original_bitmap_sizes, |
| 396 current_candidate()->icon_sizes[0]); | 401 current_candidate()->icon_sizes[0]); |
| 397 // Find largest bitmap if there is no one exactly matched. | 402 // Find largest bitmap if there is no one exactly matched. |
| 398 if (index == -1) | 403 if (index == -1) |
| 399 index = GetLargestSizeIndex(original_bitmap_sizes); | 404 index = GetLargestSizeIndex(original_bitmap_sizes); |
| 400 } | 405 } |
| 401 image_skia = gfx::ImageSkia(gfx::ImageSkiaRep(bitmaps[index], 1)); | 406 image_skia = gfx::ImageSkia(gfx::ImageSkiaRep(bitmaps[index], 1)); |
| 402 } else { | 407 } else { |
| 403 image_skia = CreateFaviconImageSkia(bitmaps, | 408 image_skia = CreateFaviconImageSkia(bitmaps, |
| 404 original_bitmap_sizes, | 409 original_bitmap_sizes, |
| 405 preferred_icon_size(), | 410 preferred_icon_size(), |
| 406 &score); | 411 &score); |
| 407 } | 412 } |
| 408 | 413 |
| 409 if (!image_skia.isNull()) { | 414 if (!image_skia.isNull()) { |
| 410 gfx::Image image(image_skia); | 415 gfx::Image image(image_skia); |
| 411 // The downloaded icon is still valid when there is no FaviconURL update | 416 // The downloaded icon is still valid when there is no FaviconURL update |
| 412 // during the downloading. | 417 // during the downloading. |
| 413 if (!bitmaps.empty()) { | 418 if (!bitmaps.empty()) { |
| 414 request_next_icon = !UpdateFaviconCandidate( | 419 request_next_icon = !UpdateFaviconCandidate( |
| 415 i->second.url, image_url, image, score, i->second.icon_type); | 420 download_request.url, image_url, image, score, |
| 421 download_request.icon_type); |
| 416 } | 422 } |
| 417 } | 423 } |
| 418 if (request_next_icon && !PageChangedSinceFaviconWasRequested() && | 424 if (request_next_icon && !PageChangedSinceFaviconWasRequested() && |
| 419 image_urls_.size() > 1) { | 425 image_urls_.size() > 1) { |
| 420 // Remove the first member of image_urls_ and process the remaining. | 426 // Remove the first member of image_urls_ and process the remaining. |
| 421 image_urls_.erase(image_urls_.begin()); | 427 image_urls_.erase(image_urls_.begin()); |
| 422 ProcessCurrentUrl(); | 428 ProcessCurrentUrl(); |
| 423 } else if (best_favicon_candidate_.icon_type != | 429 } else if (best_favicon_candidate_.icon_type != |
| 424 favicon_base::INVALID_ICON) { | 430 favicon_base::INVALID_ICON) { |
| 425 // No more icons to request, set the favicon from the candidate. | 431 // No more icons to request, set the favicon from the candidate. |
| 426 SetFavicon(best_favicon_candidate_.url, | 432 SetFavicon(best_favicon_candidate_.url, |
| 427 best_favicon_candidate_.image_url, | 433 best_favicon_candidate_.image_url, |
| 428 best_favicon_candidate_.image, | 434 best_favicon_candidate_.image, |
| 429 best_favicon_candidate_.icon_type); | 435 best_favicon_candidate_.icon_type); |
| 430 // Reset candidate. | 436 // Reset candidate. |
| 431 image_urls_.clear(); | 437 image_urls_.clear(); |
| 438 download_requests_.clear(); |
| 432 best_favicon_candidate_ = FaviconCandidate(); | 439 best_favicon_candidate_ = FaviconCandidate(); |
| 433 } | 440 } |
| 434 } | 441 } |
| 435 download_requests_.erase(i); | |
| 436 } | 442 } |
| 437 | 443 |
| 438 bool FaviconHandler::PageChangedSinceFaviconWasRequested() { | 444 bool FaviconHandler::PageChangedSinceFaviconWasRequested() { |
| 439 if (UrlMatches(driver_->GetActiveURL(), url_) && url_.is_valid()) { | 445 if (UrlMatches(driver_->GetActiveURL(), url_) && url_.is_valid()) { |
| 440 return false; | 446 return false; |
| 441 } | 447 } |
| 442 // If the URL has changed out from under us (as will happen with redirects) | 448 // If the URL has changed out from under us (as will happen with redirects) |
| 443 // return true. | 449 // return true. |
| 444 return true; | 450 return true; |
| 445 } | 451 } |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 continue; | 684 continue; |
| 679 | 685 |
| 680 gfx::Size largest = | 686 gfx::Size largest = |
| 681 image_url.icon_sizes[GetLargestSizeIndex(image_url.icon_sizes)]; | 687 image_url.icon_sizes[GetLargestSizeIndex(image_url.icon_sizes)]; |
| 682 image_url.icon_sizes.clear(); | 688 image_url.icon_sizes.clear(); |
| 683 image_url.icon_sizes.push_back(largest); | 689 image_url.icon_sizes.push_back(largest); |
| 684 } | 690 } |
| 685 std::stable_sort(image_urls_.begin(), image_urls_.end(), | 691 std::stable_sort(image_urls_.begin(), image_urls_.end(), |
| 686 CompareIconSize); | 692 CompareIconSize); |
| 687 } | 693 } |
| OLD | NEW |