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

Side by Side Diff: chrome/browser/prerender/prerender_manager.cc

Issue 11028037: Fix prerender histograms for multiple prerender case. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... whitespace Created 8 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/prerender/prerender_manager.h" 5 #include "chrome/browser/prerender/prerender_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 bool PrerenderManager::is_prefetch_enabled_ = false; 158 bool PrerenderManager::is_prefetch_enabled_ = false;
159 159
160 // static 160 // static
161 int PrerenderManager::prerenders_per_session_count_ = 0; 161 int PrerenderManager::prerenders_per_session_count_ = 0;
162 162
163 // static 163 // static
164 PrerenderManager::PrerenderManagerMode PrerenderManager::mode_ = 164 PrerenderManager::PrerenderManagerMode PrerenderManager::mode_ =
165 PRERENDER_MODE_ENABLED; 165 PRERENDER_MODE_ENABLED;
166 166
167 struct PrerenderManager::NavigationRecord { 167 struct PrerenderManager::NavigationRecord {
168 GURL url_; 168 GURL url;
169 base::TimeTicks time_; 169 base::TimeTicks time;
170
170 NavigationRecord(const GURL& url, base::TimeTicks time) 171 NavigationRecord(const GURL& url, base::TimeTicks time)
171 : url_(url), 172 : url(url),
172 time_(time) { 173 time(time) {
173 } 174 }
174 }; 175 };
175 176
177 PrerenderManager::PrerenderedWebContentsData::
178 PrerenderedWebContentsData(Origin origin) : origin(origin) {
179 }
180
176 PrerenderManager::PrerenderManager(Profile* profile, 181 PrerenderManager::PrerenderManager(Profile* profile,
177 PrerenderTracker* prerender_tracker) 182 PrerenderTracker* prerender_tracker)
178 : enabled_(true), 183 : enabled_(true),
179 profile_(profile), 184 profile_(profile),
180 prerender_tracker_(prerender_tracker), 185 prerender_tracker_(prerender_tracker),
181 prerender_contents_factory_(PrerenderContents::CreateFactory()), 186 prerender_contents_factory_(PrerenderContents::CreateFactory()),
182 last_prerender_start_time_(GetCurrentTimeTicks() - 187 last_prerender_start_time_(GetCurrentTimeTicks() -
183 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), 188 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)),
184 weak_factory_(this), 189 weak_factory_(this),
185 prerender_history_(new PrerenderHistory(kHistoryLength)), 190 prerender_history_(new PrerenderHistory(kHistoryLength)) {
186 histograms_(new PrerenderHistograms()) {
187 // There are some assumptions that the PrerenderManager is on the UI thread. 191 // There are some assumptions that the PrerenderManager is on the UI thread.
188 // Any other checks simply make sure that the PrerenderManager is accessed on 192 // Any other checks simply make sure that the PrerenderManager is accessed on
189 // the same thread that it was created on. 193 // the same thread that it was created on.
190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
191 195
192 // Certain experiments override our default config_ values. 196 // Certain experiments override our default config_ values.
193 switch (PrerenderManager::GetMode()) { 197 switch (PrerenderManager::GetMode()) {
194 case PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP: 198 case PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP:
195 config_.max_concurrency = 3; 199 config_.max_concurrency = 3;
196 break; 200 break;
197 case PrerenderManager::PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP: 201 case PrerenderManager::PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP:
198 config_.time_to_live = base::TimeDelta::FromMinutes(15); 202 config_.time_to_live = base::TimeDelta::FromMinutes(15);
199 break; 203 break;
200 default: 204 default:
201 break; 205 break;
202 } 206 }
207
208 histograms_.reset(new PrerenderHistograms(config_.time_to_live));
203 } 209 }
204 210
205 PrerenderManager::~PrerenderManager() { 211 PrerenderManager::~PrerenderManager() {
206 } 212 }
207 213
208 void PrerenderManager::Shutdown() { 214 void PrerenderManager::Shutdown() {
209 DoShutdown(); 215 DoShutdown();
210 } 216 }
211 217
212 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( 218 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender(
(...skipping 12 matching lines...) Expand all
225 FindPrerenderDataForChildAndRoute(process_id, route_id)) { 231 FindPrerenderDataForChildAndRoute(process_id, route_id)) {
226 // Instead of prerendering from inside of a running prerender, we will defer 232 // Instead of prerendering from inside of a running prerender, we will defer
227 // this request until its launcher is made visible. 233 // this request until its launcher is made visible.
228 if (PrerenderContents* contents = parent_prerender_data->contents_) { 234 if (PrerenderContents* contents = parent_prerender_data->contents_) {
229 pending_prerender_list_.push_back( 235 pending_prerender_list_.push_back(
230 linked_ptr<PrerenderData>(new PrerenderData(this))); 236 linked_ptr<PrerenderData>(new PrerenderData(this)));
231 PrerenderHandle* prerender_handle = 237 PrerenderHandle* prerender_handle =
232 new PrerenderHandle(pending_prerender_list_.back().get()); 238 new PrerenderHandle(pending_prerender_list_.back().get());
233 contents->AddPendingPrerender( 239 contents->AddPendingPrerender(
234 prerender_handle->weak_ptr_factory_.GetWeakPtr(), 240 prerender_handle->weak_ptr_factory_.GetWeakPtr(),
235 url, referrer, size); 241 ORIGIN_LINK_REL_PRERENDER, url, referrer, size);
236 return prerender_handle; 242 return prerender_handle;
237 } 243 }
238 } 244 }
239 245
240 // Unit tests pass in a process_id == -1. 246 // Unit tests pass in a process_id == -1.
241 SessionStorageNamespace* session_storage_namespace = NULL; 247 SessionStorageNamespace* session_storage_namespace = NULL;
242 if (process_id != -1) { 248 if (process_id != -1) {
243 RenderViewHost* source_render_view_host = 249 RenderViewHost* source_render_view_host =
244 RenderViewHost::FromID(process_id, route_id); 250 RenderViewHost::FromID(process_id, route_id);
245 if (!source_render_view_host) 251 if (!source_render_view_host)
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 // Try to set the prerendered page as used, so any subsequent attempts to 371 // Try to set the prerendered page as used, so any subsequent attempts to
366 // cancel on other threads will fail. If this fails because the prerender 372 // cancel on other threads will fail. If this fails because the prerender
367 // was already cancelled, possibly on another thread, fail. 373 // was already cancelled, possibly on another thread, fail.
368 if (!prerender_tracker_->TryUse(child_id, route_id)) 374 if (!prerender_tracker_->TryUse(child_id, route_id))
369 return false; 375 return false;
370 376
371 // At this point, we've determined that we will use the prerender. 377 // At this point, we've determined that we will use the prerender.
372 378
373 if (!prerender_contents->load_start_time().is_null()) { 379 if (!prerender_contents->load_start_time().is_null()) {
374 histograms_->RecordTimeUntilUsed( 380 histograms_->RecordTimeUntilUsed(
381 prerender_contents->origin(),
375 GetCurrentTimeTicks() - prerender_contents->load_start_time(), 382 GetCurrentTimeTicks() - prerender_contents->load_start_time(),
376 config_.time_to_live); 383 config_.time_to_live);
377 } 384 }
378 385
379 histograms_->RecordPerSessionCount(++prerenders_per_session_count_); 386 histograms_->RecordPerSessionCount(prerender_contents->origin(),
387 ++prerenders_per_session_count_);
380 histograms_->RecordUsedPrerender(prerender_contents->origin()); 388 histograms_->RecordUsedPrerender(prerender_contents->origin());
381 prerender_contents->set_final_status(FINAL_STATUS_USED); 389 prerender_contents->set_final_status(FINAL_STATUS_USED);
382 390
383 RenderViewHost* new_render_view_host = 391 RenderViewHost* new_render_view_host =
384 prerender_contents->prerender_contents()->web_contents()-> 392 prerender_contents->prerender_contents()->web_contents()->
385 GetRenderViewHost(); 393 GetRenderViewHost();
386 new_render_view_host->Send( 394 new_render_view_host->Send(
387 new PrerenderMsg_SetIsPrerendering(new_render_view_host->GetRoutingID(), 395 new PrerenderMsg_SetIsPrerendering(new_render_view_host->GetRoutingID(),
388 false)); 396 false));
389 397
390 // Start pending prerender requests from the PrerenderContents, if there are 398 // Start pending prerender requests from the PrerenderContents, if there are
391 // any. 399 // any.
392 prerender_contents->StartPendingPrerenders(); 400 prerender_contents->StartPendingPrerenders();
393 401
394 TabContents* new_tab_contents = 402 TabContents* new_tab_contents =
395 prerender_contents->ReleasePrerenderContents(); 403 prerender_contents->ReleasePrerenderContents();
396 TabContents* old_tab_contents = TabContents::FromWebContents(web_contents); 404 TabContents* old_tab_contents = TabContents::FromWebContents(web_contents);
397 DCHECK(new_tab_contents); 405 DCHECK(new_tab_contents);
398 DCHECK(old_tab_contents); 406 DCHECK(old_tab_contents);
399 407
400 MarkWebContentsAsPrerendered(new_tab_contents->web_contents()); 408 MarkWebContentsAsPrerendered(new_tab_contents->web_contents(),
409 prerender_contents->origin());
401 410
402 // Merge the browsing history. 411 // Merge the browsing history.
403 new_tab_contents->web_contents()->GetController().CopyStateFromAndPrune( 412 new_tab_contents->web_contents()->GetController().CopyStateFromAndPrune(
404 &old_tab_contents->web_contents()->GetController()); 413 &old_tab_contents->web_contents()->GetController());
405 CoreTabHelper::FromWebContents(old_tab_contents->web_contents())->delegate()-> 414 CoreTabHelper::FromWebContents(old_tab_contents->web_contents())->delegate()->
406 SwapTabContents(old_tab_contents->web_contents(), 415 SwapTabContents(old_tab_contents->web_contents(),
407 new_tab_contents->web_contents()); 416 new_tab_contents->web_contents());
408 prerender_contents->CommitHistory(new_tab_contents); 417 prerender_contents->CommitHistory(new_tab_contents);
409 418
410 GURL icon_url = prerender_contents->icon_url(); 419 GURL icon_url = prerender_contents->icon_url();
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 WebContents* web_contents, 513 WebContents* web_contents,
505 const GURL& url) { 514 const GURL& url) {
506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 515 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
507 PrerenderManager* prerender_manager = 516 PrerenderManager* prerender_manager =
508 PrerenderManagerFactory::GetForProfile( 517 PrerenderManagerFactory::GetForProfile(
509 Profile::FromBrowserContext(web_contents->GetBrowserContext())); 518 Profile::FromBrowserContext(web_contents->GetBrowserContext()));
510 if (!prerender_manager) 519 if (!prerender_manager)
511 return; 520 return;
512 if (!prerender_manager->IsEnabled()) 521 if (!prerender_manager->IsEnabled())
513 return; 522 return;
523 const Origin* prerender_origin = NULL;
mmenke 2012/10/05 17:01:15 Using a pointer for this seems a little weird and
gavinp 2012/10/05 20:43:35 Done.
gavinp 2012/10/05 20:43:35 Done.
514 bool was_prerender = 524 bool was_prerender =
515 prerender_manager->IsWebContentsPrerendered(web_contents); 525 prerender_manager->IsWebContentsPrerendered(web_contents,
526 &prerender_origin);
516 bool was_complete_prerender = was_prerender || 527 bool was_complete_prerender = was_prerender ||
517 prerender_manager->WouldWebContentsBePrerendered(web_contents); 528 prerender_manager->WouldWebContentsBePrerendered(web_contents);
mmenke 2012/10/05 17:01:15 So only real prerenders get an origin? Non-preren
gavinp 2012/10/05 20:43:35 Non prerenders would be tricky, yeah. And it was a
mmenke 2012/10/08 18:20:07 Sorry, this is fine. I was getting PrerenderedWeb
gavinp 2012/10/10 18:14:56 Timo asked for it in his review, so I've added it.
518 if (prerender_manager->IsWebContentsPrerendering(web_contents)) { 529 if (prerender_manager->IsWebContentsPrerendering(web_contents)) {
519 prerender_manager->histograms_->RecordPageLoadTimeNotSwappedIn( 530 prerender_manager->histograms_->RecordPageLoadTimeNotSwappedIn(
531 was_prerender ? *prerender_origin : ORIGIN_NONE,
520 perceived_page_load_time, url); 532 perceived_page_load_time, url);
521 } else { 533 } else {
522 prerender_manager->histograms_->RecordPerceivedPageLoadTime( 534 prerender_manager->histograms_->RecordPerceivedPageLoadTime(
535 was_prerender ? *prerender_origin : ORIGIN_NONE,
523 perceived_page_load_time, was_prerender, was_complete_prerender, url); 536 perceived_page_load_time, was_prerender, was_complete_prerender, url);
524 prerender_manager->histograms_->RecordPercentLoadDoneAtSwapin( 537 prerender_manager->histograms_->RecordPercentLoadDoneAtSwapin(
538 was_prerender ? *prerender_origin : ORIGIN_NONE,
525 fraction_plt_elapsed_at_swap_in); 539 fraction_plt_elapsed_at_swap_in);
mmenke 2012/10/05 17:01:15 If was_prerender is false, should we even bother c
gavinp 2012/10/05 20:43:35 Ah, but in PrerenderTabHelper::DidStopLoading(), t
526 if (prerender_manager->local_predictor_.get()) { 540 if (prerender_manager->local_predictor_.get()) {
527 prerender_manager->local_predictor_-> 541 prerender_manager->local_predictor_->
528 OnPLTEventForURL(url, perceived_page_load_time); 542 OnPLTEventForURL(url, perceived_page_load_time);
529 } 543 }
530 } 544 }
531 } 545 }
532 546
547 void PrerenderManager::RecordFractionPixelsFinalAtSwapin(
548 content::WebContents* web_contents,
549 double fraction) {
550 const Origin* origin = NULL;
551 IsWebContentsPrerendered(web_contents, &origin);
552 histograms_->RecordFractionPixelsFinalAtSwapin(
553 origin ? *origin : ORIGIN_NONE, fraction);
554 }
555
533 void PrerenderManager::set_enabled(bool enabled) { 556 void PrerenderManager::set_enabled(bool enabled) {
534 DCHECK(CalledOnValidThread()); 557 DCHECK(CalledOnValidThread());
535 enabled_ = enabled; 558 enabled_ = enabled;
536 } 559 }
537 560
538 // static 561 // static
539 bool PrerenderManager::IsPrefetchEnabled() { 562 bool PrerenderManager::IsPrefetchEnabled() {
540 return is_prefetch_enabled_; 563 return is_prefetch_enabled_;
541 } 564 }
542 565
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 TabContents* prerender_tab_contents = 652 TabContents* prerender_tab_contents =
630 it->get()->contents_->prerender_contents(); 653 it->get()->contents_->prerender_contents();
631 if (prerender_tab_contents && 654 if (prerender_tab_contents &&
632 prerender_tab_contents->web_contents() == web_contents) { 655 prerender_tab_contents->web_contents() == web_contents) {
633 return it->get()->contents_; 656 return it->get()->contents_;
634 } 657 }
635 } 658 }
636 return NULL; 659 return NULL;
637 } 660 }
638 661
639 void PrerenderManager::MarkWebContentsAsPrerendered(WebContents* web_contents) { 662 void PrerenderManager::MarkWebContentsAsPrerendered(WebContents* web_contents,
663 Origin origin) {
640 DCHECK(CalledOnValidThread()); 664 DCHECK(CalledOnValidThread());
641 prerendered_tab_contents_set_.insert(web_contents); 665 prerendered_web_contents_data_.insert(
666 base::hash_map<content::WebContents*,
667 PrerenderedWebContentsData>::value_type(
668 web_contents, PrerenderedWebContentsData(origin)));
642 } 669 }
643 670
644 void PrerenderManager::MarkWebContentsAsWouldBePrerendered( 671 void PrerenderManager::MarkWebContentsAsWouldBePrerendered(
645 WebContents* web_contents) { 672 WebContents* web_contents) {
646 DCHECK(CalledOnValidThread()); 673 DCHECK(CalledOnValidThread());
647 would_be_prerendered_map_[web_contents] = true; 674 would_be_prerendered_map_[web_contents] = true;
648 } 675 }
649 676
650 void PrerenderManager::MarkWebContentsAsNotPrerendered( 677 void PrerenderManager::MarkWebContentsAsNotPrerendered(
651 WebContents* web_contents) { 678 WebContents* web_contents) {
652 DCHECK(CalledOnValidThread()); 679 DCHECK(CalledOnValidThread());
653 prerendered_tab_contents_set_.erase(web_contents); 680 prerendered_web_contents_data_.erase(web_contents);
654 WouldBePrerenderedMap::iterator it = 681 WouldBePrerenderedMap::iterator it =
655 would_be_prerendered_map_.find(web_contents); 682 would_be_prerendered_map_.find(web_contents);
656 if (it != would_be_prerendered_map_.end()) { 683 if (it != would_be_prerendered_map_.end()) {
657 bool first_time = it->second; 684 bool first_time = it->second;
658 if (first_time) { 685 if (first_time) {
659 it->second = false; 686 it->second = false;
660 } else { 687 } else {
661 would_be_prerendered_map_.erase(it); 688 would_be_prerendered_map_.erase(it);
662 } 689 }
663 } 690 }
664 } 691 }
665 692
666 bool PrerenderManager::IsWebContentsPrerendered( 693 bool PrerenderManager::IsWebContentsPrerendered(
667 content::WebContents* web_contents) const { 694 content::WebContents* web_contents,
695 const Origin** origin) const {
668 DCHECK(CalledOnValidThread()); 696 DCHECK(CalledOnValidThread());
669 return prerendered_tab_contents_set_.count(web_contents) > 0; 697 base::hash_map<content::WebContents*, PrerenderedWebContentsData>::
698 const_iterator it = prerendered_web_contents_data_.find(web_contents);
699 if (it == prerendered_web_contents_data_.end()) {
700 if (origin)
701 *origin = NULL;
702 return false;
703 }
704 if (origin)
705 *origin = &it->second.origin;
706 return true;
670 } 707 }
671 708
672 bool PrerenderManager::WouldWebContentsBePrerendered( 709 bool PrerenderManager::WouldWebContentsBePrerendered(
673 WebContents* web_contents) const { 710 WebContents* web_contents) const {
674 DCHECK(CalledOnValidThread()); 711 DCHECK(CalledOnValidThread());
675 return would_be_prerendered_map_.count(web_contents) > 0; 712 return would_be_prerendered_map_.count(web_contents) > 0;
676 } 713 }
677 714
678 bool PrerenderManager::HasRecentlyBeenNavigatedTo(const GURL& url) { 715 bool PrerenderManager::HasRecentlyBeenNavigatedTo(Origin origin,
716 const GURL& url) {
679 DCHECK(CalledOnValidThread()); 717 DCHECK(CalledOnValidThread());
680 718
681 CleanUpOldNavigations(); 719 CleanUpOldNavigations();
682 std::list<NavigationRecord>::const_reverse_iterator end = navigations_.rend(); 720 std::list<NavigationRecord>::const_reverse_iterator end = navigations_.rend();
683 for (std::list<NavigationRecord>::const_reverse_iterator it = 721 for (std::list<NavigationRecord>::const_reverse_iterator it =
684 navigations_.rbegin(); 722 navigations_.rbegin();
685 it != end; 723 it != end;
686 ++it) { 724 ++it) {
687 if (it->url_ == url) { 725 if (it->url == url) {
688 base::TimeDelta delta = GetCurrentTimeTicks() - it->time_; 726 base::TimeDelta delta = GetCurrentTimeTicks() - it->time;
689 histograms_->RecordTimeSinceLastRecentVisit(delta); 727 histograms_->RecordTimeSinceLastRecentVisit(origin, delta);
690 return true; 728 return true;
691 } 729 }
692 } 730 }
693 731
694 return false; 732 return false;
695 } 733 }
696 734
697 // static 735 // static
698 bool PrerenderManager::IsValidHttpMethod(const std::string& method) { 736 bool PrerenderManager::IsValidHttpMethod(const std::string& method) {
699 // method has been canonicalized to upper case at this point so we can just 737 // method has been canonicalized to upper case at this point so we can just
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 #if !defined(OS_ANDROID) 999 #if !defined(OS_ANDROID)
962 if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost( 1000 if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost(
963 profile_, url) && 1001 profile_, url) &&
964 !content::RenderProcessHost::run_renderer_in_process()) { 1002 !content::RenderProcessHost::run_renderer_in_process()) {
965 RecordFinalStatus(origin, experiment, FINAL_STATUS_TOO_MANY_PROCESSES); 1003 RecordFinalStatus(origin, experiment, FINAL_STATUS_TOO_MANY_PROCESSES);
966 return NULL; 1004 return NULL;
967 } 1005 }
968 #endif 1006 #endif
969 1007
970 // Check if enough time has passed since the last prerender. 1008 // Check if enough time has passed since the last prerender.
971 if (!DoesRateLimitAllowPrerender()) { 1009 if (!DoesRateLimitAllowPrerender(origin)) {
972 // Cancel the prerender. We could add it to the pending prerender list but 1010 // Cancel the prerender. We could add it to the pending prerender list but
973 // this doesn't make sense as the next prerender request will be triggered 1011 // this doesn't make sense as the next prerender request will be triggered
974 // by a navigation and is unlikely to be the same site. 1012 // by a navigation and is unlikely to be the same site.
975 RecordFinalStatus(origin, experiment, FINAL_STATUS_RATE_LIMIT_EXCEEDED); 1013 RecordFinalStatus(origin, experiment, FINAL_STATUS_RATE_LIMIT_EXCEEDED);
976 return NULL; 1014 return NULL;
977 } 1015 }
978 1016
979 PrerenderContents* prerender_contents = CreatePrerenderContents( 1017 PrerenderContents* prerender_contents = CreatePrerenderContents(
980 url, referrer, origin, experiment); 1018 url, referrer, origin, experiment);
981 if (!prerender_contents || !prerender_contents->Init()) 1019 if (!prerender_contents || !prerender_contents->Init())
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1164 for (std::list<linked_ptr<PrerenderData> >::iterator 1202 for (std::list<linked_ptr<PrerenderData> >::iterator
1165 it = active_prerender_list_.begin(); 1203 it = active_prerender_list_.begin();
1166 it != active_prerender_list_.end(); 1204 it != active_prerender_list_.end();
1167 ++it) { 1205 ++it) {
1168 if (prerender_contents == it->get()->contents_) 1206 if (prerender_contents == it->get()->contents_)
1169 return it; 1207 return it;
1170 } 1208 }
1171 return active_prerender_list_.end(); 1209 return active_prerender_list_.end();
1172 } 1210 }
1173 1211
1174 bool PrerenderManager::DoesRateLimitAllowPrerender() const { 1212 bool PrerenderManager::DoesRateLimitAllowPrerender(Origin origin) const {
1175 DCHECK(CalledOnValidThread()); 1213 DCHECK(CalledOnValidThread());
1176 base::TimeDelta elapsed_time = 1214 base::TimeDelta elapsed_time =
1177 GetCurrentTimeTicks() - last_prerender_start_time_; 1215 GetCurrentTimeTicks() - last_prerender_start_time_;
1178 histograms_->RecordTimeBetweenPrerenderRequests(elapsed_time); 1216 histograms_->RecordTimeBetweenPrerenderRequests(origin, elapsed_time);
1179 if (!config_.rate_limit_enabled) 1217 if (!config_.rate_limit_enabled)
1180 return true; 1218 return true;
1181 return elapsed_time > 1219 return elapsed_time >
1182 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs); 1220 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs);
1183 } 1221 }
1184 1222
1185 void PrerenderManager::DeleteOldTabContents() { 1223 void PrerenderManager::DeleteOldTabContents() {
1186 while (!old_tab_contents_list_.empty()) { 1224 while (!old_tab_contents_list_.empty()) {
1187 TabContents* tab_contents = old_tab_contents_list_.front(); 1225 TabContents* tab_contents = old_tab_contents_list_.front();
1188 old_tab_contents_list_.pop_front(); 1226 old_tab_contents_list_.pop_front();
1189 // TODO(dominich): should we use Instant Unload Handler here? 1227 // TODO(dominich): should we use Instant Unload Handler here?
1190 delete tab_contents; 1228 delete tab_contents;
1191 } 1229 }
1192 } 1230 }
1193 1231
1194 void PrerenderManager::CleanUpOldNavigations() { 1232 void PrerenderManager::CleanUpOldNavigations() {
1195 DCHECK(CalledOnValidThread()); 1233 DCHECK(CalledOnValidThread());
1196 1234
1197 // Cutoff. Navigations before this cutoff can be discarded. 1235 // Cutoff. Navigations before this cutoff can be discarded.
1198 base::TimeTicks cutoff = GetCurrentTimeTicks() - 1236 base::TimeTicks cutoff = GetCurrentTimeTicks() -
1199 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs); 1237 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs);
1200 while (!navigations_.empty()) { 1238 while (!navigations_.empty()) {
1201 if (navigations_.front().time_ > cutoff) 1239 if (navigations_.front().time > cutoff)
1202 break; 1240 break;
1203 navigations_.pop_front(); 1241 navigations_.pop_front();
1204 } 1242 }
1205 } 1243 }
1206 1244
1207 void PrerenderManager::ScheduleDeleteOldTabContents( 1245 void PrerenderManager::ScheduleDeleteOldTabContents(
1208 TabContents* tab, 1246 TabContents* tab,
1209 OnCloseTabContentsDeleter* deleter) { 1247 OnCloseTabContentsDeleter* deleter) {
1210 old_tab_contents_list_.push_back(tab); 1248 old_tab_contents_list_.push_back(tab);
1211 PostCleanupTask(); 1249 PostCleanupTask();
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 if (!render_process_host || !render_process_host->GetBrowserContext()) 1334 if (!render_process_host || !render_process_host->GetBrowserContext())
1297 return NULL; 1335 return NULL;
1298 Profile* profile = Profile::FromBrowserContext( 1336 Profile* profile = Profile::FromBrowserContext(
1299 render_process_host->GetBrowserContext()); 1337 render_process_host->GetBrowserContext());
1300 if (!profile) 1338 if (!profile)
1301 return NULL; 1339 return NULL;
1302 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); 1340 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile);
1303 } 1341 }
1304 1342
1305 } // namespace prerender 1343 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698