Index: components/ntp_tiles/icon_cacher_impl.cc |
diff --git a/components/ntp_tiles/icon_cacher_impl.cc b/components/ntp_tiles/icon_cacher_impl.cc |
index cb957ea010e58bcd9e70444e6dc578aed426c45e..d2289f4f2a3ec9f6d14b9fa5955b685cf739510b 100644 |
--- a/components/ntp_tiles/icon_cacher_impl.cc |
+++ b/components/ntp_tiles/icon_cacher_impl.cc |
@@ -11,6 +11,7 @@ |
#include "components/favicon_base/favicon_types.h" |
#include "components/favicon_base/favicon_util.h" |
#include "components/image_fetcher/image_fetcher.h" |
+#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/image/image.h" |
#include "url/gurl.h" |
@@ -30,6 +31,14 @@ const GURL& IconURL(const PopularSites::Site& site) { |
} // namespace |
+struct IconCacherImpl::DefaultIcon { |
+ DefaultIcon(const PopularSites::Site& popular_site, int image_resource_id) |
+ : site(popular_site), image_resource(image_resource_id) {} |
+ |
+ PopularSites::Site site; |
+ int image_resource; |
+}; |
+ |
IconCacherImpl::IconCacherImpl( |
favicon::FaviconService* favicon_service, |
std::unique_ptr<image_fetcher::ImageFetcher> image_fetcher) |
@@ -59,6 +68,11 @@ void IconCacherImpl::OnGetFaviconImageForPageURLFinished( |
return; |
} |
+ if (ProvideDefaultIcon(site)) { |
+ done.Run(true); |
+ // Don't return. We want to fetch to update possibly stale images. |
+ } |
+ |
image_fetcher_->StartOrQueueNetworkRequest( |
std::string(), IconURL(site), |
base::Bind(&IconCacherImpl::OnFaviconDownloaded, base::Unretained(this), |
@@ -74,10 +88,31 @@ void IconCacherImpl::OnFaviconDownloaded(PopularSites::Site site, |
return; |
} |
- gfx::Image image = fetched_image; |
+ SaveIconForSite(site, fetched_image); |
+ done.Run(true); |
+} |
+ |
+void IconCacherImpl::SaveIconForSite(const PopularSites::Site& site, |
+ gfx::Image image) { |
favicon_base::SetFaviconColorSpace(&image); |
favicon_service_->SetFavicons(site.url, IconURL(site), IconType(site), image); |
- done.Run(true); |
+} |
+ |
+bool IconCacherImpl::ProvideDefaultIcon(const PopularSites::Site& site) { |
+ auto it = default_icons_.find(site.url.spec()); |
+ if (it == default_icons_.end()) { |
+ return false; |
+ } |
+ const DefaultIcon& icon = it->second; |
+ SaveIconForSite(icon.site, ResourceBundle::GetSharedInstance().GetImageNamed( |
+ icon.image_resource)); |
+ return true; |
+} |
+ |
+void IconCacherImpl::AddDefaultImage(const PopularSites::Site& site, |
+ int image_resource_id) { |
+ default_icons_.insert( |
+ std::make_pair(site.url.spec(), DefaultIcon(site, image_resource_id))); |
} |
} // namespace ntp_tiles |