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