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 |