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 <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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |