| Index: chrome/browser/ui/webui/sync_promo_handler.cc
|
| diff --git a/chrome/browser/ui/webui/sync_promo_handler.cc b/chrome/browser/ui/webui/sync_promo_handler.cc
|
| index fbee2dc2dbb191ce649e899bd91c0078dcef62a1..c9b1254a5cf2d7dda8ac6f498b25a252c0986bfe 100644
|
| --- a/chrome/browser/ui/webui/sync_promo_handler.cc
|
| +++ b/chrome/browser/ui/webui/sync_promo_handler.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/time.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/sync/profile_sync_service.h"
|
| @@ -20,8 +21,42 @@
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "content/browser/tab_contents/tab_contents.h"
|
| -#include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/notification_details.h"
|
| +#include "content/public/browser/notification_service.h"
|
| +
|
| +namespace {
|
| +
|
| +// User actions on the sync promo (aka "Sign in to Chrome").
|
| +enum SyncPromoUserFlowActionEnums {
|
| + SYNC_PROMO_VIEWED,
|
| + SYNC_PROMO_LEARN_MORE_CLICKED,
|
| + SYNC_PROMO_ACCOUNT_HELP_CLICKED,
|
| + SYNC_PROMO_CREATE_ACCOUNT_CLICKED,
|
| + SYNC_PROMO_SKIP_CLICKED,
|
| + SYNC_PROMO_SIGN_IN_ATTEMPTED,
|
| + SYNC_PROMO_SIGNED_IN_SUCCESSFULLY,
|
| + SYNC_PROMO_ADVANCED_CLICKED,
|
| + SYNC_PROMO_ENCRYPTION_HELP_CLICKED,
|
| + SYNC_PROMO_CANCELLED_AFTER_SIGN_IN,
|
| + SYNC_PROMO_CONFIRMED_AFTER_SIGN_IN,
|
| + SYNC_PROMO_CLOSED_TAB,
|
| + SYNC_PROMO_CLOSED_WINDOW,
|
| + SYNC_PROMO_LEFT_DURING_THROBBER,
|
| + SYNC_PROMO_BUCKET_BOUNDARY,
|
| + SYNC_PROMO_FIRST_VALID_JS_ACTION = SYNC_PROMO_LEARN_MORE_CLICKED,
|
| + SYNC_PROMO_LAST_VALID_JS_ACTION = SYNC_PROMO_CONFIRMED_AFTER_SIGN_IN,
|
| +};
|
| +
|
| +// This was added because of the need to change the existing UMA enum for the
|
| +// sync promo mid-flight. Ideally these values would be contiguous, but the
|
| +// real world is not always ideal.
|
| +static bool IsValidUserFlowAction(int action) {
|
| + return (action >= SYNC_PROMO_FIRST_VALID_JS_ACTION &&
|
| + action <= SYNC_PROMO_LAST_VALID_JS_ACTION) ||
|
| + action == SYNC_PROMO_LEFT_DURING_THROBBER;
|
| +}
|
| +
|
| +} // namespace
|
|
|
| SyncPromoHandler::SyncPromoHandler(ProfileManager* profile_manager)
|
| : SyncSetupHandler(profile_manager),
|
| @@ -67,12 +102,21 @@ void SyncPromoHandler::RegisterMessages() {
|
| web_ui_->RegisterMessageCallback("SyncPromo:Initialize",
|
| base::Bind(&SyncPromoHandler::HandleInitializeSyncPromo,
|
| base::Unretained(this)));
|
| - web_ui_->RegisterMessageCallback("SyncPromo:UserFlowAction",
|
| - base::Bind(&SyncPromoHandler::HandleUserFlowAction,
|
| + web_ui_->RegisterMessageCallback("SyncPromo:RecordSignInAttempts",
|
| + base::Bind(&SyncPromoHandler::HandleRecordSignInAttempts,
|
| + base::Unretained(this)));
|
| + web_ui_->RegisterMessageCallback("SyncPromo:RecordThrobberTime",
|
| + base::Bind(&SyncPromoHandler::HandleRecordThrobberTime,
|
| base::Unretained(this)));
|
| web_ui_->RegisterMessageCallback("SyncPromo:ShowAdvancedSettings",
|
| base::Bind(&SyncPromoHandler::HandleShowAdvancedSettings,
|
| base::Unretained(this)));
|
| + web_ui_->RegisterMessageCallback("SyncPromo:UserFlowAction",
|
| + base::Bind(&SyncPromoHandler::HandleUserFlowAction,
|
| + base::Unretained(this)));
|
| + web_ui_->RegisterMessageCallback("SyncPromo:UserSkipped",
|
| + base::Bind(&SyncPromoHandler::HandleUserSkipped,
|
| + base::Unretained(this)));
|
| SyncSetupHandler::RegisterMessages();
|
| }
|
|
|
| @@ -101,7 +145,7 @@ void SyncPromoHandler::Observe(int type,
|
| switch (type) {
|
| case content::NOTIFICATION_TAB_CLOSING: {
|
| if (!window_already_closed_)
|
| - RecordUserFlowAction(extension_misc::SYNC_PROMO_CLOSED_TAB);
|
| + RecordUserFlowAction(SYNC_PROMO_CLOSED_TAB);
|
| break;
|
| }
|
| case chrome::NOTIFICATION_BROWSER_CLOSING: {
|
| @@ -109,7 +153,7 @@ void SyncPromoHandler::Observe(int type,
|
| Browser* browser = content::Source<Browser>(source).ptr();
|
| if (browser->tabstrip_model()->GetWrapperIndex(
|
| web_ui_->tab_contents()) != TabStripModel::kNoTab) {
|
| - RecordUserFlowAction(extension_misc::SYNC_PROMO_CLOSED_WINDOW);
|
| + RecordUserFlowAction(SYNC_PROMO_CLOSED_WINDOW);
|
| window_already_closed_ = true;
|
| }
|
| break;
|
| @@ -149,7 +193,7 @@ void SyncPromoHandler::HandleInitializeSyncPromo(const base::ListValue* args) {
|
|
|
| OpenSyncSetup();
|
| // We don't need to compute anything for this, just do this every time.
|
| - RecordUserFlowAction(extension_misc::SYNC_PROMO_VIEWED);
|
| + RecordUserFlowAction(SYNC_PROMO_VIEWED);
|
| // Increment view count first and show natural numbers in stats rather than 0
|
| // based starting point (if it happened to be our first time showing this).
|
| IncrementViewCountBy(1);
|
| @@ -165,22 +209,38 @@ void SyncPromoHandler::HandleShowAdvancedSettings(
|
| url += chrome::kSyncSetupSubPage;
|
| web_ui_->tab_contents()->OpenURL(GURL(url), GURL(), CURRENT_TAB,
|
| content::PAGE_TRANSITION_LINK);
|
| - RecordUserFlowAction(extension_misc::SYNC_PROMO_ADVANCED_CLICKED);
|
| + RecordUserFlowAction(SYNC_PROMO_ADVANCED_CLICKED);
|
| +}
|
| +
|
| +// TODO(dbeam): Replace with metricsHandler:recordHistogramTime when it exists.
|
| +void SyncPromoHandler::HandleRecordThrobberTime(const base::ListValue* args) {
|
| + double time_double;
|
| + CHECK(args->GetDouble(0, &time_double));
|
| + UMA_HISTOGRAM_TIMES("SyncPromo.ThrobberTime",
|
| + base::TimeDelta::FromMilliseconds(time_double));
|
| +}
|
| +
|
| +// TODO(dbeam): Replace with metricsHandler:recordHistogramCount when it exists.
|
| +void SyncPromoHandler::HandleRecordSignInAttempts(const base::ListValue* args) {
|
| + double count_double;
|
| + CHECK(args->GetDouble(0, &count_double));
|
| + UMA_HISTOGRAM_COUNTS("SyncPromo.SignInAttempts", count_double);
|
| }
|
|
|
| void SyncPromoHandler::HandleUserFlowAction(const base::ListValue* args) {
|
| double action_double;
|
| CHECK(args->GetDouble(0, &action_double));
|
| int action = static_cast<int>(action_double);
|
| - if (action >= extension_misc::SYNC_PROMO_FIRST_VALID_JS_ACTION &&
|
| - action <= extension_misc::SYNC_PROMO_LAST_VALID_JS_ACTION) {
|
| +
|
| + if (IsValidUserFlowAction(action))
|
| RecordUserFlowAction(action);
|
| - } else {
|
| + else
|
| NOTREACHED() << "Attempt to record invalid user flow action on sync promo.";
|
| - }
|
| +}
|
|
|
| - if (action == extension_misc::SYNC_PROMO_SKIP_CLICKED)
|
| - SyncPromoUI::SetUserSkippedSyncPromo(Profile::FromWebUI(web_ui_));
|
| +void SyncPromoHandler::HandleUserSkipped(const base::ListValue* args) {
|
| + SyncPromoUI::SetUserSkippedSyncPromo(Profile::FromWebUI(web_ui_));
|
| + RecordUserFlowAction(SYNC_PROMO_SKIP_CLICKED);
|
| }
|
|
|
| int SyncPromoHandler::GetViewCount() const {
|
| @@ -199,5 +259,5 @@ int SyncPromoHandler::IncrementViewCountBy(unsigned int amount) {
|
| void SyncPromoHandler::RecordUserFlowAction(int action) {
|
| // Send an enumeration to our single user flow histogram.
|
| UMA_HISTOGRAM_ENUMERATION("SyncPromo.UserFlow", action,
|
| - extension_misc::SYNC_PROMO_BUCKET_BOUNDARY);
|
| + SYNC_PROMO_BUCKET_BOUNDARY);
|
| }
|
|
|