| Index: components/favicon/core/favicon_handler.h
|
| diff --git a/components/favicon/core/favicon_handler.h b/components/favicon/core/favicon_handler.h
|
| index f3d9d4b662c5d9c6f034cacffc7f5a8cfd67d9db..80e356ce9d578e2c95c007b6adedd7d909680d84 100644
|
| --- a/components/favicon/core/favicon_handler.h
|
| +++ b/components/favicon/core/favicon_handler.h
|
| @@ -14,8 +14,10 @@
|
| #include "base/macros.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/weak_ptr.h"
|
| +#include "base/optional.h"
|
| #include "base/task/cancelable_task_tracker.h"
|
| #include "components/favicon/core/favicon_driver_observer.h"
|
| +#include "components/favicon/core/favicon_selector.h"
|
| #include "components/favicon/core/favicon_url.h"
|
| #include "components/favicon_base/favicon_callback.h"
|
| #include "ui/gfx/favicon_size.h"
|
| @@ -68,11 +70,10 @@ class FaviconService;
|
| // favicon.
|
| //
|
| // When the renderer downloads favicons, it considers the entire list of
|
| -// favicon candidates, if |download_largest_favicon_| is true, the largest
|
| -// favicon will be used, otherwise the one that best matches the preferred size
|
| -// is chosen (or the first one if there is no preferred size). Once the
|
| -// matching favicon has been determined, SetFavicon is called which updates
|
| -// the page's favicon and notifies the database to save the favicon.
|
| +// favicon candidates. Among those, the one that matches |target_spec_|
|
| +// is chosen first. Once the matching favicon has been determined, SetFavicon
|
| +// is called which updates the page's favicon and notifies the database to save
|
| +// the favicon.
|
|
|
| class FaviconHandler {
|
| public:
|
| @@ -130,19 +131,10 @@ class FaviconHandler {
|
| void OnUpdateFaviconURL(const GURL& page_url,
|
| const std::vector<favicon::FaviconURL>& candidates);
|
|
|
| - // For testing.
|
| - const std::vector<favicon::FaviconURL>& image_urls() const {
|
| - return image_urls_;
|
| - }
|
| -
|
| // Returns whether the handler is waiting for a download to complete or for
|
| // data from the FaviconService. Reserved for testing.
|
| bool HasPendingTasksForTest();
|
|
|
| - // Get the maximal icon size in pixels for a icon of type |icon_type| for the
|
| - // current platform.
|
| - static int GetMaximalIconSize(favicon_base::IconType icon_type);
|
| -
|
| private:
|
| // Represents an in progress download of an image from the renderer.
|
| struct DownloadRequest {
|
| @@ -155,22 +147,6 @@ class FaviconHandler {
|
| favicon_base::IconType icon_type;
|
| };
|
|
|
| - // Used to track a candidate for the favicon.
|
| - struct FaviconCandidate {
|
| - FaviconCandidate();
|
| - ~FaviconCandidate();
|
| -
|
| - FaviconCandidate(const GURL& image_url,
|
| - const gfx::Image& image,
|
| - float score,
|
| - favicon_base::IconType icon_type);
|
| -
|
| - GURL image_url;
|
| - gfx::Image image;
|
| - float score;
|
| - favicon_base::IconType icon_type;
|
| - };
|
| -
|
| // Returns the bit mask of favicon_base::IconType based on the handler's type.
|
| static int GetIconTypesFromHandlerType(
|
| FaviconDriverObserver::NotificationIconType handler_type);
|
| @@ -183,11 +159,12 @@ class FaviconHandler {
|
| void OnFaviconDataForInitialURLFromFaviconService(const std::vector<
|
| favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results);
|
|
|
| + // Deques the next candidate to |current_candidate_| and starts processing it.
|
| // If the favicon currently mapped to |url_| has expired, downloads the
|
| // current candidate favicon from the renderer. Otherwise requests data for
|
| // the current favicon from history. If data is requested from history,
|
| // OnFaviconData() is called with the history data once it has been retrieved.
|
| - void DownloadCurrentCandidateOrAskFaviconService();
|
| + void DownloadNextCandidateOrAskFaviconService();
|
|
|
| // See description above class for details.
|
| void OnFaviconData(const std::vector<favicon_base::FaviconRawBitmapResult>&
|
| @@ -208,7 +185,8 @@ class FaviconHandler {
|
|
|
| bool ShouldSaveFavicon();
|
|
|
| - // Updates |favicon_candidate_| and returns true if it is an exact match.
|
| + // Updates candidate queues and returns true if no more candidates should be
|
| + // processed (e.g. an exact match was found).
|
| bool UpdateFaviconCandidate(const GURL& image_url,
|
| const gfx::Image& image,
|
| float score,
|
| @@ -231,17 +209,10 @@ class FaviconHandler {
|
| favicon_base::IconType icon_type,
|
| const gfx::Image& image);
|
|
|
| - // Return the current candidate if any.
|
| - favicon::FaviconURL* current_candidate() {
|
| - return current_candidate_index_ < image_urls_.size()
|
| - ? &image_urls_[current_candidate_index_]
|
| - : nullptr;
|
| - }
|
| -
|
| // Returns the preferred size of the image. 0 means no preference (any size
|
| // will do).
|
| int preferred_icon_size() const {
|
| - return download_largest_icon_ ? 0 : gfx::kFaviconSize;
|
| + return target_size_spec_.WantsBestBitmapOnly() ? 0 : gfx::kFaviconSize;
|
| }
|
|
|
| // Used for FaviconService requests.
|
| @@ -274,10 +245,18 @@ class FaviconHandler {
|
| // The combination of the supported icon types.
|
| const int icon_types_;
|
|
|
| - // Whether the largest icon should be downloaded.
|
| - const bool download_largest_icon_;
|
| + // The target "bucket" or requirements that the FaviconHandler will try to
|
| + // fulfill.
|
| + const FaviconSelector::TargetSizeSpec target_size_spec_;
|
| + std::unique_ptr<FaviconSelector> selector_;
|
| +
|
| + // Current candidate being processed.
|
| + base::Optional<FaviconSelector::Candidate> current_candidate_;
|
|
|
| - // The prioritized favicon candidates from the page back from the renderer.
|
| + // Image of the best favicon processed so far.
|
| + gfx::Image best_favicon_image_;
|
| +
|
| + // The filtered (per icon type) candidates provided by the page.
|
| std::vector<favicon::FaviconURL> image_urls_;
|
|
|
| // The icon URL and the icon type of the favicon in the most recent
|
| @@ -292,16 +271,6 @@ class FaviconHandler {
|
| // This handler's delegate.
|
| Delegate* delegate_;
|
|
|
| - // The index of the favicon URL in |image_urls_| which is currently being
|
| - // requested from history or downloaded.
|
| - size_t current_candidate_index_;
|
| -
|
| - // Best image we've seen so far. As images are downloaded from the page they
|
| - // are stored here. When there is an exact match, or no more images are
|
| - // available the favicon service and the current page are updated (assuming
|
| - // the image is for a favicon).
|
| - FaviconCandidate best_favicon_candidate_;
|
| -
|
| base::WeakPtrFactory<FaviconHandler> weak_ptr_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(FaviconHandler);
|
|
|