| 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 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 } | 404 } |
| 405 // Entry not found. | 405 // Entry not found. |
| 406 return NULL; | 406 return NULL; |
| 407 } | 407 } |
| 408 | 408 |
| 409 PrerenderContents* PrerenderManager::GetEntry(const GURL& url) { | 409 PrerenderContents* PrerenderManager::GetEntry(const GURL& url) { |
| 410 return GetEntryButNotSpecifiedTC(url, NULL); | 410 return GetEntryButNotSpecifiedTC(url, NULL); |
| 411 } | 411 } |
| 412 | 412 |
| 413 bool PrerenderManager::MaybeUsePreloadedPageOld(TabContents* tab_contents, | 413 bool PrerenderManager::MaybeUsePreloadedPageOld(TabContents* tab_contents, |
| 414 const GURL& url) { | 414 const GURL& url, |
| 415 bool has_opener_set) { |
| 415 DCHECK(CalledOnValidThread()); | 416 DCHECK(CalledOnValidThread()); |
| 416 scoped_ptr<PrerenderContents> prerender_contents(GetEntry(url)); | 417 scoped_ptr<PrerenderContents> prerender_contents(GetEntry(url)); |
| 417 if (prerender_contents.get() == NULL) | 418 if (prerender_contents.get() == NULL) |
| 418 return false; | 419 return false; |
| 419 | 420 |
| 421 // Do not use the prerendered version if the opener window.property was |
| 422 // supposed to be set. |
| 423 if (has_opener_set) { |
| 424 prerender_contents.release()->Destroy(FINAL_STATUS_WINDOW_OPENER); |
| 425 return false; |
| 426 } |
| 427 |
| 420 // If we are just in the control group (which can be detected by noticing | 428 // If we are just in the control group (which can be detected by noticing |
| 421 // that prerendering hasn't even started yet), record that |tab_contents| now | 429 // that prerendering hasn't even started yet), record that |tab_contents| now |
| 422 // would be showing a prerendered contents, but otherwise, don't do anything. | 430 // would be showing a prerendered contents, but otherwise, don't do anything. |
| 423 if (!prerender_contents->prerendering_has_started()) { | 431 if (!prerender_contents->prerendering_has_started()) { |
| 424 MarkTabContentsAsWouldBePrerendered(tab_contents); | 432 MarkTabContentsAsWouldBePrerendered(tab_contents); |
| 425 return false; | 433 return false; |
| 426 } | 434 } |
| 427 | 435 |
| 428 if (!prerender_contents->load_start_time().is_null()) | 436 if (!prerender_contents->load_start_time().is_null()) |
| 429 RecordTimeUntilUsed(GetCurrentTimeTicks() - | 437 RecordTimeUntilUsed(GetCurrentTimeTicks() - |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 urls); | 497 urls); |
| 490 } | 498 } |
| 491 | 499 |
| 492 if (prerender_contents->has_stopped_loading()) | 500 if (prerender_contents->has_stopped_loading()) |
| 493 render_view_host_delegate->DidStopLoading(); | 501 render_view_host_delegate->DidStopLoading(); |
| 494 | 502 |
| 495 return true; | 503 return true; |
| 496 } | 504 } |
| 497 | 505 |
| 498 bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents, | 506 bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents, |
| 499 const GURL& url) { | 507 const GURL& url, |
| 508 bool has_opener_set) { |
| 500 if (!PrerenderContents::UseTabContents()) { | 509 if (!PrerenderContents::UseTabContents()) { |
| 501 VLOG(1) << "Checking for prerender with LEGACY code"; | 510 VLOG(1) << "Checking for prerender with LEGACY code"; |
| 502 return PrerenderManager::MaybeUsePreloadedPageOld(tab_contents, url); | 511 return PrerenderManager::MaybeUsePreloadedPageOld(tab_contents, url, |
| 512 has_opener_set); |
| 503 } | 513 } |
| 504 VLOG(1) << "Checking for prerender with NEW code"; | 514 VLOG(1) << "Checking for prerender with NEW code"; |
| 505 DCHECK(CalledOnValidThread()); | 515 DCHECK(CalledOnValidThread()); |
| 506 scoped_ptr<PrerenderContents> prerender_contents( | 516 scoped_ptr<PrerenderContents> prerender_contents( |
| 507 GetEntryButNotSpecifiedTC(url, tab_contents)); | 517 GetEntryButNotSpecifiedTC(url, tab_contents)); |
| 508 if (prerender_contents.get() == NULL) | 518 if (prerender_contents.get() == NULL) |
| 509 return false; | 519 return false; |
| 510 | 520 |
| 521 // Do not use the prerendered version if the opener window.property was |
| 522 // supposed to be set. |
| 523 if (has_opener_set) { |
| 524 prerender_contents.release()->Destroy(FINAL_STATUS_WINDOW_OPENER); |
| 525 return false; |
| 526 } |
| 527 |
| 511 // If we are just in the control group (which can be detected by noticing | 528 // If we are just in the control group (which can be detected by noticing |
| 512 // that prerendering hasn't even started yet), record that |tab_contents| now | 529 // that prerendering hasn't even started yet), record that |tab_contents| now |
| 513 // would be showing a prerendered contents, but otherwise, don't do anything. | 530 // would be showing a prerendered contents, but otherwise, don't do anything. |
| 514 if (!prerender_contents->prerendering_has_started()) { | 531 if (!prerender_contents->prerendering_has_started()) { |
| 515 MarkTabContentsAsWouldBePrerendered(tab_contents); | 532 MarkTabContentsAsWouldBePrerendered(tab_contents); |
| 516 return false; | 533 return false; |
| 517 } | 534 } |
| 518 | 535 |
| 519 if (!prerender_contents->load_start_time().is_null()) | 536 if (!prerender_contents->load_start_time().is_null()) |
| 520 RecordTimeUntilUsed(GetCurrentTimeTicks() - | 537 RecordTimeUntilUsed(GetCurrentTimeTicks() - |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 return true; | 588 return true; |
| 572 } | 589 } |
| 573 | 590 |
| 574 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) { | 591 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) { |
| 575 DCHECK(CalledOnValidThread()); | 592 DCHECK(CalledOnValidThread()); |
| 576 DCHECK(!IsPendingDelete(entry)); | 593 DCHECK(!IsPendingDelete(entry)); |
| 577 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); | 594 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); |
| 578 it != prerender_list_.end(); | 595 it != prerender_list_.end(); |
| 579 ++it) { | 596 ++it) { |
| 580 if (it->contents_ == entry) { | 597 if (it->contents_ == entry) { |
| 581 pending_delete_list_.push_back(*it); | |
| 582 RemovePendingPreload(entry); | 598 RemovePendingPreload(entry); |
| 583 prerender_list_.erase(it); | 599 prerender_list_.erase(it); |
| 584 break; | 600 break; |
| 585 } | 601 } |
| 586 } | 602 } |
| 603 pending_delete_list_.push_back(entry); |
| 587 DeleteOldEntries(); | 604 DeleteOldEntries(); |
| 588 StartSchedulingPeriodicCleanups(); | 605 StartSchedulingPeriodicCleanups(); |
| 589 } | 606 } |
| 590 | 607 |
| 591 bool PrerenderManager::IsPendingDelete(PrerenderContents* entry) const { | 608 bool PrerenderManager::IsPendingDelete(PrerenderContents* entry) const { |
| 592 DCHECK(CalledOnValidThread()); | 609 DCHECK(CalledOnValidThread()); |
| 593 for (std::list<PrerenderContentsData>::const_iterator it = | 610 for (std::list<PrerenderContents*>::const_iterator it = |
| 594 pending_delete_list_.begin(); | 611 pending_delete_list_.begin(); |
| 595 it != pending_delete_list_.end(); | 612 it != pending_delete_list_.end(); |
| 596 ++it) { | 613 ++it) { |
| 597 if (it->contents_ == entry) | 614 if (*it == entry) |
| 598 return true; | 615 return true; |
| 599 } | 616 } |
| 600 | 617 |
| 601 return false; | 618 return false; |
| 602 } | 619 } |
| 603 | 620 |
| 604 base::Time PrerenderManager::GetCurrentTime() const { | 621 base::Time PrerenderManager::GetCurrentTime() const { |
| 605 return base::Time::Now(); | 622 return base::Time::Now(); |
| 606 } | 623 } |
| 607 | 624 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 618 PrerenderContents* PrerenderManager::CreatePrerenderContents( | 635 PrerenderContents* PrerenderManager::CreatePrerenderContents( |
| 619 const GURL& url, | 636 const GURL& url, |
| 620 const GURL& referrer) { | 637 const GURL& referrer) { |
| 621 DCHECK(CalledOnValidThread()); | 638 DCHECK(CalledOnValidThread()); |
| 622 return prerender_contents_factory_->CreatePrerenderContents( | 639 return prerender_contents_factory_->CreatePrerenderContents( |
| 623 this, profile_, url, referrer); | 640 this, profile_, url, referrer); |
| 624 } | 641 } |
| 625 | 642 |
| 626 void PrerenderManager::DeletePendingDeleteEntries() { | 643 void PrerenderManager::DeletePendingDeleteEntries() { |
| 627 while (!pending_delete_list_.empty()) { | 644 while (!pending_delete_list_.empty()) { |
| 628 PrerenderContentsData data = pending_delete_list_.front(); | 645 PrerenderContents* contents = pending_delete_list_.front(); |
| 629 pending_delete_list_.pop_front(); | 646 pending_delete_list_.pop_front(); |
| 630 delete data.contents_; | 647 delete contents; |
| 631 } | 648 } |
| 632 } | 649 } |
| 633 | 650 |
| 634 // Helper macro for histograms. | 651 // Helper macro for histograms. |
| 635 #define RECORD_PLT(tag, perceived_page_load_time) { \ | 652 #define RECORD_PLT(tag, perceived_page_load_time) { \ |
| 636 UMA_HISTOGRAM_CUSTOM_TIMES( \ | 653 UMA_HISTOGRAM_CUSTOM_TIMES( \ |
| 637 base::FieldTrial::MakeName(std::string("Prerender.") + tag, \ | 654 base::FieldTrial::MakeName(std::string("Prerender.") + tag, \ |
| 638 "Prefetch"), \ | 655 "Prefetch"), \ |
| 639 perceived_page_load_time, \ | 656 perceived_page_load_time, \ |
| 640 base::TimeDelta::FromMilliseconds(10), \ | 657 base::TimeDelta::FromMilliseconds(10), \ |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 return prerendered_tab_contents_set_.count(tab_contents) > 0; | 903 return prerendered_tab_contents_set_.count(tab_contents) > 0; |
| 887 } | 904 } |
| 888 | 905 |
| 889 bool PrerenderManager::WouldTabContentsBePrerendered( | 906 bool PrerenderManager::WouldTabContentsBePrerendered( |
| 890 TabContents* tab_contents) const { | 907 TabContents* tab_contents) const { |
| 891 DCHECK(CalledOnValidThread()); | 908 DCHECK(CalledOnValidThread()); |
| 892 return would_be_prerendered_tab_contents_set_.count(tab_contents) > 0; | 909 return would_be_prerendered_tab_contents_set_.count(tab_contents) > 0; |
| 893 } | 910 } |
| 894 | 911 |
| 895 } // namespace prerender | 912 } // namespace prerender |
| OLD | NEW |