summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r--chrome/browser/prerender/prerender_field_trial.cc24
-rw-r--r--chrome/browser/prerender/prerender_field_trial.h3
-rw-r--r--chrome/browser/prerender/prerender_manager.cc15
-rw-r--r--chrome/browser/prerender/prerender_manager.h8
-rw-r--r--chrome/browser/prerender/prerender_manager_factory.cc2
-rw-r--r--chrome/browser/prerender/prerender_tab_helper.cc79
-rw-r--r--chrome/browser/prerender/prerender_tab_helper.h30
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);
};