blob: 342fb987efb4a33cb24dad9195acb2115cbd6bef [file] [log] [blame]
// Copyright (c) 2017 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 COMPONENTS_FAVICON_CORE_FAVICON_SERVICE_H_
#define COMPONENTS_FAVICON_CORE_FAVICON_SERVICE_H_
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/callback.h"
#include "base/containers/flat_set.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/favicon_base/favicon_callback.h"
#include "components/favicon_base/favicon_types.h"
#include "components/favicon_base/favicon_usage_data.h"
#include "components/keyed_service/core/keyed_service.h"
class GURL;
namespace favicon {
class FaviconService : public KeyedService {
public:
// 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::IconType::kFavicon
// 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.
virtual base::CancelableTaskTracker::TaskId GetFaviconImage(
const GURL& icon_url,
const favicon_base::FaviconImageCallback& callback,
base::CancelableTaskTracker* tracker) = 0;
// 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.
virtual 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) = 0;
// 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.
virtual 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) = 0;
//////////////////////////////////////////////////////////////////////////////
// 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::IconType::kFavicon 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.
virtual base::CancelableTaskTracker::TaskId GetFaviconImageForPageURL(
const GURL& page_url,
const favicon_base::FaviconImageCallback& callback,
base::CancelableTaskTracker* tracker) = 0;
// 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 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.
// If |fallback_to_host| is true, the host of |page_url| will be used to
// search the favicon database if an exact match cannot be found. Generally
// code showing an icon for a full/previously visited URL should set
// |fallback_to_host|=false. Otherwise, if only a host is available, and any
// icon matching the host is permissible, use |fallback_to_host|=true.
virtual base::CancelableTaskTracker::TaskId GetRawFaviconForPageURL(
const GURL& page_url,
const favicon_base::IconTypeSet& icon_types,
int desired_size_in_pixel,
bool fallback_to_host,
const favicon_base::FaviconRawBitmapCallback& callback,
base::CancelableTaskTracker* tracker) = 0;
// See HistoryService::GetLargestFaviconForPageURL().
virtual base::CancelableTaskTracker::TaskId GetLargestRawFaviconForPageURL(
const GURL& page_url,
const std::vector<favicon_base::IconTypeSet>& icon_types,
int minimum_size_in_pixels,
const favicon_base::FaviconRawBitmapCallback& callback,
base::CancelableTaskTracker* tracker) = 0;
virtual base::CancelableTaskTracker::TaskId GetFaviconForPageURL(
const GURL& page_url,
const favicon_base::IconTypeSet& icon_types,
int desired_size_in_dip,
const favicon_base::FaviconResultsCallback& callback,
base::CancelableTaskTracker* tracker) = 0;
// Maps |page_urls| to the favicon at |icon_url| if there is an entry in the
// database for |icon_url| and |icon_type|. This occurs when there is a
// mapping from a different page URL to |icon_url|. The favicon bitmaps whose
// edge sizes most closely match |desired_size_in_dip| from the favicons which
// were just mapped to |page_urls| are returned. If |desired_size_in_dip| has
// a '0' entry, the largest favicon bitmap is returned.
virtual base::CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch(
const base::flat_set<GURL>& page_urls,
const GURL& icon_url,
favicon_base::IconType icon_type,
int desired_size_in_dip,
const favicon_base::FaviconResultsCallback& callback,
base::CancelableTaskTracker* tracker) = 0;
// Deletes favicon mappings for each URL in |page_urls| and their redirects.
virtual void DeleteFaviconMappings(const base::flat_set<GURL>& page_urls,
favicon_base::IconType icon_type) = 0;
// 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.
virtual base::CancelableTaskTracker::TaskId GetLargestRawFaviconForID(
favicon_base::FaviconID favicon_id,
const favicon_base::FaviconRawBitmapCallback& callback,
base::CancelableTaskTracker* tracker) = 0;
// Marks all types of favicon for the page as being out of date.
virtual void SetFaviconOutOfDateForPage(const GURL& page_url) = 0;
// Mark that the on-demand favicon at |icon_url| was requested now. This
// postpones the automatic eviction of the favicon from the database. Not all
// calls end up in a write into the DB:
// - It is no-op if the bitmaps are not stored using SetOnDemandFavicons().
// - The updates of the "last requested time" have limited frequency for each
// particular favicon (e.g. once per week). This limits the overhead of
// cache management for on-demand favicons.
virtual void TouchOnDemandFavicon(const GURL& icon_url) = 0;
// 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.
virtual void SetImportedFavicons(
const favicon_base::FaviconUsageDataList& favicon_usage) = 0;
// See HistoryService::AddPageNoVisitForBookmark(). Adds an entry for the
// specified url in the history service without creating a visit.
virtual void AddPageNoVisitForBookmark(const GURL& url,
const base::string16& title) = 0;
// 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.
virtual 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) = 0;
// Set the favicon for all URLs in |page_urls| for |icon_type| in the
// thumbnail database. |icon_url| is the single favicon to map to. Mappings
// from page URLs 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.
virtual void SetFavicons(const base::flat_set<GURL>& page_urls,
const GURL& icon_url,
favicon_base::IconType icon_type,
const gfx::Image& image) = 0;
// Causes each page in |page_urls_to_write| to be associated to the same
// icon as the page |page_url_to_read| for icon types matching |icon_types|.
// No-op if |page_url_to_read| has no mappings for |icon_types|.
virtual void CloneFaviconMappingsForPages(
const GURL& page_url_to_read,
const favicon_base::IconTypeSet& icon_types,
const base::flat_set<GURL>& page_urls_to_write) = 0;
// Figures out whether an on-demand favicon can be written for provided
// |page_url| and returns the result via |callback|. The result is false if
// there is an existing cached favicon for |icon_type| or if there is a
// non-expired icon of *any* type for |page_url|.
virtual void CanSetOnDemandFavicons(
const GURL& page_url,
favicon_base::IconType icon_type,
base::OnceCallback<void(bool)> callback) const = 0;
// Same as SetFavicons with three differences:
// 1) It will be a no-op if CanSetOnDemandFavicons() returns false.
// 2) If |icon_url| is known to the database, |bitmaps| will be ignored (i.e.
// the icon won't be overwritten) but the mappings from |page_url| to
// |icon_url| will be stored (conditioned to point 1 above).
// 3) If |icon_url| is stored, it will be marked as "on-demand".
//
// On-demand favicons are those that are fetched without visiting their page.
// For this reason, their life-time cannot be bound to the life-time of the
// corresponding visit in history.
// - These bitmaps are evicted from the database based on the last time they
// get requested. The last requested time is initially set to Now() and is
// further updated by calling TouchOnDemandFavicon().
// - Furthermore, on-demand bitmaps are immediately marked as expired. Hence,
// they are always replaced by standard favicons whenever their page gets
// visited.
// The callback will receive whether the write actually happened.
virtual void SetOnDemandFavicons(const GURL& page_url,
const GURL& icon_url,
favicon_base::IconType icon_type,
const gfx::Image& image,
base::OnceCallback<void(bool)> callback) = 0;
// Avoid repeated requests to download missing favicon.
virtual void UnableToDownloadFavicon(const GURL& icon_url) = 0;
virtual bool WasUnableToDownloadFavicon(const GURL& icon_url) const = 0;
virtual void ClearUnableToDownloadFavicons() = 0;
};
} // namespace favicon
#endif // COMPONENTS_FAVICON_CORE_FAVICON_SERVICE_H_