Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1137)

Unified Diff: components/favicon/core/favicon_handler.h

Issue 2739173002: Always select best favicon bitmap (Closed)
Patch Set: Updated. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..45db6d59b0754c189762cc89047bb97d26e898f8 100644
--- a/components/favicon/core/favicon_handler.h
+++ b/components/favicon/core/favicon_handler.h
@@ -68,14 +68,63 @@ 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:
+ class TargetSpec {
+ public:
+ static TargetSpec ForLargest();
+ static TargetSpec For16x16Dips();
+
+ TargetSpec(const TargetSpec&);
+ ~TargetSpec();
+
+ // Returns the target sizes to be fetched, sorted in ascending order.
+ // FaviconHandler will ensure a bitmap for each pixel sizes
+ // either by searching among candidates for an exact match, or by resampling
+ // the closest match.
+ std::vector<int> GetPixelSizes() const;
+
+ // Returns the maximum value instead of all.
+ int GetMaxPixelSize() const;
+
+ // Returns whether the spec is requiring the best-matching bitmap only.
+ bool WantsBestBitmapOnly() const;
+
+ // Compares two sizes in pixels, i.e. whether |size1| is a better match than
+ // |size2| for |pixel_size|.
+ bool IsBetterMatch(const gfx::Size& size1, const gfx::Size& size2) const;
+
+ // Checks if |bitmap_results| contains all bitmaps required by this
+ // specification.
+ bool HasCompleteResult(
+ const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results)
+ const;
+
+ gfx::ImageSkia CreateImageSkia(
+ const std::vector<SkBitmap>& bitmaps,
+ const std::vector<gfx::Size>& original_bitmap_sizes) const;
+
+ gfx::Image CreateImageFromCache(
+ const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results)
+ const;
+
+ private:
+ TargetSpec();
+
+ // Map representing the target sizes to be fetched and their corresponding
+ // scale factors.
+ std::map<int, float> pixel_sizes_;
+
+ // If true, FaviconHandler will resample candidates whenever needed to
+ // ensure that bitmaps for all |pixel_sizes| are produced.
+ bool ensure_exact_size_;
+ };
+
class Delegate {
public:
// Mimics WebContents::ImageDownloadCallback.
@@ -162,12 +211,10 @@ class FaviconHandler {
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;
};
@@ -208,10 +255,10 @@ class FaviconHandler {
bool ShouldSaveFavicon();
- // Updates |favicon_candidate_| and returns true if it is an exact match.
+ // Updates |favicon_candidate_| 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,
favicon_base::IconType icon_type);
// Sets the image data for the favicon.
@@ -238,12 +285,6 @@ class FaviconHandler {
: 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;
- }
-
// Used for FaviconService requests.
base::CancelableTaskTracker cancelable_task_tracker_;
@@ -274,8 +315,8 @@ 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_;
+ // Desired icon size.
+ const TargetSpec target_spec_;
// The prioritized favicon candidates from the page back from the renderer.
std::vector<favicon::FaviconURL> image_urls_;
« no previous file with comments | « no previous file | components/favicon/core/favicon_handler.cc » ('j') | components/favicon/core/favicon_handler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698