Chromium Code Reviews| Index: chrome/browser/prerender/prerender_manager.cc |
| =================================================================== |
| --- chrome/browser/prerender/prerender_manager.cc (revision 109294) |
| +++ chrome/browser/prerender/prerender_manager.cc (working copy) |
| @@ -130,6 +130,11 @@ |
| } |
| // static |
| +bool PrerenderManager::ActuallyPrerendering() { |
| + return IsPrerenderingPossible() && !IsControlGroup(); |
| +} |
| + |
| +// static |
| bool PrerenderManager::IsControlGroup() { |
| return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP; |
| } |
| @@ -647,14 +652,59 @@ |
| return true; |
| } |
| -void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) { |
| +bool PrerenderManager::NeedMatchCompleteDummyForFinalStatus( |
|
dominich
2011/11/11 20:53:46
This doesn't need to be a member of a PrerenderMan
tburkard
2011/11/11 21:50:07
Done.
|
| + FinalStatus final_status) const { |
| + 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_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; |
| +} |
| + |
| +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( |
|
dominich
2011/11/11 20:53:46
Instead of exposing these internals (referrer, exp
tburkard
2011/11/11 21:50:07
Since we will likely remove this again, I will lea
|
| + entry->prerender_url(), |
| + entry->referrer(), |
| + entry->origin(), |
| + entry->experiment_id()); |
| + if (dummy_replacement_prerender_contents && |
| + dummy_replacement_prerender_contents->Init()) { |
|
dominich
2011/11/11 20:53:46
If Init fails here you should delete dummy_replace
tburkard
2011/11/11 21:50:07
Didn't we talk about this in the previous iteratio
|
| + 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; |
| } |
| } |
| @@ -726,12 +776,11 @@ |
| 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 { |