Index: chrome/browser/favicon/favicon_tab_helper.cc |
diff --git a/chrome/browser/favicon/favicon_tab_helper.cc b/chrome/browser/favicon/favicon_tab_helper.cc |
index e5e933417783ed62f8ffd0b85b2543a49cafa142..177e7ba64b45cc119d13b11d0b4c79ac78797f33 100644 |
--- a/chrome/browser/favicon/favicon_tab_helper.cc |
+++ b/chrome/browser/favicon/favicon_tab_helper.cc |
@@ -4,73 +4,13 @@ |
#include "chrome/browser/favicon/favicon_tab_helper.h" |
-#include "base/command_line.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/strings/string_util.h" |
#include "chrome/browser/bookmarks/bookmark_model_factory.h" |
-#include "chrome/browser/chrome_notification_types.h" |
#include "chrome/browser/favicon/favicon_service_factory.h" |
#include "chrome/browser/history/history_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/search/search.h" |
-#include "chrome/common/chrome_constants.h" |
#include "chrome/common/url_constants.h" |
-#include "components/bookmarks/browser/bookmark_model.h" |
-#include "components/favicon/content/favicon_url_util.h" |
-#include "components/favicon/core/favicon_driver_observer.h" |
-#include "components/favicon/core/favicon_handler.h" |
-#include "components/favicon/core/favicon_service.h" |
-#include "components/favicon_base/favicon_types.h" |
-#include "components/history/core/browser/history_service.h" |
-#include "content/public/browser/favicon_status.h" |
-#include "content/public/browser/invalidate_type.h" |
-#include "content/public/browser/navigation_controller.h" |
-#include "content/public/browser/navigation_details.h" |
-#include "content/public/browser/navigation_entry.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_contents_delegate.h" |
#include "content/public/common/favicon_url.h" |
-#include "ui/base/ui_base_switches.h" |
-#include "ui/gfx/codec/png_codec.h" |
-#include "ui/gfx/image/image.h" |
-#include "ui/gfx/image/image_skia.h" |
-#include "ui/gfx/image/image_skia_rep.h" |
- |
-using content::FaviconStatus; |
-using content::NavigationController; |
-using content::NavigationEntry; |
-using content::WebContents; |
- |
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(FaviconTabHelper); |
- |
-namespace { |
- |
-// Returns whether icon NTP is enabled by experiment. |
-// TODO(huangs): Remove all 3 copies of this routine once Icon NTP launches. |
-bool IsIconNTPEnabled() { |
- // Note: It's important to query the field trial state first, to ensure that |
- // UMA reports the correct group. |
- const std::string group_name = base::FieldTrialList::FindFullName("IconNTP"); |
- using base::CommandLine; |
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableIconNtp)) |
- return false; |
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableIconNtp)) |
- return true; |
- |
- return StartsWithASCII(group_name, "Enabled", true); |
-} |
- |
-#if defined(OS_ANDROID) || defined(OS_IOS) |
-const bool kDownloadLargestIcon = true; |
-const bool kEnableTouchIcon = true; |
-#else |
-const bool kDownloadLargestIcon = false; |
-const bool kEnableTouchIcon = false; |
-#endif |
- |
-} // namespace |
// static |
void FaviconTabHelper::CreateForWebContents( |
@@ -93,277 +33,41 @@ void FaviconTabHelper::CreateForWebContents( |
BookmarkModelFactory::GetForProfileIfExists(original_profile))); |
} |
-FaviconTabHelper::FaviconTabHelper(WebContents* web_contents, |
- favicon::FaviconService* favicon_service, |
- history::HistoryService* history_service, |
- bookmarks::BookmarkModel* bookmark_model) |
- : content::WebContentsObserver(web_contents), |
- favicon_service_(favicon_service), |
- history_service_(history_service), |
- bookmark_model_(bookmark_model) { |
- favicon_handler_.reset(new favicon::FaviconHandler( |
- favicon_service_, this, favicon::FaviconHandler::FAVICON, |
- kDownloadLargestIcon)); |
- if (kEnableTouchIcon) { |
- touch_icon_handler_.reset(new favicon::FaviconHandler( |
- favicon_service_, this, favicon::FaviconHandler::TOUCH, |
- kDownloadLargestIcon)); |
- } |
- if (IsIconNTPEnabled()) { |
- large_icon_handler_.reset(new favicon::FaviconHandler( |
- favicon_service_, this, favicon::FaviconHandler::LARGE, true)); |
- } |
-} |
- |
-FaviconTabHelper::~FaviconTabHelper() { |
-} |
- |
-void FaviconTabHelper::FetchFavicon(const GURL& url) { |
- favicon_handler_->FetchFavicon(url); |
- if (touch_icon_handler_.get()) |
- touch_icon_handler_->FetchFavicon(url); |
- if (large_icon_handler_.get()) |
- large_icon_handler_->FetchFavicon(url); |
-} |
- |
-gfx::Image FaviconTabHelper::GetFavicon() const { |
- // Like GetTitle(), we also want to use the favicon for the last committed |
- // entry rather than a pending navigation entry. |
- const NavigationController& controller = web_contents()->GetController(); |
- NavigationEntry* entry = controller.GetTransientEntry(); |
- if (entry) |
- return entry->GetFavicon().image; |
- |
- entry = controller.GetLastCommittedEntry(); |
- if (entry) |
- return entry->GetFavicon().image; |
- return gfx::Image(); |
-} |
- |
-bool FaviconTabHelper::FaviconIsValid() const { |
- const NavigationController& controller = web_contents()->GetController(); |
- NavigationEntry* entry = controller.GetTransientEntry(); |
- if (entry) |
- return entry->GetFavicon().valid; |
- |
- entry = controller.GetLastCommittedEntry(); |
- if (entry) |
- return entry->GetFavicon().valid; |
- |
- return false; |
+// static |
+FaviconTabHelper* FaviconTabHelper::FromWebContents( |
+ content::WebContents* web_contents) { |
+ return static_cast<FaviconTabHelper*>( |
+ favicon::ContentFaviconDriver::FromWebContents(web_contents)); |
} |
-bool FaviconTabHelper::ShouldDisplayFavicon() { |
+// static |
+bool FaviconTabHelper::ShouldDisplayFavicon( |
+ content::WebContents* web_contents) { |
// Always display a throbber during pending loads. |
- const NavigationController& controller = web_contents()->GetController(); |
+ const content::NavigationController& controller = |
+ web_contents->GetController(); |
if (controller.GetLastCommittedEntry() && controller.GetPendingEntry()) |
return true; |
- GURL url = web_contents()->GetURL(); |
+ GURL url = web_contents->GetURL(); |
if (url.SchemeIs(content::kChromeUIScheme) && |
url.host() == chrome::kChromeUINewTabHost) { |
return false; |
} |
// No favicon on Instant New Tab Pages. |
- if (chrome::IsInstantNTP(web_contents())) |
+ if (chrome::IsInstantNTP(web_contents)) |
return false; |
return true; |
} |
-void FaviconTabHelper::SaveFavicon() { |
- GURL active_url = GetActiveURL(); |
- if (active_url.is_empty()) |
- return; |
- |
- // Make sure the page is in history, otherwise adding the favicon does |
- // nothing. |
- if (!history_service_) |
- return; |
- history_service_->AddPageNoVisitForBookmark(active_url, GetActiveTitle()); |
- |
- if (!favicon_service_) |
- return; |
- if (!GetActiveFaviconValidity()) |
- return; |
- GURL favicon_url = GetActiveFaviconURL(); |
- if (favicon_url.is_empty()) |
- return; |
- gfx::Image image = GetActiveFaviconImage(); |
- if (image.IsEmpty()) |
- return; |
- favicon_service_->SetFavicons(active_url, favicon_url, favicon_base::FAVICON, |
- image); |
-} |
- |
-void FaviconTabHelper::AddObserver(favicon::FaviconDriverObserver* observer) { |
- observer_list_.AddObserver(observer); |
-} |
- |
-void FaviconTabHelper::RemoveObserver( |
- favicon::FaviconDriverObserver* observer) { |
- observer_list_.RemoveObserver(observer); |
-} |
- |
-int FaviconTabHelper::StartDownload(const GURL& url, int max_image_size) { |
- if (favicon_service_ && favicon_service_->WasUnableToDownloadFavicon(url)) { |
- DVLOG(1) << "Skip Failed FavIcon: " << url; |
- return 0; |
- } |
- |
- bool bypass_cache = (bypass_cache_page_url_ == GetActiveURL()); |
- bypass_cache_page_url_ = GURL(); |
- |
- return web_contents()->DownloadImage( |
- url, true, max_image_size, bypass_cache, |
- base::Bind(&FaviconTabHelper::DidDownloadFavicon, |
- base::Unretained(this))); |
-} |
- |
-bool FaviconTabHelper::IsOffTheRecord() { |
- DCHECK(web_contents()); |
- return web_contents()->GetBrowserContext()->IsOffTheRecord(); |
-} |
- |
-bool FaviconTabHelper::IsBookmarked(const GURL& url) { |
- return bookmark_model_ && bookmark_model_->IsBookmarked(url); |
-} |
- |
-GURL FaviconTabHelper::GetActiveURL() { |
- NavigationEntry* entry = web_contents()->GetController().GetActiveEntry(); |
- return entry ? entry->GetURL() : GURL(); |
-} |
- |
-base::string16 FaviconTabHelper::GetActiveTitle() { |
- NavigationEntry* entry = web_contents()->GetController().GetActiveEntry(); |
- return entry ? entry->GetTitle() : base::string16(); |
-} |
- |
-bool FaviconTabHelper::GetActiveFaviconValidity() { |
- return GetFaviconStatus().valid; |
-} |
- |
-void FaviconTabHelper::SetActiveFaviconValidity(bool valid) { |
- GetFaviconStatus().valid = valid; |
-} |
- |
-GURL FaviconTabHelper::GetActiveFaviconURL() { |
- return GetFaviconStatus().url; |
-} |
- |
-void FaviconTabHelper::SetActiveFaviconURL(const GURL& url) { |
- GetFaviconStatus().url = url; |
-} |
- |
-gfx::Image FaviconTabHelper::GetActiveFaviconImage() { |
- return GetFaviconStatus().image; |
-} |
- |
-void FaviconTabHelper::SetActiveFaviconImage(const gfx::Image& image) { |
- GetFaviconStatus().image = image; |
-} |
- |
-void FaviconTabHelper::OnFaviconAvailable(const gfx::Image& image, |
- const GURL& icon_url, |
- bool is_active_favicon) { |
- if (is_active_favicon) { |
- bool icon_url_changed = GetActiveFaviconURL() != icon_url; |
- // No matter what happens, we need to mark the favicon as being set. |
- SetActiveFaviconValidity(true); |
- SetActiveFaviconURL(icon_url); |
- |
- if (image.IsEmpty()) |
- return; |
- |
- SetActiveFaviconImage(image); |
- NotifyFaviconUpdated(icon_url_changed); |
- } |
- if (!image.IsEmpty()) { |
- FOR_EACH_OBSERVER(favicon::FaviconDriverObserver, observer_list_, |
- OnFaviconAvailable(image)); |
- } |
-} |
- |
-void FaviconTabHelper::NotifyFaviconUpdated(bool icon_url_changed) { |
- FOR_EACH_OBSERVER(favicon::FaviconDriverObserver, observer_list_, |
- OnFaviconUpdated(this, icon_url_changed)); |
- web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TAB); |
-} |
- |
-void FaviconTabHelper::DidDownloadFavicon( |
- int id, |
- int http_status_code, |
- const GURL& image_url, |
- const std::vector<SkBitmap>& bitmaps, |
- const std::vector<gfx::Size>& original_bitmap_sizes) { |
- if (bitmaps.empty() && http_status_code == 404) { |
- DVLOG(1) << "Failed to Download Favicon:" << image_url; |
- if (favicon_service_) |
- favicon_service_->UnableToDownloadFavicon(image_url); |
- } |
- |
- favicon_handler_->OnDidDownloadFavicon(id, image_url, bitmaps, |
- original_bitmap_sizes); |
- if (touch_icon_handler_.get()) { |
- touch_icon_handler_->OnDidDownloadFavicon(id, image_url, bitmaps, |
- original_bitmap_sizes); |
- } |
- if (large_icon_handler_.get()) { |
- large_icon_handler_->OnDidDownloadFavicon(id, image_url, bitmaps, |
- original_bitmap_sizes); |
- } |
-} |
- |
-content::FaviconStatus& FaviconTabHelper::GetFaviconStatus() { |
- DCHECK(web_contents()->GetController().GetActiveEntry()); |
- return web_contents()->GetController().GetActiveEntry()->GetFavicon(); |
-} |
- |
-void FaviconTabHelper::DidStartNavigationToPendingEntry( |
- const GURL& url, |
- NavigationController::ReloadType reload_type) { |
- if (reload_type == NavigationController::NO_RELOAD || IsOffTheRecord()) |
- return; |
- |
- bypass_cache_page_url_ = url; |
- |
- if (favicon_service_) { |
- favicon_service_->SetFaviconOutOfDateForPage(url); |
- if (reload_type == NavigationController::RELOAD_IGNORING_CACHE) |
- favicon_service_->ClearUnableToDownloadFavicons(); |
- } |
-} |
- |
-void FaviconTabHelper::DidNavigateMainFrame( |
- const content::LoadCommittedDetails& details, |
- const content::FrameNavigateParams& params) { |
- favicon_urls_.clear(); |
- |
- // Wait till the user navigates to a new URL to start checking the cache |
- // again. The cache may be ignored for non-reload navigations (e.g. |
- // history.replace() in-page navigation). This is allowed to increase the |
- // likelihood that "reloading a page ignoring the cache" redownloads the |
- // favicon. In particular, a page may do an in-page navigation before |
- // FaviconHandler has the time to determine that the favicon needs to be |
- // redownloaded. |
- GURL url = details.entry->GetURL(); |
- if (url != bypass_cache_page_url_) |
- bypass_cache_page_url_ = GURL(); |
- |
- // Get the favicon, either from history or request it from the net. |
- FetchFavicon(url); |
-} |
- |
-void FaviconTabHelper::DidUpdateFaviconURL( |
- const std::vector<content::FaviconURL>& candidates) { |
- DCHECK(!candidates.empty()); |
- favicon_urls_ = candidates; |
- std::vector<favicon::FaviconURL> favicon_urls = |
- favicon::FaviconURLsFromContentFaviconURLs(candidates); |
- favicon_handler_->OnUpdateFaviconURL(favicon_urls); |
- if (touch_icon_handler_.get()) |
- touch_icon_handler_->OnUpdateFaviconURL(favicon_urls); |
- if (large_icon_handler_.get()) |
- large_icon_handler_->OnUpdateFaviconURL(favicon_urls); |
+FaviconTabHelper::FaviconTabHelper(content::WebContents* web_contents, |
+ favicon::FaviconService* favicon_service, |
+ history::HistoryService* history_service, |
+ bookmarks::BookmarkModel* bookmark_model) |
+ : favicon::ContentFaviconDriver(web_contents, |
+ favicon_service, |
+ history_service, |
+ bookmark_model) { |
} |