Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(207)

Side by Side Diff: chrome/browser/prerender/prerender_manager.cc

Issue 6901128: Cancel prerenders that spawn post requests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698