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 c5c85acdd0ec3b9e3a022d4304ac27ac36f20593..aa4e9118e50c5e67c084fa3c4de4f6db50f6784c 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/geometry/size.h" |
#include "ui/gfx/image/image.h" |
#include "url/gurl.h" |
@@ -44,43 +45,62 @@ IconCacherImpl::IconCacherImpl( |
IconCacherImpl::~IconCacherImpl() = default; |
-void IconCacherImpl::StartFetch(PopularSites::Site site, |
- const base::Callback<void(bool)>& done) { |
+void IconCacherImpl::StartFetch( |
+ PopularSites::Site site, |
+ const base::Closure& icon_available, |
+ const base::Closure& preliminary_icon_available) { |
+ DCHECK(!icon_available.is_null()); |
favicon::GetFaviconImageForPageURL( |
favicon_service_, site.url, IconType(site), |
base::Bind(&IconCacherImpl::OnGetFaviconImageForPageURLFinished, |
- base::Unretained(this), std::move(site), done), |
+ base::Unretained(this), std::move(site), icon_available, |
+ preliminary_icon_available), |
&tracker_); |
} |
void IconCacherImpl::OnGetFaviconImageForPageURLFinished( |
PopularSites::Site site, |
- const base::Callback<void(bool)>& done, |
+ const base::Closure& icon_available, |
+ const base::Closure& preliminary_icon_available, |
const favicon_base::FaviconImageResult& result) { |
if (!result.image.IsEmpty()) { |
- done.Run(false); |
return; |
} |
+ if (ProvideDefaultIcon(site) && !preliminary_icon_available.is_null()) { |
+ preliminary_icon_available.Run(); |
+ } |
image_fetcher_->StartOrQueueNetworkRequest( |
std::string(), IconURL(site), |
base::Bind(&IconCacherImpl::OnFaviconDownloaded, base::Unretained(this), |
- site, done)); |
+ site, icon_available)); |
} |
void IconCacherImpl::OnFaviconDownloaded(PopularSites::Site site, |
- const base::Callback<void(bool)>& done, |
+ const base::Closure& icon_available, |
const std::string& id, |
const gfx::Image& fetched_image) { |
if (fetched_image.IsEmpty()) { |
- done.Run(false); |
return; |
} |
- gfx::Image image = fetched_image; |
+ SaveIconForSite(site, fetched_image); |
+ icon_available.Run(); |
+} |
+ |
+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) { |
+ if (site.default_icon_resource < 0) { |
+ return false; |
+ } |
+ SaveIconForSite(site, ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
+ site.default_icon_resource)); |
+ return true; |
} |
} // namespace ntp_tiles |