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