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

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

Issue 8503040: Prerendering: Add MatchComplete PPLT (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 123
124 // static 124 // static
125 bool PrerenderManager::IsPrerenderingPossible() { 125 bool PrerenderManager::IsPrerenderingPossible() {
126 return GetMode() == PRERENDER_MODE_ENABLED || 126 return GetMode() == PRERENDER_MODE_ENABLED ||
127 GetMode() == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP || 127 GetMode() == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP ||
128 GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP || 128 GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP ||
129 GetMode() == PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP; 129 GetMode() == PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP;
130 } 130 }
131 131
132 // static 132 // static
133 bool PrerenderManager::ActuallyPrerendering() {
134 return IsPrerenderingPossible() && !IsControlGroup();
135 }
136
137 // static
133 bool PrerenderManager::IsControlGroup() { 138 bool PrerenderManager::IsControlGroup() {
134 return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP; 139 return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP;
135 } 140 }
136 141
137 // static 142 // static
138 bool PrerenderManager::IsValidHttpMethod(const std::string& method) { 143 bool PrerenderManager::IsValidHttpMethod(const std::string& method) {
139 // method has been canonicalized to upper case at this point so we can just 144 // method has been canonicalized to upper case at this point so we can just
140 // compare them. 145 // compare them.
141 DCHECK_EQ(method, StringToUpperASCII(method)); 146 DCHECK_EQ(method, StringToUpperASCII(method));
142 for (size_t i = 0; i < arraysize(kValidHttpMethods); ++i) { 147 for (size_t i = 0; i < arraysize(kValidHttpMethods); ++i) {
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 // No unload handler to run, so delete asap. 645 // No unload handler to run, so delete asap.
641 ScheduleDeleteOldTabContents(old_tab_contents, NULL); 646 ScheduleDeleteOldTabContents(old_tab_contents, NULL);
642 } 647 }
643 648
644 // TODO(cbentzel): Should prerender_contents move to the pending delete 649 // TODO(cbentzel): Should prerender_contents move to the pending delete
645 // list, instead of deleting directly here? 650 // list, instead of deleting directly here?
646 AddToHistory(prerender_contents.get()); 651 AddToHistory(prerender_contents.get());
647 return true; 652 return true;
648 } 653 }
649 654
650 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) { 655 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry,
656 FinalStatus final_status) {
651 DCHECK(CalledOnValidThread()); 657 DCHECK(CalledOnValidThread());
658 DCHECK(entry);
652 DCHECK(!IsPendingDelete(entry)); 659 DCHECK(!IsPendingDelete(entry));
660
661 // If this PrerenderContents is being deleted due to a cancellation, we need
662 // to create a dummy replacement for PPLT accounting purposes for the
663 // Match Complete group.
664 // This is the case if the cancellation is for any reason that would not occur
665 // in the control group case.
666 PrerenderContents* dummy_replacement_prerender_contents = NULL;
667 if (final_status != FINAL_STATUS_USED &&
668 final_status != FINAL_STATUS_TIMED_OUT &&
669 final_status != FINAL_STATUS_EVICTED &&
670 final_status != FINAL_STATUS_MANAGER_SHUTDOWN &&
671 final_status != FINAL_STATUS_WINDOW_OPENER &&
cbentzel 2011/11/10 13:16:25 Is the WINDOW_OPENER case one that would be caught
tburkard 2011/11/10 18:36:55 Yes, see MaybeUsePrerenderedPage in the same file.
672 final_status != FINAL_STATUS_FRAGMENT_MISMATCH &&
673 final_status != FINAL_STATUS_CACHE_OR_HISTORY_CLEARED &&
674 final_status != FINAL_STATUS_CANCELLED &&
675 final_status != FINAL_STATUS_MATCH_COMPLETE_DUMMY) {
676 // TODO(tburkard): I'd like to DCHECK that we are actually prerendering.
677 // However, what if new conditions are added and this list is not being
678 // updated. Not sure what's the best thing to do here. For now, I will
679 // just check whether we are actually prerendering.
680 if (ActuallyPrerendering()) {
681 dummy_replacement_prerender_contents = CreatePrerenderContents(
682 entry->prerender_url(),
683 entry->referrer(),
684 entry->origin(),
685 entry->experiment_id());
686 }
687 }
688
653 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); 689 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
654 it != prerender_list_.end(); 690 it != prerender_list_.end();
655 ++it) { 691 ++it) {
656 if (it->contents_ == entry) { 692 if (it->contents_ == entry) {
657 prerender_list_.erase(it); 693 if (dummy_replacement_prerender_contents) {
694 it->contents_ = dummy_replacement_prerender_contents;
695 it->contents_->set_final_status(FINAL_STATUS_MATCH_COMPLETE_DUMMY);
696 } else {
697 prerender_list_.erase(it);
698 }
658 break; 699 break;
659 } 700 }
660 } 701 }
661 AddToHistory(entry); 702 AddToHistory(entry);
662 pending_delete_list_.push_back(entry); 703 pending_delete_list_.push_back(entry);
663 704
664 // Destroy the old TabContents relatively promptly to reduce resource usage, 705 // Destroy the old TabContents relatively promptly to reduce resource usage,
665 // and in the case of HTML5 media, reduce the change of playing any sound. 706 // and in the case of HTML5 media, reduce the change of playing any sound.
666 PostCleanupTask(); 707 PostCleanupTask();
667 } 708 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 const GURL& url) { 760 const GURL& url) {
720 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 761 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
721 PrerenderManager* prerender_manager = 762 PrerenderManager* prerender_manager =
722 PrerenderManagerFactory::GetForProfile( 763 PrerenderManagerFactory::GetForProfile(
723 Profile::FromBrowserContext(tab_contents->browser_context())); 764 Profile::FromBrowserContext(tab_contents->browser_context()));
724 if (!prerender_manager) 765 if (!prerender_manager)
725 return; 766 return;
726 if (!prerender_manager->is_enabled()) 767 if (!prerender_manager->is_enabled())
727 return; 768 return;
728 bool was_prerender = 769 bool was_prerender =
729 ((mode_ == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP && 770 prerender_manager->IsTabContentsPrerendered(tab_contents);
730 prerender_manager->WouldTabContentsBePrerendered(tab_contents)) || 771 bool was_complete_prerender = was_prerender ||
731 (mode_ == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP && 772 prerender_manager->WouldTabContentsBePrerendered(tab_contents);
732 prerender_manager->IsTabContentsPrerendered(tab_contents)));
733 prerender_manager->histograms_->RecordPerceivedPageLoadTime( 773 prerender_manager->histograms_->RecordPerceivedPageLoadTime(
734 perceived_page_load_time, was_prerender, url); 774 perceived_page_load_time, was_prerender, was_complete_prerender, url);
735 } 775 }
736 776
737 bool PrerenderManager::is_enabled() const { 777 bool PrerenderManager::is_enabled() const {
738 DCHECK(CalledOnValidThread()); 778 DCHECK(CalledOnValidThread());
739 if (!enabled_) 779 if (!enabled_)
740 return false; 780 return false;
741 for (std::list<const PrerenderCondition*>::const_iterator it = 781 for (std::list<const PrerenderCondition*>::const_iterator it =
742 prerender_conditions_.begin(); 782 prerender_conditions_.begin();
743 it != prerender_conditions_.end(); 783 it != prerender_conditions_.end();
744 ++it) { 784 ++it) {
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 if (!render_process_host || !render_process_host->browser_context()) 1085 if (!render_process_host || !render_process_host->browser_context())
1046 return NULL; 1086 return NULL;
1047 Profile* profile = Profile::FromBrowserContext( 1087 Profile* profile = Profile::FromBrowserContext(
1048 render_process_host->browser_context()); 1088 render_process_host->browser_context());
1049 if (!profile) 1089 if (!profile)
1050 return NULL; 1090 return NULL;
1051 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); 1091 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile);
1052 } 1092 }
1053 1093
1054 } // namespace prerender 1094 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698