| 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 |