diff options
author | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-29 23:40:08 +0000 |
---|---|---|
committer | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-29 23:40:08 +0000 |
commit | 6005d68f128bbe5d2769d07ada097ff69fc0286a (patch) | |
tree | 9019a88a9b7e243b717fb995edfe85c85e05c71e /chrome/browser/prerender/prerender_manager.cc | |
parent | 5d000c47dda53af105cb8098c9fef5288008757b (diff) | |
download | chromium_src-6005d68f128bbe5d2769d07ada097ff69fc0286a.zip chromium_src-6005d68f128bbe5d2769d07ada097ff69fc0286a.tar.gz chromium_src-6005d68f128bbe5d2769d07ada097ff69fc0286a.tar.bz2 |
Add code to keep track of what fraction of pageviews are top sites.
This code will be removed again once histograms have been collected.
Review URL: http://codereview.chromium.org/7775003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98734 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender/prerender_manager.cc')
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 81 |
1 files changed, 80 insertions, 1 deletions
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc index 8ba0788..8ba9701 100644 --- a/chrome/browser/prerender/prerender_manager.cc +++ b/chrome/browser/prerender/prerender_manager.cc @@ -15,6 +15,7 @@ #include "base/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/favicon/favicon_tab_helper.h" +#include "chrome/browser/history/top_sites.h" #include "chrome/browser/prerender/prerender_condition.h" #include "chrome/browser/prerender/prerender_contents.h" #include "chrome/browser/prerender/prerender_final_status.h" @@ -26,15 +27,19 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" +#include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/render_messages.h" #include "content/browser/browser_thread.h" +#include "content/browser/cancelable_request.h" #include "content/browser/renderer_host/render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/renderer_host/resource_dispatcher_host.h" #include "content/browser/tab_contents/render_view_host_manager.h" #include "content/browser/tab_contents/tab_contents.h" #include "content/browser/tab_contents/tab_contents_delegate.h" +#include "content/common/notification_observer.h" +#include "content/common/notification_registrar.h" #include "content/common/notification_service.h" namespace prerender { @@ -165,6 +170,79 @@ struct PrerenderManager::PendingContentsData { Origin origin_; }; +class PrerenderManager::MostVisitedSites : public NotificationObserver { + public: + explicit MostVisitedSites(Profile* profile) : + profile_(profile) { + // If TopSites is already loaded, we will want to use it right away. + // Otherwise, wait for three seconds to avoid race conditions. + // This is a hack to ensure unit tests don't fail. + // See http://crbug.com/94654 + if (profile && profile->GetTopSitesWithoutCreating()) { + Init(); + } else { + timer_.Start(base::TimeDelta::FromSeconds(3), this, + &prerender::PrerenderManager::MostVisitedSites::Init); + } + } + + void Init() { + history::TopSites* top_sites = GetTopSites(); + if (top_sites) { + registrar_.Add(this, chrome::NOTIFICATION_TOP_SITES_CHANGED, + Source<history::TopSites>(top_sites)); + } + + UpdateMostVisited(); + } + + void UpdateMostVisited() { + history::TopSites* top_sites = GetTopSites(); + if (top_sites) { + top_sites->GetMostVisitedURLs( + &topsites_consumer_, + NewCallback(this, + &prerender::PrerenderManager::MostVisitedSites:: + OnMostVisitedURLsAvailable)); + } + } + + void OnMostVisitedURLsAvailable(const history::MostVisitedURLList& data) { + urls_.clear(); + for (int i = 0; i < static_cast<int>(data.size()); i++) + urls_.insert(data[i].url); + } + + void Observe(int type, + const NotificationSource& source, + const NotificationDetails& details) { + DCHECK_EQ(type, chrome::NOTIFICATION_TOP_SITES_CHANGED); + UpdateMostVisited(); + } + + bool IsTopSite(const GURL& url) const { + return (urls_.count(url) > 0); + } + + private: + history::TopSites* GetTopSites() const { + if (profile_) + return profile_->GetTopSites(); + return NULL; + } + + CancelableRequestConsumer topsites_consumer_; + Profile* profile_; + NotificationRegistrar registrar_; + std::set<GURL> urls_; + base::OneShotTimer<prerender::PrerenderManager::MostVisitedSites> timer_; +}; + +bool PrerenderManager::IsTopSite(const GURL& url) const { + DCHECK(most_visited_.get()); + return most_visited_->IsTopSite(url); +} + PrerenderManager::PrerenderManager(Profile* profile, PrerenderTracker* prerender_tracker) : enabled_(true), @@ -175,7 +253,8 @@ PrerenderManager::PrerenderManager(Profile* profile, base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), runnable_method_factory_(this), prerender_history_(new PrerenderHistory(kHistoryLength)), - histograms_(new PrerenderHistograms()) { + histograms_(new PrerenderHistograms()), + most_visited_(new MostVisitedSites(profile)) { // There are some assumptions that the PrerenderManager is on the UI thread. // Any other checks simply make sure that the PrerenderManager is accessed on // the same thread that it was created on. |