diff options
author | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-26 23:18:23 +0000 |
---|---|---|
committer | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-26 23:18:23 +0000 |
commit | 973407b94dc9fb9e191b9c98d886b17d14586fbc (patch) | |
tree | 81cb095460cce78456aa19ba51e6775d4e22eb7b /chrome | |
parent | ef637e981ce9f6f7989e586cd0518734f7743c6d (diff) | |
download | chromium_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.cc | 7 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.h | 4 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 20 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 11 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_plt_recorder.cc | 47 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_plt_recorder.h | 48 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.cc | 10 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.h | 4 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 |
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', |