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