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

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

Issue 7210020: Added prerendering to omnibox. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: More histograms/rebase Created 9 years, 6 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 <string> 7 #include <string>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 const GURL& referrer) { 220 const GURL& referrer) {
221 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 221 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
222 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); 222 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
223 if (!prerender_manager || !prerender_manager->is_enabled()) 223 if (!prerender_manager || !prerender_manager->is_enabled())
224 return; 224 return;
225 prerender_manager->RecordTagObserved(); 225 prerender_manager->RecordTagObserved();
226 226
227 std::pair<int, int> child_route_id_pair = std::make_pair(render_process_id, 227 std::pair<int, int> child_route_id_pair = std::make_pair(render_process_id,
228 render_view_id); 228 render_view_id);
229 229
230 prerender_manager->AddPreload(child_route_id_pair, url, referrer); 230 prerender_manager->AddPrerender(ORIGIN_LINK_REL_PRERENDER,
231 child_route_id_pair, url, referrer);
231 } 232 }
232 233
233 void DestroyPreloadForRenderView( 234 void DestroyPrerenderForRenderView(
234 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, 235 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
235 int render_process_id, 236 int render_process_id,
236 int render_view_id, 237 int render_view_id,
237 FinalStatus final_status) { 238 FinalStatus final_status) {
238 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 239 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
239 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); 240 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
240 if (!prerender_manager) 241 if (!prerender_manager)
241 return; 242 return;
242 243
243 prerender_manager->DestroyPreloadForChildRouteIdPair( 244 prerender_manager->DestroyPrerenderForChildRouteIdPair(
244 std::make_pair(render_process_id, render_view_id), 245 std::make_pair(render_process_id, render_view_id),
245 final_status); 246 final_status);
246 } 247 }
247 248
248 PrerenderManager::PrerenderManager(Profile* profile, 249 PrerenderManager::PrerenderManager(Profile* profile,
249 PrerenderTracker* prerender_tracker) 250 PrerenderTracker* prerender_tracker)
250 : rate_limit_enabled_(true), 251 : rate_limit_enabled_(true),
251 enabled_(true), 252 enabled_(true),
252 profile_(profile), 253 profile_(profile),
253 prerender_tracker_(prerender_tracker), 254 prerender_tracker_(prerender_tracker),
(...skipping 15 matching lines...) Expand all
269 PrerenderManager::~PrerenderManager() { 270 PrerenderManager::~PrerenderManager() {
270 DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN); 271 DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN);
271 } 272 }
272 273
273 void PrerenderManager::SetPrerenderContentsFactory( 274 void PrerenderManager::SetPrerenderContentsFactory(
274 PrerenderContents::Factory* prerender_contents_factory) { 275 PrerenderContents::Factory* prerender_contents_factory) {
275 DCHECK(CalledOnValidThread()); 276 DCHECK(CalledOnValidThread());
276 prerender_contents_factory_.reset(prerender_contents_factory); 277 prerender_contents_factory_.reset(prerender_contents_factory);
277 } 278 }
278 279
279 bool PrerenderManager::AddPreload( 280 bool PrerenderManager::AddPrerender(
281 Origin origin,
280 const std::pair<int, int>& child_route_id_pair, 282 const std::pair<int, int>& child_route_id_pair,
281 const GURL& url_arg, 283 const GURL& url_arg,
282 const GURL& referrer) { 284 const GURL& referrer) {
283 DCHECK(CalledOnValidThread()); 285 DCHECK(CalledOnValidThread());
284 286
285 // If the referring page is prerendering, defer the prerender. 287 // If the referring page is prerendering, defer the prerender.
286 if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) != 288 if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
287 prerender_list_.end()) { 289 prerender_list_.end()) {
288 AddPendingPreload(child_route_id_pair, url_arg, referrer); 290 AddPendingPrerender(child_route_id_pair, url_arg, referrer);
289 return true; 291 return true;
290 } 292 }
291 293
292 DeleteOldEntries(); 294 DeleteOldEntries();
293 DeletePendingDeleteEntries(); 295 DeletePendingDeleteEntries();
294 296
295 GURL url = url_arg; 297 GURL url = url_arg;
296 GURL alias_url; 298 GURL alias_url;
297 if (IsControlGroup() && 299 if (IsControlGroup() &&
298 PrerenderManager::MaybeGetQueryStringBasedAliasURL( 300 PrerenderManager::MaybeGetQueryStringBasedAliasURL(
299 url, &alias_url)) { 301 url, &alias_url)) {
300 url = alias_url; 302 url = alias_url;
301 } 303 }
302 304
303 if (FindEntry(url)) 305 if (FindEntry(url))
304 return false; 306 return false;
305 307
306 // Do not prerender if there are too many render processes, and we would 308 // Do not prerender if there are too many render processes, and we would
307 // have to use an existing one. We do not want prerendering to happen in 309 // have to use an existing one. We do not want prerendering to happen in
308 // a shared process, so that we can always reliably lower the CPU 310 // a shared process, so that we can always reliably lower the CPU
309 // priority for prerendering. 311 // priority for prerendering.
310 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns 312 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns
311 // true, so that case needs to be explicitly checked for. 313 // true, so that case needs to be explicitly checked for.
312 // TODO(tburkard): Figure out how to cancel prerendering in the opposite 314 // TODO(tburkard): Figure out how to cancel prerendering in the opposite
313 // case, when a new tab is added to a process used for prerendering. 315 // case, when a new tab is added to a process used for prerendering.
314 if (RenderProcessHost::ShouldTryToUseExistingProcessHost() && 316 if (RenderProcessHost::ShouldTryToUseExistingProcessHost() &&
315 !RenderProcessHost::run_renderer_in_process()) { 317 !RenderProcessHost::run_renderer_in_process()) {
316 RecordFinalStatus(FINAL_STATUS_TOO_MANY_PROCESSES); 318 RecordFinalStatus(origin, FINAL_STATUS_TOO_MANY_PROCESSES);
317 return false; 319 return false;
318 } 320 }
319 321
320 // Check if enough time has passed since the last prerender. 322 // Check if enough time has passed since the last prerender.
321 if (!DoesRateLimitAllowPrerender()) { 323 if (!DoesRateLimitAllowPrerender()) {
322 // Cancel the prerender. We could add it to the pending prerender list but 324 // Cancel the prerender. We could add it to the pending prerender list but
323 // this doesn't make sense as the next prerender request will be triggered 325 // this doesn't make sense as the next prerender request will be triggered
324 // by a navigation and is unlikely to be the same site. 326 // by a navigation and is unlikely to be the same site.
325 RecordFinalStatus(FINAL_STATUS_RATE_LIMIT_EXCEEDED); 327 RecordFinalStatus(origin, FINAL_STATUS_RATE_LIMIT_EXCEEDED);
326 return false; 328 return false;
327 } 329 }
328 330
329 RenderViewHost* source_render_view_host = NULL; 331 RenderViewHost* source_render_view_host = NULL;
330 // This test should fail only during unit tests. 332 // This test should fail only during unit tests.
331 if (child_route_id_pair.first != -1) { 333 if (child_route_id_pair.first != -1) {
332 source_render_view_host = 334 source_render_view_host =
333 RenderViewHost::FromID(child_route_id_pair.first, 335 RenderViewHost::FromID(child_route_id_pair.first,
334 child_route_id_pair.second); 336 child_route_id_pair.second);
335 // Don't prerender page if parent RenderViewHost no longer exists, or it has 337 // Don't prerender page if parent RenderViewHost no longer exists, or it has
336 // no view. The latter should only happen when the RenderView has closed. 338 // no view. The latter should only happen when the RenderView has closed.
337 if (!source_render_view_host || !source_render_view_host->view()) { 339 if (!source_render_view_host || !source_render_view_host->view()) {
338 RecordFinalStatus(FINAL_STATUS_SOURCE_RENDER_VIEW_CLOSED); 340 RecordFinalStatus(origin, FINAL_STATUS_SOURCE_RENDER_VIEW_CLOSED);
339 return false; 341 return false;
340 } 342 }
341 } 343 }
342 344
343 PrerenderContents* prerender_contents = 345 PrerenderContents* prerender_contents =
344 CreatePrerenderContents(url, referrer); 346 CreatePrerenderContents(url, referrer, origin);
345 if (!prerender_contents || !prerender_contents->Init()) 347 if (!prerender_contents || !prerender_contents->Init())
346 return false; 348 return false;
347 349
348 // TODO(cbentzel): Move invalid checks here instead of PrerenderContents? 350 // TODO(cbentzel): Move invalid checks here instead of PrerenderContents?
349 PrerenderContentsData data(prerender_contents, GetCurrentTime()); 351 PrerenderContentsData data(prerender_contents, GetCurrentTime());
350 352
351 prerender_list_.push_back(data); 353 prerender_list_.push_back(data);
354
355 RecordOrigin(origin);
356
352 if (IsControlGroup()) { 357 if (IsControlGroup()) {
353 data.contents_->set_final_status(FINAL_STATUS_CONTROL_GROUP); 358 data.contents_->set_final_status(FINAL_STATUS_CONTROL_GROUP);
354 } else { 359 } else {
355 last_prerender_start_time_ = GetCurrentTimeTicks(); 360 last_prerender_start_time_ = GetCurrentTimeTicks();
356 data.contents_->StartPrerendering(source_render_view_host); 361 data.contents_->StartPrerendering(source_render_view_host);
357 } 362 }
358 while (prerender_list_.size() > max_elements_) { 363 while (prerender_list_.size() > max_elements_) {
359 data = prerender_list_.front(); 364 data = prerender_list_.front();
360 prerender_list_.pop_front(); 365 prerender_list_.pop_front();
361 data.contents_->Destroy(FINAL_STATUS_EVICTED); 366 data.contents_->Destroy(FINAL_STATUS_EVICTED);
362 } 367 }
363 StartSchedulingPeriodicCleanups(); 368 StartSchedulingPeriodicCleanups();
364 return true; 369 return true;
365 } 370 }
366 371
367 void PrerenderManager::AddPendingPreload( 372 bool PrerenderManager::AddPrerenderWithNoTag(Origin origin, const GURL& url) {
cbentzel 2011/06/22 17:27:32 I don't really like the NoTag name, but can't thin
dominich 2011/06/22 19:00:51 That to me suggests that it's a prerender of the t
cbentzel 2011/06/22 19:08:40 That sounds good.
373 return AddPrerender(origin, std::make_pair(-1, -1), url, GURL());
374 }
375
376 void PrerenderManager::AddPendingPrerender(
368 const std::pair<int, int>& child_route_id_pair, 377 const std::pair<int, int>& child_route_id_pair,
369 const GURL& url, 378 const GURL& url,
370 const GURL& referrer) { 379 const GURL& referrer) {
371 DCHECK(FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) != 380 DCHECK(FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
372 prerender_list_.end()); 381 prerender_list_.end());
373 PendingPrerenderList::iterator it = 382 PendingPrerenderList::iterator it =
374 pending_prerender_list_.find(child_route_id_pair); 383 pending_prerender_list_.find(child_route_id_pair);
375 if (it == pending_prerender_list_.end()) { 384 if (it == pending_prerender_list_.end()) {
376 PendingPrerenderList::value_type el = std::make_pair(child_route_id_pair, 385 PendingPrerenderList::value_type el = std::make_pair(child_route_id_pair,
377 std::vector<PendingContentsData>()); 386 std::vector<PendingContentsData>());
(...skipping 18 matching lines...) Expand all
396 405
397 if (has_child_id && has_route_id && 406 if (has_child_id && has_route_id &&
398 child_id == child_route_id_pair.first && 407 child_id == child_route_id_pair.first &&
399 route_id == child_route_id_pair.second) { 408 route_id == child_route_id_pair.second) {
400 break; 409 break;
401 } 410 }
402 } 411 }
403 return it; 412 return it;
404 } 413 }
405 414
406 void PrerenderManager::DestroyPreloadForChildRouteIdPair( 415 void PrerenderManager::DestroyPrerenderForChildRouteIdPair(
407 const std::pair<int, int>& child_route_id_pair, 416 const std::pair<int, int>& child_route_id_pair,
408 FinalStatus final_status) { 417 FinalStatus final_status) {
409 DCHECK(CalledOnValidThread()); 418 DCHECK(CalledOnValidThread());
410 std::list<PrerenderContentsData>::iterator it = 419 std::list<PrerenderContentsData>::iterator it =
411 FindPrerenderContentsForChildRouteIdPair(child_route_id_pair); 420 FindPrerenderContentsForChildRouteIdPair(child_route_id_pair);
412 if (it != prerender_list_.end()) { 421 if (it != prerender_list_.end()) {
413 PrerenderContents* prerender_contents = it->contents_; 422 PrerenderContents* prerender_contents = it->contents_;
414 prerender_contents->Destroy(final_status); 423 prerender_contents->Destroy(final_status);
415 } 424 }
416 } 425 }
(...skipping 29 matching lines...) Expand all
446 } 455 }
447 } 456 }
448 // Entry not found. 457 // Entry not found.
449 return NULL; 458 return NULL;
450 } 459 }
451 460
452 PrerenderContents* PrerenderManager::GetEntry(const GURL& url) { 461 PrerenderContents* PrerenderManager::GetEntry(const GURL& url) {
453 return GetEntryButNotSpecifiedTC(url, NULL); 462 return GetEntryButNotSpecifiedTC(url, NULL);
454 } 463 }
455 464
456 bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents, 465 bool PrerenderManager::MaybeUsePrerenderedPage(TabContents* tab_contents,
457 const GURL& url, 466 const GURL& url,
458 bool has_opener_set) { 467 bool has_opener_set) {
459 DCHECK(CalledOnValidThread()); 468 DCHECK(CalledOnValidThread());
460 scoped_ptr<PrerenderContents> prerender_contents( 469 scoped_ptr<PrerenderContents> prerender_contents(
461 GetEntryButNotSpecifiedTC(url, tab_contents)); 470 GetEntryButNotSpecifiedTC(url, tab_contents));
462 if (prerender_contents.get() == NULL) 471 if (prerender_contents.get() == NULL)
463 return false; 472 return false;
464 473
465 // Do not use the prerendered version if the opener window.property was 474 // Do not use the prerendered version if the opener window.property was
466 // supposed to be set. 475 // supposed to be set.
467 if (has_opener_set) { 476 if (has_opener_set) {
468 prerender_contents.release()->Destroy(FINAL_STATUS_WINDOW_OPENER); 477 prerender_contents.release()->Destroy(FINAL_STATUS_WINDOW_OPENER);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 562
554 // See if we have any pending prerender requests for this routing id and start 563 // See if we have any pending prerender requests for this routing id and start
555 // the preload if we do. 564 // the preload if we do.
556 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id); 565 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id);
557 PendingPrerenderList::iterator pending_it = 566 PendingPrerenderList::iterator pending_it =
558 pending_prerender_list_.find(child_route_pair); 567 pending_prerender_list_.find(child_route_pair);
559 if (pending_it != pending_prerender_list_.end()) { 568 if (pending_it != pending_prerender_list_.end()) {
560 for (std::vector<PendingContentsData>::iterator content_it = 569 for (std::vector<PendingContentsData>::iterator content_it =
561 pending_it->second.begin(); 570 pending_it->second.begin();
562 content_it != pending_it->second.end(); ++content_it) { 571 content_it != pending_it->second.end(); ++content_it) {
563 AddPreload(pending_it->first, content_it->url_, content_it->referrer_); 572 AddPrerender(ORIGIN_PENDING_LINK_REL_PRERENDER,
cbentzel 2011/06/22 17:27:32 Should the pending ones maintain a cached origin,
dominich 2011/06/22 19:00:51 Done.
573 pending_it->first, content_it->url_, content_it->referrer_);
564 } 574 }
565 pending_prerender_list_.erase(pending_it); 575 pending_prerender_list_.erase(pending_it);
566 } 576 }
567 577
568 if (old_tab_contents->tab_contents()->NeedToFireBeforeUnload()) { 578 if (old_tab_contents->tab_contents()->NeedToFireBeforeUnload()) {
569 // Schedule the delete to occur after the tab has run its unload handlers. 579 // Schedule the delete to occur after the tab has run its unload handlers.
570 on_close_tab_contents_deleters_.push_back( 580 on_close_tab_contents_deleters_.push_back(
571 new OnCloseTabContentsDeleter(this, old_tab_contents)); 581 new OnCloseTabContentsDeleter(this, old_tab_contents));
572 old_tab_contents->render_view_host()->FirePageBeforeUnload(false); 582 old_tab_contents->render_view_host()->FirePageBeforeUnload(false);
573 } else { 583 } else {
574 // No unload handler to run, so delete asap. 584 // No unload handler to run, so delete asap.
575 ScheduleDeleteOldTabContents(old_tab_contents, NULL); 585 ScheduleDeleteOldTabContents(old_tab_contents, NULL);
576 } 586 }
577 587
578 // TODO(cbentzel): Should prerender_contents move to the pending delete 588 // TODO(cbentzel): Should prerender_contents move to the pending delete
579 // list, instead of deleting directly here? 589 // list, instead of deleting directly here?
580 AddToHistory(prerender_contents.get()); 590 AddToHistory(prerender_contents.get());
581 return true; 591 return true;
582 } 592 }
583 593
584 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) { 594 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) {
585 DCHECK(CalledOnValidThread()); 595 DCHECK(CalledOnValidThread());
586 DCHECK(!IsPendingDelete(entry)); 596 DCHECK(!IsPendingDelete(entry));
587 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); 597 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
588 it != prerender_list_.end(); 598 it != prerender_list_.end();
589 ++it) { 599 ++it) {
590 if (it->contents_ == entry) { 600 if (it->contents_ == entry) {
591 RemovePendingPreload(entry); 601 RemovePendingPrerender(entry);
592 prerender_list_.erase(it); 602 prerender_list_.erase(it);
593 break; 603 break;
594 } 604 }
595 } 605 }
596 pending_delete_list_.push_back(entry); 606 pending_delete_list_.push_back(entry);
597 607
598 // Destroy the old TabContents relatively promptly to reduce resource usage, 608 // Destroy the old TabContents relatively promptly to reduce resource usage,
599 // and in the case of HTML5 media, reduce the change of playing any sound. 609 // and in the case of HTML5 media, reduce the change of playing any sound.
600 PostCleanupTask(); 610 PostCleanupTask();
601 } 611 }
(...skipping 20 matching lines...) Expand all
622 } 632 }
623 633
624 bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const { 634 bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const {
625 DCHECK(CalledOnValidThread()); 635 DCHECK(CalledOnValidThread());
626 base::Time now = GetCurrentTime(); 636 base::Time now = GetCurrentTime();
627 return (now - start < max_prerender_age_); 637 return (now - start < max_prerender_age_);
628 } 638 }
629 639
630 PrerenderContents* PrerenderManager::CreatePrerenderContents( 640 PrerenderContents* PrerenderManager::CreatePrerenderContents(
631 const GURL& url, 641 const GURL& url,
632 const GURL& referrer) { 642 const GURL& referrer,
643 Origin origin) {
633 DCHECK(CalledOnValidThread()); 644 DCHECK(CalledOnValidThread());
634 return prerender_contents_factory_->CreatePrerenderContents( 645 return prerender_contents_factory_->CreatePrerenderContents(
635 this, prerender_tracker_, profile_, url, referrer); 646 this, prerender_tracker_, profile_, url, referrer, origin);
636 } 647 }
637 648
638 void PrerenderManager::DeletePendingDeleteEntries() { 649 void PrerenderManager::DeletePendingDeleteEntries() {
639 while (!pending_delete_list_.empty()) { 650 while (!pending_delete_list_.empty()) {
640 PrerenderContents* contents = pending_delete_list_.front(); 651 PrerenderContents* contents = pending_delete_list_.front();
641 pending_delete_list_.pop_front(); 652 pending_delete_list_.pop_front();
642 AddToHistory(contents); 653 AddToHistory(contents);
643 delete contents; 654 delete contents;
644 } 655 }
645 } 656 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 776
766 void PrerenderManager::RecordTagObserved() { 777 void PrerenderManager::RecordTagObserved() {
767 DCHECK(CalledOnValidThread()); 778 DCHECK(CalledOnValidThread());
768 779
769 // If we observe multiple tags within the 30 second window, we will still 780 // If we observe multiple tags within the 30 second window, we will still
770 // reset the window to begin at the most recent occurrence, so that we will 781 // reset the window to begin at the most recent occurrence, so that we will
771 // always be in a window in the 30 seconds from each occurrence. 782 // always be in a window in the 30 seconds from each occurrence.
772 last_prerender_seen_time_ = base::TimeTicks::Now(); 783 last_prerender_seen_time_ = base::TimeTicks::Now();
773 } 784 }
774 785
775 void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) { 786 void PrerenderManager::RemovePendingPrerender(PrerenderContents* entry) {
776 DCHECK(CalledOnValidThread()); 787 DCHECK(CalledOnValidThread());
777 int child_id; 788 int child_id;
778 int route_id; 789 int route_id;
779 bool has_child_id = entry->GetChildId(&child_id); 790 bool has_child_id = entry->GetChildId(&child_id);
780 bool has_route_id = has_child_id && entry->GetRouteId(&route_id); 791 bool has_route_id = has_child_id && entry->GetRouteId(&route_id);
781 792
782 // If the entry doesn't have a RenderViewHost then it didn't start 793 // If the entry doesn't have a RenderViewHost then it didn't start
783 // prerendering and there shouldn't be any pending preloads to remove. 794 // prerendering and there shouldn't be any pending preloads to remove.
784 if (has_child_id && has_route_id) { 795 if (has_child_id && has_route_id) {
785 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id); 796 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id);
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 DeleteOldTabContents(); 1043 DeleteOldTabContents();
1033 while (!prerender_list_.empty()) { 1044 while (!prerender_list_.empty()) {
1034 PrerenderContentsData data = prerender_list_.front(); 1045 PrerenderContentsData data = prerender_list_.front();
1035 prerender_list_.pop_front(); 1046 prerender_list_.pop_front();
1036 data.contents_->Destroy(final_status); 1047 data.contents_->Destroy(final_status);
1037 } 1048 }
1038 DeletePendingDeleteEntries(); 1049 DeletePendingDeleteEntries();
1039 } 1050 }
1040 1051
1041 } // namespace prerender 1052 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698