blob: 1627a22086362d53056ed36847bcc42f52960ed4 [file] [log] [blame]
// 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 COMPONENTS_FAVICON_CORE_FAVICON_BACKEND_H_
#define COMPONENTS_FAVICON_CORE_FAVICON_BACKEND_H_
#include <memory>
#include <set>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/memory/ref_counted.h"
#include "components/favicon/core/favicon_types.h"
#include "components/favicon_base/favicon_types.h"
class GURL;
class SkBitmap;
namespace base {
class FilePath;
}
namespace favicon {
// The maximum number of bitmaps for a single icon URL which can be stored in
// the favicon database.
static const size_t kMaxFaviconBitmapsPerIconURL = 8;
class FaviconBackendDelegate;
class FaviconDatabase;
// FaviconBackend owns and interacts with FaviconDatabase to maintain favicons.
// FaviconDatabase provides a thin veneer on top of sqlite for reading/writing
// favicons. FaviconBackend provides the logic for querying and updating the
// database.
class FaviconBackend {
public:
// Creates a new FaviconBackend. Returns the backend on success, null if
// there is an error in creating it.
static std::unique_ptr<FaviconBackend> Create(
const base::FilePath& path,
FaviconBackendDelegate* delegate);
FaviconBackend(const FaviconBackend&) = delete;
FaviconBackend& operator=(const FaviconBackend&) = delete;
~FaviconBackend();
FaviconDatabase* db() { return db_.get(); }
void Commit();
void TrimMemory();
// Removes all favicons, except those referenced by |kept_page_urls|.
// Returns true on success.
bool ClearAllExcept(const std::vector<GURL>& kept_page_urls);
// See function of same name in HistoryService for details.
favicon_base::FaviconRawBitmapResult GetLargestFaviconForUrl(
const GURL& page_url,
const std::vector<favicon_base::IconTypeSet>& icon_types_list,
int minimum_size_in_pixels);
// See function of same name in HistoryService for details.
std::vector<favicon_base::FaviconRawBitmapResult> GetFaviconsForUrl(
const GURL& page_url,
const favicon_base::IconTypeSet& icon_types,
const std::vector<int>& desired_sizes,
bool fallback_to_host);
// See function of same name in HistoryService for details.
std::vector<favicon_base::FaviconRawBitmapResult> GetFaviconForId(
favicon_base::FaviconID favicon_id,
int desired_size);
// Used by both UpdateFaviconMappingsAndFetch() and GetFavicon().
// If there is a favicon stored in the database for |icon_url|, a mapping is
// added to the database from each element in |page_urls| (and all redirects)
// to |icon_url|.
UpdateFaviconMappingsResult UpdateFaviconMappingsAndFetch(
const base::flat_set<GURL>& page_urls,
const GURL& icon_url,
favicon_base::IconType icon_type,
const std::vector<int>& desired_sizes);
// Deletes the mappings for the specified page urls. Returns the set of
// page urls that changed.
base::flat_set<GURL> DeleteFaviconMappings(
const base::flat_set<GURL>& page_urls,
favicon_base::IconType icon_type);
// See function of same name in HistoryService for details.
MergeFaviconResult 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);
// If |bitmap_type| is ON_DEMAND, the icon for |icon_url| will be modified
// only if it's not present in the database. In that case, it will be
// initially set as expired. |page_urls| must not be empty.
SetFaviconsResult SetFavicons(const base::flat_set<GURL>& page_urls,
favicon_base::IconType icon_type,
const GURL& icon_url,
const std::vector<SkBitmap>& bitmaps,
FaviconBitmapType bitmap_type);
// 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|. Returns the
// set of page urls that were updated, which may be empty.
std::set<GURL> CloneFaviconMappingsForPages(
const GURL& page_url_to_read,
const favicon_base::IconTypeSet& icon_types,
const base::flat_set<GURL>& page_urls_to_write);
// See function of same name in HistoryService for details.
SetFaviconsResult SetOnDemandFavicons(const GURL& page_url,
favicon_base::IconType icon_type,
const GURL& icon_url,
const std::vector<SkBitmap>& bitmaps);
// See function of same name in HistoryService for details.
bool CanSetOnDemandFavicons(const GURL& page_url,
favicon_base::IconType icon_type);
// See function of same name in HistoryService for details. Returns true
// if the mapping was updated, false if |page_url| has no icons associated
// with it.
bool SetFaviconsOutOfDateForPage(const GURL& page_url);
// Mark all favicons as out of date that have been modified at or after
// |begin| and before |end|.
bool SetFaviconsOutOfDateBetween(base::Time begin, base::Time end);
// See function of same name in HistoryService for details.
void TouchOnDemandFavicon(const GURL& icon_url);
private:
FaviconBackend(std::unique_ptr<FaviconDatabase> db,
FaviconBackendDelegate* delegate);
// Set the favicon bitmaps of |type| for |icon_id|.
// For each entry in |bitmaps|, if a favicon bitmap already exists at the
// entry's pixel size, replace the favicon bitmap's data with the entry's
// bitmap data. Otherwise add a new favicon bitmap.
// Any favicon bitmaps already mapped to |icon_id| whose pixel size does not
// match the pixel size of one of |bitmaps| is deleted.
// For bitmap type FaviconBitmapType::ON_DEMAND, this is legal to call only
// for a newly created |icon_id| (that has no bitmaps yet).
// Returns true if any of the bitmap data at |icon_id| is changed as a result
// of calling this method.
bool SetFaviconBitmaps(favicon_base::FaviconID icon_id,
const std::vector<SkBitmap>& bitmaps,
FaviconBitmapType type);
bool IsFaviconBitmapDataEqual(
FaviconBitmapID bitmap_id,
const scoped_refptr<base::RefCountedMemory>& new_bitmap_data);
// Returns the favicon bitmaps whose edge sizes most closely match
// |desired_sizes|. If |desired_sizes| has a '0' entry, the largest favicon
// bitmap with one of the icon types in |icon_types| is returned. If
// |icon_types| contains multiple icon types and there are several matched
// icon types in the database, results will only be returned for a single
// icon type in the priority of kTouchPrecomposedIcon, kTouchIcon, and
// kFavicon. 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.
// See the comment for GetFaviconResultsForBestMatch() for more details on
// how |favicon_bitmap_results| is constructed.
std::vector<favicon_base::FaviconRawBitmapResult> GetFaviconsFromDB(
const GURL& page_url,
const favicon_base::IconTypeSet& icon_types,
const std::vector<int>& desired_sizes,
bool fallback_to_host);
// Returns the favicon bitmaps whose edge sizes most closely match
// |desired_sizes| in |favicon_bitmap_results|. If |desired_sizes| has a '0'
// entry, only the largest favicon bitmap is returned. Goodness is computed
// via SelectFaviconFrameIndices(). It is computed on a per FaviconID basis,
// thus all |favicon_bitmap_results| are guaranteed to be for the same
// FaviconID. |favicon_bitmap_results| will have at most one entry for each
// desired edge size. There will be fewer entries if the same favicon bitmap
// is the best result for multiple edge sizes.
// Returns true if there were no errors.
std::vector<favicon_base::FaviconRawBitmapResult>
GetFaviconBitmapResultsForBestMatch(
const std::vector<favicon_base::FaviconID>& candidate_favicon_ids,
const std::vector<int>& desired_sizes);
// Maps the favicon ID |icon_id| to |page_url| (and all redirects) for
// |icon_type|. |icon_id| == 0 deletes previously existing mappings.
// Returns true if the mappings for the page or any of its redirects were
// changed.
bool SetFaviconMappingsForPageAndRedirects(const GURL& page_url,
favicon_base::IconType icon_type,
favicon_base::FaviconID icon_id);
// Maps the favicon ID |icon_id| to URLs in |page_urls| for |icon_type|.
// |icon_id| == 0 deletes previously existing mappings.
// Returns page URLs among |page_urls| whose mappings were changed (might be
// empty).
std::vector<GURL> SetFaviconMappingsForPages(
const base::flat_set<GURL>& page_urls,
favicon_base::IconType icon_type,
favicon_base::FaviconID icon_id);
// Maps the favicon ID |icon_ids| to |page_url| for |icon_type|.
// |icon_id| == 0 deletes previously existing mappings.
// Returns true if the function changed at least one of |page_url|'s mappings.
bool SetFaviconMappingsForPage(const GURL& page_url,
favicon_base::IconType icon_type,
favicon_base::FaviconID icon_id);
std::unique_ptr<FaviconDatabase> db_;
FaviconBackendDelegate* delegate_;
};
} // namespace favicon
#endif // COMPONENTS_FAVICON_CORE_FAVICON_BACKEND_H_