Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(583)

Unified Diff: chrome/browser/prerender/prerender_manager.cc

Issue 6677005: Limit prerender by only allowing one every X ms (X currently set to 500). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixes to times based on static changes Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_manager.cc
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index d30bc9135c9e81f2c3f35701dae39a972a8a6b4c..67a633852a85d08239e8f2e22d5bec7c43de3b14 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -54,11 +54,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_(base::TimeTicks::Now() -
+ base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)) {
cbentzel 2011/03/15 18:51:03 Nit: should indentation be only four from previous
dominich 2011/03/15 21:05:37 I'm not sure either, and I couldn't find anything
}
PrerenderManager::~PrerenderManager() {
@@ -92,10 +95,21 @@ 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);
+ last_prerender_start_time_ = base::TimeTicks::Now();
data.contents_->StartPrerendering();
while (prerender_list_.size() > max_elements_) {
data = prerender_list_.front();
@@ -277,6 +291,18 @@ bool PrerenderManager::ShouldRecordWindowedPPLT() {
return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds);
}
+bool PrerenderManager::DoesRateLimitAllowPrerender() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ base::TimeDelta elapsed_time =
+ base::TimeTicks::Now() - 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;

Powered by Google App Engine
This is Rietveld 408576698