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