favicon_service.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/common/cancelable_request.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_keyed_service.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/ref_counted_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryService;
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.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This service is thread safe. Each request callback is invoked in the
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread that made the request.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FaviconService : public CancelableRequestProvider,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public ProfileKeyedService {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FaviconService(HistoryService* history_service);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FaviconService();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Auxiliary argument structure for requesting favicons for URLs.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct FaviconForURLParams {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FaviconForURLParams(Profile* profile,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const GURL& page_url,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int icon_types,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        int desired_size_in_dip)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : profile(profile),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          page_url(page_url),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          icon_types(icon_types),
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          desired_size_in_dip(desired_size_in_dip) {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL page_url;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int icon_types;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int desired_size_in_dip;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for GetFaviconImage() and GetFaviconImageForURL().
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |FaviconImageResult::image| is constructed from the bitmaps for the
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // passed in URL and icon types which most which closely match the passed in
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |desired_size_in_dip| at the scale factors supported by the current
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // platform (eg MacOS) in addition to 1x.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |FaviconImageResult::icon_url| is the favicon that the favicon bitmaps in
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |image| originate from.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Enable constructing |image| from bitmaps from several
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // icon URLs.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const history::FaviconImageResult&)>
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FaviconImageCallback;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for GetRawFavicon() and GetRawFaviconForURL().
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FaviconBitmapResult::bitmap_data is the bitmap in the thumbnail database
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the passed in URL and icon types whose pixel size best matches the
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // passed in |desired_size_in_dip| and |desired_scale_factor|. Returns an
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalid history::FaviconBitmapResult if there are no matches.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const history::FaviconBitmapResult&)>
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FaviconRawCallback;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for GetFavicon() and GetFaviconForURL().
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first argument is the set of bitmaps for the passed in URL and
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // icon types whose pixel sizes best match the passed in
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |desired_size_in_dip| at the scale factors supported by the current
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // platform (eg MacOS) in addition to 1x. The vector has at most one result
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for each of the scale factors. There are less entries if a single result
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is the best bitmap to use for several scale factors.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const std::vector<history::FaviconBitmapResult>&)>
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FaviconResultsCallback;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We usually pass parameters with pointer to avoid copy. This function is a
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // helper to run FaviconResultsCallback with pointer parameters.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void FaviconResultsCallbackRunner(
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconResultsCallback& callback,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<history::FaviconBitmapResult>* results);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests the favicon at |icon_url| of |icon_type| whose size most closely
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matches |desired_size_in_dip|. If |desired_size_in_dip| is 0, the largest
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // favicon bitmap at |icon_url| is returned. |consumer| is notified when the
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bits have been fetched. |icon_url| is the URL of the icon itself, e.g.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // <http://www.google.com/favicon.ico>.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Each of the three methods below differs in the format of the callback and
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the requested scale factors. All of the scale factors supported by the
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current platform (eg MacOS) are requested for GetFaviconImage().
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetFaviconImage(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& icon_url,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history::IconType icon_type,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int desired_size_in_dip,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconImageCallback& callback,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetRawFavicon(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& icon_url,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history::IconType icon_type,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int desired_size_in_dip,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::ScaleFactor desired_scale_factor,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconRawCallback& callback,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetFavicon(
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& icon_url,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history::IconType icon_type,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int desired_size_in_dip,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconResultsCallback& callback,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the favicon mappings to |page_url| for |icon_types| in the history
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sample |icon_urls|:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  { ICON_URL1 -> TOUCH_ICON, known to the database,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    ICON_URL2 -> TOUCH_ICON, not known to the database,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    ICON_URL3 -> TOUCH_PRECOMPOSED_ICON, known to the database }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new mappings are computed from |icon_urls| with these rules:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1) Any urls in |icon_urls| which are not already known to the database are
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    rejected.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    Sample new mappings to |page_url|: { ICON_URL1, ICON_URL3 }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2) If |icon_types| has multiple types, the mappings are only set for the
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    largest icon type.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    Sample new mappings to |page_url|: { ICON_URL3 }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |icon_types| can only have multiple IconTypes if
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |icon_types| == TOUCH_ICON | TOUCH_PRECOMPOSED_ICON.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The favicon bitmaps which most closely match |desired_size_in_dip|
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // at the scale factors supported by the current platform (eg MacOS) in
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // addition to 1x from the favicons which were just mapped to |page_url| are
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returned. If |desired_size_in_dip| is 0, the largest favicon bitmap is
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returned.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& page_url,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<GURL>& icon_urls,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int icon_types,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int desired_size_in_dip,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconResultsCallback& callback,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests the favicons of any of |icon_types| whose pixel sizes most
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closely match |desired_size_in_dip| and desired scale factors for a web
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page URL. If |desired_size_in_dip| is 0, the largest favicon for the web
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // page URL is returned. |callback| is run when the bits have been fetched.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |icon_types| can be any combination of IconType value, but only one icon
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will be returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON and
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FAVICON. Each of the three methods below differs in the format of the
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // callback and the requested scale factors. All of the scale factors
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // supported by the current platform (eg MacOS) are requested for
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetFaviconImageForURL().
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note. |callback| is always run asynchronously.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetFaviconImageForURL(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconForURLParams& params,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconImageCallback& callback,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetRawFaviconForURL(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconForURLParams& params,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::ScaleFactor desired_scale_factor,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconRawCallback& callback,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetFaviconForURL(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FaviconForURLParams& params,
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconResultsCallback& callback,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to request a bitmap for the favicon with |favicon_id| which is not
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resized from the size it is stored at in the database. If there are
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multiple favicon bitmaps for |favicon_id|, the largest favicon bitmap is
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned.
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetLargestRawFaviconForID(
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history::FaviconID favicon_id,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconRawCallback& callback,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marks all types of favicon for the page as being out of date.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetFaviconOutOfDateForPage(const GURL& page_url);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clones all icons from an existing page. This associates the icons from
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |old_page_url| with |new_page_url|, provided |new_page_url| has no
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recorded associations to any other icons.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed if you want to declare favicons (tentatively) in advance, before a
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page is ever visited.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloneFavicon(const GURL& old_page_url, const GURL& new_page_url);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows the importer to set many favicons for many pages at once. The pages
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must exist, any favicon sets for unknown pages will be discarded. Existing
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // favicons will not be overwritten.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetImportedFavicons(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<history::ImportedFaviconUsage>& favicon_usage);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the favicon for |page_url| for |icon_type| in the thumbnail database.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlike SetFavicons(), this method will not delete preexisting bitmap data
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which is associated to |page_url| if at all possible. Use this method if
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the favicon bitmaps for any of ui::GetSupportedScaleFactors() are not
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // known.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MergeFavicon(const GURL& page_url,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const GURL& icon_url,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    history::IconType icon_type,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_refptr<base::RefCountedMemory> bitmap_data,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const gfx::Size& pixel_size);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the favicon for |page_url| for |icon_type| in the thumbnail database.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |icon_url| is the single favicon to map to |page_url|. Mappings from
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_url| to favicons at different icon URLs will be deleted.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A favicon bitmap is added for each image rep in |image|. Any preexisting
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bitmap data for |icon_url| is deleted. It is important that |image|
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contains image reps for all of ui::GetSupportedScaleFactors(). Use
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MergeFavicon() if it does not.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Save unresized favicon bitmaps to the database.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pkotwicz): Support adding favicons for multiple icon URLs to the
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thumbnail database.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetFavicons(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& page_url,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& icon_url,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      history::IconType icon_type,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Image& image);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history_service_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for GetFaviconImageForURL(), GetRawFaviconForURL() and
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetFaviconForURL().
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId GetFaviconForURLImpl(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FaviconForURLParams& params,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<ui::ScaleFactor>& desired_scale_factors,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconResultsCallback& callback,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CancelableTaskTracker* tracker);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intermediate callback for GetFaviconImage() and GetFaviconImageForURL()
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so that history service can deal solely with FaviconResultsCallback.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builds history::FaviconImageResult from |favicon_bitmap_results| and runs
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |callback|.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunFaviconImageCallbackWithBitmapResults(
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconImageCallback& callback,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int desired_size_in_dip,
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<history::FaviconBitmapResult>& favicon_bitmap_results);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intermediate callback for GetRawFavicon() and GetRawFaviconForURL()
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so that history service can deal solely with FaviconResultsCallback.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resizes history::FaviconBitmapResult if necessary and runs |callback|.
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunFaviconRawCallbackWithBitmapResults(
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FaviconRawCallback& callback,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int desired_size_in_dip,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::ScaleFactor desired_scale_factor,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<history::FaviconBitmapResult>& favicon_bitmap_results);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FaviconService);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_
259