Home | History | Annotate | Download | only in favicon
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_FAVICON_FAVICON_TAB_HELPER_H_
      6 #define CHROME_BROWSER_FAVICON_FAVICON_TAB_HELPER_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/callback.h"
     12 #include "components/favicon/core/browser/favicon_client.h"
     13 #include "components/favicon/core/favicon_driver.h"
     14 #include "content/public/browser/web_contents_observer.h"
     15 #include "content/public/browser/web_contents_user_data.h"
     16 #include "content/public/common/favicon_url.h"
     17 
     18 namespace gfx {
     19 class Image;
     20 }
     21 
     22 namespace content {
     23 struct FaviconStatus;
     24 }
     25 
     26 class GURL;
     27 class FaviconHandler;
     28 class Profile;
     29 class SkBitmap;
     30 
     31 // FaviconTabHelper works with FaviconHandlers to fetch the favicons.
     32 //
     33 // FetchFavicon fetches the given page's icons. It requests the icons from the
     34 // history backend. If the icon is not available or expired, the icon will be
     35 // downloaded and saved in the history backend.
     36 //
     37 class FaviconTabHelper : public content::WebContentsObserver,
     38                          public FaviconDriver,
     39                          public content::WebContentsUserData<FaviconTabHelper> {
     40  public:
     41   virtual ~FaviconTabHelper();
     42 
     43   // Initiates loading the favicon for the specified url.
     44   void FetchFavicon(const GURL& url);
     45 
     46   // Returns the favicon for this tab, or IDR_DEFAULT_FAVICON if the tab does
     47   // not have a favicon. The default implementation uses the current navigation
     48   // entry. This will return an empty bitmap if there are no navigation
     49   // entries, which should rarely happen.
     50   gfx::Image GetFavicon() const;
     51 
     52   // Returns true if we have the favicon for the page.
     53   bool FaviconIsValid() const;
     54 
     55   // Returns whether the favicon should be displayed. If this returns false, no
     56   // space is provided for the favicon, and the favicon is never displayed.
     57   virtual bool ShouldDisplayFavicon();
     58 
     59   // Returns the current tab's favicon urls. If this is empty,
     60   // DidUpdateFaviconURL has not yet been called for the current navigation.
     61   const std::vector<content::FaviconURL>& favicon_urls() const {
     62     return favicon_urls_;
     63   }
     64 
     65   // content::WebContentsObserver override. Must be public, because also
     66   // called from PrerenderContents.
     67   virtual void DidUpdateFaviconURL(
     68       const std::vector<content::FaviconURL>& candidates) OVERRIDE;
     69 
     70   // Saves the favicon for the current page.
     71   void SaveFavicon();
     72 
     73   // FaviconDriver methods.
     74   virtual int StartDownload(const GURL& url, int max_bitmap_size) OVERRIDE;
     75   virtual void NotifyFaviconUpdated(bool icon_url_changed) OVERRIDE;
     76   virtual bool IsOffTheRecord() OVERRIDE;
     77   virtual const gfx::Image GetActiveFaviconImage() OVERRIDE;
     78   virtual const GURL GetActiveFaviconURL() OVERRIDE;
     79   virtual bool GetActiveFaviconValidity() OVERRIDE;
     80   virtual const GURL GetActiveURL() OVERRIDE;
     81   virtual void SetActiveFaviconImage(gfx::Image image) OVERRIDE;
     82   virtual void SetActiveFaviconURL(GURL url) OVERRIDE;
     83   virtual void SetActiveFaviconValidity(bool validity) OVERRIDE;
     84 
     85   // Favicon download callback.
     86   void DidDownloadFavicon(
     87       int id,
     88       int http_status_code,
     89       const GURL& image_url,
     90       const std::vector<SkBitmap>& bitmaps,
     91       const std::vector<gfx::Size>& original_bitmap_sizes);
     92 
     93  private:
     94   explicit FaviconTabHelper(content::WebContents* web_contents);
     95   friend class content::WebContentsUserData<FaviconTabHelper>;
     96 
     97   // content::WebContentsObserver overrides.
     98   virtual void DidStartNavigationToPendingEntry(
     99       const GURL& url,
    100       content::NavigationController::ReloadType reload_type) OVERRIDE;
    101   virtual void DidNavigateMainFrame(
    102       const content::LoadCommittedDetails& details,
    103       const content::FrameNavigateParams& params) OVERRIDE;
    104 
    105   // Helper method that returns the active navigation entry's favicon.
    106   content::FaviconStatus& GetFaviconStatus();
    107 
    108   Profile* profile_;
    109 
    110   scoped_ptr<FaviconClient> client_;
    111 
    112   std::vector<content::FaviconURL> favicon_urls_;
    113 
    114   scoped_ptr<FaviconHandler> favicon_handler_;
    115 
    116   // Handles downloading touchicons. It is NULL if
    117   // browser_defaults::kEnableTouchIcon is false.
    118   scoped_ptr<FaviconHandler> touch_icon_handler_;
    119 
    120   DISALLOW_COPY_AND_ASSIGN(FaviconTabHelper);
    121 };
    122 
    123 #endif  // CHROME_BROWSER_FAVICON_FAVICON_TAB_HELPER_H_
    124