| 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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 | 221 |
| 222 PrerenderManager::~PrerenderManager() { | 222 PrerenderManager::~PrerenderManager() { |
| 223 } | 223 } |
| 224 | 224 |
| 225 void PrerenderManager::Shutdown() { | 225 void PrerenderManager::Shutdown() { |
| 226 DoShutdown(); | 226 DoShutdown(); |
| 227 } | 227 } |
| 228 | 228 |
| 229 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( | 229 PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( |
| 230 int process_id, | 230 int process_id, |
| 231 int prerender_id, |
| 231 int route_id, | 232 int route_id, |
| 232 const GURL& url, | 233 const GURL& url, |
| 233 const content::Referrer& referrer, | 234 const content::Referrer& referrer, |
| 234 const gfx::Size& size) { | 235 const gfx::Size& size) { |
| 235 #if defined(OS_ANDROID) | 236 #if defined(OS_ANDROID) |
| 236 // TODO(jcivelli): http://crbug.com/113322 We should have an option to disable | 237 // TODO(jcivelli): http://crbug.com/113322 We should have an option to disable |
| 237 // link-prerender and enable omnibox-prerender only. | 238 // link-prerender and enable omnibox-prerender only. |
| 238 return NULL; | 239 return NULL; |
| 239 #else | 240 #else |
| 240 DCHECK(!size.IsEmpty()); | 241 DCHECK(!size.IsEmpty()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 256 session_storage_namespace = | 257 session_storage_namespace = |
| 257 source_web_contents->GetController() | 258 source_web_contents->GetController() |
| 258 .GetDefaultSessionStorageNamespace(); | 259 .GetDefaultSessionStorageNamespace(); |
| 259 } | 260 } |
| 260 | 261 |
| 261 if (PrerenderData* parent_prerender_data = | 262 if (PrerenderData* parent_prerender_data = |
| 262 FindPrerenderDataForChildAndRoute(process_id, route_id)) { | 263 FindPrerenderDataForChildAndRoute(process_id, route_id)) { |
| 263 // Instead of prerendering from inside of a running prerender, we will defer | 264 // Instead of prerendering from inside of a running prerender, we will defer |
| 264 // this request until its launcher is made visible. | 265 // this request until its launcher is made visible. |
| 265 if (PrerenderContents* contents = parent_prerender_data->contents_) { | 266 if (PrerenderContents* contents = parent_prerender_data->contents_) { |
| 266 pending_prerender_list_.push_back( | 267 pending_prerender_list_.push_back(linked_ptr<PrerenderData>( |
| 267 linked_ptr<PrerenderData>(new PrerenderData(this))); | 268 new PrerenderData(this))); |
| 268 PrerenderHandle* prerender_handle = | 269 PrerenderHandle* prerender_handle = |
| 269 new PrerenderHandle(pending_prerender_list_.back().get()); | 270 new PrerenderHandle(pending_prerender_list_.back().get()); |
| 270 contents->AddPendingPrerender( | 271 contents->AddPendingPrerender( |
| 271 prerender_handle->weak_ptr_factory_.GetWeakPtr(), origin, | 272 prerender_handle->weak_ptr_factory_.GetWeakPtr(), origin, |
| 272 url, referrer, size); | 273 url, referrer, size); |
| 273 return prerender_handle; | 274 return prerender_handle; |
| 274 } | 275 } |
| 275 } | 276 } |
| 276 | 277 |
| 277 return AddPrerender(origin, process_id, url, referrer, size, | 278 return AddPrerender(origin, process_id, prerender_id, url, referrer, size, |
| 278 session_storage_namespace); | 279 session_storage_namespace); |
| 279 #endif | 280 #endif |
| 280 } | 281 } |
| 281 | 282 |
| 282 PrerenderHandle* PrerenderManager::AddPrerenderFromOmnibox( | 283 PrerenderHandle* PrerenderManager::AddPrerenderFromOmnibox( |
| 283 const GURL& url, | 284 const GURL& url, |
| 284 SessionStorageNamespace* session_storage_namespace, | 285 SessionStorageNamespace* session_storage_namespace, |
| 285 const gfx::Size& size) { | 286 const gfx::Size& size) { |
| 286 if (!IsOmniboxEnabled(profile_)) | 287 if (!IsOmniboxEnabled(profile_)) |
| 287 return NULL; | 288 return NULL; |
| 288 return AddPrerender(ORIGIN_OMNIBOX, -1, url, content::Referrer(), size, | 289 return AddPrerender(ORIGIN_OMNIBOX, -1, -1, url, content::Referrer(), size, |
| 289 session_storage_namespace); | 290 session_storage_namespace); |
| 290 } | 291 } |
| 291 | 292 |
| 292 void PrerenderManager::DestroyPrerenderForRenderView( | 293 void PrerenderManager::DestroyPrerenderForRenderView( |
| 293 int process_id, int view_id, FinalStatus final_status) { | 294 int process_id, int view_id, FinalStatus final_status) { |
| 294 DCHECK(CalledOnValidThread()); | 295 DCHECK(CalledOnValidThread()); |
| 295 if (PrerenderData* prerender_data = | 296 if (PrerenderData* prerender_data = |
| 296 FindPrerenderDataForChildAndRoute(process_id, view_id)) { | 297 FindPrerenderDataForChildAndRoute(process_id, view_id)) { |
| 297 prerender_data->contents_->Destroy(final_status); | 298 prerender_data->contents_->Destroy(final_status); |
| 298 } | 299 } |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 906 DCHECK(existing_prerender_handle->IsValid()); | 907 DCHECK(existing_prerender_handle->IsValid()); |
| 907 DCHECK(existing_prerender_handle->IsPending()); | 908 DCHECK(existing_prerender_handle->IsPending()); |
| 908 | 909 |
| 909 DVLOG(6) << "StartPendingPrerender"; | 910 DVLOG(6) << "StartPendingPrerender"; |
| 910 DVLOG(6) << "existing_prerender_handle->handle_count_ = " << | 911 DVLOG(6) << "existing_prerender_handle->handle_count_ = " << |
| 911 existing_prerender_handle->prerender_data_->handle_count_; | 912 existing_prerender_handle->prerender_data_->handle_count_; |
| 912 | 913 |
| 913 DCHECK(process_id == -1 || session_storage_namespace); | 914 DCHECK(process_id == -1 || session_storage_namespace); |
| 914 | 915 |
| 915 scoped_ptr<PrerenderHandle> swap_prerender_handle(AddPrerender( | 916 scoped_ptr<PrerenderHandle> swap_prerender_handle(AddPrerender( |
| 916 origin, process_id, url, referrer, size, session_storage_namespace)); | 917 origin, process_id, -1, url, referrer, size, session_storage_namespace)); |
| 917 if (swap_prerender_handle.get()) { | 918 if (swap_prerender_handle.get()) { |
| 918 // AddPrerender has returned a new prerender handle to us. We want to make | 919 // AddPrerender has returned a new prerender handle to us. We want to make |
| 919 // |existing_prerender_handle| active, so swap the underlying PrerenderData | 920 // |existing_prerender_handle| active, so swap the underlying PrerenderData |
| 920 // between the two handles, and delete our old handle (which will release | 921 // between the two handles, and delete our old handle (which will release |
| 921 // our entry in the pending_prerender_list_). | 922 // our entry in the pending_prerender_list_). |
| 922 existing_prerender_handle->SwapPrerenderDataWith( | 923 existing_prerender_handle->SwapPrerenderDataWith( |
| 923 swap_prerender_handle.get()); | 924 swap_prerender_handle.get()); |
| 924 swap_prerender_handle->OnCancel(); | 925 swap_prerender_handle->OnCancel(); |
| 925 return; | 926 return; |
| 926 } | 927 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 on_close_tab_contents_deleters_.clear(); | 980 on_close_tab_contents_deleters_.clear(); |
| 980 profile_ = NULL; | 981 profile_ = NULL; |
| 981 | 982 |
| 982 DCHECK(active_prerender_list_.empty()); | 983 DCHECK(active_prerender_list_.empty()); |
| 983 } | 984 } |
| 984 | 985 |
| 985 // private | 986 // private |
| 986 PrerenderHandle* PrerenderManager::AddPrerender( | 987 PrerenderHandle* PrerenderManager::AddPrerender( |
| 987 Origin origin, | 988 Origin origin, |
| 988 int process_id, | 989 int process_id, |
| 990 int prerender_id, |
| 989 const GURL& url_arg, | 991 const GURL& url_arg, |
| 990 const content::Referrer& referrer, | 992 const content::Referrer& referrer, |
| 991 const gfx::Size& size, | 993 const gfx::Size& size, |
| 992 SessionStorageNamespace* session_storage_namespace) { | 994 SessionStorageNamespace* session_storage_namespace) { |
| 993 DCHECK(CalledOnValidThread()); | 995 DCHECK(CalledOnValidThread()); |
| 994 | 996 |
| 995 if (!IsEnabled()) | 997 if (!IsEnabled()) |
| 996 return NULL; | 998 return NULL; |
| 997 | 999 |
| 998 if ((origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN || | 1000 if ((origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN || |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 this, prerender_contents, GetExpiryTimeForNewPrerender()))); | 1066 this, prerender_contents, GetExpiryTimeForNewPrerender()))); |
| 1065 | 1067 |
| 1066 PrerenderHandle* prerender_handle = | 1068 PrerenderHandle* prerender_handle = |
| 1067 new PrerenderHandle(active_prerender_list_.back().get()); | 1069 new PrerenderHandle(active_prerender_list_.back().get()); |
| 1068 | 1070 |
| 1069 last_prerender_start_time_ = GetCurrentTimeTicks(); | 1071 last_prerender_start_time_ = GetCurrentTimeTicks(); |
| 1070 | 1072 |
| 1071 gfx::Size contents_size = | 1073 gfx::Size contents_size = |
| 1072 size.IsEmpty() ? config_.default_tab_bounds.size() : size; | 1074 size.IsEmpty() ? config_.default_tab_bounds.size() : size; |
| 1073 | 1075 |
| 1074 prerender_contents->StartPrerendering(process_id, contents_size, | 1076 prerender_contents->StartPrerendering(process_id, prerender_id, contents_size, |
| 1075 session_storage_namespace, | 1077 session_storage_namespace, |
| 1076 control_group_behavior); | 1078 control_group_behavior); |
| 1077 | 1079 |
| 1078 while (active_prerender_list_.size() > config_.max_concurrency) { | 1080 while (active_prerender_list_.size() > config_.max_concurrency) { |
| 1079 prerender_contents = active_prerender_list_.front()->contents_; | 1081 prerender_contents = active_prerender_list_.front()->contents_; |
| 1080 DCHECK(prerender_contents); | 1082 DCHECK(prerender_contents); |
| 1081 prerender_contents->Destroy(FINAL_STATUS_EVICTED); | 1083 prerender_contents->Destroy(FINAL_STATUS_EVICTED); |
| 1082 } | 1084 } |
| 1083 | 1085 |
| 1084 histograms_->RecordConcurrency(active_prerender_list_.size(), | 1086 histograms_->RecordConcurrency(active_prerender_list_.size(), |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1372 if (!render_process_host || !render_process_host->GetBrowserContext()) | 1374 if (!render_process_host || !render_process_host->GetBrowserContext()) |
| 1373 return NULL; | 1375 return NULL; |
| 1374 Profile* profile = Profile::FromBrowserContext( | 1376 Profile* profile = Profile::FromBrowserContext( |
| 1375 render_process_host->GetBrowserContext()); | 1377 render_process_host->GetBrowserContext()); |
| 1376 if (!profile) | 1378 if (!profile) |
| 1377 return NULL; | 1379 return NULL; |
| 1378 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); | 1380 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); |
| 1379 } | 1381 } |
| 1380 | 1382 |
| 1381 } // namespace prerender | 1383 } // namespace prerender |
| OLD | NEW |