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 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 | 413 |
414 if (!prerender_contents->load_start_time().is_null()) { | 414 if (!prerender_contents->load_start_time().is_null()) { |
415 histograms_->RecordTimeUntilUsed( | 415 histograms_->RecordTimeUntilUsed( |
416 prerender_contents->origin(), | 416 prerender_contents->origin(), |
417 GetCurrentTimeTicks() - prerender_contents->load_start_time()); | 417 GetCurrentTimeTicks() - prerender_contents->load_start_time()); |
418 } | 418 } |
419 | 419 |
420 histograms_->RecordPerSessionCount(prerender_contents->origin(), | 420 histograms_->RecordPerSessionCount(prerender_contents->origin(), |
421 ++prerenders_per_session_count_); | 421 ++prerenders_per_session_count_); |
422 histograms_->RecordUsedPrerender(prerender_contents->origin()); | 422 histograms_->RecordUsedPrerender(prerender_contents->origin()); |
423 prerender_contents->set_final_status(FINAL_STATUS_USED); | 423 prerender_contents->SetFinalStatus(FINAL_STATUS_USED); |
424 | 424 |
425 RenderViewHost* new_render_view_host = | 425 RenderViewHost* new_render_view_host = |
426 prerender_contents->prerender_contents()->web_contents()-> | 426 prerender_contents->prerender_contents()->web_contents()-> |
427 GetRenderViewHost(); | 427 GetRenderViewHost(); |
428 new_render_view_host->Send( | 428 new_render_view_host->Send( |
429 new PrerenderMsg_SetIsPrerendering(new_render_view_host->GetRoutingID(), | 429 new PrerenderMsg_SetIsPrerendering(new_render_view_host->GetRoutingID(), |
430 false)); | 430 false)); |
431 | 431 |
432 // Start pending prerender requests from the PrerenderContents, if there are | 432 // Start pending prerender requests from the PrerenderContents, if there are |
433 // any. | 433 // any. |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 return ""; | 619 return ""; |
620 } | 620 } |
621 | 621 |
622 // static | 622 // static |
623 bool PrerenderManager::IsPrerenderingPossible() { | 623 bool PrerenderManager::IsPrerenderingPossible() { |
624 return GetMode() != PRERENDER_MODE_DISABLED; | 624 return GetMode() != PRERENDER_MODE_DISABLED; |
625 } | 625 } |
626 | 626 |
627 // static | 627 // static |
628 bool PrerenderManager::ActuallyPrerendering() { | 628 bool PrerenderManager::ActuallyPrerendering() { |
629 return IsPrerenderingPossible() && !IsControlGroup(); | 629 return IsPrerenderingPossible() && !IsControlGroup(kNoExperiment); |
630 } | 630 } |
631 | 631 |
632 // static | 632 // static |
633 bool PrerenderManager::IsControlGroup() { | 633 bool PrerenderManager::IsControlGroup(uint8 experiment_id) { |
634 return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP; | 634 return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP || |
| 635 IsControlGroupExperiment(experiment_id); |
635 } | 636 } |
636 | 637 |
637 // static | 638 // static |
638 bool PrerenderManager::IsNoUseGroup() { | 639 bool PrerenderManager::IsNoUseGroup() { |
639 return GetMode() == PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP; | 640 return GetMode() == PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP; |
640 } | 641 } |
641 | 642 |
642 bool PrerenderManager::IsWebContentsPrerendering( | 643 bool PrerenderManager::IsWebContentsPrerendering( |
643 WebContents* web_contents, | 644 WebContents* web_contents, |
644 Origin* origin) const { | 645 Origin* origin) const { |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 | 800 |
800 DictionaryValue* PrerenderManager::GetAsValue() const { | 801 DictionaryValue* PrerenderManager::GetAsValue() const { |
801 DCHECK(CalledOnValidThread()); | 802 DCHECK(CalledOnValidThread()); |
802 DictionaryValue* dict_value = new DictionaryValue(); | 803 DictionaryValue* dict_value = new DictionaryValue(); |
803 dict_value->Set("history", prerender_history_->GetEntriesAsValue()); | 804 dict_value->Set("history", prerender_history_->GetEntriesAsValue()); |
804 dict_value->Set("active", GetActivePrerendersAsValue()); | 805 dict_value->Set("active", GetActivePrerendersAsValue()); |
805 dict_value->SetBoolean("enabled", enabled_); | 806 dict_value->SetBoolean("enabled", enabled_); |
806 dict_value->SetBoolean("omnibox_enabled", IsOmniboxEnabled(profile_)); | 807 dict_value->SetBoolean("omnibox_enabled", IsOmniboxEnabled(profile_)); |
807 // If prerender is disabled via a flag this method is not even called. | 808 // If prerender is disabled via a flag this method is not even called. |
808 std::string enabled_note; | 809 std::string enabled_note; |
809 if (IsControlGroup()) | 810 if (IsControlGroup(kNoExperiment)) |
810 enabled_note += "(Control group: Not actually prerendering) "; | 811 enabled_note += "(Control group: Not actually prerendering) "; |
811 if (IsNoUseGroup()) | 812 if (IsNoUseGroup()) |
812 enabled_note += "(No-use group: Not swapping in prerendered pages) "; | 813 enabled_note += "(No-use group: Not swapping in prerendered pages) "; |
813 if (GetMode() == PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP) | 814 if (GetMode() == PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP) |
814 enabled_note += | 815 enabled_note += |
815 "(15 min TTL group: Extended prerender eviction to 15 mins) "; | 816 "(15 min TTL group: Extended prerender eviction to 15 mins) "; |
816 dict_value->SetString("enabled_note", enabled_note); | 817 dict_value->SetString("enabled_note", enabled_note); |
817 return dict_value; | 818 return dict_value; |
818 } | 819 } |
819 | 820 |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 IsGoogleSearchResultURL(referrer.url)) { | 1010 IsGoogleSearchResultURL(referrer.url)) { |
1010 origin = ORIGIN_GWS_PRERENDER; | 1011 origin = ORIGIN_GWS_PRERENDER; |
1011 } | 1012 } |
1012 | 1013 |
1013 DeleteOldEntries(); | 1014 DeleteOldEntries(); |
1014 to_delete_prerenders_.clear(); | 1015 to_delete_prerenders_.clear(); |
1015 | 1016 |
1016 GURL url = url_arg; | 1017 GURL url = url_arg; |
1017 GURL alias_url; | 1018 GURL alias_url; |
1018 uint8 experiment = GetQueryStringBasedExperiment(url_arg); | 1019 uint8 experiment = GetQueryStringBasedExperiment(url_arg); |
1019 bool control_group_behavior = | 1020 if (IsControlGroup(experiment) && |
1020 IsControlGroup() || IsControlGroupExperiment(experiment); | |
1021 if (control_group_behavior && | |
1022 MaybeGetQueryStringBasedAliasURL(url, &alias_url)) { | 1021 MaybeGetQueryStringBasedAliasURL(url, &alias_url)) { |
1023 url = alias_url; | 1022 url = alias_url; |
1024 } | 1023 } |
1025 | 1024 |
1026 // From here on, we will record a FinalStatus so we need to register with the | 1025 // From here on, we will record a FinalStatus so we need to register with the |
1027 // histogram tracking. | 1026 // histogram tracking. |
1028 histograms_->RecordPrerender(origin, url_arg); | 1027 histograms_->RecordPrerender(origin, url_arg); |
1029 | 1028 |
1030 if (PrerenderData* preexisting_prerender_data = | 1029 if (PrerenderData* preexisting_prerender_data = |
1031 FindPrerenderData(url, session_storage_namespace)) { | 1030 FindPrerenderData(url, session_storage_namespace)) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1076 PrerenderHandle* prerender_handle = | 1075 PrerenderHandle* prerender_handle = |
1077 new PrerenderHandle(active_prerenders_.back()); | 1076 new PrerenderHandle(active_prerenders_.back()); |
1078 SortActivePrerenders(); | 1077 SortActivePrerenders(); |
1079 | 1078 |
1080 last_prerender_start_time_ = GetCurrentTimeTicks(); | 1079 last_prerender_start_time_ = GetCurrentTimeTicks(); |
1081 | 1080 |
1082 gfx::Size contents_size = | 1081 gfx::Size contents_size = |
1083 size.IsEmpty() ? config_.default_tab_bounds.size() : size; | 1082 size.IsEmpty() ? config_.default_tab_bounds.size() : size; |
1084 | 1083 |
1085 prerender_contents->StartPrerendering(process_id, contents_size, | 1084 prerender_contents->StartPrerendering(process_id, contents_size, |
1086 session_storage_namespace, | 1085 session_storage_namespace); |
1087 control_group_behavior); | 1086 |
1088 DCHECK(control_group_behavior || | 1087 DCHECK(IsControlGroup(experiment) || |
1089 prerender_contents->prerendering_has_started()); | 1088 prerender_contents->prerendering_has_started()); |
1090 | 1089 |
1091 while (active_prerenders_.size() > config_.max_concurrency) { | 1090 while (active_prerenders_.size() > config_.max_concurrency) { |
1092 prerender_contents = active_prerenders_.front()->contents(); | 1091 prerender_contents = active_prerenders_.front()->contents(); |
1093 DCHECK(prerender_contents); | 1092 DCHECK(prerender_contents); |
1094 prerender_contents->Destroy(FINAL_STATUS_EVICTED); | 1093 prerender_contents->Destroy(FINAL_STATUS_EVICTED); |
1095 } | 1094 } |
1096 | 1095 |
1097 histograms_->RecordConcurrency(active_prerenders_.size(), | 1096 histograms_->RecordConcurrency(active_prerenders_.size(), |
1098 config_.max_concurrency); | 1097 config_.max_concurrency); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1177 return base::TimeTicks::Now(); | 1176 return base::TimeTicks::Now(); |
1178 } | 1177 } |
1179 | 1178 |
1180 PrerenderContents* PrerenderManager::CreatePrerenderContents( | 1179 PrerenderContents* PrerenderManager::CreatePrerenderContents( |
1181 const GURL& url, | 1180 const GURL& url, |
1182 const content::Referrer& referrer, | 1181 const content::Referrer& referrer, |
1183 Origin origin, | 1182 Origin origin, |
1184 uint8 experiment_id) { | 1183 uint8 experiment_id) { |
1185 DCHECK(CalledOnValidThread()); | 1184 DCHECK(CalledOnValidThread()); |
1186 return prerender_contents_factory_->CreatePrerenderContents( | 1185 return prerender_contents_factory_->CreatePrerenderContents( |
1187 this, prerender_tracker_, profile_, url, referrer, origin, experiment_id); | 1186 this, profile_, url, referrer, origin, experiment_id); |
1188 } | 1187 } |
1189 | 1188 |
1190 void PrerenderManager::SortActivePrerenders() { | 1189 void PrerenderManager::SortActivePrerenders() { |
1191 std::sort(active_prerenders_.begin(), active_prerenders_.end(), | 1190 std::sort(active_prerenders_.begin(), active_prerenders_.end(), |
1192 PrerenderData::OrderByExpiryTime()); | 1191 PrerenderData::OrderByExpiryTime()); |
1193 } | 1192 } |
1194 | 1193 |
1195 PrerenderManager::PrerenderData* PrerenderManager::FindPrerenderData( | 1194 PrerenderManager::PrerenderData* PrerenderManager::FindPrerenderData( |
1196 const GURL& url, | 1195 const GURL& url, |
1197 const SessionStorageNamespace* session_storage_namespace) { | 1196 const SessionStorageNamespace* session_storage_namespace) { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1358 if (!render_process_host || !render_process_host->GetBrowserContext()) | 1357 if (!render_process_host || !render_process_host->GetBrowserContext()) |
1359 return NULL; | 1358 return NULL; |
1360 Profile* profile = Profile::FromBrowserContext( | 1359 Profile* profile = Profile::FromBrowserContext( |
1361 render_process_host->GetBrowserContext()); | 1360 render_process_host->GetBrowserContext()); |
1362 if (!profile) | 1361 if (!profile) |
1363 return NULL; | 1362 return NULL; |
1364 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); | 1363 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); |
1365 } | 1364 } |
1366 | 1365 |
1367 } // namespace prerender | 1366 } // namespace prerender |
OLD | NEW |