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

Side by Side Diff: components/favicon/core/favicon_handler.cc

Issue 1081003002: Simplify FaviconHandler::OnFaviconData() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@fix_favicon5
Patch Set: 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 | « no previous file | 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 // 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 "components/favicon/core/favicon_handler.h" 5 #include "components/favicon/core/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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 // Return true if |bitmap_result| is expired. 67 // Return true if |bitmap_result| is expired.
68 bool IsExpired(const favicon_base::FaviconRawBitmapResult& bitmap_result) { 68 bool IsExpired(const favicon_base::FaviconRawBitmapResult& bitmap_result) {
69 return bitmap_result.expired; 69 return bitmap_result.expired;
70 } 70 }
71 71
72 // Return true if |bitmap_result| is valid. 72 // Return true if |bitmap_result| is valid.
73 bool IsValid(const favicon_base::FaviconRawBitmapResult& bitmap_result) { 73 bool IsValid(const favicon_base::FaviconRawBitmapResult& bitmap_result) {
74 return bitmap_result.is_valid(); 74 return bitmap_result.is_valid();
75 } 75 }
76 76
77 // Returns true if at least one of the bitmaps in |bitmap_results| is expired or 77 // Returns true if |bitmap_results| is non-empty and:
78 // if |bitmap_results| is missing favicons for |desired_size_in_dip| and one of 78 // - At least one of the bitmaps in |bitmap_results| is expired
79 // the scale factors in favicon_base::GetFaviconScales(). 79 // OR
80 // - |bitmap_results| is missing favicons for |desired_size_in_dip| and one of
81 // the scale factors in favicon_base::GetFaviconScales().
80 bool HasExpiredOrIncompleteResult( 82 bool HasExpiredOrIncompleteResult(
81 int desired_size_in_dip, 83 int desired_size_in_dip,
82 const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results) { 84 const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results) {
85 if (bitmap_results.empty())
86 return false;
87
83 // Check if at least one of the bitmaps is expired. 88 // Check if at least one of the bitmaps is expired.
84 std::vector<favicon_base::FaviconRawBitmapResult>::const_iterator it = 89 std::vector<favicon_base::FaviconRawBitmapResult>::const_iterator it =
85 std::find_if(bitmap_results.begin(), bitmap_results.end(), IsExpired); 90 std::find_if(bitmap_results.begin(), bitmap_results.end(), IsExpired);
86 if (it != bitmap_results.end()) 91 if (it != bitmap_results.end())
87 return true; 92 return true;
88 93
89 // Any favicon size is good if the desired size is 0. 94 // Any favicon size is good if the desired size is 0.
90 if (desired_size_in_dip == 0) 95 if (desired_size_in_dip == 0)
91 return false; 96 return false;
92 97
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 } 556 }
552 557
553 void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( 558 void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService(
554 const std::vector<favicon_base::FaviconRawBitmapResult>& 559 const std::vector<favicon_base::FaviconRawBitmapResult>&
555 favicon_bitmap_results) { 560 favicon_bitmap_results) {
556 if (PageChangedSinceFaviconWasRequested()) 561 if (PageChangedSinceFaviconWasRequested())
557 return; 562 return;
558 got_favicon_from_history_ = true; 563 got_favicon_from_history_ = true;
559 history_results_ = favicon_bitmap_results; 564 history_results_ = favicon_bitmap_results;
560 bool has_results = !favicon_bitmap_results.empty(); 565 bool has_results = !favicon_bitmap_results.empty();
561 favicon_expired_or_incomplete_ = has_results && HasExpiredOrIncompleteResult( 566 favicon_expired_or_incomplete_ = HasExpiredOrIncompleteResult(
562 preferred_icon_size(), favicon_bitmap_results); 567 preferred_icon_size(), favicon_bitmap_results);
563 bool has_valid_result = HasValidResult(favicon_bitmap_results); 568 bool has_valid_result = HasValidResult(favicon_bitmap_results);
564 569
565 if (has_results && handler_type_ == FAVICON && 570 if (has_results && handler_type_ == FAVICON &&
566 !download_largest_icon_ && !driver_->GetActiveFaviconValidity() && 571 !download_largest_icon_ && !driver_->GetActiveFaviconValidity() &&
567 (!current_candidate() || 572 (!current_candidate() ||
568 DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) { 573 DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) {
569 if (has_valid_result) { 574 if (has_valid_result) {
570 // The db knows the favicon (although it may be out of date) and the entry 575 // The db knows the favicon (although it may be out of date) and the entry
571 // doesn't have an icon. Set the favicon now, and if the favicon turns out 576 // doesn't have an icon. Set the favicon now, and if the favicon turns out
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 641
637 void FaviconHandler::OnFaviconData(const std::vector< 642 void FaviconHandler::OnFaviconData(const std::vector<
638 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) { 643 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results) {
639 if (PageChangedSinceFaviconWasRequested()) 644 if (PageChangedSinceFaviconWasRequested())
640 return; 645 return;
641 646
642 bool has_results = !favicon_bitmap_results.empty(); 647 bool has_results = !favicon_bitmap_results.empty();
643 bool has_expired_or_incomplete_result = HasExpiredOrIncompleteResult( 648 bool has_expired_or_incomplete_result = HasExpiredOrIncompleteResult(
644 preferred_icon_size(), favicon_bitmap_results); 649 preferred_icon_size(), favicon_bitmap_results);
645 bool has_valid_result = HasValidResult(favicon_bitmap_results); 650 bool has_valid_result = HasValidResult(favicon_bitmap_results);
651 history_results_ = favicon_bitmap_results;
646 652
647 if (has_results && handler_type_ == FAVICON && !download_largest_icon_) { 653 if (has_valid_result) {
648 if (has_valid_result) { 654 // There is a valid favicon. Notify any observers. It is useful to notify
649 // There is a favicon, set it now. If expired we'll download the current 655 // the observers even if the favicon is expired or incomplete (incorrect
650 // one again, but at least the user will get some icon instead of the 656 // size) because temporarily showing the user an expired favicon or
651 // default and most likely the current one is fine anyway. 657 // streched favicon is preferable to showing the user the default favicon.
652 NotifyFaviconAvailable(favicon_bitmap_results); 658 NotifyFaviconAvailable(favicon_bitmap_results);
653 } 659 }
654 if (has_expired_or_incomplete_result) { 660
655 // The favicon is out of date. Request the current one. 661 if (!current_candidate() ||
656 ScheduleDownload(driver_->GetActiveURL(), 662 (has_results &&
657 driver_->GetActiveFaviconURL(), 663 !DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) {
658 favicon_base::FAVICON); 664 // The icon URLs have been updated since the favicon data was requested.
659 } 665 return;
660 } else if (current_candidate() && 666 }
661 (!has_results || has_expired_or_incomplete_result || 667
662 !(DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)))) { 668 if (!has_results || has_expired_or_incomplete_result) {
663 // We don't know the favicon, it is out of date or its type is not same as
664 // one got from page. Request the current one.
665 ScheduleDownload(driver_->GetActiveURL(), 669 ScheduleDownload(driver_->GetActiveURL(),
666 current_candidate()->icon_url, 670 current_candidate()->icon_url,
667 current_candidate()->icon_type); 671 current_candidate()->icon_type);
668 } 672 }
669 history_results_ = favicon_bitmap_results;
670
671 if (has_valid_result &&
672 (handler_type_ != FAVICON || download_largest_icon_)) {
673 NotifyFaviconAvailable(favicon_bitmap_results);
674 }
675 } 673 }
676 674
677 void FaviconHandler::ScheduleDownload(const GURL& url, 675 void FaviconHandler::ScheduleDownload(const GURL& url,
678 const GURL& image_url, 676 const GURL& image_url,
679 favicon_base::IconType icon_type) { 677 favicon_base::IconType icon_type) {
680 // A max bitmap size is specified to avoid receiving huge bitmaps in 678 // A max bitmap size is specified to avoid receiving huge bitmaps in
681 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload() 679 // OnDidDownloadFavicon(). See FaviconDriver::StartDownload()
682 // for more details about the max bitmap size. 680 // for more details about the max bitmap size.
683 const int download_id = DownloadFavicon(image_url, 681 const int download_id = DownloadFavicon(image_url,
684 GetMaximalIconSize(icon_type)); 682 GetMaximalIconSize(icon_type));
(...skipping 14 matching lines...) Expand all
699 gfx::Size largest = 697 gfx::Size largest =
700 image_url.icon_sizes[GetLargestSizeIndex(image_url.icon_sizes)]; 698 image_url.icon_sizes[GetLargestSizeIndex(image_url.icon_sizes)];
701 image_url.icon_sizes.clear(); 699 image_url.icon_sizes.clear();
702 image_url.icon_sizes.push_back(largest); 700 image_url.icon_sizes.push_back(largest);
703 } 701 }
704 std::stable_sort(image_urls_.begin(), image_urls_.end(), 702 std::stable_sort(image_urls_.begin(), image_urls_.end(),
705 CompareIconSize); 703 CompareIconSize);
706 } 704 }
707 705
708 } // namespace favicon 706 } // namespace favicon
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698