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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_ 5 #ifndef COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_
6 #define COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_ 6 #define COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <map> 10 #include <map>
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 // . Otherwise we ask the history database to update the mapping from 61 // . Otherwise we ask the history database to update the mapping from
62 // page url to favicon url and call us back with the favicon. Remember, it is 62 // page url to favicon url and call us back with the favicon. Remember, it is
63 // possible for the db to already have the favicon, just not the mapping 63 // possible for the db to already have the favicon, just not the mapping
64 // between page to favicon url. The callback for this is OnFaviconData. 64 // between page to favicon url. The callback for this is OnFaviconData.
65 // 65 //
66 // OnFaviconData either updates the favicon of the current page (if the 66 // OnFaviconData either updates the favicon of the current page (if the
67 // db knew about the favicon), or requests the renderer to download the 67 // db knew about the favicon), or requests the renderer to download the
68 // favicon. 68 // favicon.
69 // 69 //
70 // When the renderer downloads favicons, it considers the entire list of 70 // When the renderer downloads favicons, it considers the entire list of
71 // favicon candidates, if |download_largest_favicon_| is true, the largest 71 // favicon candidates. Among those, the one that matches |target_spec_|
72 // favicon will be used, otherwise the one that best matches the preferred size 72 // is chosen first. Once the matching favicon has been determined, SetFavicon
73 // is chosen (or the first one if there is no preferred size). Once the 73 // is called which updates the page's favicon and notifies the database to save
74 // matching favicon has been determined, SetFavicon is called which updates 74 // the favicon.
75 // the page's favicon and notifies the database to save the favicon.
76 75
77 class FaviconHandler { 76 class FaviconHandler {
78 public: 77 public:
78 class TargetSpec {
79 public:
80 static TargetSpec ForLargest();
81 static TargetSpec For16x16Dips();
82
83 TargetSpec(const TargetSpec&);
84 ~TargetSpec();
85
86 // Returns the target sizes to be fetched, sorted in ascending order.
87 // FaviconHandler will ensure a bitmap for each pixel sizes
88 // either by searching among candidates for an exact match, or by resampling
89 // the closest match.
90 std::vector<int> GetPixelSizes() const;
91
92 // Returns the maximum value instead of all.
93 int GetMaxPixelSize() const;
94
95 // Returns whether the spec is requiring the best-matching bitmap only.
96 bool WantsBestBitmapOnly() const;
97
98 // Compares two sizes in pixels, i.e. whether |size1| is a better match than
99 // |size2| for |pixel_size|.
100 bool IsBetterMatch(const gfx::Size& size1, const gfx::Size& size2) const;
101
102 // Checks if |bitmap_results| contains all bitmaps required by this
103 // specification.
104 bool HasCompleteResult(
105 const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results)
106 const;
107
108 gfx::ImageSkia CreateImageSkia(
109 const std::vector<SkBitmap>& bitmaps,
110 const std::vector<gfx::Size>& original_bitmap_sizes) const;
111
112 gfx::Image CreateImageFromCache(
113 const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results)
114 const;
115
116 private:
117 TargetSpec();
118
119 // Map representing the target sizes to be fetched and their corresponding
120 // scale factors.
121 std::map<int, float> pixel_sizes_;
122
123 // If true, FaviconHandler will resample candidates whenever needed to
124 // ensure that bitmaps for all |pixel_sizes| are produced.
125 bool ensure_exact_size_;
126 };
127
79 class Delegate { 128 class Delegate {
80 public: 129 public:
81 // Mimics WebContents::ImageDownloadCallback. 130 // Mimics WebContents::ImageDownloadCallback.
82 typedef base::Callback<void( 131 typedef base::Callback<void(
83 int id, 132 int id,
84 int status_code, 133 int status_code,
85 const GURL& image_url, 134 const GURL& image_url,
86 const std::vector<SkBitmap>& bitmaps, 135 const std::vector<SkBitmap>& bitmaps,
87 const std::vector<gfx::Size>& original_bitmap_sizes)> 136 const std::vector<gfx::Size>& original_bitmap_sizes)>
88 ImageDownloadCallback; 137 ImageDownloadCallback;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 favicon_base::IconType icon_type; 204 favicon_base::IconType icon_type;
156 }; 205 };
157 206
158 // Used to track a candidate for the favicon. 207 // Used to track a candidate for the favicon.
159 struct FaviconCandidate { 208 struct FaviconCandidate {
160 FaviconCandidate(); 209 FaviconCandidate();
161 ~FaviconCandidate(); 210 ~FaviconCandidate();
162 211
163 FaviconCandidate(const GURL& image_url, 212 FaviconCandidate(const GURL& image_url,
164 const gfx::Image& image, 213 const gfx::Image& image,
165 float score,
166 favicon_base::IconType icon_type); 214 favicon_base::IconType icon_type);
167 215
168 GURL image_url; 216 GURL image_url;
169 gfx::Image image; 217 gfx::Image image;
170 float score;
171 favicon_base::IconType icon_type; 218 favicon_base::IconType icon_type;
172 }; 219 };
173 220
174 // Returns the bit mask of favicon_base::IconType based on the handler's type. 221 // Returns the bit mask of favicon_base::IconType based on the handler's type.
175 static int GetIconTypesFromHandlerType( 222 static int GetIconTypesFromHandlerType(
176 FaviconDriverObserver::NotificationIconType handler_type); 223 FaviconDriverObserver::NotificationIconType handler_type);
177 224
178 // Called when the history request for favicon data mapped to |url_| has 225 // Called when the history request for favicon data mapped to |url_| has
179 // completed and the renderer has told us the icon URLs used by |url_| 226 // completed and the renderer has told us the icon URLs used by |url_|
180 void OnGotInitialHistoryDataAndIconURLCandidates(); 227 void OnGotInitialHistoryDataAndIconURLCandidates();
(...skipping 20 matching lines...) Expand all
201 // Triggered when a download of an image has finished. 248 // Triggered when a download of an image has finished.
202 void OnDidDownloadFavicon( 249 void OnDidDownloadFavicon(
203 int id, 250 int id,
204 int http_status_code, 251 int http_status_code,
205 const GURL& image_url, 252 const GURL& image_url,
206 const std::vector<SkBitmap>& bitmaps, 253 const std::vector<SkBitmap>& bitmaps,
207 const std::vector<gfx::Size>& original_bitmap_sizes); 254 const std::vector<gfx::Size>& original_bitmap_sizes);
208 255
209 bool ShouldSaveFavicon(); 256 bool ShouldSaveFavicon();
210 257
211 // Updates |favicon_candidate_| and returns true if it is an exact match. 258 // Updates |favicon_candidate_| and returns true if no more candidates should
259 // be processed (e.g. an exact match was found).
212 bool UpdateFaviconCandidate(const GURL& image_url, 260 bool UpdateFaviconCandidate(const GURL& image_url,
213 const gfx::Image& image, 261 const gfx::Image& image,
214 float score,
215 favicon_base::IconType icon_type); 262 favicon_base::IconType icon_type);
216 263
217 // Sets the image data for the favicon. 264 // Sets the image data for the favicon.
218 void SetFavicon(const GURL& icon_url, 265 void SetFavicon(const GURL& icon_url,
219 const gfx::Image& image, 266 const gfx::Image& image,
220 favicon_base::IconType icon_type); 267 favicon_base::IconType icon_type);
221 268
222 // Notifies |driver_| that FaviconHandler found an icon which matches the 269 // Notifies |driver_| that FaviconHandler found an icon which matches the
223 // |handler_type_| criteria. NotifyFaviconUpdated() can be called multiple 270 // |handler_type_| criteria. NotifyFaviconUpdated() can be called multiple
224 // times for the same page if: 271 // times for the same page if:
225 // - a better match is found for |handler_type_| (e.g. newer bitmap data) 272 // - a better match is found for |handler_type_| (e.g. newer bitmap data)
226 // - Javascript changes the page's icon URLs. 273 // - Javascript changes the page's icon URLs.
227 void NotifyFaviconUpdated( 274 void NotifyFaviconUpdated(
228 const std::vector<favicon_base::FaviconRawBitmapResult>& 275 const std::vector<favicon_base::FaviconRawBitmapResult>&
229 favicon_bitmap_results); 276 favicon_bitmap_results);
230 void NotifyFaviconUpdated(const GURL& icon_url, 277 void NotifyFaviconUpdated(const GURL& icon_url,
231 favicon_base::IconType icon_type, 278 favicon_base::IconType icon_type,
232 const gfx::Image& image); 279 const gfx::Image& image);
233 280
234 // Return the current candidate if any. 281 // Return the current candidate if any.
235 favicon::FaviconURL* current_candidate() { 282 favicon::FaviconURL* current_candidate() {
236 return current_candidate_index_ < image_urls_.size() 283 return current_candidate_index_ < image_urls_.size()
237 ? &image_urls_[current_candidate_index_] 284 ? &image_urls_[current_candidate_index_]
238 : nullptr; 285 : nullptr;
239 } 286 }
240 287
241 // Returns the preferred size of the image. 0 means no preference (any size
242 // will do).
243 int preferred_icon_size() const {
244 return download_largest_icon_ ? 0 : gfx::kFaviconSize;
245 }
246
247 // Used for FaviconService requests. 288 // Used for FaviconService requests.
248 base::CancelableTaskTracker cancelable_task_tracker_; 289 base::CancelableTaskTracker cancelable_task_tracker_;
249 290
250 FaviconDriverObserver::NotificationIconType handler_type_; 291 FaviconDriverObserver::NotificationIconType handler_type_;
251 292
252 // URL of the page we're requesting the favicon for. 293 // URL of the page we're requesting the favicon for.
253 GURL url_; 294 GURL url_;
254 295
255 // Whether we got data back for the initial request to the FaviconService. 296 // Whether we got data back for the initial request to the FaviconService.
256 bool got_favicon_from_history_; 297 bool got_favicon_from_history_;
(...skipping 10 matching lines...) Expand all
267 // |image_urls_| one by one. 308 // |image_urls_| one by one.
268 bool redownload_icons_; 309 bool redownload_icons_;
269 310
270 // Requests to the renderer to download favicons. 311 // Requests to the renderer to download favicons.
271 typedef std::map<int, DownloadRequest> DownloadRequests; 312 typedef std::map<int, DownloadRequest> DownloadRequests;
272 DownloadRequests download_requests_; 313 DownloadRequests download_requests_;
273 314
274 // The combination of the supported icon types. 315 // The combination of the supported icon types.
275 const int icon_types_; 316 const int icon_types_;
276 317
277 // Whether the largest icon should be downloaded. 318 // Desired icon size.
278 const bool download_largest_icon_; 319 const TargetSpec target_spec_;
279 320
280 // The prioritized favicon candidates from the page back from the renderer. 321 // The prioritized favicon candidates from the page back from the renderer.
281 std::vector<favicon::FaviconURL> image_urls_; 322 std::vector<favicon::FaviconURL> image_urls_;
282 323
283 // The icon URL and the icon type of the favicon in the most recent 324 // The icon URL and the icon type of the favicon in the most recent
284 // FaviconDriver::OnFaviconAvailable() notification. 325 // FaviconDriver::OnFaviconAvailable() notification.
285 GURL notification_icon_url_; 326 GURL notification_icon_url_;
286 favicon_base::IconType notification_icon_type_; 327 favicon_base::IconType notification_icon_type_;
287 328
288 // The FaviconService which implements favicon operations. May be null during 329 // The FaviconService which implements favicon operations. May be null during
(...skipping 14 matching lines...) Expand all
303 FaviconCandidate best_favicon_candidate_; 344 FaviconCandidate best_favicon_candidate_;
304 345
305 base::WeakPtrFactory<FaviconHandler> weak_ptr_factory_; 346 base::WeakPtrFactory<FaviconHandler> weak_ptr_factory_;
306 347
307 DISALLOW_COPY_AND_ASSIGN(FaviconHandler); 348 DISALLOW_COPY_AND_ASSIGN(FaviconHandler);
308 }; 349 };
309 350
310 } // namespace favicon 351 } // namespace favicon
311 352
312 #endif // COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_ 353 #endif // COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_
OLDNEW
« 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