summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender/prerender_manager.cc
diff options
context:
space:
mode:
authordominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-21 19:25:18 +0000
committerdominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-21 19:25:18 +0000
commitbd29ec77b1f66cf1d508ef43cb7ed863457d0ccc (patch)
treec1e66d22d9ec4cff99ec795d6de04a2e9602ced9 /chrome/browser/prerender/prerender_manager.cc
parentf07aabbfcee06d7e89c3da43cd58de4dfd5f315a (diff)
downloadchromium_src-bd29ec77b1f66cf1d508ef43cb7ed863457d0ccc.zip
chromium_src-bd29ec77b1f66cf1d508ef43cb7ed863457d0ccc.tar.gz
chromium_src-bd29ec77b1f66cf1d508ef43cb7ed863457d0ccc.tar.bz2
Limit prerender by only allowing one every X ms (X currently set to 500).
BUG= TEST=Run a search that returns a prerender link ('cnn') and without navigating immediately run another ('nytimes'). Observe the second search does not cause a prerender if performed within the rate limit. Review URL: http://codereview.chromium.org/6677005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78905 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender/prerender_manager.cc')
-rw-r--r--chrome/browser/prerender/prerender_manager.cc39
1 files changed, 35 insertions, 4 deletions
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index 95d3ba1..d571213 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -61,11 +61,14 @@ struct PrerenderManager::PrerenderContentsData {
};
PrerenderManager::PrerenderManager(Profile* profile)
- : profile_(profile),
+ : rate_limit_enabled_(true),
+ profile_(profile),
max_prerender_age_(base::TimeDelta::FromSeconds(
kDefaultMaxPrerenderAgeSeconds)),
max_elements_(kDefaultMaxPrerenderElements),
- prerender_contents_factory_(PrerenderContents::CreateFactory()) {
+ prerender_contents_factory_(PrerenderContents::CreateFactory()),
+ last_prerender_start_time_(GetCurrentTimeTicks() -
+ base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)) {
}
PrerenderManager::~PrerenderManager() {
@@ -101,12 +104,24 @@ bool PrerenderManager::AddPreload(const GURL& url,
RecordFinalStatus(FINAL_STATUS_TOO_MANY_PROCESSES);
return false;
}
+
+ // Check if enough time has passed since the last prerender.
+ if (!DoesRateLimitAllowPrerender()) {
+ // Cancel the prerender. We could add it to the pending prerender list but
+ // this doesn't make sense as the next prerender request will be triggered
+ // by a navigation and is unlikely to be the same site.
+ RecordFinalStatus(FINAL_STATUS_RATE_LIMIT_EXCEEDED);
+ return false;
+ }
+
// TODO(cbentzel): Move invalid checks here instead of PrerenderContents?
PrerenderContentsData data(CreatePrerenderContents(url, alias_urls, referrer),
GetCurrentTime());
prerender_list_.push_back(data);
- if (!IsControlGroup())
+ if (!IsControlGroup()) {
+ last_prerender_start_time_ = GetCurrentTimeTicks();
data.contents_->StartPrerendering();
+ }
while (prerender_list_.size() > max_elements_) {
data = prerender_list_.front();
prerender_list_.pop_front();
@@ -161,7 +176,7 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tc, const GURL& url) {
}
if (!pc->load_start_time().is_null())
- RecordTimeUntilUsed(base::TimeTicks::Now() - pc->load_start_time());
+ RecordTimeUntilUsed(GetCurrentTimeTicks() - pc->load_start_time());
pc->set_final_status(FINAL_STATUS_USED);
RenderViewHost* rvh = pc->render_view_host();
@@ -208,6 +223,10 @@ base::Time PrerenderManager::GetCurrentTime() const {
return base::Time::Now();
}
+base::TimeTicks PrerenderManager::GetCurrentTimeTicks() const {
+ return base::TimeTicks::Now();
+}
+
bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const {
base::Time now = GetCurrentTime();
return (now - start < max_prerender_age_);
@@ -316,6 +335,18 @@ bool PrerenderManager::ShouldRecordWindowedPPLT() {
return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds);
}
+bool PrerenderManager::DoesRateLimitAllowPrerender() const {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ base::TimeDelta elapsed_time =
+ GetCurrentTimeTicks() - last_prerender_start_time_;
+ UMA_HISTOGRAM_TIMES("Prerender.TimeBetweenPrerenderRequests",
+ elapsed_time);
+ if (!rate_limit_enabled_)
+ return true;
+ return elapsed_time >
+ base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs);
+}
+
void PrerenderManager::StartSchedulingPeriodicCleanups() {
if (repeating_timer_.IsRunning())
return;