Index: chrome/browser/favicon/favicon_handler.h |
diff --git a/chrome/browser/favicon/favicon_handler.h b/chrome/browser/favicon/favicon_handler.h |
index a59e944c42e6e66b7ba81b97b05851c1de1c8a01..6ab901f6d5b6ba38e54cac4389a313ce32ec14d6 100644 |
--- a/chrome/browser/favicon/favicon_handler.h |
+++ b/chrome/browser/favicon/favicon_handler.h |
@@ -18,6 +18,7 @@ |
#include "chrome/common/ref_counted_util.h" |
#include "googleurl/src/gurl.h" |
#include "ui/gfx/favicon_size.h" |
+#include "ui/gfx/image/image.h" |
class FaviconHandlerDelegate; |
class Profile; |
@@ -29,10 +30,6 @@ namespace content { |
class NavigationEntry; |
} |
-namespace gfx { |
-class Image; |
-} |
- |
// FaviconHandler works with FaviconTabHelper to fetch the specific type of |
// favicon. |
// |
@@ -72,9 +69,11 @@ class Image; |
// db knew about the favicon), or requests the renderer to download the |
// favicon. |
// |
-// When the renderer downloads the favicon SetFavicon is invoked, |
-// at which point we update the favicon of the NavigationEntry and notify |
-// the database to save the favicon. |
+// When the renderer downloads favicons, it considers the entire list of |
+// favicon candidates and chooses the one that best matches the preferred size |
+// (or the first one if there is no preferred size). Once the matching favicon |
+// has been determined, SetFavicon is called which updates the favicon of the |
+// NavigationEntry and notifies the database to save the favicon. |
class FaviconHandler { |
public: |
@@ -104,10 +103,14 @@ class FaviconHandler { |
const FaviconTabHelper::ImageDownloadCallback& callback); |
// Message Handler. Must be public, because also called from |
- // PrerenderContents. |
+ // PrerenderContents. Collects the |image_urls| list. |
void OnUpdateFaviconURL(int32 page_id, |
const std::vector<FaviconURL>& candidates); |
+ // Processes the current image_irls_ entry, requesting the image from the |
+ // history / download service. |
+ void ProcessCurrentUrl(); |
+ |
void OnDidDownloadFavicon(int id, |
const GURL& image_url, |
bool errored, |
@@ -172,6 +175,23 @@ class FaviconHandler { |
history::IconType icon_type; |
}; |
+ struct FaviconCandidate { |
+ FaviconCandidate(); |
+ ~FaviconCandidate(); |
+ |
+ FaviconCandidate(const GURL& url, |
+ const GURL& image_url, |
+ const gfx::Image& image, |
+ int bitmap_size, |
+ history::IconType icon_type); |
+ |
+ GURL url; |
+ GURL image_url; |
+ gfx::Image image; |
+ int bitmap_size; |
+ history::IconType icon_type; |
+ }; |
+ |
// See description above class for details. |
void OnFaviconDataForInitialURL(FaviconService::Handle handle, |
history::FaviconData favicon); |
@@ -195,8 +215,13 @@ class FaviconHandler { |
history::IconType icon_type, |
const FaviconTabHelper::ImageDownloadCallback& callback); |
- // Sets the image data for the favicon. This is invoked asynchronously after |
- // we request the TabContents to download the favicon. |
+ // Updates |favicon_candidate_| and returns true if it is an exact match. |
+ bool UpdateFaviconCandidate(const GURL& url, |
+ const GURL& image_url, |
+ const gfx::Image& image, |
+ history::IconType icon_type); |
+ |
+ // Sets the image data for the favicon. |
void SetFavicon(const GURL& url, |
const GURL& icon_url, |
const gfx::Image& image, |
@@ -211,16 +236,15 @@ class FaviconHandler { |
void UpdateFavicon(content::NavigationEntry* entry, const gfx::Image* image); |
// If the image is not already at its preferred size, scales the image such |
- // that either the width and/or height is 16 pixels wide. Does nothing if the |
- // image is empty. |
+ // that either the width and/or height == gfx::kFaviconSize. Does nothing if |
+ // the image is empty. |
gfx::Image ResizeFaviconIfNeeded(const gfx::Image& image); |
void FetchFaviconInternal(); |
// Return the current candidate if any. |
FaviconURL* current_candidate() { |
- return (urls_.size() > current_url_index_) ? |
- &urls_[current_url_index_] : NULL; |
+ return (image_urls_.size() > 0) ? &image_urls_[0] : NULL; |
} |
// Returns the preferred_icon_size according icon_types_, 0 means no |
@@ -253,10 +277,7 @@ class FaviconHandler { |
const int icon_types_; |
// The prioritized favicon candidates from the page back from the renderer. |
- std::vector<FaviconURL> urls_; |
- |
- // The current candidate's index in urls_. |
- size_t current_url_index_; |
+ std::deque<FaviconURL> image_urls_; |
// The FaviconData from history. |
history::FaviconData history_icon_; |
@@ -267,6 +288,9 @@ class FaviconHandler { |
// This handler's delegate. |
FaviconHandlerDelegate* delegate_; // weak |
+ // Current favicon candidate. |
+ FaviconCandidate favicon_candidate_; |
+ |
DISALLOW_COPY_AND_ASSIGN(FaviconHandler); |
}; |