1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
#define CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
#include <vector>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/common/cancelable_request.h"
#include "chrome/browser/history/history_types.h"
#include "chrome/browser/profiles/profile_keyed_service.h"
#include "chrome/common/cancelable_task_tracker.h"
#include "chrome/common/ref_counted_util.h"
#include "ui/base/layout.h"
class GURL;
class HistoryService;
class Profile;
// The favicon service provides methods to access favicons. It calls the history
// backend behind the scenes.
//
// This service is thread safe. Each request callback is invoked in the
// thread that made the request.
class FaviconService : public CancelableRequestProvider,
public ProfileKeyedService {
public:
explicit FaviconService(HistoryService* history_service);
virtual ~FaviconService();
// Auxiliary argument structure for requesting favicons for URLs.
struct FaviconForURLParams {
FaviconForURLParams(Profile* profile,
const GURL& page_url,
int icon_types,
int desired_size_in_dip)
: profile(profile),
page_url(page_url),
icon_types(icon_types),
desired_size_in_dip(desired_size_in_dip) {}
Profile* profile;
GURL page_url;
int icon_types;
int desired_size_in_dip;
};
// Callback for GetFaviconImage() and GetFaviconImageForURL().
// |FaviconImageResult::image| is constructed from the bitmaps for the
// passed in URL and icon types which most which closely match the passed in
// |desired_size_in_dip| at the scale factors supported by the current
// platform (eg MacOS) in addition to 1x.
// |FaviconImageResult::icon_url| is the favicon that the favicon bitmaps in
// |image| originate from.
// TODO(pkotwicz): Enable constructing |image| from bitmaps from several
// icon URLs.
typedef base::Callback<void(const history::FaviconImageResult&)>
FaviconImageCallback;
// Callback for GetRawFavicon() and GetRawFaviconForURL().
// FaviconBitmapResult::bitmap_data is the bitmap in the thumbnail database
// for the passed in URL and icon types whose pixel size best matches the
// passed in |desired_size_in_dip| and |desired_scale_factor|. Returns an
// invalid history::FaviconBitmapResult if there are no matches.
typedef base::Callback<void(const history::FaviconBitmapResult&)>
FaviconRawCallback;
// Callback for GetFavicon() and GetFaviconForURL().
//
// The first argument is the set of bitmaps for the passed in URL and
// icon types whose pixel sizes best match the passed in
// |desired_size_in_dip| at the scale factors supported by the current
// platform (eg MacOS) in addition to 1x. The vector has at most one result
// for each of the scale factors. There are less entries if a single result
// is the best bitmap to use for several scale factors.
typedef base::Callback<void(const std::vector<history::FaviconBitmapResult>&)>
FaviconResultsCallback;
// We usually pass parameters with pointer to avoid copy. This function is a
// helper to run FaviconResultsCallback with pointer parameters.
static void FaviconResultsCallbackRunner(
const FaviconResultsCallback& callback,
const std::vector<history::FaviconBitmapResult>* results);
// Requests the favicon at |icon_url| of |icon_type| whose size most closely
// matches |desired_size_in_dip|. If |desired_size_in_dip| is 0, the largest
// favicon bitmap at |icon_url| is returned. |consumer| is notified when the
// bits have been fetched. |icon_url| is the URL of the icon itself, e.g.
// <http://www.google.com/favicon.ico>.
// Each of the three methods below differs in the format of the callback and
// the requested scale factors. All of the scale factors supported by the
// current platform (eg MacOS) are requested for GetFaviconImage().
CancelableTaskTracker::TaskId GetFaviconImage(
const GURL& icon_url,
history::IconType icon_type,
int desired_size_in_dip,
const FaviconImageCallback& callback,
CancelableTaskTracker* tracker);
CancelableTaskTracker::TaskId GetRawFavicon(
const GURL& icon_url,
history::IconType icon_type,
int desired_size_in_dip,
ui::ScaleFactor desired_scale_factor,
const FaviconRawCallback& callback,
CancelableTaskTracker* tracker);
CancelableTaskTracker::TaskId GetFavicon(
const GURL& icon_url,
history::IconType icon_type,
int desired_size_in_dip,
const FaviconResultsCallback& callback,
CancelableTaskTracker* tracker);
// Set the favicon mappings to |page_url| for |icon_types| in the history
// database.
// Sample |icon_urls|:
// { ICON_URL1 -> TOUCH_ICON, known to the database,
// ICON_URL2 -> TOUCH_ICON, not known to the database,
// ICON_URL3 -> TOUCH_PRECOMPOSED_ICON, known to the database }
// The new mappings are computed from |icon_urls| with these rules:
// 1) Any urls in |icon_urls| which are not already known to the database are
// rejected.
// Sample new mappings to |page_url|: { ICON_URL1, ICON_URL3 }
// 2) If |icon_types| has multiple types, the mappings are only set for the
// largest icon type.
// Sample new mappings to |page_url|: { ICON_URL3 }
// |icon_types| can only have multiple IconTypes if
// |icon_types| == TOUCH_ICON | TOUCH_PRECOMPOSED_ICON.
// The favicon bitmaps which most closely match |desired_size_in_dip|
// at the scale factors supported by the current platform (eg MacOS) in
// addition to 1x from the favicons which were just mapped to |page_url| are
// returned. If |desired_size_in_dip| is 0, the largest favicon bitmap is
// returned.
CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch(
const GURL& page_url,
const std::vector<GURL>& icon_urls,
int icon_types,
int desired_size_in_dip,
const FaviconResultsCallback& callback,
CancelableTaskTracker* tracker);
// Requests the favicons of any of |icon_types| whose pixel sizes most
// closely match |desired_size_in_dip| and desired scale factors for a web
// page URL. If |desired_size_in_dip| is 0, the largest favicon for the web
// page URL is returned. |callback| is run when the bits have been fetched.
// |icon_types| can be any combination of IconType value, but only one icon
// will be returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON and
// FAVICON. Each of the three methods below differs in the format of the
// callback and the requested scale factors. All of the scale factors
// supported by the current platform (eg MacOS) are requested for
// GetFaviconImageForURL().
// Note. |callback| is always run asynchronously.
CancelableTaskTracker::TaskId GetFaviconImageForURL(
const FaviconForURLParams& params,
const FaviconImageCallback& callback,
CancelableTaskTracker* tracker);
CancelableTaskTracker::TaskId GetRawFaviconForURL(
const FaviconForURLParams& params,
ui::ScaleFactor desired_scale_factor,
const FaviconRawCallback& callback,
CancelableTaskTracker* tracker);
CancelableTaskTracker::TaskId GetFaviconForURL(
const FaviconForURLParams& params,
const FaviconResultsCallback& callback,
CancelableTaskTracker* tracker);
// Used to request a bitmap for the favicon with |favicon_id| which is not
// resized from the size it is stored at in the database. If there are
// multiple favicon bitmaps for |favicon_id|, the largest favicon bitmap is
// returned.
CancelableTaskTracker::TaskId GetLargestRawFaviconForID(
history::FaviconID favicon_id,
const FaviconRawCallback& callback,
CancelableTaskTracker* tracker);
// Marks all types of favicon for the page as being out of date.
void SetFaviconOutOfDateForPage(const GURL& page_url);
// Clones all icons from an existing page. This associates the icons from
// |old_page_url| with |new_page_url|, provided |new_page_url| has no
// recorded associations to any other icons.
// Needed if you want to declare favicons (tentatively) in advance, before a
// page is ever visited.
void CloneFavicon(const GURL& old_page_url, const GURL& new_page_url);
// Allows the importer to set many favicons for many pages at once. The pages
// must exist, any favicon sets for unknown pages will be discarded. Existing
// favicons will not be overwritten.
void SetImportedFavicons(
const std::vector<history::ImportedFaviconUsage>& favicon_usage);
// Set the favicon for |page_url| for |icon_type| in the thumbnail database.
// Unlike SetFavicons(), this method will not delete preexisting bitmap data
// which is associated to |page_url| if at all possible. Use this method if
// the favicon bitmaps for any of ui::GetSupportedScaleFactors() are not
// known.
void MergeFavicon(const GURL& page_url,
const GURL& icon_url,
history::IconType icon_type,
scoped_refptr<base::RefCountedMemory> bitmap_data,
const gfx::Size& pixel_size);
// Set the favicon for |page_url| for |icon_type| in the thumbnail database.
// |icon_url| is the single favicon to map to |page_url|. Mappings from
// |page_url| to favicons at different icon URLs will be deleted.
// A favicon bitmap is added for each image rep in |image|. Any preexisting
// bitmap data for |icon_url| is deleted. It is important that |image|
// contains image reps for all of ui::GetSupportedScaleFactors(). Use
// MergeFavicon() if it does not.
// TODO(pkotwicz): Save unresized favicon bitmaps to the database.
// TODO(pkotwicz): Support adding favicons for multiple icon URLs to the
// thumbnail database.
void SetFavicons(
const GURL& page_url,
const GURL& icon_url,
history::IconType icon_type,
const gfx::Image& image);
private:
HistoryService* history_service_;
// Helper function for GetFaviconImageForURL(), GetRawFaviconForURL() and
// GetFaviconForURL().
CancelableTaskTracker::TaskId GetFaviconForURLImpl(
const FaviconForURLParams& params,
const std::vector<ui::ScaleFactor>& desired_scale_factors,
const FaviconResultsCallback& callback,
CancelableTaskTracker* tracker);
// Intermediate callback for GetFaviconImage() and GetFaviconImageForURL()
// so that history service can deal solely with FaviconResultsCallback.
// Builds history::FaviconImageResult from |favicon_bitmap_results| and runs
// |callback|.
void RunFaviconImageCallbackWithBitmapResults(
const FaviconImageCallback& callback,
int desired_size_in_dip,
const std::vector<history::FaviconBitmapResult>& favicon_bitmap_results);
// Intermediate callback for GetRawFavicon() and GetRawFaviconForURL()
// so that history service can deal solely with FaviconResultsCallback.
// Resizes history::FaviconBitmapResult if necessary and runs |callback|.
void RunFaviconRawCallbackWithBitmapResults(
const FaviconRawCallback& callback,
int desired_size_in_dip,
ui::ScaleFactor desired_scale_factor,
const std::vector<history::FaviconBitmapResult>& favicon_bitmap_results);
DISALLOW_COPY_AND_ASSIGN(FaviconService);
};
#endif // CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
|