| 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);
|
| };
|
|
|
|
|