Chromium Code Reviews| 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 f8480de51e9a18affc9ec87c04dfca203339cee7..d2b3e5fce56215175ff77f63d4ec827f968abba4 100644 |
| --- a/components/ntp_tiles/icon_cacher_impl.cc |
| +++ b/components/ntp_tiles/icon_cacher_impl.cc |
| @@ -9,6 +9,8 @@ |
| #include "base/memory/ptr_util.h" |
| #include "components/favicon/core/favicon_service.h" |
| #include "components/favicon/core/favicon_util.h" |
| +#include "components/favicon/core/large_icon_service.h" |
| +#include "components/favicon_base/fallback_icon_style.h" |
| #include "components/favicon_base/favicon_types.h" |
| #include "components/favicon_base/favicon_util.h" |
| #include "components/image_fetcher/core/image_decoder.h" |
| @@ -24,6 +26,12 @@ namespace { |
| constexpr int kDesiredFrameSize = 128; |
| +// TODO(jkrcal): Make the size in dip and the scale factor be passed as |
| +// arguments from the UI so that we desire for the right size on a given device. |
| +// See crbug.com/696563. |
| +constexpr int kTileIconMinSizePx = 48; |
| +constexpr int kTileIconDesiredSizePx = 96; |
| + |
| favicon_base::IconType IconType(const PopularSites::Site& site) { |
| return site.large_icon_url.is_valid() ? favicon_base::TOUCH_ICON |
| : favicon_base::FAVICON; |
| @@ -34,12 +42,22 @@ const GURL& IconURL(const PopularSites::Site& site) { |
| : site.favicon_url; |
| } |
| +bool HasResultDefaultBackgroundColor( |
| + const favicon_base::LargeIconResult& result) { |
| + if (!result.fallback_icon_style) { |
| + return false; |
| + } |
| + return result.fallback_icon_style->is_default_background_color; |
|
pkotwicz
2017/05/12 15:40:18
Nit:
return result.fallback_icon_style && result.
jkrcal
2017/05/12 17:08:58
Even though the logic is simple, I prefer it separ
|
| +} |
| + |
| } // namespace |
| IconCacherImpl::IconCacherImpl( |
| favicon::FaviconService* favicon_service, |
| + favicon::LargeIconService* large_icon_service, |
| std::unique_ptr<image_fetcher::ImageFetcher> image_fetcher) |
| : favicon_service_(favicon_service), |
| + large_icon_service_(large_icon_service), |
| image_fetcher_(std::move(image_fetcher)), |
| weak_ptr_factory_(this) { |
| image_fetcher_->SetDataUseServiceName( |
| @@ -51,7 +69,7 @@ IconCacherImpl::IconCacherImpl( |
| IconCacherImpl::~IconCacherImpl() = default; |
| -void IconCacherImpl::StartFetch( |
| +void IconCacherImpl::StartFetchPopularSites( |
| PopularSites::Site site, |
| const base::Closure& icon_available, |
| const base::Closure& preliminary_icon_available) { |
| @@ -80,12 +98,13 @@ void IconCacherImpl::OnGetFaviconImageForPageURLFinished( |
| image_fetcher_->StartOrQueueNetworkRequest( |
| std::string(), IconURL(site), |
| - base::Bind(&IconCacherImpl::OnFaviconDownloaded, base::Unretained(this), |
| - site, base::Passed(std::move(preliminary_callback)), |
| + base::Bind(&IconCacherImpl::OnPopularSitesFaviconDownloaded, |
| + base::Unretained(this), site, |
| + base::Passed(std::move(preliminary_callback)), |
| icon_available)); |
| } |
| -void IconCacherImpl::OnFaviconDownloaded( |
| +void IconCacherImpl::OnPopularSitesFaviconDownloaded( |
| PopularSites::Site site, |
| std::unique_ptr<CancelableImageCallback> preliminary_callback, |
| const base::Closure& icon_available, |
| @@ -140,4 +159,43 @@ IconCacherImpl::MaybeProvideDefaultIcon(const PopularSites::Site& site, |
| return preliminary_callback; |
| } |
| +void IconCacherImpl::StartFetchMostLikely(const GURL& page_url, |
| + const base::Closure& icon_available) { |
| + // Desired size 0 means that we do not want the service to resize the image |
| + // (as we will not use it anyway). |
| + large_icon_service_->GetLargeIconOrFallbackStyle( |
| + page_url, kTileIconMinSizePx, /*desired_size_in_pixel=*/0, |
| + base::Bind(&IconCacherImpl::OnGetLargeIconOrFallbackStyleFinished, |
| + weak_ptr_factory_.GetWeakPtr(), page_url, icon_available), |
| + &tracker_); |
| +} |
| + |
| +void IconCacherImpl::OnGetLargeIconOrFallbackStyleFinished( |
| + const GURL& page_url, |
| + const base::Closure& icon_available, |
| + const favicon_base::LargeIconResult& result) { |
| + if (!HasResultDefaultBackgroundColor(result)) { |
| + // We should only fetch for default "gray" tiles so that we never overrite |
| + // any favicon of any size. |
| + return; |
| + } |
| + |
| + large_icon_service_ |
| + ->GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache( |
| + page_url, kTileIconMinSizePx, kTileIconDesiredSizePx, |
| + base::Bind(&IconCacherImpl::OnMostLikelyFaviconDownloaded, |
| + weak_ptr_factory_.GetWeakPtr(), icon_available)); |
| +} |
| + |
| +void IconCacherImpl::OnMostLikelyFaviconDownloaded( |
| + const base::Closure& icon_available, |
| + bool success) { |
| + if (!success) { |
| + return; |
| + } |
| + if (icon_available) { |
| + icon_available.Run(); |
| + } |
| +} |
| + |
| } // namespace ntp_tiles |