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