favicon_service.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/ref_counted_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryService; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The favicon service provides methods to access favicons. It calls the history 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// backend behind the scenes. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This service is thread safe. Each request callback is invoked in the 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread that made the request. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FaviconService : public CancelableRequestProvider, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ProfileKeyedService { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FaviconService(HistoryService* history_service); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FaviconService(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Auxiliary argument structure for requesting favicons for URLs. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct FaviconForURLParams { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconForURLParams(Profile* profile, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile(profile), 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_url(page_url), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_types(icon_types), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_size_in_dip(desired_size_in_dip), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumer(consumer) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for GetFaviconImage() and GetFaviconImageForURL(). 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |FaviconImageResult::image| is constructed from the bitmaps for the 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed in URL and icon types which most which closely match the passed in 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |desired_size_in_dip| at the scale factors supported by the current 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // platform (eg MacOS). 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |FaviconImageResult::icon_url| is the favicon that the favicon bitmaps in 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |image| originate from. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(pkotwicz): Enable constructing |image| from bitmaps from several 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // icon URLs. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(Handle, const history::FaviconImageResult&)> 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconImageCallback; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for GetRawFavicon() and GetRawFaviconForURL(). 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FaviconBitmapResult::bitmap_data is the bitmap in the thumbnail database 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the passed in URL and icon types whose pixel size best matches the 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed in |desired_size_in_dip| and |desired_scale_factor|. Returns an 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalid history::FaviconBitmapResult if there are no matches. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(Handle, const history::FaviconBitmapResult&)> 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconRawCallback; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for GetFavicon() and GetFaviconForURL(). 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second argument is the set of bitmaps for the passed in URL and 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // icon types whose pixel sizes best match the passed in 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |desired_size_in_dip| and |desired_scale_factors|. The vector has at most 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one result for each of |desired_scale_factors|. There are less entries if 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a single result is the best bitmap to use for several scale factors. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Third argument: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a) If the callback is called as a result of GetFaviconForURL(): 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The third argument is a map of the icon URLs mapped to |page_url| to 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the sizes at which the favicon is available from the web. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // b) If the callback is called as a result of GetFavicon() or 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateFaviconMappingsAndFetch(): 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The third argument is a map of the subset of |icon_urls| known to the 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history backend to a vector of sizes of the favicon bitmaps at each 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL. If none of |icon_urls| are known to the history backend, an empty 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // map is returned. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See history_types.h for more information about IconURLSizesMap. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback< 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(Handle, // handle 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<history::FaviconBitmapResult>, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconURLSizesMap)> 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconResultsCallback; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef CancelableRequest<FaviconResultsCallback> GetFaviconRequest; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests the favicon at |icon_url| of |icon_type| whose size most closely 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matches |desired_size_in_dip|. If |desired_size_in_dip| is 0, the largest 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // favicon bitmap at |icon_url| is returned. |consumer| is notified when the 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bits have been fetched. |icon_url| is the URL of the icon itself, e.g. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <http://www.google.com/favicon.ico>. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each of the three methods below differs in the format of the callback and 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the requested scale factors. All of the scale factors supported by the 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current platform (eg MacOS) are requested for GetFaviconImage(). 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetFaviconImage(const GURL& icon_url, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconType icon_type, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconImageCallback& callback); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetRawFavicon(const GURL& icon_url, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconType icon_type, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor desired_scale_factor, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconRawCallback& callback); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetFavicon(const GURL& icon_url, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconType icon_type, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& desired_scale_factors, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconResultsCallback& callback); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the favicon mappings to |page_url| for |icon_types| in the history 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample |icon_urls|: 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // { ICON_URL1 -> TOUCH_ICON, known to the database, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ICON_URL2 -> TOUCH_ICON, not known to the database, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ICON_URL3 -> TOUCH_PRECOMPOSED_ICON, known to the database } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The new mappings are computed from |icon_urls| with these rules: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1) Any urls in |icon_urls| which are not already known to the database are 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rejected. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample new mappings to |page_url|: { ICON_URL1, ICON_URL3 } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2) If |icon_types| has multiple types, the mappings are only set for the 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // largest icon type. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample new mappings to |page_url|: { ICON_URL3 } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |icon_types| can only have multiple IconTypes if 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |icon_types| == TOUCH_ICON | TOUCH_PRECOMPOSED_ICON. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The favicon bitmaps which most closely match |desired_size_in_dip| 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and |desired_scale_factors| from the favicons which were just mapped 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to |page_url| are returned. If |desired_size_in_dip| is 0, the 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // largest favicon bitmap is returned. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle UpdateFaviconMappingsAndFetch( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& icon_urls, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& desired_scale_factors, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconResultsCallback& callback); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests the favicons of any of |icon_types| whose pixel sizes most 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closely match |desired_size_in_dip| and desired scale factors for a web 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page URL. If |desired_size_in_dip| is 0, the largest favicon for the web 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page URL is returned. |consumer| is notified when the bits have been 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fetched. |icon_types| can be any combination of IconType value, but only 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one icon will be returned in the priority of TOUCH_PRECOMPOSED_ICON, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TOUCH_ICON and FAVICON. Each of the three methods below differs in the 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // format of the callback and the requested scale factors. All of the scale 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // factors supported by the current platform (eg MacOS) are requested for 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetFaviconImageForURL(). 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetFaviconImageForURL(const FaviconForURLParams& params, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconImageCallback& callback); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetRawFaviconForURL(const FaviconForURLParams& params, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor desired_scale_factor, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconRawCallback& callback); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetFaviconForURL( 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconForURLParams& params, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& desired_scale_factors, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconResultsCallback& callback); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to request a bitmap for the favicon with |favicon_id| which is not 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resized from the size it is stored at in the database. If there are 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // multiple favicon bitmaps for |favicon_id|, the largest favicon bitmap is 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returned. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetLargestRawFaviconForID(history::FaviconID favicon_id, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconRawCallback& callback); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Marks all types of favicon for the page as being out of date. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFaviconOutOfDateForPage(const GURL& page_url); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clones all icons from an existing page. This associates the icons from 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |old_page_url| with |new_page_url|, provided |new_page_url| has no 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recorded associations to any other icons. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needed if you want to declare favicons (tentatively) in advance, before a 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page is ever visited. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloneFavicon(const GURL& old_page_url, const GURL& new_page_url); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the importer to set many favicons for many pages at once. The pages 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must exist, any favicon sets for unknown pages will be discarded. Existing 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // favicons will not be overwritten. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetImportedFavicons( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<history::ImportedFaviconUsage>& favicon_usage); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the favicon for |page_url| for |icon_type| in the thumbnail database. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unlike SetFavicons(), this method will not delete preexisting bitmap data 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which is associated to |page_url| if at all possible. Use this method if 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the favicon bitmaps for any of ui::GetSupportedScaleFactors() are not 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // known. If there is a favicon bitmap of |pixel_size| for |page_url| already 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the database, the favicon bitmap is overwritten. Otherwise, a new 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // favicon and favicon bitmap are created with |page_url| as the fake icon 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL. Arbitrary favicons and favicon bitmaps associated to |page_url| may be 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleted in order to maintain the restriction for the max favicons per page. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(pkotwicz): Remove once no longer required by sync. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MergeFavicon(const GURL& page_url, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconType icon_type, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pixel_size); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the favicon for |page_url| for |icon_type| in the thumbnail database. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |icon_url| is the single favicon to map to |page_url|. Mappings from 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url| to favicons at different icon URLs will be deleted. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A favicon bitmap is added for each image rep in |image|. Any preexisting 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bitmap data for |icon_url| is deleted. It is important that |image| 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contains image reps for all of ui::GetSupportedScaleFactors(). Use 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MergeFavicon() if it does not. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(pkotwicz): Save unresized favicon bitmaps to the database. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(pkotwicz): Support adding favicons for multiple icon URLs to the 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thumbnail database. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFavicons( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconType icon_type, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Image& image); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* history_service_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to forward an empty result if we cannot get the history service. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ForwardEmptyResultAsync(GetFaviconRequest* request); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function for GetFaviconImageForURL(), GetRawFaviconForURL() and 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetFaviconForURL(). 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle GetFaviconForURLImpl( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconForURLParams& params, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& desired_scale_factors, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFaviconRequest* request); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intermediate callback for GetFaviconImage() and GetFaviconImageForURL() 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that history service can deal solely with FaviconResultsCallback. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builds history::FaviconImageResult from |favicon_bitmap_results| and runs 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback|. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetFaviconImageCallback( 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconImageCallback callback, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle handle, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<history::FaviconBitmapResult> favicon_bitmap_results, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconURLSizesMap icon_url_sizes_map); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intermediate callback for GetRawFavicon() and GetRawFaviconForURL() 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that history service can deal solely with FaviconResultsCallback. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resizes history::FaviconBitmapResult if necessary and runs |callback|. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetRawFaviconCallback( 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int desired_size_in_dip, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor desired_scale_factor, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconRawCallback callback, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Handle handle, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<history::FaviconBitmapResult> favicon_bitmap_results, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::IconURLSizesMap icon_url_sizes_map); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FaviconService); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_FAVICON_FAVICON_SERVICE_H_ 274