15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/favicon_base/favicon_callback.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/favicon_base/favicon_types.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryService;
20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)struct ImportedFaviconUsage;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The favicon service provides methods to access favicons. It calls the history
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// backend behind the scenes.
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass FaviconService : public KeyedService {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit FaviconService(Profile* profile);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FaviconService();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Auxiliary argument structure for requesting favicons for URLs.
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  struct FaviconForPageURLParams {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    FaviconForPageURLParams(const GURL& page_url,
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            int icon_types,
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            int desired_size_in_dip)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        : page_url(page_url),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          icon_types(icon_types),
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          desired_size_in_dip(desired_size_in_dip) {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL page_url;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int icon_types;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int desired_size_in_dip;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // We usually pass parameters with pointer to avoid copy. This function is a
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // helper to run FaviconResultsCallback with pointer parameters.
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static void FaviconResultsCallbackRunner(
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const favicon_base::FaviconResultsCallback& callback,
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::vector<favicon_base::FaviconRawBitmapResult>* results);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The first argument of |callback| is a |const FaviconImageResult&|. Of which
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |FaviconImageResult::image| is constructed from the bitmaps for the
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // passed in URL and icon types which most wich closely match the passed in
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // |desired_size_in_dip| at the resource scale factors supported by the
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // current platform (eg MacOS) in addition to 1x.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |FaviconImageResult::icon_url| is the favicon that the favicon bitmaps in
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |image| originate from.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Enable constructing |image| from bitmaps from several
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // icon URLs.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests the favicon at |icon_url| of |icon_type| whose size most closely
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matches |desired_size_in_dip|. If |desired_size_in_dip| is 0, the largest
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // favicon bitmap at |icon_url| is returned. |consumer| is notified when the
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bits have been fetched. |icon_url| is the URL of the icon itself, e.g.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // <http://www.google.com/favicon.ico>.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Each of the three methods below differs in the format of the callback and
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // the requested scales. All of the resource scale factors supported by the
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current platform (eg MacOS) are requested for GetFaviconImage().
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetFaviconImage(
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& icon_url,
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      favicon_base::IconType icon_type,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int desired_size_in_dip,
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const favicon_base::FaviconImageCallback& callback,
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetRawFavicon(
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& icon_url,
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      favicon_base::IconType icon_type,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int desired_size_in_dip,
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      float desired_favicon_scale,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const favicon_base::FaviconRawBitmapCallback& callback,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The first argument for |callback| is the set of bitmaps for the passed in
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // URL and icon types whose pixel sizes best match the passed in
866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // |desired_size_in_dip| at the resource scale factors supported by the
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // current platform (eg MacOS) in addition to 1x. The vector has at most one
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // result for each of the resource scale factors. There are less entries if a
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // single/ result is the best bitmap to use for several resource scale
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // factors.
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetFavicon(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& icon_url,
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      favicon_base::IconType icon_type,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int desired_size_in_dip,
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const favicon_base::FaviconResultsCallback& callback,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the favicon mappings to |page_url| for |icon_types| in the history
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sample |icon_urls|:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  { ICON_URL1 -> TOUCH_ICON, known to the database,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    ICON_URL2 -> TOUCH_ICON, not known to the database,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    ICON_URL3 -> TOUCH_PRECOMPOSED_ICON, known to the database }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new mappings are computed from |icon_urls| with these rules:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1) Any urls in |icon_urls| which are not already known to the database are
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    rejected.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    Sample new mappings to |page_url|: { ICON_URL1, ICON_URL3 }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2) If |icon_types| has multiple types, the mappings are only set for the
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    largest icon type.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    Sample new mappings to |page_url|: { ICON_URL3 }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |icon_types| can only have multiple IconTypes if
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |icon_types| == TOUCH_ICON | TOUCH_PRECOMPOSED_ICON.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The favicon bitmaps which most closely match |desired_size_in_dip|
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // at the reosurce scale factors supported by the current platform (eg MacOS)
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // in addition to 1x from the favicons which were just mapped to |page_url|
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // are returned. If |desired_size_in_dip| is 0, the largest favicon bitmap is
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returned.
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& page_url,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<GURL>& icon_urls,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int icon_types,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int desired_size_in_dip,
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const favicon_base::FaviconResultsCallback& callback,
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests the favicons of any of |icon_types| whose pixel sizes most
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // closely match |desired_size_in_dip| and desired scale for a web
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page URL. If |desired_size_in_dip| is 0, the largest favicon for the web
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // page URL is returned. |callback| is run when the bits have been fetched.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |icon_types| can be any combination of IconType value, but only one icon
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will be returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON and
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FAVICON. Each of the three methods below differs in the format of the
1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // callback and the requested scales. All of the resource scale factors
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // supported by the current platform (eg MacOS) are requested for
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // GetFaviconImageForPageURL().
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note. |callback| is always run asynchronously.
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetFaviconImageForPageURL(
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const FaviconForPageURLParams& params,
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const favicon_base::FaviconImageCallback& callback,
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetRawFaviconForPageURL(
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const FaviconForPageURLParams& params,
1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      float desired_favicon_scale,
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const favicon_base::FaviconRawBitmapCallback& callback,
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // See HistoryService::GetLargestFaviconForPageURL().
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetLargestRawFaviconForPageURL(
1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Profile* profile,
1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const GURL& page_url,
1528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const std::vector<int>& icon_types,
1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      int minimum_size_in_pixels,
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const favicon_base::FaviconRawBitmapCallback& callback,
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetFaviconForPageURL(
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const FaviconForPageURLParams& params,
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const favicon_base::FaviconResultsCallback& callback,
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to request a bitmap for the favicon with |favicon_id| which is not
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resized from the size it is stored at in the database. If there are
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multiple favicon bitmaps for |favicon_id|, the largest favicon bitmap is
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned.
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetLargestRawFaviconForID(
1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      favicon_base::FaviconID favicon_id,
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const favicon_base::FaviconRawBitmapCallback& callback,
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marks all types of favicon for the page as being out of date.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetFaviconOutOfDateForPage(const GURL& page_url);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clones all icons from an existing page. This associates the icons from
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |old_page_url| with |new_page_url|, provided |new_page_url| has no
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recorded associations to any other icons.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed if you want to declare favicons (tentatively) in advance, before a
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page is ever visited.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloneFavicon(const GURL& old_page_url, const GURL& new_page_url);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows the importer to set many favicons for many pages at once. The pages
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must exist, any favicon sets for unknown pages will be discarded. Existing
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // favicons will not be overwritten.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetImportedFavicons(
185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const std::vector<ImportedFaviconUsage>& favicon_usage);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the favicon for |page_url| for |icon_type| in the thumbnail database.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlike SetFavicons(), this method will not delete preexisting bitmap data
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which is associated to |page_url| if at all possible. Use this method if
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the favicon bitmaps for any of ui::GetSupportedScaleFactors() are not
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // known.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MergeFavicon(const GURL& page_url,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const GURL& icon_url,
1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                    favicon_base::IconType icon_type,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_refptr<base::RefCountedMemory> bitmap_data,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const gfx::Size& pixel_size);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the favicon for |page_url| for |icon_type| in the thumbnail database.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |icon_url| is the single favicon to map to |page_url|. Mappings from
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_url| to favicons at different icon URLs will be deleted.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A favicon bitmap is added for each image rep in |image|. Any preexisting
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bitmap data for |icon_url| is deleted. It is important that |image|
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contains image reps for all of ui::GetSupportedScaleFactors(). Use
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MergeFavicon() if it does not.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Save unresized favicon bitmaps to the database.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Support adding favicons for multiple icon URLs to the
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thumbnail database.
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetFavicons(const GURL& page_url,
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   const GURL& icon_url,
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                   favicon_base::IconType icon_type,
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   const gfx::Image& image);
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Avoid repeated requests to download missing favicon.
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UnableToDownloadFavicon(const GURL& icon_url);
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool WasUnableToDownloadFavicon(const GURL& icon_url) const;
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ClearUnableToDownloadFavicons();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef uint32 MissingFaviconURLHash;
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::hash_set<MissingFaviconURLHash> missing_favicon_urls_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history_service_;
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Profile* profile_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Helper function for GetFaviconImageForPageURL(), GetRawFaviconForPageURL()
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // and GetFaviconForPageURL().
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::CancelableTaskTracker::TaskId GetFaviconForPageURLImpl(
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const FaviconForPageURLParams& params,
2286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const std::vector<int>& desired_sizes_in_pixel,
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const favicon_base::FaviconResultsCallback& callback,
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::CancelableTaskTracker* tracker);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Intermediate callback for GetFaviconImage() and GetFaviconImageForPageURL()
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so that history service can deal solely with FaviconResultsCallback.
2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Builds favicon_base::FaviconImageResult from |favicon_bitmap_results| and
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // runs |callback|.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunFaviconImageCallbackWithBitmapResults(
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const favicon_base::FaviconImageCallback& callback,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int desired_size_in_dip,
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::vector<favicon_base::FaviconRawBitmapResult>&
2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          favicon_bitmap_results);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Intermediate callback for GetRawFavicon() and GetRawFaviconForPageURL()
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so that history service can deal solely with FaviconResultsCallback.
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Resizes favicon_base::FaviconRawBitmapResult if necessary and runs
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |callback|.
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RunFaviconRawBitmapCallbackWithBitmapResults(
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const favicon_base::FaviconRawBitmapCallback& callback,
2486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      int desired_size_in_pixel,
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::vector<favicon_base::FaviconRawBitmapResult>&
2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          favicon_bitmap_results);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FaviconService);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
256