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 |