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

Unified 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 side-by-side diff with in-line comments
Download patch
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;
}
@@ -385,8 +390,11 @@
PrerenderContents* prerender_contents = CreatePrerenderContents(
url, referrer, origin, experiment);
- if (!prerender_contents || !prerender_contents->Init())
+ if (!prerender_contents || !prerender_contents->Init()) {
+ if (prerender_contents)
+ delete prerender_contents;
return false;
+ }
// TODO(cbentzel): Move invalid checks here instead of PrerenderContents?
PrerenderContentsData data(prerender_contents, GetCurrentTime());
@@ -647,14 +655,62 @@
return true;
}
-void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) {
+bool PrerenderManager::NeedMatchCompleteDummyForFinalStatus(
+ 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));
+
+ // 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.
+ PrerenderContents* dummy_replacement_prerender_contents = NULL;
+ 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()) {
+ dummy_replacement_prerender_contents = CreatePrerenderContents(
+ entry->prerender_url(),
+ entry->referrer(),
+ entry->origin(),
+ entry->experiment_id());
+ if (dummy_replacement_prerender_contents) {
+ if (!dummy_replacement_prerender_contents->Init()) {
+ delete dummy_replacement_prerender_contents;
+ dummy_replacement_prerender_contents = NULL;
+ }
+ }
+ }
+ }
+
for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
it != prerender_list_.end();
++it) {
if (it->contents_ == entry) {
- prerender_list_.erase(it);
+ if (dummy_replacement_prerender_contents) {
+ it->contents_ = dummy_replacement_prerender_contents;
+ it->contents_->set_final_status(FINAL_STATUS_MATCH_COMPLETE_DUMMY);
+ } else {
+ prerender_list_.erase(it);
+ }
break;
}
}
@@ -726,12 +782,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