OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <string> | 7 #include <string> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/time.h" | 12 #include "base/time.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "chrome/browser/browser_process.h" |
14 #include "chrome/browser/favicon/favicon_tab_helper.h" | 15 #include "chrome/browser/favicon/favicon_tab_helper.h" |
15 #include "chrome/browser/prerender/prerender_contents.h" | 16 #include "chrome/browser/prerender/prerender_contents.h" |
16 #include "chrome/browser/prerender/prerender_final_status.h" | 17 #include "chrome/browser/prerender/prerender_final_status.h" |
17 #include "chrome/browser/prerender/prerender_observer.h" | 18 #include "chrome/browser/prerender/prerender_observer.h" |
18 #include "chrome/browser/prerender/prerender_tracker.h" | 19 #include "chrome/browser/prerender/prerender_tracker.h" |
19 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
20 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 21 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
21 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" | 22 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" |
22 #include "chrome/common/render_messages.h" | 23 #include "chrome/common/render_messages.h" |
23 #include "content/browser/browser_thread.h" | 24 #include "content/browser/browser_thread.h" |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 200 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
200 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); | 201 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); |
201 if (!prerender_manager) | 202 if (!prerender_manager) |
202 return; | 203 return; |
203 | 204 |
204 prerender_manager->DestroyPreloadForChildRouteIdPair( | 205 prerender_manager->DestroyPreloadForChildRouteIdPair( |
205 std::make_pair(render_process_id, render_view_id), | 206 std::make_pair(render_process_id, render_view_id), |
206 final_status); | 207 final_status); |
207 } | 208 } |
208 | 209 |
209 PrerenderManager::PrerenderManager(Profile* profile) | 210 PrerenderManager::PrerenderManager(Profile* profile, |
| 211 PrerenderTracker* prerender_tracker) |
210 : rate_limit_enabled_(true), | 212 : rate_limit_enabled_(true), |
211 enabled_(true), | 213 enabled_(true), |
212 profile_(profile), | 214 profile_(profile), |
| 215 prerender_tracker_(prerender_tracker), |
213 max_prerender_age_(base::TimeDelta::FromSeconds( | 216 max_prerender_age_(base::TimeDelta::FromSeconds( |
214 kDefaultMaxPrerenderAgeSeconds)), | 217 kDefaultMaxPrerenderAgeSeconds)), |
215 max_prerender_memory_mb_(kDefaultMaxPrerenderMemoryMB), | 218 max_prerender_memory_mb_(kDefaultMaxPrerenderMemoryMB), |
216 max_elements_(kDefaultMaxPrerenderElements), | 219 max_elements_(kDefaultMaxPrerenderElements), |
217 prerender_contents_factory_(PrerenderContents::CreateFactory()), | 220 prerender_contents_factory_(PrerenderContents::CreateFactory()), |
218 last_prerender_start_time_(GetCurrentTimeTicks() - | 221 last_prerender_start_time_(GetCurrentTimeTicks() - |
219 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), | 222 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), |
220 runnable_method_factory_(this) { | 223 runnable_method_factory_(this) { |
221 // There are some assumptions that the PrerenderManager is on the UI thread. | 224 // There are some assumptions that the PrerenderManager is on the UI thread. |
222 // Any other checks simply make sure that the PrerenderManager is accessed on | 225 // Any other checks simply make sure that the PrerenderManager is accessed on |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 return false; | 450 return false; |
448 } | 451 } |
449 | 452 |
450 int child_id, route_id; | 453 int child_id, route_id; |
451 CHECK(prerender_contents->GetChildId(&child_id)); | 454 CHECK(prerender_contents->GetChildId(&child_id)); |
452 CHECK(prerender_contents->GetRouteId(&route_id)); | 455 CHECK(prerender_contents->GetRouteId(&route_id)); |
453 | 456 |
454 // Try to set the prerendered page as used, so any subsequent attempts to | 457 // Try to set the prerendered page as used, so any subsequent attempts to |
455 // cancel on other threads will fail. If this fails because the prerender | 458 // cancel on other threads will fail. If this fails because the prerender |
456 // was already cancelled, possibly on another thread, fail. | 459 // was already cancelled, possibly on another thread, fail. |
457 if (!PrerenderTracker::GetInstance()->TryUse(child_id, route_id)) | 460 if (!prerender_tracker_->TryUse(child_id, route_id)) |
458 return false; | 461 return false; |
459 | 462 |
460 if (!prerender_contents->load_start_time().is_null()) | 463 if (!prerender_contents->load_start_time().is_null()) |
461 RecordTimeUntilUsed(GetCurrentTimeTicks() - | 464 RecordTimeUntilUsed(GetCurrentTimeTicks() - |
462 prerender_contents->load_start_time()); | 465 prerender_contents->load_start_time()); |
463 | 466 |
464 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", | 467 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", |
465 ++prerenders_per_session_count_); | 468 ++prerenders_per_session_count_); |
466 prerender_contents->set_final_status(FINAL_STATUS_USED); | 469 prerender_contents->set_final_status(FINAL_STATUS_USED); |
467 | 470 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 return false; | 562 return false; |
560 } | 563 } |
561 | 564 |
562 int child_id, route_id; | 565 int child_id, route_id; |
563 CHECK(prerender_contents->GetChildId(&child_id)); | 566 CHECK(prerender_contents->GetChildId(&child_id)); |
564 CHECK(prerender_contents->GetRouteId(&route_id)); | 567 CHECK(prerender_contents->GetRouteId(&route_id)); |
565 | 568 |
566 // Try to set the prerendered page as used, so any subsequent attempts to | 569 // Try to set the prerendered page as used, so any subsequent attempts to |
567 // cancel on other threads will fail. If this fails because the prerender | 570 // cancel on other threads will fail. If this fails because the prerender |
568 // was already cancelled, possibly on another thread, fail. | 571 // was already cancelled, possibly on another thread, fail. |
569 if (!PrerenderTracker::GetInstance()->TryUse(child_id, route_id)) | 572 if (!prerender_tracker_->TryUse(child_id, route_id)) |
570 return false; | 573 return false; |
571 | 574 |
572 if (!prerender_contents->load_start_time().is_null()) | 575 if (!prerender_contents->load_start_time().is_null()) |
573 RecordTimeUntilUsed(GetCurrentTimeTicks() - | 576 RecordTimeUntilUsed(GetCurrentTimeTicks() - |
574 prerender_contents->load_start_time()); | 577 prerender_contents->load_start_time()); |
575 | 578 |
576 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", | 579 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", |
577 ++prerenders_per_session_count_); | 580 ++prerenders_per_session_count_); |
578 prerender_contents->set_final_status(FINAL_STATUS_USED); | 581 prerender_contents->set_final_status(FINAL_STATUS_USED); |
579 | 582 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 DCHECK(CalledOnValidThread()); | 684 DCHECK(CalledOnValidThread()); |
682 base::Time now = GetCurrentTime(); | 685 base::Time now = GetCurrentTime(); |
683 return (now - start < max_prerender_age_); | 686 return (now - start < max_prerender_age_); |
684 } | 687 } |
685 | 688 |
686 PrerenderContents* PrerenderManager::CreatePrerenderContents( | 689 PrerenderContents* PrerenderManager::CreatePrerenderContents( |
687 const GURL& url, | 690 const GURL& url, |
688 const GURL& referrer) { | 691 const GURL& referrer) { |
689 DCHECK(CalledOnValidThread()); | 692 DCHECK(CalledOnValidThread()); |
690 return prerender_contents_factory_->CreatePrerenderContents( | 693 return prerender_contents_factory_->CreatePrerenderContents( |
691 this, profile_, url, referrer); | 694 this, profile_, prerender_tracker_, url, referrer); |
692 } | 695 } |
693 | 696 |
694 void PrerenderManager::DeletePendingDeleteEntries() { | 697 void PrerenderManager::DeletePendingDeleteEntries() { |
695 while (!pending_delete_list_.empty()) { | 698 while (!pending_delete_list_.empty()) { |
696 PrerenderContents* contents = pending_delete_list_.front(); | 699 PrerenderContents* contents = pending_delete_list_.front(); |
697 pending_delete_list_.pop_front(); | 700 pending_delete_list_.pop_front(); |
698 delete contents; | 701 delete contents; |
699 } | 702 } |
700 } | 703 } |
701 | 704 |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 base::TimeTicks cutoff = GetCurrentTimeTicks() - | 1012 base::TimeTicks cutoff = GetCurrentTimeTicks() - |
1010 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs); | 1013 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs); |
1011 while (!navigations_.empty()) { | 1014 while (!navigations_.empty()) { |
1012 if (navigations_.front().time_ > cutoff) | 1015 if (navigations_.front().time_ > cutoff) |
1013 break; | 1016 break; |
1014 navigations_.pop_front(); | 1017 navigations_.pop_front(); |
1015 } | 1018 } |
1016 } | 1019 } |
1017 | 1020 |
1018 } // namespace prerender | 1021 } // namespace prerender |
OLD | NEW |