| 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, prerender_tracker_, profile_, 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 |