OLD | NEW |
---|---|
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> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/callback_forward.h" | 13 #include "base/callback_forward.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
16 #include "base/memory/weak_ptr.h" | |
16 #include "base/task/cancelable_task_tracker.h" | 17 #include "base/task/cancelable_task_tracker.h" |
17 #include "components/favicon/core/favicon_driver_observer.h" | 18 #include "components/favicon/core/favicon_driver_observer.h" |
18 #include "components/favicon/core/favicon_url.h" | 19 #include "components/favicon/core/favicon_url.h" |
19 #include "components/favicon_base/favicon_callback.h" | 20 #include "components/favicon_base/favicon_callback.h" |
20 #include "ui/gfx/favicon_size.h" | 21 #include "ui/gfx/favicon_size.h" |
21 #include "ui/gfx/image/image.h" | 22 #include "ui/gfx/image/image.h" |
22 #include "url/gurl.h" | 23 #include "url/gurl.h" |
23 | 24 |
24 class SkBitmap; | 25 class SkBitmap; |
25 | 26 |
26 namespace favicon { | 27 namespace favicon { |
27 | 28 |
28 class FaviconDriver; | |
29 class FaviconService; | 29 class FaviconService; |
30 class TestFaviconHandler; | 30 class TestFaviconHandler; |
31 | 31 |
32 // FaviconHandler works with FaviconDriver to fetch the specific type of | 32 // FaviconHandler works with FaviconDriver to fetch the specific type of |
33 // favicon. | 33 // favicon. |
34 // | 34 // |
35 // FetchFavicon requests the favicon from the favicon service which in turn | 35 // FetchFavicon requests the favicon from the favicon service which in turn |
36 // requests the favicon from the history database. At this point | 36 // requests the favicon from the history database. At this point |
37 // we only know the URL of the page, and not necessarily the url of the | 37 // we only know the URL of the page, and not necessarily the url of the |
38 // favicon. To ensure we handle reloading stale favicons as well as | 38 // favicon. To ensure we handle reloading stale favicons as well as |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
70 // | 70 // |
71 // When the renderer downloads favicons, it considers the entire list of | 71 // When the renderer downloads favicons, it considers the entire list of |
72 // favicon candidates, if |download_largest_favicon_| is true, the largest | 72 // favicon candidates, if |download_largest_favicon_| is true, the largest |
73 // favicon will be used, otherwise the one that best matches the preferred size | 73 // favicon will be used, otherwise the one that best matches the preferred size |
74 // is chosen (or the first one if there is no preferred size). Once the | 74 // is chosen (or the first one if there is no preferred size). Once the |
75 // matching favicon has been determined, SetFavicon is called which updates | 75 // matching favicon has been determined, SetFavicon is called which updates |
76 // the page's favicon and notifies the database to save the favicon. | 76 // the page's favicon and notifies the database to save the favicon. |
77 | 77 |
78 class FaviconHandler { | 78 class FaviconHandler { |
79 public: | 79 public: |
80 class Delegate { | |
81 public: | |
82 // Mimics WebContents::ImageDownloadCallback. | |
83 typedef base::Callback<void( | |
84 int id, | |
85 int status_code, | |
86 const GURL& image_url, | |
87 const std::vector<SkBitmap>& bitmaps, | |
88 const std::vector<gfx::Size>& original_bitmap_sizes)> | |
89 ImageDownloadCallback; | |
90 | |
91 // Starts the download for the given favicon. When finished, the callback | |
92 // is called with the results. Returns the unique id of the download | |
93 // request, which will also be passed to the callback. In case of error, 0 | |
94 // is returned and no callback will be called. | |
95 // Bitmaps with pixel sizes larger than |max_bitmap_size| are filtered out | |
96 // from the bitmap results. If there are no bitmap results <= | |
97 // |max_bitmap_size|, the smallest bitmap is resized to |max_bitmap_size| | |
98 // and is the only result. A |max_bitmap_size| of 0 means unlimited. | |
99 virtual int DownloadImage(const GURL& url, | |
100 int max_image_size, | |
101 ImageDownloadCallback callback) = 0; | |
pkotwicz
2017/02/22 02:37:54
Might as well use WebContents::ImageDownloadCallba
mastiz
2017/02/23 21:55:54
I can't add a dependency to WebContents in shared
pkotwicz
2017/02/24 16:04:46
You're right. I forgot about iOS
| |
102 | |
103 // Returns whether the user is operating in an off-the-record context. | |
104 virtual bool IsOffTheRecord() = 0; | |
105 | |
106 // Returns whether |url| is bookmarked. | |
107 virtual bool IsBookmarked(const GURL& url) = 0; | |
108 | |
109 // Notifies that the favicon image has been updated, which the delegate | |
110 // would typically propagate to FaviconDriverObserver::OnFaviconUpdated(), | |
111 // see its documentation for details. | |
pkotwicz
2017/02/22 02:37:54
Nit: "Replace the ',' with '.'
"Notifies that the
mastiz
2017/02/23 21:55:54
Done.
| |
112 virtual void OnFaviconUpdated( | |
113 const GURL& page_url, | |
114 FaviconDriverObserver::NotificationIconType notification_icon_type, | |
115 const GURL& icon_url, | |
116 bool icon_url_changed, | |
117 const gfx::Image& image) = 0; | |
118 }; | |
119 | |
120 // |delegate| must not be nullptr and must outlive this class. | |
80 FaviconHandler(FaviconService* service, | 121 FaviconHandler(FaviconService* service, |
81 FaviconDriver* driver, | 122 Delegate* delegate, |
82 FaviconDriverObserver::NotificationIconType handler_type); | 123 FaviconDriverObserver::NotificationIconType handler_type); |
83 virtual ~FaviconHandler(); | 124 virtual ~FaviconHandler(); |
84 | 125 |
85 // Returns the bit mask of favicon_base::IconType based on the handler's type. | |
86 static int GetIconTypesFromHandlerType( | |
87 FaviconDriverObserver::NotificationIconType handler_type); | |
88 | |
89 // Initiates loading the favicon for the specified url. | 126 // Initiates loading the favicon for the specified url. |
90 void FetchFavicon(const GURL& url); | 127 void FetchFavicon(const GURL& url); |
91 | 128 |
92 // Message Handler. Must be public, because also called from | 129 // Message Handler. Must be public, because also called from |
93 // PrerenderContents. Collects the |image_urls| list. | 130 // PrerenderContents. Collects the |image_urls| list. |
94 void OnUpdateFaviconURL(const GURL& page_url, | 131 void OnUpdateFaviconURL(const GURL& page_url, |
95 const std::vector<favicon::FaviconURL>& candidates); | 132 const std::vector<favicon::FaviconURL>& candidates); |
96 | 133 |
97 // Called when the history request for favicon data mapped to |url_| has | |
98 // completed and the renderer has told us the icon URLs used by |url_| | |
99 void OnGotInitialHistoryDataAndIconURLCandidates(); | |
100 | |
101 // Message handler for ImageHostMsg_DidDownloadImage. Called when the image | |
102 // at |image_url| has been downloaded. | |
103 // |bitmaps| is a list of all the frames of the image at |image_url|. | |
104 // |original_bitmap_sizes| are the sizes of |bitmaps| before they were resized | |
105 // to the maximum bitmap size passed to DownloadFavicon(). | |
106 void OnDidDownloadFavicon( | |
107 int id, | |
108 const GURL& image_url, | |
109 const std::vector<SkBitmap>& bitmaps, | |
110 const std::vector<gfx::Size>& original_bitmap_sizes); | |
111 | |
112 // For testing. | 134 // For testing. |
113 const std::vector<favicon::FaviconURL>& image_urls() const { | 135 const std::vector<favicon::FaviconURL>& image_urls() const { |
114 return image_urls_; | 136 return image_urls_; |
115 } | 137 } |
116 | 138 |
117 // Returns whether the handler is waiting for a download to complete or for | 139 // Returns whether the handler is waiting for a download to complete or for |
118 // data from the FaviconService. Reserved for testing. | 140 // data from the FaviconService. Reserved for testing. |
119 bool HasPendingTasksForTest(); | 141 bool HasPendingTasksForTest(); |
120 | 142 |
121 protected: | 143 protected: |
122 // These virtual methods make FaviconHandler testable and are overridden by | 144 // These virtual methods make FaviconHandler testable and are overridden by |
123 // TestFaviconHandler. | 145 // TestFaviconHandler. |
124 | 146 |
125 // Asks the render to download favicon, returns the request id. | |
126 virtual int DownloadFavicon(const GURL& image_url, int max_bitmap_size); | |
127 | |
128 // Ask the favicon from history | 147 // Ask the favicon from history |
129 virtual void UpdateFaviconMappingAndFetch( | 148 virtual void UpdateFaviconMappingAndFetch( |
130 const GURL& page_url, | 149 const GURL& page_url, |
131 const GURL& icon_url, | 150 const GURL& icon_url, |
132 favicon_base::IconType icon_type, | 151 favicon_base::IconType icon_type, |
133 const favicon_base::FaviconResultsCallback& callback, | 152 const favicon_base::FaviconResultsCallback& callback, |
134 base::CancelableTaskTracker* tracker); | 153 base::CancelableTaskTracker* tracker); |
135 | 154 |
136 virtual void GetFaviconFromFaviconService( | 155 virtual void GetFaviconFromFaviconService( |
137 const GURL& icon_url, | 156 const GURL& icon_url, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 const gfx::Image& image, | 196 const gfx::Image& image, |
178 float score, | 197 float score, |
179 favicon_base::IconType icon_type); | 198 favicon_base::IconType icon_type); |
180 | 199 |
181 GURL image_url; | 200 GURL image_url; |
182 gfx::Image image; | 201 gfx::Image image; |
183 float score; | 202 float score; |
184 favicon_base::IconType icon_type; | 203 favicon_base::IconType icon_type; |
185 }; | 204 }; |
186 | 205 |
206 // Returns the bit mask of favicon_base::IconType based on the handler's type. | |
207 static int GetIconTypesFromHandlerType( | |
208 FaviconDriverObserver::NotificationIconType handler_type); | |
pkotwicz
2017/02/22 02:37:54
Nit: Reorder the functions in the .cc file to matc
mastiz
2017/02/23 21:55:54
I started to do this when I realized that many of
pkotwicz
2017/02/24 16:04:46
Sorting the functions in a follow up CL is fine by
| |
209 | |
187 // Get the maximal icon size in pixels for a icon of type |icon_type| for the | 210 // Get the maximal icon size in pixels for a icon of type |icon_type| for the |
188 // current platform. | 211 // current platform. |
189 static int GetMaximalIconSize(favicon_base::IconType icon_type); | 212 static int GetMaximalIconSize(favicon_base::IconType icon_type); |
190 | 213 |
214 // Called when the history request for favicon data mapped to |url_| has | |
215 // completed and the renderer has told us the icon URLs used by |url_| | |
216 void OnGotInitialHistoryDataAndIconURLCandidates(); | |
217 | |
191 // See description above class for details. | 218 // See description above class for details. |
192 void OnFaviconDataForInitialURLFromFaviconService(const std::vector< | 219 void OnFaviconDataForInitialURLFromFaviconService(const std::vector< |
193 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results); | 220 favicon_base::FaviconRawBitmapResult>& favicon_bitmap_results); |
194 | 221 |
195 // If the favicon currently mapped to |url_| has expired, downloads the | 222 // If the favicon currently mapped to |url_| has expired, downloads the |
196 // current candidate favicon from the renderer. Otherwise requests data for | 223 // current candidate favicon from the renderer. Otherwise requests data for |
197 // the current favicon from history. If data is requested from history, | 224 // the current favicon from history. If data is requested from history, |
198 // OnFaviconData() is called with the history data once it has been retrieved. | 225 // OnFaviconData() is called with the history data once it has been retrieved. |
199 void DownloadCurrentCandidateOrAskFaviconService(); | 226 void DownloadCurrentCandidateOrAskFaviconService(); |
200 | 227 |
201 // See description above class for details. | 228 // See description above class for details. |
202 void OnFaviconData(const std::vector<favicon_base::FaviconRawBitmapResult>& | 229 void OnFaviconData(const std::vector<favicon_base::FaviconRawBitmapResult>& |
203 favicon_bitmap_results); | 230 favicon_bitmap_results); |
204 | 231 |
205 // Schedules a download for the specified entry. This adds the request to | 232 // Schedules a download for the specified entry. This adds the request to |
206 // download_requests_. | 233 // download_requests_. |
207 void ScheduleDownload(const GURL& image_url, | 234 void ScheduleDownload(const GURL& image_url, |
208 favicon_base::IconType icon_type); | 235 favicon_base::IconType icon_type); |
209 | 236 |
237 // Triggered when a download of an image has finished. | |
238 void DidDownloadFavicon(int id, | |
pkotwicz
2017/02/22 02:37:54
Nit: Keep the function name as OnDidDownloadFavico
mastiz
2017/02/23 21:55:54
Done.
| |
239 int http_status_code, | |
240 const GURL& image_url, | |
241 const std::vector<SkBitmap>& bitmaps, | |
242 const std::vector<gfx::Size>& original_bitmap_sizes); | |
243 | |
210 // Updates |favicon_candidate_| and returns true if it is an exact match. | 244 // Updates |favicon_candidate_| and returns true if it is an exact match. |
211 bool UpdateFaviconCandidate(const GURL& image_url, | 245 bool UpdateFaviconCandidate(const GURL& image_url, |
212 const gfx::Image& image, | 246 const gfx::Image& image, |
213 float score, | 247 float score, |
214 favicon_base::IconType icon_type); | 248 favicon_base::IconType icon_type); |
215 | 249 |
216 // Sets the image data for the favicon. | 250 // Sets the image data for the favicon. |
217 void SetFavicon(const GURL& icon_url, | 251 void SetFavicon(const GURL& icon_url, |
218 const gfx::Image& image, | 252 const gfx::Image& image, |
219 favicon_base::IconType icon_type); | 253 favicon_base::IconType icon_type); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
281 | 315 |
282 // The icon URL and the icon type of the favicon in the most recent | 316 // The icon URL and the icon type of the favicon in the most recent |
283 // FaviconDriver::OnFaviconAvailable() notification. | 317 // FaviconDriver::OnFaviconAvailable() notification. |
284 GURL notification_icon_url_; | 318 GURL notification_icon_url_; |
285 favicon_base::IconType notification_icon_type_; | 319 favicon_base::IconType notification_icon_type_; |
286 | 320 |
287 // The FaviconService which implements favicon operations. May be null during | 321 // The FaviconService which implements favicon operations. May be null during |
288 // testing. | 322 // testing. |
289 FaviconService* service_; | 323 FaviconService* service_; |
290 | 324 |
291 // This handler's driver, owns this object. | 325 // This handler's delegate. |
292 FaviconDriver* driver_; | 326 Delegate* delegate_; |
293 | 327 |
294 // The index of the favicon URL in |image_urls_| which is currently being | 328 // The index of the favicon URL in |image_urls_| which is currently being |
295 // requested from history or downloaded. | 329 // requested from history or downloaded. |
296 size_t current_candidate_index_; | 330 size_t current_candidate_index_; |
297 | 331 |
298 // Best image we've seen so far. As images are downloaded from the page they | 332 // Best image we've seen so far. As images are downloaded from the page they |
299 // are stored here. When there is an exact match, or no more images are | 333 // are stored here. When there is an exact match, or no more images are |
300 // available the favicon service and the current page are updated (assuming | 334 // available the favicon service and the current page are updated (assuming |
301 // the image is for a favicon). | 335 // the image is for a favicon). |
302 FaviconCandidate best_favicon_candidate_; | 336 FaviconCandidate best_favicon_candidate_; |
303 | 337 |
338 base::WeakPtrFactory<FaviconHandler> weak_ptr_factory_; | |
339 | |
304 DISALLOW_COPY_AND_ASSIGN(FaviconHandler); | 340 DISALLOW_COPY_AND_ASSIGN(FaviconHandler); |
305 }; | 341 }; |
306 | 342 |
307 } // namespace favicon | 343 } // namespace favicon |
308 | 344 |
309 #endif // COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_ | 345 #endif // COMPONENTS_FAVICON_CORE_FAVICON_HANDLER_H_ |
OLD | NEW |