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 @@ ...@@ -14,6 +14,7 @@
#include "chrome/browser/favicon/favicon_tab_helper.h" #include "chrome/browser/favicon/favicon_tab_helper.h"
#include "chrome/browser/prerender/prerender_contents.h" #include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_final_status.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/prerender/prerender_tracker.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
...@@ -608,6 +609,14 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents, ...@@ -608,6 +609,14 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents,
urls); 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 // See if we have any pending prerender requests for this routing id and start
// the preload if we do. // the preload if we do.
std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id); std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id);
......
...@@ -44,10 +44,6 @@ void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id, ...@@ -44,10 +44,6 @@ void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id,
bool is_main_frame, bool is_main_frame,
bool has_opener_set, bool has_opener_set,
const GURL& url) { 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) { if (is_main_frame) {
// Record the beginning of a new PPLT navigation. // Record the beginning of a new PPLT navigation.
pplt_load_start_ = base::TimeTicks::Now(); pplt_load_start_ = base::TimeTicks::Now();
...@@ -57,11 +53,9 @@ void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id, ...@@ -57,11 +53,9 @@ void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id,
void PrerenderObserver::DidStopLoading() { void PrerenderObserver::DidStopLoading() {
// Don't include prerendered pages in the PPLT metric until after they are // Don't include prerendered pages in the PPLT metric until after they are
// swapped in. // swapped in.
if (IsPrerendering())
return;
// Compute the PPLT metric and report it in a histogram, if needed. // 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( PrerenderManager::RecordPerceivedPageLoadTime(
base::TimeTicks::Now() - pplt_load_start_, tab_contents()); base::TimeTicks::Now() - pplt_load_start_, tab_contents());
} }
...@@ -92,4 +86,17 @@ bool PrerenderObserver::IsPrerendering() { ...@@ -92,4 +86,17 @@ bool PrerenderObserver::IsPrerendering() {
return prerender_manager->IsTabContentsPrerendering(tab_contents()); 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 } // namespace prerender
...@@ -36,6 +36,9 @@ class PrerenderObserver : public TabContentsObserver { ...@@ -36,6 +36,9 @@ class PrerenderObserver : public TabContentsObserver {
bool has_opener_set, bool has_opener_set,
const GURL& url); const GURL& url);
// Called when this prerendered TabContents has just been swapped in.
void PrerenderSwappedIn();
private: private:
// Retrieves the PrerenderManager, or NULL, if none was found. // Retrieves the PrerenderManager, or NULL, if none was found.
PrerenderManager* MaybeGetPrerenderManager(); PrerenderManager* MaybeGetPrerenderManager();
......
...@@ -34,6 +34,17 @@ bool PrerenderRenderViewHostObserver::OnMessageReceived( ...@@ -34,6 +34,17 @@ bool PrerenderRenderViewHostObserver::OnMessageReceived(
IPC_BEGIN_MESSAGE_MAP(PrerenderRenderViewHostObserver, message) IPC_BEGIN_MESSAGE_MAP(PrerenderRenderViewHostObserver, message)
IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame, IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame,
OnDidStartProvisionalLoadForFrame) 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(IconHostMsg_UpdateFaviconURL, OnUpdateFaviconURL)
IPC_MESSAGE_HANDLER(ViewHostMsg_MaybeCancelPrerenderForHTML5Media, IPC_MESSAGE_HANDLER(ViewHostMsg_MaybeCancelPrerenderForHTML5Media,
OnMaybeCancelPrerenderForHTML5Media) OnMaybeCancelPrerenderForHTML5Media)
......
...@@ -166,6 +166,10 @@ class TabContentsWrapper : public TabContentsObserver, ...@@ -166,6 +166,10 @@ class TabContentsWrapper : public TabContentsObserver,
return translate_tab_helper_.get(); return translate_tab_helper_.get();
} }
prerender::PrerenderObserver* prerender_observer() {
return prerender_observer_.get();
}
// Overrides ----------------------------------------------------------------- // Overrides -----------------------------------------------------------------
// TabContentsObserver 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