Index: components/favicon/core/favicon_handler.cc |
diff --git a/components/favicon/core/favicon_handler.cc b/components/favicon/core/favicon_handler.cc |
index 1d5eac7ccdf34289398f1c2aa256434a160ccb5a..b96e36facfcd3feaef8c21926001f2e21edfc757 100644 |
--- a/components/favicon/core/favicon_handler.cc |
+++ b/components/favicon/core/favicon_handler.cc |
@@ -74,12 +74,17 @@ bool IsValid(const favicon_base::FaviconRawBitmapResult& bitmap_result) { |
return bitmap_result.is_valid(); |
} |
-// Returns true if at least one of the bitmaps in |bitmap_results| is expired or |
-// if |bitmap_results| is missing favicons for |desired_size_in_dip| and one of |
-// the scale factors in favicon_base::GetFaviconScales(). |
+// Returns true if |bitmap_results| is non-empty and: |
+// - At least one of the bitmaps in |bitmap_results| is expired |
+// OR |
+// - |bitmap_results| is missing favicons for |desired_size_in_dip| and one of |
+// the scale factors in favicon_base::GetFaviconScales(). |
bool HasExpiredOrIncompleteResult( |
int desired_size_in_dip, |
const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results) { |
+ if (bitmap_results.empty()) |
+ return false; |
+ |
// Check if at least one of the bitmaps is expired. |
std::vector<favicon_base::FaviconRawBitmapResult>::const_iterator it = |
std::find_if(bitmap_results.begin(), bitmap_results.end(), IsExpired); |
@@ -558,7 +563,7 @@ void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( |
got_favicon_from_history_ = true; |
history_results_ = favicon_bitmap_results; |
bool has_results = !favicon_bitmap_results.empty(); |
- favicon_expired_or_incomplete_ = has_results && HasExpiredOrIncompleteResult( |
+ favicon_expired_or_incomplete_ = HasExpiredOrIncompleteResult( |
preferred_icon_size(), favicon_bitmap_results); |
bool has_valid_result = HasValidResult(favicon_bitmap_results); |
@@ -643,35 +648,28 @@ void FaviconHandler::OnFaviconData(const std::vector< |
bool has_expired_or_incomplete_result = HasExpiredOrIncompleteResult( |
preferred_icon_size(), favicon_bitmap_results); |
bool has_valid_result = HasValidResult(favicon_bitmap_results); |
+ history_results_ = favicon_bitmap_results; |
- if (has_results && handler_type_ == FAVICON && !download_largest_icon_) { |
- if (has_valid_result) { |
- // There is a favicon, set it now. If expired we'll download the current |
- // one again, but at least the user will get some icon instead of the |
- // default and most likely the current one is fine anyway. |
- NotifyFaviconAvailable(favicon_bitmap_results); |
- } |
- if (has_expired_or_incomplete_result) { |
- // The favicon is out of date. Request the current one. |
- ScheduleDownload(driver_->GetActiveURL(), |
- driver_->GetActiveFaviconURL(), |
- favicon_base::FAVICON); |
- } |
- } else if (current_candidate() && |
- (!has_results || has_expired_or_incomplete_result || |
- !(DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)))) { |
- // We don't know the favicon, it is out of date or its type is not same as |
- // one got from page. Request the current one. |
+ if (has_valid_result) { |
+ // There is a valid favicon. Notify any observers. It is useful to notify |
+ // the observers even if the favicon is expired or incomplete (incorrect |
+ // size) because temporarily showing the user an expired favicon or |
+ // streched favicon is preferable to showing the user the default favicon. |
+ NotifyFaviconAvailable(favicon_bitmap_results); |
+ } |
+ |
+ if (!current_candidate() || |
+ (has_results && |
+ !DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) { |
+ // The icon URLs have been updated since the favicon data was requested. |
+ return; |
+ } |
+ |
+ if (!has_results || has_expired_or_incomplete_result) { |
ScheduleDownload(driver_->GetActiveURL(), |
current_candidate()->icon_url, |
current_candidate()->icon_type); |
} |
- history_results_ = favicon_bitmap_results; |
- |
- if (has_valid_result && |
- (handler_type_ != FAVICON || download_largest_icon_)) { |
- NotifyFaviconAvailable(favicon_bitmap_results); |
- } |
} |
void FaviconHandler::ScheduleDownload(const GURL& url, |