Commit 9ec0b986 authored by tburkard@chromium.org's avatar tburkard@chromium.org

Fix PPLT metric for the new TabContents based prerendering

R=cbentzel@chromium.org, dominich@chromium.org
Review URL: http://codereview.chromium.org/7066011

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86364 0039d316-1c4b-4281-b951-d872f2087c98
parent d94bcd8a
......@@ -14,6 +14,7 @@
#include "chrome/browser/favicon/favicon_tab_helper.h"
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_final_status.h"
#include "chrome/browser/prerender/prerender_observer.h"
#include "chrome/browser/prerender/prerender_tracker.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
......@@ -608,6 +609,14 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents,
urls);
}
// Update PPLT metrics:
// If the tab has finished loading, record a PPLT of 0.
// If the tab is still loading, reset its start time to the current time.
PrerenderObserver* prerender_observer =
new_tab_contents->prerender_observer();
DCHECK(prerender_observer != NULL);
prerender_observer->PrerenderSwappedIn();
// See if we have any pending prerender requests for this routing id and start
// the preload if we do.
std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id);
......
......@@ -44,10 +44,6 @@ void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id,
bool is_main_frame,
bool has_opener_set,
const GURL& url) {
// Don't include prerendered pages in the PPLT metric until after they are
// swapped in.
if (IsPrerendering())
return;
if (is_main_frame) {
// Record the beginning of a new PPLT navigation.
pplt_load_start_ = base::TimeTicks::Now();
......@@ -57,11 +53,9 @@ void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id,
void PrerenderObserver::DidStopLoading() {
// Don't include prerendered pages in the PPLT metric until after they are
// swapped in.
if (IsPrerendering())
return;
// Compute the PPLT metric and report it in a histogram, if needed.
if (!pplt_load_start_.is_null()) {
if (!pplt_load_start_.is_null() && !IsPrerendering()) {
PrerenderManager::RecordPerceivedPageLoadTime(
base::TimeTicks::Now() - pplt_load_start_, tab_contents());
}
......@@ -92,4 +86,17 @@ bool PrerenderObserver::IsPrerendering() {
return prerender_manager->IsTabContentsPrerendering(tab_contents());
}
void PrerenderObserver::PrerenderSwappedIn() {
// Ensure we are not prerendering any more.
DCHECK(!IsPrerendering());
if (pplt_load_start_.is_null()) {
// If we have already finished loading, report a 0 PPLT.
PrerenderManager::RecordPerceivedPageLoadTime(base::TimeDelta(),
tab_contents());
} else {
// If we have not finished loading yet, rebase the start time to now.
pplt_load_start_ = base::TimeTicks::Now();
}
}
} // namespace prerender
......@@ -36,6 +36,9 @@ class PrerenderObserver : public TabContentsObserver {
bool has_opener_set,
const GURL& url);
// Called when this prerendered TabContents has just been swapped in.
void PrerenderSwappedIn();
private:
// Retrieves the PrerenderManager, or NULL, if none was found.
PrerenderManager* MaybeGetPrerenderManager();
......
......@@ -34,6 +34,17 @@ bool PrerenderRenderViewHostObserver::OnMessageReceived(
IPC_BEGIN_MESSAGE_MAP(PrerenderRenderViewHostObserver, message)
IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame,
OnDidStartProvisionalLoadForFrame)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
// If this was a DidStartProvisionalLoadForFrame message, we don't want to
// to consume it, so return false;
if (handled)
return false;
// The following messages we do want to consume.
handled = true;
IPC_BEGIN_MESSAGE_MAP(PrerenderRenderViewHostObserver, message)
IPC_MESSAGE_HANDLER(IconHostMsg_UpdateFaviconURL, OnUpdateFaviconURL)
IPC_MESSAGE_HANDLER(ViewHostMsg_MaybeCancelPrerenderForHTML5Media,
OnMaybeCancelPrerenderForHTML5Media)
......
......@@ -166,6 +166,10 @@ class TabContentsWrapper : public TabContentsObserver,
return translate_tab_helper_.get();
}
prerender::PrerenderObserver* prerender_observer() {
return prerender_observer_.get();
}
// Overrides -----------------------------------------------------------------
// TabContentsObserver overrides:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment