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

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

Issue 6915019: Changes to not use the prerendered contents when window.opener needs to be set. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Addressing Chris's comments & fixing a bug in PrerenderManager::MoveEntryToPendingDelete. Created 9 years, 7 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 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698