Chromium Code Reviews| Index: components/favicon/core/favicon_handler.cc |
| diff --git a/components/favicon/core/favicon_handler.cc b/components/favicon/core/favicon_handler.cc |
| index 64c8961ae23ad760d06e826ee6e04bf06b7f1b2d..409896000cb29db1a64e4d3bc04602f6a1a7a730 100644 |
| --- a/components/favicon/core/favicon_handler.cc |
| +++ b/components/favicon/core/favicon_handler.cc |
| @@ -12,6 +12,7 @@ |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "base/memory/ref_counted_memory.h" |
| +#include "base/metrics/histogram_macros.h" |
| #include "build/build_config.h" |
| #include "components/favicon/core/favicon_service.h" |
| #include "components/favicon_base/favicon_util.h" |
| @@ -59,6 +60,30 @@ bool IsValid(const favicon_base::FaviconRawBitmapResult& bitmap_result) { |
| return bitmap_result.is_valid(); |
| } |
| +void RecordDownloadAttemptsForHandlerType( |
| + FaviconDriverObserver::NotificationIconType handler_type, |
| + int attempts) { |
| + // If not at least one attempts was recorded or more than 15 attempts were |
| + // registered, something went wrong. Underflows are stored in bucket 0 and |
| + // overflows in bucket 16. |
| + attempts = std::max(0, std::min(attempts, 16)); |
| + switch (handler_type) { |
| + case FaviconDriverObserver::NON_TOUCH_16_DIP: |
| + INTERNAL_HISTOGRAM_SPARSE_SLOWLY("Favicons.DownloadAttempts.Favicons", |
|
Ilya Sherman
2017/04/13 21:17:59
Please use UMA_HISTOGRAM_SPARSE_SLOWLY. The INTER
fhorschig
2017/04/18 15:15:26
Done and thanks!
|
| + attempts); |
| + return; |
| + case FaviconDriverObserver::NON_TOUCH_LARGEST: |
| + INTERNAL_HISTOGRAM_SPARSE_SLOWLY("Favicons.DownloadAttempts.LargeIcons", |
| + attempts); |
| + return; |
| + case FaviconDriverObserver::TOUCH_LARGEST: |
| + INTERNAL_HISTOGRAM_SPARSE_SLOWLY("Favicons.DownloadAttempts.TouchIcons", |
| + attempts); |
| + return; |
| + } |
| + NOTREACHED(); |
| +} |
| + |
| // Returns true if |bitmap_results| is non-empty and: |
| // - At least one of the bitmaps in |bitmap_results| is expired |
| // OR |
| @@ -167,6 +192,7 @@ FaviconHandler::FaviconHandler( |
| notification_icon_type_(favicon_base::INVALID_ICON), |
| service_(service), |
| delegate_(delegate), |
| + num_download_requests_(0), |
| current_candidate_index_(0u) { |
| DCHECK(delegate_); |
| } |
| @@ -199,6 +225,7 @@ void FaviconHandler::FetchFavicon(const GURL& url) { |
| candidates_.clear(); |
| notification_icon_url_ = GURL(); |
| notification_icon_type_ = favicon_base::INVALID_ICON; |
| + num_download_requests_ = 0; |
| current_candidate_index_ = 0u; |
| best_favicon_ = DownloadedFavicon(); |
| @@ -311,6 +338,7 @@ void FaviconHandler::OnUpdateFaviconURL( |
| download_request_.Cancel(); |
| candidates_ = std::move(sorted_candidates); |
| + num_download_requests_ = 0; |
| current_candidate_index_ = 0u; |
| best_favicon_ = DownloadedFavicon(); |
| @@ -399,6 +427,9 @@ void FaviconHandler::OnDidDownloadFavicon( |
| ++current_candidate_index_; |
| DownloadCurrentCandidateOrAskFaviconService(); |
| } else { |
| + // OnDidDownloadFavicon() can only be called after requesting a download, so |
| + // |num_download_requests_| can never be 0. |
| + RecordDownloadAttemptsForHandlerType(handler_type_, num_download_requests_); |
| // We have either found the ideal candidate or run out of candidates. |
| if (best_favicon_.candidate.icon_type != favicon_base::INVALID_ICON) { |
| // No more icons to request, set the favicon from the candidate. |
| @@ -407,6 +438,7 @@ void FaviconHandler::OnDidDownloadFavicon( |
| } |
| // Clear download related state. |
| current_candidate_index_ = candidates_.size(); |
| + num_download_requests_ = 0; |
| best_favicon_ = DownloadedFavicon(); |
| } |
| } |
| @@ -517,6 +549,8 @@ void FaviconHandler::OnFaviconData(const std::vector< |
| if (has_expired_or_incomplete_result) { |
| ScheduleDownload(current_candidate()->icon_url, |
| current_candidate()->icon_type); |
| + } else if (num_download_requests_ > 0) { |
| + RecordDownloadAttemptsForHandlerType(handler_type_, num_download_requests_); |
| } |
| } |
| @@ -531,6 +565,7 @@ void FaviconHandler::ScheduleDownload(const GURL& image_url, |
| std::vector<gfx::Size>()); |
| return; |
| } |
| + ++num_download_requests_; |
| download_request_.Reset(base::Bind(&FaviconHandler::OnDidDownloadFavicon, |
| base::Unretained(this), icon_type)); |
| // A max bitmap size is specified to avoid receiving huge bitmaps in |