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

Unified Diff: chrome/browser/prerender/prerender_manager.cc

Issue 8540025: 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 side-by-side diff with in-line comments
Download patch
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 {

Powered by Google App Engine
This is Rietveld 408576698