summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender/prerender_manager.cc
diff options
context:
space:
mode:
authortburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-29 23:40:08 +0000
committertburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-29 23:40:08 +0000
commit6005d68f128bbe5d2769d07ada097ff69fc0286a (patch)
tree9019a88a9b7e243b717fb995edfe85c85e05c71e /chrome/browser/prerender/prerender_manager.cc
parent5d000c47dda53af105cb8098c9fef5288008757b (diff)
downloadchromium_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.cc81
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.