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" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/time.h" | 12 #include "base/time.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "chrome/browser/favicon/favicon_tab_helper.h" | 14 #include "chrome/browser/favicon/favicon_tab_helper.h" |
15 #include "chrome/browser/prerender/prerender_contents.h" | 15 #include "chrome/browser/prerender/prerender_contents.h" |
16 #include "chrome/browser/prerender/prerender_final_status.h" | 16 #include "chrome/browser/prerender/prerender_final_status.h" |
| 17 #include "chrome/browser/prerender/prerender_tracker.h" |
17 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 19 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
19 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" | 20 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" |
20 #include "chrome/common/render_messages.h" | 21 #include "chrome/common/render_messages.h" |
21 #include "content/browser/browser_thread.h" | 22 #include "content/browser/browser_thread.h" |
22 #include "content/browser/renderer_host/render_view_host.h" | 23 #include "content/browser/renderer_host/render_view_host.h" |
23 #include "content/browser/renderer_host/render_process_host.h" | 24 #include "content/browser/renderer_host/render_process_host.h" |
24 #include "content/browser/renderer_host/resource_dispatcher_host.h" | 25 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
25 #include "content/browser/tab_contents/render_view_host_manager.h" | 26 #include "content/browser/tab_contents/render_view_host_manager.h" |
26 #include "content/browser/tab_contents/tab_contents.h" | 27 #include "content/browser/tab_contents/tab_contents.h" |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 prerender_contents->Destroy(final_status); | 384 prerender_contents->Destroy(final_status); |
384 } | 385 } |
385 } | 386 } |
386 | 387 |
387 void PrerenderManager::DeleteOldEntries() { | 388 void PrerenderManager::DeleteOldEntries() { |
388 DCHECK(CalledOnValidThread()); | 389 DCHECK(CalledOnValidThread()); |
389 while (!prerender_list_.empty()) { | 390 while (!prerender_list_.empty()) { |
390 PrerenderContentsData data = prerender_list_.front(); | 391 PrerenderContentsData data = prerender_list_.front(); |
391 if (IsPrerenderElementFresh(data.start_time_)) | 392 if (IsPrerenderElementFresh(data.start_time_)) |
392 return; | 393 return; |
393 prerender_list_.pop_front(); | 394 data.contents_->Destroy(FINAL_STATUS_TIMED_OUT); |
394 data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT); | |
395 delete data.contents_; | |
396 } | 395 } |
397 MaybeStopSchedulingPeriodicCleanups(); | 396 MaybeStopSchedulingPeriodicCleanups(); |
398 } | 397 } |
399 | 398 |
400 PrerenderContents* PrerenderManager::GetEntryButNotSpecifiedTC( | 399 PrerenderContents* PrerenderManager::GetEntryButNotSpecifiedTC( |
401 const GURL& url, | 400 const GURL& url, |
402 TabContents *tc) { | 401 TabContents *tc) { |
403 DCHECK(CalledOnValidThread()); | 402 DCHECK(CalledOnValidThread()); |
404 DeleteOldEntries(); | 403 DeleteOldEntries(); |
405 DeletePendingDeleteEntries(); | 404 DeletePendingDeleteEntries(); |
(...skipping 26 matching lines...) Expand all Loading... |
432 return false; | 431 return false; |
433 | 432 |
434 // If we are just in the control group (which can be detected by noticing | 433 // If we are just in the control group (which can be detected by noticing |
435 // that prerendering hasn't even started yet), record that |tab_contents| now | 434 // that prerendering hasn't even started yet), record that |tab_contents| now |
436 // would be showing a prerendered contents, but otherwise, don't do anything. | 435 // would be showing a prerendered contents, but otherwise, don't do anything. |
437 if (!prerender_contents->prerendering_has_started()) { | 436 if (!prerender_contents->prerendering_has_started()) { |
438 MarkTabContentsAsWouldBePrerendered(tab_contents); | 437 MarkTabContentsAsWouldBePrerendered(tab_contents); |
439 return false; | 438 return false; |
440 } | 439 } |
441 | 440 |
| 441 int child_id, route_id; |
| 442 CHECK(prerender_contents->GetChildId(&child_id)); |
| 443 CHECK(prerender_contents->GetRouteId(&route_id)); |
| 444 |
| 445 // Try to set the prerendered page as used, so any subsequent attempts to |
| 446 // cancel on other threads will fail. If this fails because the prerender |
| 447 // was already cancelled, possibly on another thread, fail. |
| 448 if (!PrerenderTracker::GetInstance()->TryUse(child_id, route_id)) |
| 449 return false; |
| 450 |
442 if (!prerender_contents->load_start_time().is_null()) | 451 if (!prerender_contents->load_start_time().is_null()) |
443 RecordTimeUntilUsed(GetCurrentTimeTicks() - | 452 RecordTimeUntilUsed(GetCurrentTimeTicks() - |
444 prerender_contents->load_start_time()); | 453 prerender_contents->load_start_time()); |
445 | 454 |
446 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", | 455 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", |
447 ++prerenders_per_session_count_); | 456 ++prerenders_per_session_count_); |
448 prerender_contents->set_final_status(FINAL_STATUS_USED); | 457 prerender_contents->set_final_status(FINAL_STATUS_USED); |
449 | 458 |
450 int child_id; | |
451 int route_id; | |
452 CHECK(prerender_contents->GetChildId(&child_id)); | |
453 CHECK(prerender_contents->GetRouteId(&route_id)); | |
454 | |
455 RenderViewHost* render_view_host = | 459 RenderViewHost* render_view_host = |
456 prerender_contents->render_view_host_mutable(); | 460 prerender_contents->render_view_host_mutable(); |
457 prerender_contents->set_render_view_host(NULL); | 461 prerender_contents->set_render_view_host(NULL); |
458 | 462 |
459 // RenderViewHosts in PrerenderContents start out hidden. | 463 // RenderViewHosts in PrerenderContents start out hidden. |
460 // Since we are actually using it now, restore it. | 464 // Since we are actually using it now, restore it. |
461 render_view_host->WasRestored(); | 465 render_view_host->WasRestored(); |
462 render_view_host->Send( | 466 render_view_host->Send( |
463 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false)); | 467 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false)); |
464 tab_contents->SwapInRenderViewHost(render_view_host); | 468 tab_contents->SwapInRenderViewHost(render_view_host); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 return false; | 528 return false; |
525 | 529 |
526 // If we are just in the control group (which can be detected by noticing | 530 // If we are just in the control group (which can be detected by noticing |
527 // that prerendering hasn't even started yet), record that |tab_contents| now | 531 // that prerendering hasn't even started yet), record that |tab_contents| now |
528 // would be showing a prerendered contents, but otherwise, don't do anything. | 532 // would be showing a prerendered contents, but otherwise, don't do anything. |
529 if (!prerender_contents->prerendering_has_started()) { | 533 if (!prerender_contents->prerendering_has_started()) { |
530 MarkTabContentsAsWouldBePrerendered(tab_contents); | 534 MarkTabContentsAsWouldBePrerendered(tab_contents); |
531 return false; | 535 return false; |
532 } | 536 } |
533 | 537 |
| 538 int child_id, route_id; |
| 539 CHECK(prerender_contents->GetChildId(&child_id)); |
| 540 CHECK(prerender_contents->GetRouteId(&route_id)); |
| 541 |
| 542 // Try to set the prerendered page as used, so any subsequent attempts to |
| 543 // cancel on other threads will fail. If this fails because the prerender |
| 544 // was already cancelled, possibly on another thread, fail. |
| 545 if (!PrerenderTracker::GetInstance()->TryUse(child_id, route_id)) |
| 546 return false; |
| 547 |
534 if (!prerender_contents->load_start_time().is_null()) | 548 if (!prerender_contents->load_start_time().is_null()) |
535 RecordTimeUntilUsed(GetCurrentTimeTicks() - | 549 RecordTimeUntilUsed(GetCurrentTimeTicks() - |
536 prerender_contents->load_start_time()); | 550 prerender_contents->load_start_time()); |
537 | 551 |
538 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", | 552 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", |
539 ++prerenders_per_session_count_); | 553 ++prerenders_per_session_count_); |
540 prerender_contents->set_final_status(FINAL_STATUS_USED); | 554 prerender_contents->set_final_status(FINAL_STATUS_USED); |
541 | 555 |
542 int child_id; | |
543 int route_id; | |
544 CHECK(prerender_contents->GetChildId(&child_id)); | |
545 CHECK(prerender_contents->GetRouteId(&route_id)); | |
546 | |
547 RenderViewHost* render_view_host = | 556 RenderViewHost* render_view_host = |
548 prerender_contents->prerender_contents()->render_view_host(); | 557 prerender_contents->prerender_contents()->render_view_host(); |
549 DCHECK(render_view_host); | 558 DCHECK(render_view_host); |
550 render_view_host->Send( | 559 render_view_host->Send( |
551 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false)); | 560 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false)); |
552 | 561 |
553 TabContentsWrapper* new_tab_contents = | 562 TabContentsWrapper* new_tab_contents = |
554 prerender_contents->ReleasePrerenderContents(); | 563 prerender_contents->ReleasePrerenderContents(); |
555 TabContentsWrapper* old_tab_contents = | 564 TabContentsWrapper* old_tab_contents = |
556 TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); | 565 TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 base::TimeTicks cutoff = GetCurrentTimeTicks() - | 977 base::TimeTicks cutoff = GetCurrentTimeTicks() - |
969 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs); | 978 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs); |
970 while (!navigations_.empty()) { | 979 while (!navigations_.empty()) { |
971 if (navigations_.front().time_ > cutoff) | 980 if (navigations_.front().time_ > cutoff) |
972 break; | 981 break; |
973 navigations_.pop_front(); | 982 navigations_.pop_front(); |
974 } | 983 } |
975 } | 984 } |
976 | 985 |
977 } // namespace prerender | 986 } // namespace prerender |
OLD | NEW |