| OLD | NEW | 
|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/logging.h" | 7 #include "base/logging.h" | 
| 8 #include "base/metrics/field_trial.h" | 8 #include "base/metrics/field_trial.h" | 
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" | 
| 10 #include "base/time.h" | 10 #include "base/time.h" | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 140   prerender_manager->RecordPrefetchTagObserved(); | 140   prerender_manager->RecordPrefetchTagObserved(); | 
| 141   // TODO(cbentzel): Should the decision to make pending be done on the | 141   // TODO(cbentzel): Should the decision to make pending be done on the | 
| 142   //                 UI thread rather than the IO thread? The page may have | 142   //                 UI thread rather than the IO thread? The page may have | 
| 143   //                 become activated at this point. | 143   //                 become activated at this point. | 
| 144   if (make_pending) | 144   if (make_pending) | 
| 145     prerender_manager->AddPendingPreload(child_route_id_pair, url, referrer); | 145     prerender_manager->AddPendingPreload(child_route_id_pair, url, referrer); | 
| 146   else | 146   else | 
| 147     prerender_manager->AddPreload(child_route_id_pair, url, referrer); | 147     prerender_manager->AddPreload(child_route_id_pair, url, referrer); | 
| 148 } | 148 } | 
| 149 | 149 | 
|  | 150 void DestroyPreloadForChildRouteIdPairOnUIThread( | 
|  | 151     const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, | 
|  | 152     const std::pair<int, int>& child_route_id_pair, | 
|  | 153     FinalStatus final_status) { | 
|  | 154   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
|  | 155   PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); | 
|  | 156   if (!prerender_manager || !prerender_manager->is_enabled()) | 
|  | 157     return; | 
|  | 158   prerender_manager->DestroyPreloadForChildRouteIdPair(child_route_id_pair, | 
|  | 159                                                        final_status); | 
|  | 160 } | 
|  | 161 | 
| 150 PrerenderManager::PrerenderManager(Profile* profile) | 162 PrerenderManager::PrerenderManager(Profile* profile) | 
| 151     : rate_limit_enabled_(true), | 163     : rate_limit_enabled_(true), | 
| 152       enabled_(true), | 164       enabled_(true), | 
| 153       profile_(profile), | 165       profile_(profile), | 
| 154       max_prerender_age_(base::TimeDelta::FromSeconds( | 166       max_prerender_age_(base::TimeDelta::FromSeconds( | 
| 155           kDefaultMaxPrerenderAgeSeconds)), | 167           kDefaultMaxPrerenderAgeSeconds)), | 
| 156       max_prerender_memory_mb_(kDefaultMaxPrerenderMemoryMB), | 168       max_prerender_memory_mb_(kDefaultMaxPrerenderMemoryMB), | 
| 157       max_elements_(kDefaultMaxPrerenderElements), | 169       max_elements_(kDefaultMaxPrerenderElements), | 
| 158       prerender_contents_factory_(PrerenderContents::CreateFactory()), | 170       prerender_contents_factory_(PrerenderContents::CreateFactory()), | 
| 159       last_prerender_start_time_(GetCurrentTimeTicks() - | 171       last_prerender_start_time_(GetCurrentTimeTicks() - | 
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 299       pending_prerender_list_.find(child_route_id_pair); | 311       pending_prerender_list_.find(child_route_id_pair); | 
| 300   if (it == pending_prerender_list_.end()) { | 312   if (it == pending_prerender_list_.end()) { | 
| 301     PendingPrerenderList::value_type el = std::make_pair(child_route_id_pair, | 313     PendingPrerenderList::value_type el = std::make_pair(child_route_id_pair, | 
| 302                                             std::vector<PendingContentsData>()); | 314                                             std::vector<PendingContentsData>()); | 
| 303     it = pending_prerender_list_.insert(el).first; | 315     it = pending_prerender_list_.insert(el).first; | 
| 304   } | 316   } | 
| 305 | 317 | 
| 306   it->second.push_back(PendingContentsData(url, referrer)); | 318   it->second.push_back(PendingContentsData(url, referrer)); | 
| 307 } | 319 } | 
| 308 | 320 | 
|  | 321 void PrerenderManager::DestroyPreloadForChildRouteIdPair( | 
|  | 322     const std::pair<int, int>& child_route_id_pair, | 
|  | 323     FinalStatus final_status) { | 
|  | 324   DCHECK(CalledOnValidThread()); | 
|  | 325   for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); | 
|  | 326        it != prerender_list_.end();) { | 
|  | 327     PrerenderContents* prerender_contents = it->contents_; | 
|  | 328 | 
|  | 329     int child_id; | 
|  | 330     int route_id; | 
|  | 331     bool has_child_id = prerender_contents->GetChildId(&child_id); | 
|  | 332     bool has_route_id = has_child_id && | 
|  | 333                         prerender_contents->GetRouteId(&route_id); | 
|  | 334 | 
|  | 335     if (has_child_id && has_route_id && | 
|  | 336         child_id == child_route_id_pair.first && | 
|  | 337         route_id == child_route_id_pair.second) { | 
|  | 338       prerender_contents->set_final_status(final_status); | 
|  | 339       RemovePendingPreload(prerender_contents); | 
|  | 340       delete prerender_contents; | 
|  | 341       it = prerender_list_.erase(it); | 
|  | 342     } else { | 
|  | 343       ++it; | 
|  | 344     } | 
|  | 345   } | 
|  | 346 } | 
|  | 347 | 
| 309 void PrerenderManager::DeleteOldEntries() { | 348 void PrerenderManager::DeleteOldEntries() { | 
| 310   DCHECK(CalledOnValidThread()); | 349   DCHECK(CalledOnValidThread()); | 
| 311   while (!prerender_list_.empty()) { | 350   while (!prerender_list_.empty()) { | 
| 312     PrerenderContentsData data = prerender_list_.front(); | 351     PrerenderContentsData data = prerender_list_.front(); | 
| 313     if (IsPrerenderElementFresh(data.start_time_)) | 352     if (IsPrerenderElementFresh(data.start_time_)) | 
| 314       return; | 353       return; | 
| 315     prerender_list_.pop_front(); | 354     prerender_list_.pop_front(); | 
| 316     data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT); | 355     data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT); | 
| 317     delete data.contents_; | 356     delete data.contents_; | 
| 318   } | 357   } | 
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 678   return prerendered_tab_contents_set_.count(tab_contents) > 0; | 717   return prerendered_tab_contents_set_.count(tab_contents) > 0; | 
| 679 } | 718 } | 
| 680 | 719 | 
| 681 bool PrerenderManager::WouldTabContentsBePrerendered( | 720 bool PrerenderManager::WouldTabContentsBePrerendered( | 
| 682     TabContents* tab_contents) const { | 721     TabContents* tab_contents) const { | 
| 683   DCHECK(CalledOnValidThread()); | 722   DCHECK(CalledOnValidThread()); | 
| 684   return would_be_prerendered_tab_contents_set_.count(tab_contents) > 0; | 723   return would_be_prerendered_tab_contents_set_.count(tab_contents) > 0; | 
| 685 } | 724 } | 
| 686 | 725 | 
| 687 }  // namespace prerender | 726 }  // namespace prerender | 
| OLD | NEW | 
|---|