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