1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifndef CHROME_BROWSER_FAVICON_HELPER_H__ 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define CHROME_BROWSER_FAVICON_HELPER_H__ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/favicon_service.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/favicon_url.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/ref_counted_util.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_observer.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/gfx/favicon_size.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NavigationEntry; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile; 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RefCountedMemory; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SkBitmap; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// FaviconHelper is used to fetch the favicon for TabContents. 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// FetchFavicon requests the favicon from the favicon service which in turn 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// requests the favicon from the history database. At this point 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// we only know the URL of the page, and not necessarily the url of the 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// favicon. To ensure we handle reloading stale favicons as well as 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// reloading a favicon on page reload we always request the favicon from 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// history regardless of whether the NavigationEntry has a favicon. 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// After the navigation two types of events are delivered (which is 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// first depends upon who is faster): notification from the history 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// db on our request for the favicon (OnFaviconDataForInitialURL), 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// or a message from the renderer giving us the URL of the favicon for 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// the page (SetFaviconURL). 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . If the history db has a valid up to date favicon for the page, we update 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the NavigationEntry and use the favicon. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . When we receive the favicon url if it matches that of the NavigationEntry 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and the NavigationEntry's favicon is set, we do nothing (everything is 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ok). 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . On the other hand if the database does not know the favicon for url, or 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the favicon is out date, or the URL from the renderer does not match that 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// NavigationEntry we proceed to DownloadFaviconOrAskHistory. Before we 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// invoke DownloadFaviconOrAskHistory we wait until we've received both 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the favicon url and the callback from history. We wait to ensure we 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// truly know both the favicon url and the state of the database. 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// DownloadFaviconOrAskHistory does the following: 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . If we have a valid favicon, but it is expired we ask the renderer to 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// download the favicon. 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . Otherwise we ask the history database to update the mapping from 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// page url to favicon url and call us back with the favicon. Remember, it is 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// possible for the db to already have the favicon, just not the mapping 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// between page to favicon url. The callback for this is OnFaviconData. 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// OnFaviconData either updates the favicon of the NavigationEntry (if the 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// db knew about the favicon), or requests the renderer to download the 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// favicon. 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// When the renderer downloads the favicon SetFaviconImageData is invoked, 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// at which point we update the favicon of the NavigationEntry and notify 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the database to save the favicon. 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass FaviconHelper : public TabContentsObserver { 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen enum Type { 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FAVICON, 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TOUCH, 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconHelper(TabContents* tab_contents, Type icon_type); 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~FaviconHelper(); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initiates loading the favicon for the specified url. 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void FetchFavicon(const GURL& url); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initiates loading an image from given |image_url|. Returns a download id 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for caller to track the request. When download completes, |callback| is 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // called with the three params: the download_id, a boolean flag to indicate 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // whether the download succeeds and a SkBitmap as the downloaded image. 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note that |image_size| is a hint for images with multiple sizes. The 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // downloaded image is not resized to the given image_size. If 0 is passed, 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the first frame of the image is returned. 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef Callback3<int, bool, const SkBitmap&>::Type ImageDownloadCallback; 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int DownloadImage(const GURL& image_url, 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int image_size, 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type, 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ImageDownloadCallback* callback); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Message Handler. Must be public, because also called from 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // PrerenderContents. 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnUpdateFaviconURL(int32 page_id, 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<FaviconURL>& candidates); 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // These virtual methods make FaviconHelper testable and are overridden by 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TestFaviconHelper 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Return the NavigationEntry for the active entry, or NULL if the active 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // entries URL does not match that of the URL last passed to FetchFavicon. 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual NavigationEntry* GetEntry(); 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Asks the render to download favicon, returns the request id. 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual int DownloadFavicon(const GURL& image_url, int image_size); 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Ask the favicon from history 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void UpdateFaviconMappingAndFetch( 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& page_url, 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& icon_url, 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type, 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CancelableRequestConsumerBase* consumer, 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconService::FaviconDataCallback* callback); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void GetFavicon( 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& icon_url, 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type, 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CancelableRequestConsumerBase* consumer, 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconService::FaviconDataCallback* callback); 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void GetFaviconForURL( 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& page_url, 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int icon_types, 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CancelableRequestConsumerBase* consumer, 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconService::FaviconDataCallback* callback); 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void SetHistoryFavicon(const GURL& page_url, 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& icon_url, 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<unsigned char>& image_data, 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual FaviconService* GetFaviconService(); 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if the favicon should be saved. 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool ShouldSaveFavicon(const GURL& url); 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen friend class TestFaviconHelper; // For testing 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct DownloadRequest { 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadRequest(); 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DownloadRequest(const GURL& url, 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& image_url, 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ImageDownloadCallback* callback, 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url; 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL image_url; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ImageDownloadCallback* callback; 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TabContentsObserver overrides. 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnDidDownloadFavicon(int id, 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& image_url, 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool errored, 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const SkBitmap& image); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See description above class for details. 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnFaviconDataForInitialURL(FaviconService::Handle handle, 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::FaviconData favicon); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the favicon has expired, asks the renderer to download the favicon. 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Otherwise asks history to update the mapping between page url and icon 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // url with a callback to OnFaviconData when done. 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void DownloadFaviconOrAskHistory(const GURL& page_url, 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& icon_url, 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See description above class for details. 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnFaviconData(FaviconService::Handle handle, 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::FaviconData favicon); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Schedules a download for the specified entry. This adds the request to 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // download_requests_. 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int ScheduleDownload(const GURL& url, 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& image_url, 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int image_size, 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type, 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ImageDownloadCallback* callback); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the image data for the favicon. This is invoked asynchronously after 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we request the TabContents to download the favicon. 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetFavicon(const GURL& url, 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& icon_url, 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const SkBitmap& image, 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Converts the FAVICON's image data to an SkBitmap and sets it on the 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // NavigationEntry. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the TabContents has a delegate, it is notified of the new favicon 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (INVALIDATE_FAVICON). 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateFavicon(NavigationEntry* entry, 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<RefCountedMemory> data); 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateFavicon(NavigationEntry* entry, const SkBitmap& image); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Scales the image such that either the width and/or height is 16 pixels 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // wide. Does nothing if the image is empty. 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SkBitmap ConvertToFaviconSize(const SkBitmap& image); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void FetchFaviconInternal(); 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Return the current candidate if any. 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconURL* current_candidate() { 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return (urls_.size() > current_url_index_) ? 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &urls_[current_url_index_] : NULL; 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns the preferred_icon_size according icon_types_, 0 means no 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // preference. 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int preferred_icon_size() { 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return icon_types_ == history::FAVICON ? kFaviconSize : 0; 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used for history requests. 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CancelableRequestConsumer cancelable_consumer_; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URL of the page we're requesting the favicon for. 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url_; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether we got the initial response for the favicon back from the renderer. 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See "Favicon Details" in tab_contents.cc for more details. 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool got_favicon_from_history_; 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether the favicon is out of date. If true, it means history knows about 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the favicon, but we need to download the favicon because the icon has 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // expired. 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See "Favicon Details" in tab_contents.cc for more details. 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool favicon_expired_; 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Requests to the renderer to download favicons. 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<int, DownloadRequest> DownloadRequests; 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DownloadRequests download_requests_; 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The combination of the supported icon types. 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const int icon_types_; 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The prioritized favicon candidates from the page back from the renderer. 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<FaviconURL> urls_; 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The current candidate's index in urls_. 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen size_t current_url_index_; 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The FaviconData from history. 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::FaviconData history_icon_; 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(FaviconHelper); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // CHROME_BROWSER_FAVICON_HELPER_H__ 259