Chromium Code Reviews| 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; |