| Index: chrome/browser/prerender/prerender_manager.cc
|
| ===================================================================
|
| --- chrome/browser/prerender/prerender_manager.cc (revision 109949)
|
| +++ chrome/browser/prerender/prerender_manager.cc (working copy)
|
| @@ -77,6 +77,24 @@
|
| // 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 @@
|
| }
|
|
|
| // static
|
| +bool PrerenderManager::ActuallyPrerendering() {
|
| + return IsPrerenderingPossible() && !IsControlGroup();
|
| +}
|
| +
|
| +// static
|
| bool PrerenderManager::IsControlGroup() {
|
| return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP;
|
| }
|
| @@ -655,14 +678,46 @@
|
| 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 @@
|
| 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 {
|
|
|