Index: chrome/browser/history/history_backend.cc |
diff --git a/chrome/browser/history/history_backend.cc b/chrome/browser/history/history_backend.cc |
index 614d93a3bf4747e41f1816dff5f47841464e6e3e..c1c16b22fb2249fe4bd6d4b7905e4bc33e85ee6c 100644 |
--- a/chrome/browser/history/history_backend.cc |
+++ b/chrome/browser/history/history_backend.cc |
@@ -103,6 +103,11 @@ static const int kMaxRedirectCount = 32; |
// and is archived. |
static const int kArchiveDaysThreshold = 90; |
+#if defined(OS_ANDROID) |
+// The maximum number of top sites to track when recording top page visit stats. |
+static const size_t kPageVisitStatsMaxTopSites = 50; |
+#endif |
+ |
// Converts from PageUsageData to MostVisitedURL. |redirects| is a |
// list of redirects for this URL. Empty list means no redirects. |
MostVisitedURL MakeMostVisitedURL(const PageUsageData& page_data, |
@@ -256,6 +261,9 @@ void HistoryBackend::Init(const std::string& languages, bool force_fail) { |
InitImpl(languages); |
delegate_->DBLoaded(id_); |
typed_url_syncable_service_.reset(new TypedUrlSyncableService(this)); |
+#if defined(OS_ANDROID) |
+ PopulateMostVisitedURLMap(); |
+#endif |
} |
void HistoryBackend::SetOnBackendDestroyTask(base::MessageLoop* message_loop, |
@@ -800,6 +808,15 @@ std::pair<URLID, VisitID> HistoryBackend::AddPageVisit( |
transition_type == content::PAGE_TRANSITION_KEYWORD_GENERATED) |
typed_increment = 1; |
+#if defined(OS_ANDROID) |
+ // Only count the page visit if it came from user browsing and only count it |
+ // once when cycling through a redirect chain. |
+ if (visit_source == SOURCE_BROWSED && |
+ (transition & content::PAGE_TRANSITION_CHAIN_END) != 0) { |
+ RecordTopPageVisitStats(url); |
+ } |
+#endif |
+ |
// See if this URL is already in the DB. |
URLRow url_info(url); |
URLID url_id = db_->GetRowForURL(url, &url_info); |
@@ -3074,4 +3091,28 @@ void HistoryBackend::NotifyVisitObservers(const VisitRow& visit) { |
delegate_->NotifyVisitDBObserversOnAddVisit(info); |
} |
+#if defined(OS_ANDROID) |
+void HistoryBackend::PopulateMostVisitedURLMap() { |
+ MostVisitedURLList most_visited_urls; |
+ QueryMostVisitedURLsImpl(kPageVisitStatsMaxTopSites, kSegmentDataRetention, |
+ &most_visited_urls); |
+ |
+ DCHECK_LE(most_visited_urls.size(), kPageVisitStatsMaxTopSites); |
+ for (size_t i = 0; i < most_visited_urls.size(); ++i) { |
+ most_visited_urls_map_[most_visited_urls[i].url] = i; |
+ for (size_t j = 0; j < most_visited_urls[i].redirects.size(); ++j) |
+ most_visited_urls_map_[most_visited_urls[i].redirects[j]] = i; |
+ } |
+} |
+ |
+void HistoryBackend::RecordTopPageVisitStats(const GURL& url) { |
+ int rank = kPageVisitStatsMaxTopSites; |
+ std::map<GURL, int>::const_iterator it = most_visited_urls_map_.find(url); |
+ if (it != most_visited_urls_map_.end()) |
+ rank = (*it).second; |
+ UMA_HISTOGRAM_ENUMERATION("History.TopSitesVisitsByRank", |
+ rank, kPageVisitStatsMaxTopSites + 1); |
+} |
+#endif |
+ |
} // namespace history |