Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 | 62 |
| 63 namespace { | 63 namespace { |
| 64 | 64 |
| 65 // Time window for which we will record windowed PLT's from the last | 65 // Time window for which we will record windowed PLT's from the last |
| 66 // observed link rel=prefetch tag. | 66 // observed link rel=prefetch tag. |
| 67 const int kWindowDurationSeconds = 30; | 67 const int kWindowDurationSeconds = 30; |
| 68 | 68 |
| 69 // Time interval at which periodic cleanups are performed. | 69 // Time interval at which periodic cleanups are performed. |
| 70 const int kPeriodicCleanupIntervalMs = 1000; | 70 const int kPeriodicCleanupIntervalMs = 1000; |
| 71 | 71 |
| 72 // Time interval before a new prerender is allowed. | |
| 73 const int kMinTimeBetweenPrerendersMs = 500; | |
| 74 | |
| 75 // Valid HTTP methods for prerendering. | 72 // Valid HTTP methods for prerendering. |
| 76 const char* const kValidHttpMethods[] = { | 73 const char* const kValidHttpMethods[] = { |
| 77 "GET", | 74 "GET", |
| 78 "HEAD", | 75 "HEAD", |
| 79 "OPTIONS", | 76 "OPTIONS", |
| 80 "POST", | 77 "POST", |
| 81 "TRACE", | 78 "TRACE", |
| 82 }; | 79 }; |
| 83 | 80 |
| 84 // Length of prerender history, for display in chrome://net-internals | 81 // Length of prerender history, for display in chrome://net-internals |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 189 last_prerender_start_time_(GetCurrentTimeTicks() - | 186 last_prerender_start_time_(GetCurrentTimeTicks() - |
| 190 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), | 187 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), |
| 191 weak_factory_(this), | 188 weak_factory_(this), |
| 192 prerender_history_(new PrerenderHistory(kHistoryLength)), | 189 prerender_history_(new PrerenderHistory(kHistoryLength)), |
| 193 histograms_(new PrerenderHistograms()), | 190 histograms_(new PrerenderHistograms()), |
| 194 local_predictor_(new PrerenderLocalPredictor(this)) { | 191 local_predictor_(new PrerenderLocalPredictor(this)) { |
| 195 // There are some assumptions that the PrerenderManager is on the UI thread. | 192 // There are some assumptions that the PrerenderManager is on the UI thread. |
| 196 // Any other checks simply make sure that the PrerenderManager is accessed on | 193 // Any other checks simply make sure that the PrerenderManager is accessed on |
| 197 // the same thread that it was created on. | 194 // the same thread that it was created on. |
| 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 195 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 196 | |
| 197 if (GetMode() == PRERENDER_MODE_EXPERIMENT_ONE_PRERENDER_GROUP) { | |
| 198 config_.max_concurrency = 1; | |
| 199 } | |
| 199 } | 200 } |
| 200 | 201 |
| 201 PrerenderManager::~PrerenderManager() { | 202 PrerenderManager::~PrerenderManager() { |
| 202 } | 203 } |
| 203 | 204 |
| 204 void PrerenderManager::Shutdown() { | 205 void PrerenderManager::Shutdown() { |
| 205 DoShutdown(); | 206 DoShutdown(); |
| 206 } | 207 } |
| 207 | 208 |
| 208 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( | 209 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 552 return "_Disabled"; | 553 return "_Disabled"; |
| 553 case PRERENDER_MODE_ENABLED: | 554 case PRERENDER_MODE_ENABLED: |
| 554 case PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP: | 555 case PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP: |
| 555 return "_Enabled"; | 556 return "_Enabled"; |
| 556 case PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP: | 557 case PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP: |
| 557 return "_Control"; | 558 return "_Control"; |
| 558 case PRERENDER_MODE_EXPERIMENT_5MIN_TTL_GROUP: | 559 case PRERENDER_MODE_EXPERIMENT_5MIN_TTL_GROUP: |
| 559 return "_5MinTTL"; | 560 return "_5MinTTL"; |
| 560 case PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP: | 561 case PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP: |
| 561 return "_NoUse"; | 562 return "_NoUse"; |
| 563 case PRERENDER_MODE_EXPERIMENT_ONE_PRERENDER_GROUP: | |
| 564 return "_One"; | |
| 562 case PRERENDER_MODE_MAX: | 565 case PRERENDER_MODE_MAX: |
| 563 NOTREACHED() << "Invalid PrerenderManager mode."; | 566 NOTREACHED() << "Invalid PrerenderManager mode."; |
| 564 break; | 567 break; |
| 565 }; | 568 }; |
| 566 return ""; | 569 return ""; |
| 567 } | 570 } |
| 568 | 571 |
| 569 // static | 572 // static |
| 570 bool PrerenderManager::IsPrerenderingPossible() { | 573 bool PrerenderManager::IsPrerenderingPossible() { |
| 571 return GetMode() != PRERENDER_MODE_DISABLED; | 574 return GetMode() != PRERENDER_MODE_DISABLED; |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 921 // by a navigation and is unlikely to be the same site. | 924 // by a navigation and is unlikely to be the same site. |
| 922 RecordFinalStatus(origin, experiment, FINAL_STATUS_RATE_LIMIT_EXCEEDED); | 925 RecordFinalStatus(origin, experiment, FINAL_STATUS_RATE_LIMIT_EXCEEDED); |
| 923 return NULL; | 926 return NULL; |
| 924 } | 927 } |
| 925 | 928 |
| 926 PrerenderContents* prerender_contents = CreatePrerenderContents( | 929 PrerenderContents* prerender_contents = CreatePrerenderContents( |
| 927 url, referrer, origin, experiment); | 930 url, referrer, origin, experiment); |
| 928 if (!prerender_contents || !prerender_contents->Init()) | 931 if (!prerender_contents || !prerender_contents->Init()) |
| 929 return NULL; | 932 return NULL; |
| 930 | 933 |
| 931 histograms_->RecordPrerenderStarted(origin); | |
| 932 | |
| 933 // TODO(cbentzel): Move invalid checks here instead of PrerenderContents? | 934 // TODO(cbentzel): Move invalid checks here instead of PrerenderContents? |
| 934 active_prerender_list_.push_back( | 935 active_prerender_list_.push_back( |
| 935 linked_ptr<PrerenderData>(new PrerenderData(this, prerender_contents))); | 936 linked_ptr<PrerenderData>(new PrerenderData(this, prerender_contents))); |
| 936 PrerenderHandle* prerender_handle = | 937 PrerenderHandle* prerender_handle = |
| 937 new PrerenderHandle(active_prerender_list_.back().get()); | 938 new PrerenderHandle(active_prerender_list_.back().get()); |
| 938 | 939 |
| 939 last_prerender_start_time_ = GetCurrentTimeTicks(); | 940 last_prerender_start_time_ = GetCurrentTimeTicks(); |
| 940 | 941 |
| 941 gfx::Size contents_size = | 942 gfx::Size contents_size = |
| 942 size.IsEmpty() ? config_.default_tab_bounds.size() : size; | 943 size.IsEmpty() ? config_.default_tab_bounds.size() : size; |
| 943 | 944 |
| 944 prerender_contents->StartPrerendering(process_id, contents_size, | 945 prerender_contents->StartPrerendering(process_id, contents_size, |
| 945 session_storage_namespace, | 946 session_storage_namespace, |
| 946 control_group_behavior); | 947 control_group_behavior); |
| 947 | 948 |
| 948 while (active_prerender_list_.size() > config_.max_elements) { | 949 while (active_prerender_list_.size() > config_.max_concurrency) { |
| 949 prerender_contents = active_prerender_list_.front()->contents_; | 950 prerender_contents = active_prerender_list_.front()->contents_; |
| 950 DCHECK(prerender_contents); | 951 DCHECK(prerender_contents); |
| 951 prerender_contents->Destroy(FINAL_STATUS_EVICTED); | 952 prerender_contents->Destroy(FINAL_STATUS_EVICTED); |
| 952 } | 953 } |
| 953 | 954 |
| 955 histograms_->RecordPrerenderStarted(origin, active_prerender_list_.size()); | |
|
dominich
2012/07/19 16:04:38
changing this is bad - we'll have a mismatch betwe
gavinp
2012/07/23 18:35:21
Done.
| |
| 956 | |
| 954 StartSchedulingPeriodicCleanups(); | 957 StartSchedulingPeriodicCleanups(); |
| 955 return prerender_handle; | 958 return prerender_handle; |
| 956 } | 959 } |
| 957 | 960 |
| 958 void PrerenderManager::StartSchedulingPeriodicCleanups() { | 961 void PrerenderManager::StartSchedulingPeriodicCleanups() { |
| 959 DCHECK(CalledOnValidThread()); | 962 DCHECK(CalledOnValidThread()); |
| 960 if (repeating_timer_.IsRunning()) | 963 if (repeating_timer_.IsRunning()) |
| 961 return; | 964 return; |
| 962 repeating_timer_.Start(FROM_HERE, | 965 repeating_timer_.Start(FROM_HERE, |
| 963 base::TimeDelta::FromMilliseconds(kPeriodicCleanupIntervalMs), | 966 base::TimeDelta::FromMilliseconds(kPeriodicCleanupIntervalMs), |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1225 return NULL; | 1228 return NULL; |
| 1226 Profile* profile = Profile::FromBrowserContext( | 1229 Profile* profile = Profile::FromBrowserContext( |
| 1227 render_process_host->GetBrowserContext()); | 1230 render_process_host->GetBrowserContext()); |
| 1228 if (!profile) | 1231 if (!profile) |
| 1229 return NULL; | 1232 return NULL; |
| 1230 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); | 1233 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); |
| 1231 } | 1234 } |
| 1232 | 1235 |
| 1233 } // namespace prerender | 1236 } // namespace prerender |
| 1234 | 1237 |
| OLD | NEW |