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..9748380a2eb8e4f1f7120e10d6e77b0dedb362d1 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)) { |
} |
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() const { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ base::TimeDelta elapsed_time = |
+ base::TimeTicks::Now() - last_prerender_start_time_; |
cbentzel
2011/03/16 01:06:01
This should use GetCurrentTime instead of base::Ti
dominich
2011/03/16 19:58:39
I added GetCurrentTimeTicks() and used that everyw
|
+ 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; |