Index: chrome/browser/favicon/favicon_handler.cc |
diff --git a/chrome/browser/favicon/favicon_handler.cc b/chrome/browser/favicon/favicon_handler.cc |
index 49adcd6f6f21e64cd036e6ade5b2854e8775d3f7..dc2b228c6a2189fb0fd89b93557259225c6b21b1 100644 |
--- a/chrome/browser/favicon/favicon_handler.cc |
+++ b/chrome/browser/favicon/favicon_handler.cc |
@@ -61,6 +61,17 @@ bool UrlMatches(const GURL& gurl_a, const GURL& gurl_b) { |
return UrlWithoutFragment(gurl_a) == UrlWithoutFragment(gurl_b); |
} |
+// Returns true if at least one of the bitmaps in |favicon_bitmap_results| is |
+// expired. |
+bool HasExpiredFaviconResult( |
+ const std::vector<history::FaviconBitmapResult>& favicon_bitmap_results) { |
+ for (size_t i = 0; i < favicon_bitmap_results.size(); ++i) { |
+ if (favicon_bitmap_results[i].expired) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
@@ -278,11 +289,13 @@ void FaviconHandler::ProcessCurrentUrl() { |
entry->GetFavicon().url = current_candidate()->icon_url; |
} else if (!favicon_expired_ && got_favicon_from_history_ && |
- history_icon_.is_valid() && |
- DoUrlAndIconMatch( |
- *current_candidate(), |
- history_icon_.icon_url, history_icon_.icon_type)) { |
- return; |
+ !history_results_.empty()) { |
+ const history::FaviconBitmapResult& bitmap_result = history_results_[0]; |
+ if (bitmap_result.is_valid() && |
+ DoUrlAndIconMatch(*current_candidate(), bitmap_result.icon_url, |
+ bitmap_result.icon_type)) { |
+ return; |
+ } |
} |
if (got_favicon_from_history_) |
@@ -356,7 +369,7 @@ void FaviconHandler::UpdateFaviconMappingAndFetch( |
const GURL& icon_url, |
history::IconType icon_type, |
CancelableRequestConsumerBase* consumer, |
- const FaviconService::FaviconDataCallback& callback) { |
+ const FaviconService::FaviconResultsCallback& callback) { |
GetFaviconService()->UpdateFaviconMappingAndFetch(page_url, icon_url, |
icon_type, consumer, callback); |
} |
@@ -365,17 +378,19 @@ void FaviconHandler::GetFavicon( |
const GURL& icon_url, |
history::IconType icon_type, |
CancelableRequestConsumerBase* consumer, |
- const FaviconService::FaviconDataCallback& callback) { |
- GetFaviconService()->GetFavicon(icon_url, icon_type, consumer, callback); |
+ const FaviconService::FaviconResultsCallback& callback) { |
+ GetFaviconService()->GetFavicon(icon_url, icon_type, preferred_icon_size(), |
+ ui::GetSupportedScaleFactors(), consumer, callback); |
} |
void FaviconHandler::GetFaviconForURL( |
const GURL& page_url, |
int icon_types, |
CancelableRequestConsumerBase* consumer, |
- const FaviconService::FaviconDataCallback& callback) { |
+ const FaviconService::FaviconResultsCallback& callback) { |
GetFaviconService()->GetFaviconForURL(profile_, page_url, icon_types, |
- consumer, callback); |
+ preferred_icon_size(), ui::GetSupportedScaleFactors(), consumer, |
+ callback); |
} |
void FaviconHandler::SetHistoryFavicon( |
@@ -398,35 +413,42 @@ bool FaviconHandler::ShouldSaveFavicon(const GURL& url) { |
void FaviconHandler::OnFaviconDataForInitialURL( |
FaviconService::Handle handle, |
- history::FaviconData favicon) { |
+ std::vector<history::FaviconBitmapResult> favicon_bitmap_results, |
+ history::IconURLSizesMap icon_url_sizes) { |
NavigationEntry* entry = GetEntry(); |
if (!entry) |
return; |
got_favicon_from_history_ = true; |
- history_icon_ = favicon; |
+ history_results_ = favicon_bitmap_results; |
+ |
+ bool has_results = !favicon_bitmap_results.empty(); |
+ favicon_expired_ = (has_results && |
+ HasExpiredFaviconResult(favicon_bitmap_results)); |
- favicon_expired_ = (favicon.known_icon && favicon.expired); |
+ history::FaviconBitmapResult bitmap_result; |
+ if (has_results) |
+ bitmap_result = favicon_bitmap_results[0]; |
- if (favicon.known_icon && favicon.icon_type == history::FAVICON && |
+ if (has_results && bitmap_result.icon_type == history::FAVICON && |
!entry->GetFavicon().valid && |
(!current_candidate() || |
- DoUrlAndIconMatch( |
- *current_candidate(), favicon.icon_url, favicon.icon_type))) { |
+ DoUrlAndIconMatch(*current_candidate(), |
+ bitmap_result.icon_url, bitmap_result.icon_type))) { |
// The db knows the favicon (although it may be out of date) and the entry |
// doesn't have an icon. Set the favicon now, and if the favicon turns out |
// to be expired (or the wrong url) we'll fetch later on. This way the |
// user doesn't see a flash of the default favicon. |
- entry->GetFavicon().url = favicon.icon_url; |
- if (favicon.is_valid()) |
- UpdateFavicon(entry, favicon.image_data); |
+ entry->GetFavicon().url = bitmap_result.icon_url; |
+ if (bitmap_result.is_valid()) |
+ UpdateFavicon(entry, bitmap_result.bitmap_data); |
entry->GetFavicon().valid = true; |
} |
- if (favicon.known_icon && !favicon.expired) { |
+ if (has_results && !bitmap_result.expired) { |
if (current_candidate() && |
- !DoUrlAndIconMatch( |
- *current_candidate(), favicon.icon_url, favicon.icon_type)) { |
+ !DoUrlAndIconMatch(*current_candidate(), |
+ bitmap_result.icon_url, bitmap_result.icon_type)) { |
// Mapping in the database is wrong. DownloadFavIconOrAskHistory will |
// update the mapping for this url and download the favicon if we don't |
// already have it. |
@@ -474,32 +496,39 @@ void FaviconHandler::DownloadFaviconOrAskHistory( |
} |
} |
-void FaviconHandler::OnFaviconData(FaviconService::Handle handle, |
- history::FaviconData favicon) { |
+void FaviconHandler::OnFaviconData( |
+ FaviconService::Handle handle, |
+ std::vector<history::FaviconBitmapResult> favicon_bitmap_results, |
+ history::IconURLSizesMap icon_url_sizes) { |
NavigationEntry* entry = GetEntry(); |
if (!entry) |
return; |
+ bool has_results = !favicon_bitmap_results.empty(); |
+ history::FaviconBitmapResult bitmap_result; |
+ if (has_results) |
+ bitmap_result = favicon_bitmap_results[0]; |
+ |
// No need to update the favicon url. By the time we get here |
// UpdateFaviconURL will have set the favicon url. |
- if (favicon.icon_type == history::FAVICON) { |
- if (favicon.is_valid()) { |
+ if (has_results && bitmap_result.icon_type == history::FAVICON) { |
+ if (bitmap_result.is_valid()) { |
// 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. |
- UpdateFavicon(entry, favicon.image_data); |
+ UpdateFavicon(entry, bitmap_result.bitmap_data); |
} |
- if (!favicon.known_icon || favicon.expired) { |
- // We don't know the favicon, or it is out of date. Request the current |
- // one. |
+ if (HasExpiredFaviconResult(favicon_bitmap_results)) { |
+ // The favicon is out of date. Request the current one. |
ScheduleDownload(entry->GetURL(), entry->GetFavicon().url, |
preferred_icon_size(), |
history::FAVICON, |
FaviconTabHelper::ImageDownloadCallback()); |
} |
- } else if (current_candidate() && (!favicon.known_icon || favicon.expired || |
- !(DoUrlAndIconMatch( |
- *current_candidate(), favicon.icon_url, favicon.icon_type)))) { |
+ } else if (current_candidate() && |
+ (!has_results || HasExpiredFaviconResult(favicon_bitmap_results) || |
+ !(DoUrlAndIconMatch(*current_candidate(), bitmap_result.icon_url, |
+ bitmap_result.icon_type)))) { |
// 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. |
ScheduleDownload(entry->GetURL(), current_candidate()->icon_url, |
@@ -507,7 +536,7 @@ void FaviconHandler::OnFaviconData(FaviconService::Handle handle, |
ToHistoryIconType(current_candidate()->icon_type), |
FaviconTabHelper::ImageDownloadCallback()); |
} |
- history_icon_ = favicon; |
+ history_results_ = favicon_bitmap_results; |
} |
int FaviconHandler::ScheduleDownload( |