Index: chrome/browser/favicon/favicon_handler.cc |
diff --git a/chrome/browser/favicon/favicon_handler.cc b/chrome/browser/favicon/favicon_handler.cc |
index addf93b8081669f98a499cb98e6d7a17dc75df62..7510a9944a0cc5d70aef4dbb522b56dbfd3fd572 100644 |
--- a/chrome/browser/favicon/favicon_handler.cc |
+++ b/chrome/browser/favicon/favicon_handler.cc |
@@ -15,8 +15,6 @@ |
#include "chrome/browser/favicon/favicon_service_factory.h" |
#include "chrome/browser/favicon/favicon_util.h" |
#include "components/favicon_base/select_favicon_frames.h" |
-#include "content/public/browser/favicon_status.h" |
-#include "content/public/browser/navigation_entry.h" |
#include "skia/ext/image_operations.h" |
#include "ui/gfx/codec/png_codec.h" |
#include "ui/gfx/image/image.h" |
@@ -24,7 +22,6 @@ |
#include "ui/gfx/image/image_util.h" |
using content::FaviconURL; |
-using content::NavigationEntry; |
namespace { |
@@ -328,16 +325,13 @@ void FaviconHandler::SetFavicon(const GURL& url, |
SetHistoryFavicons(url, icon_url, icon_type, image); |
if (UrlMatches(url, url_) && icon_type == favicon_base::FAVICON) { |
- NavigationEntry* entry = GetEntry(); |
- if (entry) |
- SetFaviconOnNavigationEntry(entry, icon_url, image); |
+ if (!PageChangedSinceFaviconWasRequested()) |
+ SetFaviconOnActivePage(icon_url, image); |
} |
} |
-void FaviconHandler::SetFaviconOnNavigationEntry( |
- NavigationEntry* entry, |
- const std::vector<favicon_base::FaviconBitmapResult>& |
- favicon_bitmap_results) { |
+void FaviconHandler::SetFaviconOnActivePage(const std::vector< |
+ favicon_base::FaviconBitmapResult>& favicon_bitmap_results) { |
gfx::Image resized_image = FaviconUtil::SelectFaviconFramesFromPNGs( |
favicon_bitmap_results, |
FaviconUtil::GetFaviconScaleFactors(), |
@@ -346,18 +340,16 @@ void FaviconHandler::SetFaviconOnNavigationEntry( |
// not matter which result we get the |icon_url| from. |
const GURL icon_url = favicon_bitmap_results.empty() ? |
GURL() : favicon_bitmap_results[0].icon_url; |
- SetFaviconOnNavigationEntry(entry, icon_url, resized_image); |
+ SetFaviconOnActivePage(icon_url, resized_image); |
} |
-void FaviconHandler::SetFaviconOnNavigationEntry( |
- NavigationEntry* entry, |
- const GURL& icon_url, |
- const gfx::Image& image) { |
+void FaviconHandler::SetFaviconOnActivePage(const GURL& icon_url, |
+ const gfx::Image& image) { |
// No matter what happens, we need to mark the favicon as being set. |
- entry->GetFavicon().valid = true; |
+ driver_->SetActiveFaviconValidity(true); |
- bool icon_url_changed = (entry->GetFavicon().url != icon_url); |
- entry->GetFavicon().url = icon_url; |
+ bool icon_url_changed = driver_->GetActiveFaviconURL() != icon_url; |
+ driver_->SetActiveFaviconURL(icon_url); |
if (image.IsEmpty()) |
return; |
@@ -365,7 +357,7 @@ void FaviconHandler::SetFaviconOnNavigationEntry( |
gfx::Image image_with_adjusted_colorspace = image; |
FaviconUtil::SetFaviconColorSpace(&image_with_adjusted_colorspace); |
- entry->GetFavicon().image = image_with_adjusted_colorspace; |
+ driver_->SetActiveFaviconImage(image_with_adjusted_colorspace); |
NotifyFaviconUpdated(icon_url_changed); |
} |
@@ -396,17 +388,16 @@ void FaviconHandler::OnUpdateFaviconURL( |
void FaviconHandler::ProcessCurrentUrl() { |
DCHECK(!image_urls_.empty()); |
- NavigationEntry* entry = GetEntry(); |
- |
// current_candidate() may return NULL if download_largest_icon_ is true and |
// all the sizes are larger than the max. |
- if (!entry || !current_candidate()) |
+ if (PageChangedSinceFaviconWasRequested() || !current_candidate()) |
return; |
if (current_candidate()->icon_type == FaviconURL::FAVICON) { |
- if (!favicon_expired_or_incomplete_ && entry->GetFavicon().valid && |
+ if (!favicon_expired_or_incomplete_ && |
+ driver_->GetActiveFaviconValidity() && |
DoUrlAndIconMatch(*current_candidate(), |
- entry->GetFavicon().url, |
+ driver_->GetActiveFaviconURL(), |
favicon_base::FAVICON)) |
return; |
} else if (!favicon_expired_or_incomplete_ && got_favicon_from_history_ && |
@@ -417,7 +408,8 @@ void FaviconHandler::ProcessCurrentUrl() { |
if (got_favicon_from_history_) |
DownloadFaviconOrAskFaviconService( |
- entry->GetURL(), current_candidate()->icon_url, |
+ driver_->GetActiveURL(), |
+ current_candidate()->icon_url, |
ToChromeIconType(current_candidate()->icon_type)); |
} |
@@ -474,7 +466,8 @@ void FaviconHandler::OnDidDownloadFavicon( |
i->second.url, image_url, image, score, i->second.icon_type); |
} |
} |
- if (request_next_icon && GetEntry() && image_urls_.size() > 1) { |
+ if (request_next_icon && !PageChangedSinceFaviconWasRequested() && |
+ image_urls_.size() > 1) { |
// Remove the first member of image_urls_ and process the remaining. |
image_urls_.erase(image_urls_.begin()); |
ProcessCurrentUrl(); |
@@ -493,14 +486,13 @@ void FaviconHandler::OnDidDownloadFavicon( |
download_requests_.erase(i); |
} |
-NavigationEntry* FaviconHandler::GetEntry() { |
- NavigationEntry* entry = driver_->GetActiveEntry(); |
- if (entry && UrlMatches(entry->GetURL(), url_)) |
- return entry; |
- |
+bool FaviconHandler::PageChangedSinceFaviconWasRequested() { |
+ if (UrlMatches(driver_->GetActiveURL(), url_) && url_.is_valid()) { |
+ return false; |
+ } |
// If the URL has changed out from under us (as will happen with redirects) |
- // return NULL. |
- return NULL; |
+ // return true. |
+ return true; |
} |
int FaviconHandler::DownloadFavicon(const GURL& image_url, |
@@ -570,19 +562,15 @@ void FaviconHandler::NotifyFaviconUpdated(bool icon_url_changed) { |
void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( |
const std::vector<favicon_base::FaviconBitmapResult>& |
favicon_bitmap_results) { |
- NavigationEntry* entry = GetEntry(); |
- if (!entry) |
+ if (PageChangedSinceFaviconWasRequested()) |
return; |
- |
got_favicon_from_history_ = true; |
history_results_ = favicon_bitmap_results; |
- |
bool has_results = !favicon_bitmap_results.empty(); |
favicon_expired_or_incomplete_ = has_results && HasExpiredOrIncompleteResult( |
preferred_icon_size(), favicon_bitmap_results); |
- |
if (has_results && icon_types_ == favicon_base::FAVICON && |
- !entry->GetFavicon().valid && |
+ !driver_->GetActiveFaviconValidity() && |
(!current_candidate() || |
DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results))) { |
if (HasValidResult(favicon_bitmap_results)) { |
@@ -590,7 +578,7 @@ void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( |
// doesn't have an icon. Set the favicon now, and if the favicon turns out |
// to be expired (or the wrong url) we'll fetch later on. This way the |
// user doesn't see a flash of the default favicon. |
- SetFaviconOnNavigationEntry(entry, favicon_bitmap_results); |
+ SetFaviconOnActivePage(favicon_bitmap_results); |
} else { |
// If |favicon_bitmap_results| does not have any valid results, treat the |
// favicon as if it's expired. |
@@ -598,7 +586,6 @@ void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( |
favicon_expired_or_incomplete_ = true; |
} |
} |
- |
if (has_results && !favicon_expired_or_incomplete_) { |
if (current_candidate() && |
!DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)) { |
@@ -606,7 +593,8 @@ void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( |
// update the mapping for this url and download the favicon if we don't |
// already have it. |
DownloadFaviconOrAskFaviconService( |
- entry->GetURL(), current_candidate()->icon_url, |
+ driver_->GetActiveURL(), |
+ current_candidate()->icon_url, |
ToChromeIconType(current_candidate()->icon_type)); |
} |
} else if (current_candidate()) { |
@@ -614,7 +602,8 @@ void FaviconHandler::OnFaviconDataForInitialURLFromFaviconService( |
// favicon or it's expired. Continue on to DownloadFaviconOrAskHistory to |
// either download or check history again. |
DownloadFaviconOrAskFaviconService( |
- entry->GetURL(), current_candidate()->icon_url, |
+ driver_->GetActiveURL(), |
+ current_candidate()->icon_url, |
ToChromeIconType(current_candidate()->icon_type)); |
} |
// else we haven't got the icon url. When we get it we'll ask the |
@@ -653,8 +642,7 @@ void FaviconHandler::DownloadFaviconOrAskFaviconService( |
void FaviconHandler::OnFaviconData(const std::vector< |
favicon_base::FaviconBitmapResult>& favicon_bitmap_results) { |
- NavigationEntry* entry = GetEntry(); |
- if (!entry) |
+ if (PageChangedSinceFaviconWasRequested()) |
return; |
bool has_results = !favicon_bitmap_results.empty(); |
@@ -666,19 +654,21 @@ void FaviconHandler::OnFaviconData(const std::vector< |
// There is a favicon, set it now. If expired we'll download the current |
// one again, but at least the user will get some icon instead of the |
// default and most likely the current one is fine anyway. |
- SetFaviconOnNavigationEntry(entry, favicon_bitmap_results); |
+ SetFaviconOnActivePage(favicon_bitmap_results); |
} |
if (has_expired_or_incomplete_result) { |
// The favicon is out of date. Request the current one. |
- ScheduleDownload( |
- entry->GetURL(), entry->GetFavicon().url, favicon_base::FAVICON); |
+ ScheduleDownload(driver_->GetActiveURL(), |
+ driver_->GetActiveFaviconURL(), |
+ favicon_base::FAVICON); |
} |
} else if (current_candidate() && |
(!has_results || has_expired_or_incomplete_result || |
!(DoUrlsAndIconsMatch(*current_candidate(), favicon_bitmap_results)))) { |
// We don't know the favicon, it is out of date or its type is not same as |
// one got from page. Request the current one. |
- ScheduleDownload(entry->GetURL(), current_candidate()->icon_url, |
+ ScheduleDownload(driver_->GetActiveURL(), |
+ current_candidate()->icon_url, |
ToChromeIconType(current_candidate()->icon_type)); |
} |
history_results_ = favicon_bitmap_results; |