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 |