summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authortburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-26 23:18:23 +0000
committertburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-26 23:18:23 +0000
commit973407b94dc9fb9e191b9c98d886b17d14586fbc (patch)
tree81cb095460cce78456aa19ba51e6775d4e22eb7b /chrome
parentef637e981ce9f6f7989e586cd0518734f7743c6d (diff)
downloadchromium_src-973407b94dc9fb9e191b9c98d886b17d14586fbc.zip
chromium_src-973407b94dc9fb9e191b9c98d886b17d14586fbc.tar.gz
chromium_src-973407b94dc9fb9e191b9c98d886b17d14586fbc.tar.bz2
Add Perceived PageLoad Time (PPLT) metrics for Prerender Experiments.
BUG=None Test=None Review URL: http://codereview.chromium.org/6263014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72714 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/prerender/prerender_contents.cc7
-rw-r--r--chrome/browser/prerender/prerender_contents.h4
-rw-r--r--chrome/browser/prerender/prerender_manager.cc20
-rw-r--r--chrome/browser/prerender/prerender_manager.h11
-rw-r--r--chrome/browser/prerender/prerender_plt_recorder.cc47
-rw-r--r--chrome/browser/prerender/prerender_plt_recorder.h48
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc10
-rw-r--r--chrome/browser/tab_contents/tab_contents.h4
-rw-r--r--chrome/chrome_browser.gypi2
9 files changed, 146 insertions, 7 deletions
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index bd84b8e..c20a906 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -37,7 +37,8 @@ PrerenderContents::PrerenderContents(PrerenderManager* prerender_manager,
render_view_host_(NULL),
prerender_url_(url),
profile_(profile),
- page_id_(0) {
+ page_id_(0),
+ has_stopped_loading_(false) {
DCHECK(prerender_manager != NULL);
AddAliasURL(prerender_url_);
for (std::vector<GURL>::const_iterator it = alias_urls.begin();
@@ -279,3 +280,7 @@ bool PrerenderContents::MatchesURL(const GURL& url) const {
return std::find(alias_urls_.begin(), alias_urls_.end(), url)
!= alias_urls_.end();
}
+
+void PrerenderContents::DidStopLoading() {
+ has_stopped_loading_ = true;
+}
diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
index 4f55aba..9ac0929 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/chrome/browser/prerender/prerender_contents.h
@@ -67,6 +67,7 @@ class PrerenderContents : public RenderViewHostDelegate,
}
string16 title() const { return title_; }
int32 page_id() const { return page_id_; }
+ bool has_stopped_loading() const { return has_stopped_loading_; }
// Indicates whether this prerendered page can be used for the provided
// URL, i.e. whether there is a match.
@@ -91,6 +92,7 @@ class PrerenderContents : public RenderViewHostDelegate,
IPC::Message* reply_msg,
bool* did_suppress_message);
virtual void Close(RenderViewHost* render_view_host);
+ virtual void DidStopLoading();
virtual RendererPreferences GetRendererPrefs(Profile* profile) const;
// RenderViewHostDelegate::View
@@ -206,6 +208,8 @@ class PrerenderContents : public RenderViewHostDelegate,
// such as HTTP redirects or javascript redirects.
std::vector<GURL> alias_urls_;
+ bool has_stopped_loading_;
+
DISALLOW_COPY_AND_ASSIGN(PrerenderContents);
};
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index cc5b683..0459058 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/prerender/prerender_manager.h"
#include "base/logging.h"
+#include "base/metrics/histogram.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_thread.h"
@@ -32,7 +33,8 @@ PrerenderManager::PrerenderManager(Profile* profile)
max_prerender_age_(base::TimeDelta::FromSeconds(
kDefaultMaxPrerenderAgeSeconds)),
max_elements_(kDefaultMaxPrerenderElements),
- prerender_contents_factory_(PrerenderContents::CreateFactory()) {
+ prerender_contents_factory_(PrerenderContents::CreateFactory()),
+ mode_(PRERENDER_MODE_ENABLED) {
}
PrerenderManager::~PrerenderManager() {
@@ -115,6 +117,9 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tc, const GURL& url) {
if (!title.empty())
tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title));
+ if (pc->has_stopped_loading())
+ tc->DidStopLoading();
+
return true;
}
@@ -148,6 +153,19 @@ PrerenderContents* PrerenderManager::CreatePrerenderContents(
this, profile_, url, alias_urls);
}
+void PrerenderManager::RecordPerceivedPageLoadTime(base::TimeDelta pplt) {
+ switch(mode_) {
+ case PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP:
+ UMA_HISTOGRAM_TIMES("PLT.PerceivedPageLoadTime_PrerenderControl", pplt);
+ break;
+ case PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP:
+ UMA_HISTOGRAM_TIMES("PLT.PerceivedPageLoadTime_PrerenderTreatment", pplt);
+ break;
+ default:
+ break;
+ }
+}
+
PrerenderContents* PrerenderManager::FindEntry(const GURL& url) {
for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
it != prerender_list_.end();
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index d23cbe5e..62967d8 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -22,6 +22,13 @@ class TabContents;
// views of webpages.
class PrerenderManager : public base::RefCounted<PrerenderManager> {
public:
+ enum PrerenderManagerMode {
+ PRERENDER_MODE_DISABLED,
+ PRERENDER_MODE_ENABLED,
+ PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP,
+ PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP
+ };
+
// Owned by a Profile object for the lifetime of the profile.
explicit PrerenderManager(Profile* profile);
@@ -45,6 +52,8 @@ class PrerenderManager : public base::RefCounted<PrerenderManager> {
// Returns NULL if the specified URL has not been prerendered.
PrerenderContents* GetEntry(const GURL& url);
+ void RecordPerceivedPageLoadTime(base::TimeDelta pplt);
+
base::TimeDelta max_prerender_age() const { return max_prerender_age_; }
void set_max_prerender_age(base::TimeDelta td) { max_prerender_age_ = td; }
unsigned int max_elements() const { return max_elements_; }
@@ -91,6 +100,8 @@ class PrerenderManager : public base::RefCounted<PrerenderManager> {
scoped_ptr<PrerenderContents::Factory> prerender_contents_factory_;
+ PrerenderManagerMode mode_;
+
DISALLOW_COPY_AND_ASSIGN(PrerenderManager);
};
diff --git a/chrome/browser/prerender/prerender_plt_recorder.cc b/chrome/browser/prerender/prerender_plt_recorder.cc
new file mode 100644
index 0000000..60b5da9
--- /dev/null
+++ b/chrome/browser/prerender/prerender_plt_recorder.cc
@@ -0,0 +1,47 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/prerender/prerender_plt_recorder.h"
+
+#include "base/time.h"
+#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/render_messages.h"
+
+PrerenderPLTRecorder::PrerenderPLTRecorder(TabContents* tab_contents)
+ : tab_contents_(tab_contents),
+ pplt_load_start_() {
+
+}
+
+PrerenderPLTRecorder::~PrerenderPLTRecorder() {
+}
+
+bool PrerenderPLTRecorder::OnMessageReceived(const IPC::Message& message) {
+ IPC_BEGIN_MESSAGE_MAP(PrerenderPLTRecorder, message)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame,
+ OnDidStartProvisionalLoadForFrame)
+ IPC_END_MESSAGE_MAP()
+ return false;
+}
+
+void PrerenderPLTRecorder::OnDidStartProvisionalLoadForFrame(int64 frame_id,
+ bool is_main_frame,
+ const GURL& url) {
+ if (is_main_frame) {
+ // Record the beginning of a new PPLT navigation.
+ pplt_load_start_ = base::TimeTicks::Now();
+ }
+}
+
+void PrerenderPLTRecorder::DidStopLoading() {
+ // Compute the PPLT metric and report it in a histogram, if needed.
+ PrerenderManager* pm = tab_contents_->profile()->GetPrerenderManager();
+ if (pm != NULL && !pplt_load_start_.is_null())
+ pm->RecordPerceivedPageLoadTime(base::TimeTicks::Now() - pplt_load_start_);
+
+ // Reset the PPLT metric.
+ pplt_load_start_ = base::TimeTicks();
+}
diff --git a/chrome/browser/prerender/prerender_plt_recorder.h b/chrome/browser/prerender/prerender_plt_recorder.h
new file mode 100644
index 0000000..bf1e94e
--- /dev/null
+++ b/chrome/browser/prerender/prerender_plt_recorder.h
@@ -0,0 +1,48 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_PLT_RECORDER_H_
+#define CHROME_BROWSER_PRERENDER_PRERENDER_PLT_RECORDER_H_
+#pragma once
+
+#include <list>
+#include <vector>
+
+#include "base/scoped_ptr.h"
+#include "base/time.h"
+#include "chrome/browser/tab_contents/web_navigation_observer.h"
+#include "googleurl/src/gurl.h"
+
+class PrerenderContents;
+class Profile;
+class TabContents;
+
+// PrerenderPLTRecorder is responsible for recording perceived pageload times
+// to compare PLT's with prerendering enabled and disabled.
+class PrerenderPLTRecorder : public WebNavigationObserver {
+ public:
+ explicit PrerenderPLTRecorder(TabContents* tab_contents);
+ virtual ~PrerenderPLTRecorder();
+
+ // WebNavigationObserver implementation.
+ virtual bool OnMessageReceived(const IPC::Message& message);
+
+ // Message handler.
+ void OnDidStartProvisionalLoadForFrame(int64 frame_id,
+ bool main_frame,
+ const GURL& url);
+
+ virtual void DidStopLoading();
+
+ private:
+ TabContents* tab_contents_;
+
+ // System time at which the current load was started for the purpose of
+ // the perceived page load time (PPLT).
+ base::TimeTicks pplt_load_start_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrerenderPLTRecorder);
+};
+
+#endif // CHROME_BROWSER_PRERENDER_PRERENDER_PLT_RECORDER_H_
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index 7d1703e..370ff80e 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -52,6 +52,7 @@
#include "chrome/browser/plugin_installer_infobar_delegate.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_plt_recorder.h"
#include "chrome/browser/printing/print_preview_tab_controller.h"
#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/profiles/profile.h"
@@ -367,6 +368,7 @@ TabContents::TabContents(Profile* profile,
autocomplete_history_manager_(),
autofill_manager_(),
plugin_installer_(),
+ prerender_plt_recorder_(),
bookmark_drag_(NULL),
ALLOW_THIS_IN_INITIALIZER_LIST(fav_icon_helper_(this)),
is_loading_(false),
@@ -472,6 +474,8 @@ TabContents::TabContents(Profile* profile,
AddNavigationObserver(autofill_manager_.get());
autocomplete_history_manager_.reset(new AutocompleteHistoryManager(this));
AddNavigationObserver(autocomplete_history_manager_.get());
+ prerender_plt_recorder_.reset(new PrerenderPLTRecorder(this));
+ AddNavigationObserver(prerender_plt_recorder_.get());
AddNavigationObserver(&fav_icon_helper_);
AddNavigationObserver(printing_.get());
}
@@ -3393,12 +3397,8 @@ void TabContents::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) {
bool TabContents::MaybeUsePreloadedPage(const GURL& url) {
PrerenderManager* pm = profile()->GetPrerenderManager();
if (pm != NULL) {
- if (pm->MaybeUsePreloadedPage(this, url)) {
- // TODO(tburkard): If the preloaded page has not finished preloading
- // yet, we should not do this.
- DidStopLoading();
+ if (pm->MaybeUsePreloadedPage(this, url))
return true;
- }
}
return false;
}
diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h
index a40edfb..b0af381 100644
--- a/chrome/browser/tab_contents/tab_contents.h
+++ b/chrome/browser/tab_contents/tab_contents.h
@@ -68,6 +68,7 @@ class OmniboxSearchHint;
class PluginInstallerInfoBarDelegate;
class Profile;
class PrerenderManager;
+class PrerenderPLTRecorder;
struct RendererPreferences;
class RenderViewHost;
class SessionStorageNamespace;
@@ -1124,6 +1125,9 @@ class TabContents : public PageNavigator,
// PluginInstallerInfoBarDelegate, lazily created.
scoped_ptr<PluginInstallerInfoBarDelegate> plugin_installer_;
+ // Prerender PageLoadTime Recorder.
+ scoped_ptr<PrerenderPLTRecorder> prerender_plt_recorder_;
+
// TabContentsSSLHelper, lazily created.
scoped_ptr<TabContentsSSLHelper> ssl_helper_;
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index c6f329a..b2d44d1 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2082,6 +2082,8 @@
'browser/prerender/prerender_contents.h',
'browser/prerender/prerender_manager.cc',
'browser/prerender/prerender_manager.h',
+ 'browser/prerender/prerender_plt_recorder.cc',
+ 'browser/prerender/prerender_plt_recorder.h',
'browser/prerender/prerender_resource_handler.h',
'browser/prerender/prerender_resource_handler.cc',
'browser/printing/print_dialog_gtk.cc',