| 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..a15bf07d4df044b27acf62a0859c99f5e91a3bc6 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" | 
|  | 
| @@ -41,43 +42,63 @@ 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::Callback<void(bool)>& icon_available) { | 
| 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), | 
| &tracker_); | 
| } | 
|  | 
| void IconCacherImpl::OnGetFaviconImageForPageURLFinished( | 
| PopularSites::Site site, | 
| -    const base::Callback<void(bool)>& done, | 
| +    const base::Callback<void(bool)>& icon_available, | 
| const favicon_base::FaviconImageResult& result) { | 
| if (!result.image.IsEmpty()) { | 
| -    done.Run(false); | 
| +    icon_available.Run(false); | 
| return; | 
| } | 
|  | 
| +  if (ProvideDefaultIcon(site)) { | 
| +    icon_available.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), | 
| -                 site, done)); | 
| +                 site, icon_available)); | 
| } | 
|  | 
| -void IconCacherImpl::OnFaviconDownloaded(PopularSites::Site site, | 
| -                                         const base::Callback<void(bool)>& done, | 
| -                                         const std::string& id, | 
| -                                         const gfx::Image& fetched_image) { | 
| +void IconCacherImpl::OnFaviconDownloaded( | 
| +    PopularSites::Site site, | 
| +    const base::Callback<void(bool)>& icon_available, | 
| +    const std::string& id, | 
| +    const gfx::Image& fetched_image) { | 
| if (fetched_image.IsEmpty()) { | 
| -    done.Run(false); | 
| +    icon_available.Run(false); | 
| return; | 
| } | 
|  | 
| -  gfx::Image image = fetched_image; | 
| +  SaveIconForSite(site, fetched_image); | 
| +  icon_available.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) { | 
| +  if (site.default_resource_id < 0) { | 
| +    return false; | 
| +  } | 
| +  SaveIconForSite(site, ResourceBundle::GetSharedInstance().GetNativeImageNamed( | 
| +                            site.default_resource_id)); | 
| +  return true; | 
| } | 
|  | 
| }  // namespace ntp_tiles | 
|  |