diff options
author | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-14 23:56:35 +0000 |
---|---|---|
committer | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-14 23:56:35 +0000 |
commit | 447f9ab8ca52d9a7b48ae3c0ef7811a1b4d80b9c (patch) | |
tree | d82ec8a148ebc16931f79e6bc774b5c5eece2c69 /chrome/browser/prerender/prerender_manager.cc | |
parent | 549d0da4062e8966449976b29d35b964a6cdcc03 (diff) | |
download | chromium_src-447f9ab8ca52d9a7b48ae3c0ef7811a1b4d80b9c.zip chromium_src-447f9ab8ca52d9a7b48ae3c0ef7811a1b4d80b9c.tar.gz chromium_src-447f9ab8ca52d9a7b48ae3c0ef7811a1b4d80b9c.tar.bz2 |
Prerendering: Add MatchComplete PPLT
R=cbentzel, dominich
Review URL: http://codereview.chromium.org/8540025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@109983 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender/prerender_manager.cc')
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 68 |
1 files changed, 61 insertions, 7 deletions
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc index a2e07b41..a9e8777 100644 --- a/chrome/browser/prerender/prerender_manager.cc +++ b/chrome/browser/prerender/prerender_manager.cc @@ -77,6 +77,24 @@ const char* const kValidHttpMethods[] = { // Length of prerender history, for display in chrome://net-internals const int kHistoryLength = 100; +// Indicates whether a Prerender has been cancelled such that we need +// a dummy replacement for the purpose of recording the correct PPLT for +// the Match Complete case. + +bool NeedMatchCompleteDummyForFinalStatus(FinalStatus final_status) { + return final_status != FINAL_STATUS_USED && + final_status != FINAL_STATUS_TIMED_OUT && + final_status != FINAL_STATUS_EVICTED && + final_status != FINAL_STATUS_MANAGER_SHUTDOWN && + final_status != FINAL_STATUS_APP_TERMINATING && + final_status != FINAL_STATUS_RENDERER_CRASHED && + final_status != FINAL_STATUS_WINDOW_OPENER && + final_status != FINAL_STATUS_FRAGMENT_MISMATCH && + final_status != FINAL_STATUS_CACHE_OR_HISTORY_CLEARED && + final_status != FINAL_STATUS_CANCELLED && + final_status != FINAL_STATUS_MATCH_COMPLETE_DUMMY; +} + } // namespace class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate { @@ -130,6 +148,11 @@ bool PrerenderManager::IsPrerenderingPossible() { } // static +bool PrerenderManager::ActuallyPrerendering() { + return IsPrerenderingPossible() && !IsControlGroup(); +} + +// static bool PrerenderManager::IsControlGroup() { return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP; } @@ -655,14 +678,46 @@ bool PrerenderManager::MaybeUsePrerenderedPage(TabContents* tab_contents, return true; } -void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) { +void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry, + FinalStatus final_status) { DCHECK(CalledOnValidThread()); + DCHECK(entry); DCHECK(!IsPendingDelete(entry)); + for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); it != prerender_list_.end(); ++it) { if (it->contents_ == entry) { - prerender_list_.erase(it); + bool swapped_in_dummy_replacement = false; + + // If this PrerenderContents is being deleted due to a cancellation, + // we need to create a dummy replacement for PPLT accounting purposes + // for the Match Complete group. + // This is the case if the cancellation is for any reason that would not + // occur in the control group case. + if (NeedMatchCompleteDummyForFinalStatus(final_status)) { + // TODO(tburkard): I'd like to DCHECK that we are actually prerendering. + // However, what if new conditions are added and + // NeedMatchCompleteDummyForFinalStatus, is not being updated. Not sure + // what's the best thing to do here. For now, I will just check whether + // we are actually prerendering. + if (ActuallyPrerendering()) { + PrerenderContents* dummy_replacement_prerender_contents = + CreatePrerenderContents( + entry->prerender_url(), + entry->referrer(), + entry->origin(), + entry->experiment_id()); + if (dummy_replacement_prerender_contents && + dummy_replacement_prerender_contents->Init()) { + it->contents_ = dummy_replacement_prerender_contents; + it->contents_->set_final_status(FINAL_STATUS_MATCH_COMPLETE_DUMMY); + swapped_in_dummy_replacement = true; + } + } + } + if (!swapped_in_dummy_replacement) + prerender_list_.erase(it); break; } } @@ -734,12 +789,11 @@ void PrerenderManager::RecordPerceivedPageLoadTime( if (!prerender_manager->is_enabled()) return; bool was_prerender = - ((mode_ == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP && - prerender_manager->WouldTabContentsBePrerendered(tab_contents)) || - (mode_ == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP && - prerender_manager->IsTabContentsPrerendered(tab_contents))); + prerender_manager->IsTabContentsPrerendered(tab_contents); + bool was_complete_prerender = was_prerender || + prerender_manager->WouldTabContentsBePrerendered(tab_contents); prerender_manager->histograms_->RecordPerceivedPageLoadTime( - perceived_page_load_time, was_prerender, url); + perceived_page_load_time, was_prerender, was_complete_prerender, url); } bool PrerenderManager::is_enabled() const { |