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
|
// 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/containers/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/favicon_base/favicon_callback.h"
#include "components/favicon_base/favicon_types.h"
#include "components/keyed_service/core/keyed_service.h"
class FaviconClient;
class GURL;
class HistoryService;
struct ImportedFaviconUsage;
class Profile;
// The favicon service provides methods to access favicons. It calls the history
// backend behind the scenes. The callbacks are run asynchronously, even in the
// case of an error.
class FaviconService : public KeyedService {
public:
// TODO(jif): Remove usage of Profile. http://crbug.com/378208.
// The FaviconClient must outlive the constructed FaviconService.
FaviconService(Profile* profile, FaviconClient* favicon_client);
~FaviconService() override;
// We usually pass parameters with pointer to avoid copy. This function is a
// helper to run FaviconResultsCallback with pointer parameters.
static void FaviconResultsCallbackRunner(
const favicon_base::FaviconResultsCallback& callback,
const std::vector<favicon_base::FaviconRawBitmapResult>* results);
//////////////////////////////////////////////////////////////////////////////
// Methods to request favicon bitmaps from the history backend for |icon_url|.
// |icon_url| is the URL of the icon itself.
// (e.g. <http://www.google.com/favicon.ico>)
// Requests the favicon at |icon_url| of type favicon_base::FAVICON and of
// size gfx::kFaviconSize. The returned gfx::Image is populated with
// representations for all of the scale factors supported by the platform
// (e.g. MacOS). If data is unavailable for some or all of the scale factors,
// the bitmaps with the best matching sizes are resized.
base::CancelableTaskTracker::TaskId GetFaviconImage(
const GURL& icon_url,
const favicon_base::FaviconImageCallback& callback,
base::CancelableTaskTracker* tracker);
// Requests the favicon at |icon_url| of |icon_type| of size
// |desired_size_in_pixel|. If there is no favicon of size
// |desired_size_in_pixel|, the favicon bitmap which best matches
// |desired_size_in_pixel| is resized. If |desired_size_in_pixel| is 0,
// the largest favicon bitmap is returned.
base::CancelableTaskTracker::TaskId GetRawFavicon(
const GURL& icon_url,
favicon_base::IconType icon_type,
int desired_size_in_pixel,
const favicon_base::FaviconRawBitmapCallback& callback,
base::CancelableTaskTracker* tracker);
// The first argument for |callback| 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 resource scale factors supported by the
// current platform (eg MacOS) in addition to 1x. The vector has at most one
// result for each of the resource scale factors. There are less entries if a
// single/ result is the best bitmap to use for several resource scale
// factors.
base::CancelableTaskTracker::TaskId GetFavicon(
const GURL& icon_url,
favicon_base::IconType icon_type,
int desired_size_in_dip,
const favicon_base::FaviconResultsCallback& callback,
base::CancelableTaskTracker* tracker);
//////////////////////////////////////////////////////////////////////////////
// Methods to request favicon bitmaps from the history backend for |page_url|.
// |page_url| is the web page the favicon is associated with.
// (e.g. <http://www.google.com>)
// Requests the favicon for the page at |page_url| of type
// favicon_base::FAVICON and of size gfx::kFaviconSize. The returned
// gfx::Image is populated with representations for all of the scale factors
// supported by the platform (e.g. MacOS). If data is unavailable for some or
// all of the scale factors, the bitmaps with the best matching sizes are
// resized.
base::CancelableTaskTracker::TaskId GetFaviconImageForPageURL(
const GURL& page_url,
const favicon_base::FaviconImageCallback& callback,
base::CancelableTaskTracker* tracker);
// Requests the favicon for the page at |page_url| with one of |icon_types|
// and with |desired_size_in_pixel|. |icon_types| can be any combination of
// IconTypes. If favicon bitmaps for several IconTypes are available, the
// favicon bitmap is chosen in the priority of TOUCH_PRECOMPOSED_ICON,
// TOUCH_ICON and FAVICON. If there is no favicon bitmap of size
// |desired_size_in_pixel|, the favicon bitmap which best matches
// |desired_size_in_pixel| is resized. If |desired_size_in_pixel| is 0,
// the largest favicon bitmap is returned. Results with a higher priority
// IconType are preferred over an exact match of the favicon bitmap size.
base::CancelableTaskTracker::TaskId GetRawFaviconForPageURL(
const GURL& page_url,
int icon_types,
int desired_size_in_pixel,
const favicon_base::FaviconRawBitmapCallback& callback,
base::CancelableTaskTracker* tracker);
// See HistoryService::GetLargestFaviconForPageURL().
base::CancelableTaskTracker::TaskId GetLargestRawFaviconForPageURL(
const GURL& page_url,
const std::vector<int>& icon_types,
int minimum_size_in_pixels,
const favicon_base::FaviconRawBitmapCallback& callback,
base::CancelableTaskTracker* tracker);
base::CancelableTaskTracker::TaskId GetFaviconForPageURL(
const GURL& page_url,
int icon_types,
int desired_size_in_dip,
const favicon_base::FaviconResultsCallback& callback,
base::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 reosurce 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.
base::CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch(
const GURL& page_url,
const std::vector<GURL>& icon_urls,
int icon_types,
int desired_size_in_dip,
const favicon_base::FaviconResultsCallback& callback,
base::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.
base::CancelableTaskTracker::TaskId GetLargestRawFaviconForID(
favicon_base::FaviconID favicon_id,
const favicon_base::FaviconRawBitmapCallback& callback,
base::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<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,
favicon_base::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,
favicon_base::IconType icon_type,
const gfx::Image& image);
// Avoid repeated requests to download missing favicon.
void UnableToDownloadFavicon(const GURL& icon_url);
bool WasUnableToDownloadFavicon(const GURL& icon_url) const;
void ClearUnableToDownloadFavicons();
private:
typedef uint32 MissingFaviconURLHash;
base::hash_set<MissingFaviconURLHash> missing_favicon_urls_;
HistoryService* history_service_;
Profile* profile_;
FaviconClient* favicon_client_;
// Helper function for GetFaviconImageForPageURL(), GetRawFaviconForPageURL()
// and GetFaviconForPageURL().
base::CancelableTaskTracker::TaskId GetFaviconForPageURLImpl(
const GURL& page_url,
int icon_types,
const std::vector<int>& desired_sizes_in_pixel,
const favicon_base::FaviconResultsCallback& callback,
base::CancelableTaskTracker* tracker);
// Intermediate callback for GetFaviconImage() and GetFaviconImageForPageURL()
// so that history service can deal solely with FaviconResultsCallback.
// Builds favicon_base::FaviconImageResult from |favicon_bitmap_results| and
// runs |callback|.
void RunFaviconImageCallbackWithBitmapResults(
const favicon_base::FaviconImageCallback& callback,
int desired_size_in_dip,
const std::vector<favicon_base::FaviconRawBitmapResult>&
favicon_bitmap_results);
// Intermediate callback for GetRawFavicon() and GetRawFaviconForPageURL()
// so that history service can deal solely with FaviconResultsCallback.
// Resizes favicon_base::FaviconRawBitmapResult if necessary and runs
// |callback|.
void RunFaviconRawBitmapCallbackWithBitmapResults(
const favicon_base::FaviconRawBitmapCallback& callback,
int desired_size_in_pixel,
const std::vector<favicon_base::FaviconRawBitmapResult>&
favicon_bitmap_results);
DISALLOW_COPY_AND_ASSIGN(FaviconService);
};
#endif // CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
|