diff options
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r-- | chrome/browser/prerender/prerender_field_trial.cc | 24 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_field_trial.h | 3 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 15 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 8 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager_factory.cc | 2 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_tab_helper.cc | 79 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_tab_helper.h | 30 |
7 files changed, 160 insertions, 1 deletions
diff --git a/chrome/browser/prerender/prerender_field_trial.cc b/chrome/browser/prerender/prerender_field_trial.cc index 6ff8c6a..312c9fb 100644 --- a/chrome/browser/prerender/prerender_field_trial.cc +++ b/chrome/browser/prerender/prerender_field_trial.cc @@ -29,6 +29,10 @@ int g_omnibox_trial_default_group_number = kint32min; const char kLocalPredictorTrialName[] = "PrerenderLocalPredictor"; const char kLocalPredictorEnabledGroup[] = "Enabled"; +const char kLoggedInPredictorTrialName[] = "PrerenderLoggedInPredictor"; +const char kLoggedInPredictorEnabledGroup[] = "Enabled"; +const char kLoggedInPredictorDisabledGroup[] = "Disabled"; + void SetupPrefetchFieldTrial() { chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); if (channel == chrome::VersionInfo::CHANNEL_STABLE || @@ -141,6 +145,7 @@ void SetupPrerenderFieldTrial() { } // end namespace void ConfigureOmniboxPrerender(); +void ConfigureLoggedInPredictor(); void ConfigurePrefetchAndPrerender(const CommandLine& command_line) { enum PrerenderOption { @@ -197,6 +202,7 @@ void ConfigurePrefetchAndPrerender(const CommandLine& command_line) { } ConfigureOmniboxPrerender(); + ConfigureLoggedInPredictor(); } void ConfigureOmniboxPrerender() { @@ -217,6 +223,19 @@ void ConfigureOmniboxPrerender() { kDisabledProbability); } +void ConfigureLoggedInPredictor() { + chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); + if (channel == chrome::VersionInfo::CHANNEL_STABLE || + channel == chrome::VersionInfo::CHANNEL_BETA) { + return; + } + scoped_refptr<FieldTrial> logged_in_predictor_trial( + FieldTrialList::FactoryGetFieldTrial( + kLoggedInPredictorTrialName, 100, + kLoggedInPredictorDisabledGroup, 2013, 12, 31, NULL)); + logged_in_predictor_trial->AppendGroup(kLoggedInPredictorEnabledGroup, 100); +} + bool IsOmniboxEnabled(Profile* profile) { if (!profile) return false; @@ -250,4 +269,9 @@ bool IsLocalPredictorEnabled() { kLocalPredictorEnabledGroup; } +bool IsLoggedInPredictorEnabled() { + return base::FieldTrialList::FindFullName(kLoggedInPredictorTrialName) == + kLoggedInPredictorEnabledGroup; +} + } // namespace prerender diff --git a/chrome/browser/prerender/prerender_field_trial.h b/chrome/browser/prerender/prerender_field_trial.h index 534cb89..7ce9d9a 100644 --- a/chrome/browser/prerender/prerender_field_trial.h +++ b/chrome/browser/prerender/prerender_field_trial.h @@ -24,6 +24,9 @@ bool IsOmniboxEnabled(Profile* profile); // Returns true iff the Prerender Local Predictor is enabled. bool IsLocalPredictorEnabled(); +// Returns true iff the LoggedIn Predictor is enabled. +bool IsLoggedInPredictorEnabled(); + } // namespace prerender #endif // CHROME_BROWSER_PRERENDER_PRERENDER_FIELD_TRIAL_H_ diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc index 7210591..8b08265 100644 --- a/chrome/browser/prerender/prerender_manager.cc +++ b/chrome/browser/prerender/prerender_manager.cc @@ -22,6 +22,9 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/common/cancelable_request.h" #include "chrome/browser/favicon/favicon_tab_helper.h" +#include "chrome/browser/predictors/logged_in_predictor_table.h" +#include "chrome/browser/predictors/predictor_database.h" +#include "chrome/browser/predictors/predictor_database_factory.h" #include "chrome/browser/prerender/prerender_condition.h" #include "chrome/browser/prerender/prerender_contents.h" #include "chrome/browser/prerender/prerender_field_trial.h" @@ -205,6 +208,13 @@ PrerenderManager::PrerenderManager(Profile* profile, if (IsLocalPredictorEnabled()) local_predictor_.reset(new PrerenderLocalPredictor(this)); + if (IsLoggedInPredictorEnabled() && !profile_->IsOffTheRecord()) { + predictors::PredictorDatabase* predictor_db = + predictors::PredictorDatabaseFactory::GetForProfile(profile); + if (predictor_db) + logged_in_predictor_table_ = predictor_db->logged_in_table(); + } + // Certain experiments override our default config_ values. switch (PrerenderManager::GetMode()) { case PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP: @@ -226,6 +236,11 @@ PrerenderManager::~PrerenderManager() { DCHECK(to_delete_prerenders_.empty()); } +scoped_refptr<predictors::LoggedInPredictorTable> +PrerenderManager::logged_in_predictor_table() { + return logged_in_predictor_table_; +} + void PrerenderManager::Shutdown() { DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN); STLDeleteElements(&prerender_conditions_); diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h index 9b0b7fc..fc4495a 100644 --- a/chrome/browser/prerender/prerender_manager.h +++ b/chrome/browser/prerender/prerender_manager.h @@ -40,6 +40,10 @@ namespace gfx { class Size; } +namespace predictors { +class LoggedInPredictorTable; +} + #if defined(COMPILER_GCC) namespace BASE_HASH_NAMESPACE { @@ -272,6 +276,8 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, virtual base::Time GetCurrentTime() const; virtual base::TimeTicks GetCurrentTimeTicks() const; + scoped_refptr<predictors::LoggedInPredictorTable> logged_in_predictor_table(); + protected: class PrerenderData : public base::SupportsWeakPtr<PrerenderData> { public: @@ -573,6 +579,8 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, scoped_ptr<PrerenderLocalPredictor> local_predictor_; + scoped_refptr<predictors::LoggedInPredictorTable> logged_in_predictor_table_; + DISALLOW_COPY_AND_ASSIGN(PrerenderManager); }; diff --git a/chrome/browser/prerender/prerender_manager_factory.cc b/chrome/browser/prerender/prerender_manager_factory.cc index f676d08..6d9cdb4 100644 --- a/chrome/browser/prerender/prerender_manager_factory.cc +++ b/chrome/browser/prerender/prerender_manager_factory.cc @@ -7,6 +7,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/extension_system_factory.h" #include "chrome/browser/history/history_service_factory.h" +#include "chrome/browser/predictors/predictor_database_factory.h" #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_dependency_manager.h" @@ -38,6 +39,7 @@ PrerenderManagerFactory::PrerenderManagerFactory() DependsOn(extensions::ExtensionSystemFactory::GetInstance()); // PrerenderLocalPredictor observers the history visit DB. DependsOn(HistoryServiceFactory::GetInstance()); + DependsOn(predictors::PredictorDatabaseFactory::GetInstance()); } PrerenderManagerFactory::~PrerenderManagerFactory() { diff --git a/chrome/browser/prerender/prerender_tab_helper.cc b/chrome/browser/prerender/prerender_tab_helper.cc index e74186e..bd04fd2 100644 --- a/chrome/browser/prerender/prerender_tab_helper.cc +++ b/chrome/browser/prerender/prerender_tab_helper.cc @@ -7,13 +7,18 @@ #include "base/metrics/histogram.h" #include "base/strings/string_number_conversions.h" #include "base/time.h" +#include "chrome/browser/predictors/logged_in_predictor_table.h" #include "chrome/browser/prerender/prerender_histograms.h" #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/browser/prerender/prerender_manager_factory.h" #include "chrome/browser/profiles/profile.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_details.h" +#include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_view.h" +#include "content/public/common/frame_navigate_params.h" #include "skia/ext/platform_canvas.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/rect.h" @@ -128,7 +133,8 @@ class PrerenderTabHelper::PixelStats { }; PrerenderTabHelper::PrerenderTabHelper(content::WebContents* web_contents) - : content::WebContentsObserver(web_contents) { + : content::WebContentsObserver(web_contents), + weak_factory_(this) { } PrerenderTabHelper::~PrerenderTabHelper() { @@ -138,6 +144,8 @@ void PrerenderTabHelper::ProvisionalChangeToMainFrameUrl( const GURL& url, content::RenderViewHost* render_view_host) { url_ = url; + RecordEvent(EVENT_MAINFRAME_CHANGE); + RecordEventIfLoggedInURL(EVENT_MAINFRAME_CHANGE_DOMAIN_LOGGED_IN, url); PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); if (!prerender_manager) return; @@ -154,6 +162,9 @@ void PrerenderTabHelper::DidCommitProvisionalLoadForFrame( content::RenderViewHost* render_view_host) { if (!is_main_frame) return; + RecordEvent(EVENT_MAINFRAME_COMMIT); + RecordEventIfLoggedInURL(EVENT_MAINFRAME_COMMIT_DOMAIN_LOGGED_IN, + validated_url); url_ = validated_url; PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); if (!prerender_manager) @@ -210,11 +221,40 @@ void PrerenderTabHelper::DidStartProvisionalLoadForFrame( } } +void PrerenderTabHelper::DidNavigateAnyFrame( + const content::LoadCommittedDetails& details, + const content::FrameNavigateParams& params) { + scoped_refptr<predictors::LoggedInPredictorTable> logged_in_table = + MaybeGetLoggedInTable(); + if (params.password_form.origin.is_valid() && logged_in_table.get()) { + content::BrowserThread::PostTask( + content::BrowserThread::DB, FROM_HERE, + base::Bind(&predictors::LoggedInPredictorTable::Add, + logged_in_table, + params.url)); + RecordEvent(EVENT_LOGIN_ACTION_ADDED); + } +} + PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const { return PrerenderManagerFactory::GetForProfile( Profile::FromBrowserContext(web_contents()->GetBrowserContext())); } +scoped_refptr<predictors::LoggedInPredictorTable> +PrerenderTabHelper::MaybeGetLoggedInTable() const { + RecordEvent(EVENT_LOGGED_IN_TABLE_REQUESTED); + PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); + if (prerender_manager) { + predictors::LoggedInPredictorTable* result = + prerender_manager->logged_in_predictor_table(); + if (result) + RecordEvent(EVENT_LOGGED_IN_TABLE_PRESENT); + return result; + } + return NULL; +} + bool PrerenderTabHelper::IsPrerendering() { PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); if (!prerender_manager) @@ -249,4 +289,41 @@ void PrerenderTabHelper::PrerenderSwappedIn() { } } +void PrerenderTabHelper::RecordEvent(PrerenderTabHelper::Event event) const { + UMA_HISTOGRAM_ENUMERATION("Prerender.TabHelperEvent", + event, PrerenderTabHelper::EVENT_MAX_VALUE); +} + +void PrerenderTabHelper::RecordEventIfLoggedInURL( + PrerenderTabHelper::Event event, const GURL& url) { + scoped_refptr<predictors::LoggedInPredictorTable> logged_in_table = + MaybeGetLoggedInTable(); + if (!logged_in_table.get()) + return; + scoped_ptr<bool> is_present(new bool); + scoped_ptr<bool> lookup_succeeded(new bool); + bool* is_present_ptr = is_present.get(); + bool* lookup_succeeded_ptr = lookup_succeeded.get(); + content::BrowserThread::PostTaskAndReply( + content::BrowserThread::DB, FROM_HERE, + base::Bind(&predictors::LoggedInPredictorTable::HasUserLoggedIn, + logged_in_table, + url, + is_present_ptr, + lookup_succeeded_ptr), + base::Bind(&PrerenderTabHelper::RecordEventIfLoggedInURLResult, + weak_factory_.GetWeakPtr(), + event, + base::Passed(&is_present), + base::Passed(&lookup_succeeded))); +} + +void PrerenderTabHelper::RecordEventIfLoggedInURLResult( + PrerenderTabHelper::Event event, + scoped_ptr<bool> is_present, + scoped_ptr<bool> lookup_succeeded) { + if (*lookup_succeeded && *is_present) + RecordEvent(event); +} + } // namespace prerender diff --git a/chrome/browser/prerender/prerender_tab_helper.h b/chrome/browser/prerender/prerender_tab_helper.h index 4c47e3b..92fa567 100644 --- a/chrome/browser/prerender/prerender_tab_helper.h +++ b/chrome/browser/prerender/prerender_tab_helper.h @@ -6,11 +6,16 @@ #define CHROME_BROWSER_PRERENDER_PRERENDER_TAB_HELPER_H_ #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/time.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "googleurl/src/gurl.h" +namespace predictors { +class LoggedInPredictorTable; +} + namespace prerender { class PrerenderManager; @@ -21,6 +26,17 @@ class PrerenderTabHelper : public content::WebContentsObserver, public content::WebContentsUserData<PrerenderTabHelper> { public: + enum Event { + EVENT_LOGGED_IN_TABLE_REQUESTED = 0, + EVENT_LOGGED_IN_TABLE_PRESENT = 1, + EVENT_MAINFRAME_CHANGE = 2, + EVENT_MAINFRAME_CHANGE_DOMAIN_LOGGED_IN = 3, + EVENT_MAINFRAME_COMMIT = 4, + EVENT_MAINFRAME_COMMIT_DOMAIN_LOGGED_IN = 5, + EVENT_LOGIN_ACTION_ADDED = 6, + EVENT_MAX_VALUE + }; + virtual ~PrerenderTabHelper(); // content::WebContentsObserver implementation. @@ -43,6 +59,10 @@ class PrerenderTabHelper const GURL& validated_url, content::PageTransition transition_type, content::RenderViewHost* render_view_host) OVERRIDE; + virtual void DidNavigateAnyFrame( + const content::LoadCommittedDetails& details, + const content::FrameNavigateParams& params) OVERRIDE; + // Called when this prerendered WebContents has just been swapped in. void PrerenderSwappedIn(); @@ -50,6 +70,10 @@ class PrerenderTabHelper explicit PrerenderTabHelper(content::WebContents* web_contents); friend class content::WebContentsUserData<PrerenderTabHelper>; + void RecordEvent(Event event) const; + void RecordEventIfLoggedInURL(Event event, const GURL& url); + void RecordEventIfLoggedInURLResult(Event event, scoped_ptr<bool> is_present, + scoped_ptr<bool> lookup_succeeded); // Helper class to compute pixel-based stats on the paint progress // between when a prerendered page is swapped in and when the onload event // fires. @@ -59,6 +83,10 @@ class PrerenderTabHelper // Retrieves the PrerenderManager, or NULL, if none was found. PrerenderManager* MaybeGetPrerenderManager() const; + // Retrieves the LoggedInPredictorTable, or NULL, if none was found. + scoped_refptr<predictors::LoggedInPredictorTable> + MaybeGetLoggedInTable() const; + // Returns whether the WebContents being observed is currently prerendering. bool IsPrerendering(); @@ -77,6 +105,8 @@ class PrerenderTabHelper // Current URL being loaded. GURL url_; + base::WeakPtrFactory<PrerenderTabHelper> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(PrerenderTabHelper); }; |