diff options
author | dominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-21 19:25:18 +0000 |
---|---|---|
committer | dominich@google.com <dominich@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-21 19:25:18 +0000 |
commit | bd29ec77b1f66cf1d508ef43cb7ed863457d0ccc (patch) | |
tree | c1e66d22d9ec4cff99ec795d6de04a2e9602ced9 /chrome/browser/prerender/prerender_manager.cc | |
parent | f07aabbfcee06d7e89c3da43cd58de4dfd5f315a (diff) | |
download | chromium_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.cc | 39 |
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; |