Chromium Code Reviews| 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()) | |
|
cbentzel
2011/04/29 20:00:30
In this case, you should call even if the prerende
dominich
2011/04/29 21:13:52
Done.
| |
| 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(); | |
|
cbentzel
2011/04/29 20:00:30
There should only be on PrerenderContents per chil
dominich
2011/04/29 21:13:52
Done.
| |
| 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 |