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_HANDLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_FAVICON_FAVICON_HANDLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/ref_counted_util.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/favicon_url.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/favicon_size.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FaviconHandlerDelegate; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RefCountedMemory; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NavigationEntry; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FaviconHandler works with FaviconTabHelper to fetch the specific type of 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// favicon. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FetchFavicon requests the favicon from the favicon service which in turn 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requests the favicon from the history database. At this point 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we only know the URL of the page, and not necessarily the url of the 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// favicon. To ensure we handle reloading stale favicons as well as 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reloading a favicon on page reload we always request the favicon from 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// history regardless of whether the NavigationEntry has a favicon. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After the navigation two types of events are delivered (which is 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first depends upon who is faster): notification from the history 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// db on our request for the favicon (OnFaviconDataForInitialURL), 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or a message from the renderer giving us the URL of the favicon for 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page (SetFaviconURL). 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . If the history db has a valid up to date favicon for the page, we update 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the NavigationEntry and use the favicon. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . When we receive the favicon url if it matches that of the NavigationEntry 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and the NavigationEntry's favicon is set, we do nothing (everything is 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ok). 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . On the other hand if the database does not know the favicon for url, or 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the favicon is out date, or the URL from the renderer does not match that 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NavigationEntry we proceed to DownloadFaviconOrAskHistory. Before we 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invoke DownloadFaviconOrAskHistory we wait until we've received both 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the favicon url and the callback from history. We wait to ensure we 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// truly know both the favicon url and the state of the database. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadFaviconOrAskHistory does the following: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . If we have a valid favicon, but it is expired we ask the renderer to 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download the favicon. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . Otherwise we ask the history database to update the mapping from 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page url to favicon url and call us back with the favicon. Remember, it is 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// possible for the db to already have the favicon, just not the mapping 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// between page to favicon url. The callback for this is OnFaviconData. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnFaviconData either updates the favicon of the NavigationEntry (if the 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// db knew about the favicon), or requests the renderer to download the 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// favicon. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the renderer downloads favicons, it considers the entire list of 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// favicon candidates and chooses the one that best matches the preferred size 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (or the first one if there is no preferred size). Once the matching favicon 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has been determined, SetFavicon is called which updates the favicon of the 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NavigationEntry and notifies the database to save the favicon. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FaviconHandler { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Type { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAVICON, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOUCH, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconHandler(Profile* profile, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconHandlerDelegate* delegate, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type icon_type); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FaviconHandler(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initiates loading the favicon for the specified url. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FetchFavicon(const GURL& url); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message Handler. Must be public, because also called from 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderContents. Collects the |image_urls| list. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnUpdateFaviconURL(int32 page_id, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<content::FaviconURL>& candidates); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes the current image_irls_ entry, requesting the image from the 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history / download service. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessCurrentUrl(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Message handler for ImageHostMsg_DidDownloadImage. Called when the image 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // at |image_url| has been downloaded. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |bitmaps| is a list of all the frames of the image at |image_url|. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDidDownloadFavicon(int id, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& image_url, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int requested_size, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<SkBitmap>& bitmaps); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For testing. 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::deque<content::FaviconURL>& image_urls() const { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return image_urls_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These virtual methods make FaviconHandler testable and are overridden by 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TestFaviconHandler. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the NavigationEntry for the active entry, or NULL if the active 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entries URL does not match that of the URL last passed to FetchFavicon. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual content::NavigationEntry* GetEntry(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asks the render to download favicon, returns the request id. 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual int DownloadFavicon(const GURL& image_url, 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int image_size, 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::IconType icon_type); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask the favicon from history 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateFaviconMappingAndFetch( 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconService::FaviconResultsCallback& callback, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetFavicon( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconService::FaviconResultsCallback& callback, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetFaviconForURL( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FaviconService::FaviconResultsCallback& callback, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker* tracker); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetHistoryFavicons(const GURL& page_url, 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const GURL& icon_url, 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type, 15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Image& image); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual FaviconService* GetFaviconService(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the favicon should be saved. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShouldSaveFavicon(const GURL& url); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class TestFaviconHandler; // For testing 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct DownloadRequest { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadRequest(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~DownloadRequest(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadRequest(const GURL& url, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& image_url, 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL image_url; 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct FaviconCandidate { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconCandidate(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FaviconCandidate(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconCandidate(const GURL& url, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& image_url, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Image& image, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float score, 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL image_url; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image image; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float score; 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See description above class for details. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnFaviconDataForInitialURL( 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<chrome::FaviconBitmapResult>& favicon_bitmap_results); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the favicon has expired, asks the renderer to download the favicon. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise asks history to update the mapping between page url and icon 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // url with a callback to OnFaviconData when done. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadFaviconOrAskHistory(const GURL& page_url, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See description above class for details. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnFaviconData( 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<chrome::FaviconBitmapResult>& favicon_bitmap_results); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a download for the specified entry. This adds the request to 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // download_requests_. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ScheduleDownload(const GURL& url, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& image_url, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int image_size, 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates |favicon_candidate_| and returns true if it is an exact match. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UpdateFaviconCandidate(const GURL& url, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& image_url, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Image& image, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float score, 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the image data for the favicon. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFavicon(const GURL& url, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Image& image, 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the favicon's data on the NavigationEntry. 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the WebContents has a delegate, it is invalidated (INVALIDATE_TYPE_TAB). 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateFavicon(content::NavigationEntry* entry, 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<chrome::FaviconBitmapResult>& favicon_bitmap_results); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateFavicon(content::NavigationEntry* entry, 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& icon_url, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Image& image); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the current candidate if any. 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::FaviconURL* current_candidate() { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (image_urls_.size() > 0) ? &image_urls_[0] : NULL; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preferred_icon_size according icon_types_, 0 means no 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preference. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int preferred_icon_size() { 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return icon_types_ == chrome::FAVICON ? gfx::kFaviconSize : 0; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used for FaviconService requests. 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker cancelable_task_tracker_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL of the page we're requesting the favicon for. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we got the initial response for the favicon back from the renderer. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool got_favicon_from_history_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the favicon is out of date or the favicon data in 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |history_results_| is known to be incomplete. If true, it means history 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // knows about the favicon, but we need to download the favicon because the 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // icon has expired or the data in the database is incomplete. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool favicon_expired_or_incomplete_; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests to the renderer to download favicons. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<int, DownloadRequest> DownloadRequests; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadRequests download_requests_; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The combination of the supported icon types. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int icon_types_; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The prioritized favicon candidates from the page back from the renderer. 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::deque<content::FaviconURL> image_urls_; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The FaviconBitmapResults from history. 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> history_results_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Profile associated with this handler. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This handler's delegate. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconHandlerDelegate* delegate_; // weak 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current favicon candidate. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconCandidate favicon_candidate_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FaviconHandler); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_FAVICON_FAVICON_HANDLER_H_ 287