diff options
author | gogerald <gogerald@chromium.org> | 2015-12-07 16:49:37 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-08 00:50:39 +0000 |
commit | 71bf6c90880518262efc373771eb621617d09c39 (patch) | |
tree | d9f5c0dfb9d2d3b9b388f060d36d56a694c80a1b | |
parent | f98b00b97ed4d2eb9747b8815265058bcedb1cbc (diff) | |
download | chromium_src-71bf6c90880518262efc373771eb621617d09c39.zip chromium_src-71bf6c90880518262efc373771eb621617d09c39.tar.gz chromium_src-71bf6c90880518262efc373771eb621617d09c39.tar.bz2 |
Implement newly designed sign-in related histograms for desktop platorms.
This CL splits signin_metrics::Source into signin_metrics::AccessPoint and signin_metrics::Reason. It implements three new histograms Signin.SigninStartedAccessPoint, Signin.SigninCompletedAccessPoint and Signin.SigninReason. These histograms could replace Signin.SigninSource histogram with extra capabilities.
https://docs.google.com/a/google.com/document/d/1-gXYAMXXgsJhk6jxO55RuYJ00JBGermevJZ0sIlk6ko/edit?usp=sharingusp=sharing contains details.
BUG=532557
Review URL: https://codereview.chromium.org/1473543002
Cr-Commit-Position: refs/heads/master@{#363640}
73 files changed, 736 insertions, 425 deletions
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index 8ec1516..56b78e5 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm @@ -1126,10 +1126,11 @@ class AppControllerProfileObserver : public ProfileInfoCacheObserver { break; case IDC_SHOW_SYNC_SETUP: if (Browser* browser = ActivateBrowser(lastProfile)) { - chrome::ShowBrowserSigninOrSettings(browser, - signin_metrics::SOURCE_MENU); + chrome::ShowBrowserSigninOrSettings( + browser, signin_metrics::AccessPoint::ACCESS_POINT_MENU); } else { - chrome::OpenSyncSetupWindow(lastProfile, signin_metrics::SOURCE_MENU); + chrome::OpenSyncSetupWindow( + lastProfile, signin_metrics::AccessPoint::ACCESS_POINT_MENU); } break; case IDC_TASK_MANAGER: diff --git a/chrome/browser/extensions/api/principals_private/principals_private_api.cc b/chrome/browser/extensions/api/principals_private/principals_private_api.cc index 491f419..867990d 100644 --- a/chrome/browser/extensions/api/principals_private/principals_private_api.cc +++ b/chrome/browser/extensions/api/principals_private/principals_private_api.cc @@ -10,6 +10,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" #include "components/signin/core/browser/signin_header_helper.h" +#include "components/signin/core/browser/signin_metrics.h" #include "components/signin/core/common/profile_management_switches.h" namespace extensions { @@ -36,7 +37,8 @@ bool PrincipalsPrivateShowAvatarBubbleFunction::RunSyncSafe() { if (browser) { browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); } return true; } diff --git a/chrome/browser/printing/print_dialog_cloud.cc b/chrome/browser/printing/print_dialog_cloud.cc index b22feeb..1d061aa 100644 --- a/chrome/browser/printing/print_dialog_cloud.cc +++ b/chrome/browser/printing/print_dialog_cloud.cc @@ -13,6 +13,7 @@ #include "components/cloud_devices/common/cloud_devices_urls.h" #include "components/google/core/browser/google_util.h" #include "components/signin/core/browser/signin_header_helper.h" +#include "components/signin/core/browser/signin_metrics.h" #include "components/signin/core/common/profile_management_switches.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" @@ -69,7 +70,8 @@ void CreateCloudPrintSigninTab(Browser* browser, browser->window()->ShowAvatarBubbleFromAvatarButton( add_account ? BrowserWindow::AVATAR_BUBBLE_MODE_ADD_ACCOUNT : BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_CLOUD_PRINT); } else { GURL url = add_account ? cloud_devices::GetCloudPrintAddAccountURL() : cloud_devices::GetCloudPrintSigninURL(); diff --git a/chrome/browser/profiles/host_zoom_map_browsertest.cc b/chrome/browser/profiles/host_zoom_map_browsertest.cc index f3d7764..aa2803a 100644 --- a/chrome/browser/profiles/host_zoom_map_browsertest.cc +++ b/chrome/browser/profiles/host_zoom_map_browsertest.cc @@ -20,6 +20,7 @@ #include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_impl.h" +#include "chrome/browser/signin/signin_promo.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h" @@ -126,6 +127,13 @@ class HostZoomMapBrowserTest : public InProcessBrowserTest { return results; } + std::string GetSigninPromoURL() { + return signin::GetPromoURL( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false) + .spec(); + } + GURL ConstructTestServerURL(const char* url_template) { return GURL(base::StringPrintf( url_template, embedded_test_server()->port())); @@ -243,7 +251,7 @@ IN_PROC_BROWSER_TEST_F(HostZoomMapBrowserTest, ZoomEventsWorkForOffTheRecord) { IN_PROC_BROWSER_TEST_F( HostZoomMapBrowserTest, WebviewBasedSigninUsesDefaultStoragePartitionForEmbedder) { - GURL test_url = ConstructTestServerURL(chrome::kChromeUIChromeSigninURL); + GURL test_url = ConstructTestServerURL(GetSigninPromoURL().c_str()); std::string test_host(test_url.host()); std::string test_scheme(test_url.scheme()); ui_test_utils::NavigateToURL(browser(), test_url); @@ -281,7 +289,7 @@ IN_PROC_BROWSER_TEST_F(HostZoomMapIframeSigninBrowserTest, // test currently relies on the signin page being loaded into a non-default // storage partition (and verifies this is the case), but ultimately it would // be better not to rely on what the signin page is doing. - GURL test_url = ConstructTestServerURL(chrome::kChromeUIChromeSigninURL); + GURL test_url = ConstructTestServerURL(GetSigninPromoURL().c_str()); std::string test_host(test_url.host()); std::string test_scheme(test_url.scheme()); ui_test_utils::NavigateToURL(browser(), test_url); diff --git a/chrome/browser/resources/options/browser_options.js b/chrome/browser/resources/options/browser_options.js index ae7c092..c9fa7ba 100644 --- a/chrome/browser/resources/options/browser_options.js +++ b/chrome/browser/resources/options/browser_options.js @@ -203,7 +203,7 @@ cr.define('options', function() { } else if (cr.isChromeOS) { SyncSetupOverlay.showSetupUI(); } else { - SyncSetupOverlay.startSignIn(); + SyncSetupOverlay.startSignIn('access-point-settings'); } }; $('customize-sync').onclick = function(event) { diff --git a/chrome/browser/resources/options/manage_profile_overlay.js b/chrome/browser/resources/options/manage_profile_overlay.js index 1f80642..df9862b 100644 --- a/chrome/browser/resources/options/manage_profile_overlay.js +++ b/chrome/browser/resources/options/manage_profile_overlay.js @@ -95,7 +95,7 @@ cr.define('options', function() { $('create-profile-supervised-sign-in-link').onclick = function(event) { - SyncSetupOverlay.startSignIn(); + SyncSetupOverlay.startSignIn('access-point-supervised-user'); }; $('create-profile-supervised-sign-in-again-link').onclick = diff --git a/chrome/browser/resources/options/sync_setup_overlay.js b/chrome/browser/resources/options/sync_setup_overlay.js index 4b59449..d05b778 100644 --- a/chrome/browser/resources/options/sync_setup_overlay.js +++ b/chrome/browser/resources/options/sync_setup_overlay.js @@ -827,8 +827,8 @@ cr.define('options', function() { * already signed in. * @private */ - startSignIn_: function() { - chrome.send('SyncSetupStartSignIn'); + startSignIn_: function(accessPoint) { + chrome.send('SyncSetupStartSignIn', [accessPoint]); }, /** @@ -840,34 +840,16 @@ cr.define('options', function() { }, }; - // These methods are for general consumption. - SyncSetupOverlay.closeOverlay = function() { - SyncSetupOverlay.getInstance().closeOverlay_(); - }; - - SyncSetupOverlay.showSetupUI = function() { - SyncSetupOverlay.getInstance().showSetupUI_(); - }; - - SyncSetupOverlay.startSignIn = function() { - SyncSetupOverlay.getInstance().startSignIn_(); - }; - - SyncSetupOverlay.doSignOutOnAuthError = function() { - SyncSetupOverlay.getInstance().doSignOutOnAuthError_(); - }; - - SyncSetupOverlay.showSyncSetupPage = function(page, args) { - SyncSetupOverlay.getInstance().showSyncSetupPage_(page, args); - }; - - SyncSetupOverlay.showCustomizePage = function(args, index) { - SyncSetupOverlay.getInstance().showCustomizePage_(args, index); - }; - - SyncSetupOverlay.showStopSyncingUI = function() { - SyncSetupOverlay.getInstance().showStopSyncingUI_(); - }; + // Forward public APIs to private implementations. + cr.makePublic(SyncSetupOverlay, [ + 'closeOverlay', + 'showSetupUI', + 'startSignIn', + 'doSignOutOnAuthError', + 'showSyncSetupPage', + 'showCustomizePage', + 'showStopSyncingUI', + ]); // Export return { diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc index 4914aef..9118ea6 100644 --- a/chrome/browser/signin/chrome_signin_helper.cc +++ b/chrome/browser/signin/chrome_signin_helper.cc @@ -74,8 +74,9 @@ void ProcessMirrorHeaderUIThread(int child_id, } signin_metrics::LogAccountReconcilorStateOnGaiaResponse( account_reconcilor->GetState()); - browser->window()->ShowAvatarBubbleFromAvatarButton(bubble_mode, - manage_accounts_params); + browser->window()->ShowAvatarBubbleFromAvatarButton( + bubble_mode, manage_accounts_params, + signin_metrics::AccessPoint::ACCESS_POINT_CONTENT_AREA); } #else // BUILDFLAG(ANDROID_JAVA_UI) if (service_type == signin::GAIA_SERVICE_TYPE_INCOGNITO) { diff --git a/chrome/browser/signin/signin_global_error.cc b/chrome/browser/signin/signin_global_error.cc index 71f8a46..9369b83a 100644 --- a/chrome/browser/signin/signin_global_error.cc +++ b/chrome/browser/signin/signin_global_error.cc @@ -98,8 +98,8 @@ void SigninGlobalError::ExecuteMenuItem(Browser* browser) { signin_metrics::HISTOGRAM_REAUTH_SHOWN, signin_metrics::HISTOGRAM_REAUTH_MAX); browser->window()->ShowAvatarBubbleFromAvatarButton( - BrowserWindow::AVATAR_BUBBLE_MODE_REAUTH, - signin::ManageAccountsParams()); + BrowserWindow::AVATAR_BUBBLE_MODE_REAUTH, signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_MENU); #endif } diff --git a/chrome/browser/signin/signin_promo.cc b/chrome/browser/signin/signin_promo.cc index 1377d70..657aaa8 100644 --- a/chrome/browser/signin/signin_promo.cc +++ b/chrome/browser/signin/signin_promo.cc @@ -165,25 +165,51 @@ void SetUserSkippedPromo(Profile* profile) { profile->GetPrefs()->SetBoolean(prefs::kSignInPromoUserSkipped, true); } -GURL GetLandingURL(const char* option, int value) { - std::string url = base::StringPrintf("%s/success.html?%s=%d", - extensions::kGaiaAuthExtensionOrigin, - option, - value); +GURL GetLandingURL(signin_metrics::AccessPoint access_point) { + std::string url = base::StringPrintf( + "%s/success.html?%s=%d", extensions::kGaiaAuthExtensionOrigin, + kSignInPromoQueryKeyAccessPoint, static_cast<int>(access_point)); + + // TODO(gogerald): right now, gaia server needs to distinguish the source from + // signin_metrics::SOURCE_START_PAGE, signin_metrics::SOURCE_SETTINGS and + // the others to show advanced sync settings, remove them after + // switching to Minute Maid sign in flow. + if (access_point == signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE) { + base::StringAppendF(&url, "&%s=%d", kSignInPromoQueryKeySource, + signin_metrics::SOURCE_START_PAGE); + } else if (access_point == + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS) { + base::StringAppendF(&url, "&%s=%d", kSignInPromoQueryKeySource, + signin_metrics::SOURCE_SETTINGS); + } else { + base::StringAppendF(&url, "&%s=%d", kSignInPromoQueryKeySource, + signin_metrics::SOURCE_OTHERS); + } + return GURL(url); } -GURL GetPromoURL(signin_metrics::Source source, bool auto_close) { - return GetPromoURL(source, auto_close, false /* is_constrained */); +GURL GetPromoURL(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, + bool auto_close) { + return GetPromoURL(access_point, reason, auto_close, + false /* is_constrained */); } -GURL GetPromoURL(signin_metrics::Source source, +GURL GetPromoURL(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, bool auto_close, bool is_constrained) { - DCHECK_NE(signin_metrics::SOURCE_UNKNOWN, source); + CHECK_LT(static_cast<int>(access_point), + static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_MAX)); + CHECK_LT(static_cast<int>(reason), + static_cast<int>(signin_metrics::Reason::REASON_MAX)); std::string url(chrome::kChromeUIChromeSigninURL); - base::StringAppendF(&url, "?%s=%d", kSignInPromoQueryKeySource, source); + base::StringAppendF(&url, "?%s=%d", kSignInPromoQueryKeyAccessPoint, + static_cast<int>(access_point)); + base::StringAppendF(&url, "&%s=%d", kSignInPromoQueryKeyReason, + static_cast<int>(reason)); if (auto_close) base::StringAppendF(&url, "&%s=1", kSignInPromoQueryKeyAutoClose); if (is_constrained) @@ -191,16 +217,20 @@ GURL GetPromoURL(signin_metrics::Source source, return GURL(url); } -GURL GetReauthURL(Profile* profile, const std::string& account_id) { +GURL GetReauthURL(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, + Profile* profile, + const std::string& account_id) { AccountInfo info = AccountTrackerServiceFactory::GetForProfile(profile) ->GetAccountInfo(account_id); - return GetReauthURLWithEmail(info.email); + return GetReauthURLWithEmail(access_point, reason, info.email); } -GURL GetReauthURLWithEmail(const std::string& email) { - GURL url = signin::GetPromoURL( - signin_metrics::SOURCE_REAUTH, true /* auto_close */, - true /* is_constrained */); +GURL GetReauthURLWithEmail(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, + const std::string& email) { + GURL url = signin::GetPromoURL(access_point, reason, true /* auto_close */, + true /* is_constrained */); url = net::AppendQueryParameter(url, "email", email); url = net::AppendQueryParameter(url, "validateEmail", "1"); @@ -223,24 +253,27 @@ GURL GetSigninPartitionURL() { } GURL GetSigninURLFromBubbleViewMode(Profile* profile, - profiles::BubbleViewMode mode) { + profiles::BubbleViewMode mode, + signin_metrics::AccessPoint access_point) { switch (mode) { case profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN: - return GetPromoURL(signin_metrics::SOURCE_AVATAR_BUBBLE_SIGN_IN, - false /* auto_close */, - true /* is_constrained */); + return GetPromoURL(access_point, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, + false /* auto_close */, true /* is_constrained */); break; case profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT: - return GetPromoURL(signin_metrics::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT, - false /* auto_close */, - true /* is_constrained */); + return GetPromoURL(access_point, + signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT, + false /* auto_close */, true /* is_constrained */); break; case profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH: { const SigninErrorController* error_controller = SigninErrorControllerFactory::GetForProfile(profile); CHECK(error_controller); DCHECK(error_controller->HasError()); - return GetReauthURL(profile, error_controller->error_account_id()); + return GetReauthURL(access_point, + signin_metrics::Reason::REASON_REAUTHENTICATION, + profile, error_controller->error_account_id()); break; } default: @@ -249,17 +282,34 @@ GURL GetSigninURLFromBubbleViewMode(Profile* profile, } } -signin_metrics::Source GetSourceForPromoURL(const GURL& url) { +signin_metrics::AccessPoint GetAccessPointForPromoURL(const GURL& url) { std::string value; - if (net::GetValueForKeyInQuery(url, kSignInPromoQueryKeySource, &value)) { - int source = 0; - if (base::StringToInt(value, &source) && - source >= signin_metrics::SOURCE_START_PAGE && - source < signin_metrics::SOURCE_UNKNOWN) { - return static_cast<signin_metrics::Source>(source); - } + if (!net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyAccessPoint, + &value)) { + return signin_metrics::AccessPoint::ACCESS_POINT_MAX; } - return signin_metrics::SOURCE_UNKNOWN; + + int access_point = 0; + CHECK(base::StringToInt(value, &access_point)); + CHECK_GE( + access_point, + static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE)); + CHECK_LT(access_point, + static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_MAX)); + return static_cast<signin_metrics::AccessPoint>(access_point); +} + +signin_metrics::Reason GetSigninReasonForPromoURL(const GURL& url) { + std::string value; + if (!net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyReason, &value)) + return signin_metrics::Reason::REASON_MAX; + + int reason = 0; + CHECK(base::StringToInt(value, &reason)); + CHECK_GE(reason, static_cast<int>( + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT)); + CHECK_LT(reason, static_cast<int>(signin_metrics::Reason::REASON_MAX)); + return static_cast<signin_metrics::Reason>(reason); } bool IsAutoCloseEnabledInURL(const GURL& url) { diff --git a/chrome/browser/signin/signin_promo.h b/chrome/browser/signin/signin_promo.h index c4a77f9..f6f7143 100644 --- a/chrome/browser/signin/signin_promo.h +++ b/chrome/browser/signin/signin_promo.h @@ -21,8 +21,10 @@ class PrefRegistrySyncable; // Utility functions for sign in promos. namespace signin { +const char kSignInPromoQueryKeyAccessPoint[] = "access_point"; const char kSignInPromoQueryKeyAutoClose[] = "auto_close"; const char kSignInPromoQueryKeyContinue[] = "continue"; +const char kSignInPromoQueryKeyReason[] = "reason"; const char kSignInPromoQueryKeySource[] = "source"; const char kSignInPromoQueryKeyConstrained[] = "constrained"; const char kSignInPromoQueryKeyShowAccountManagement[] = @@ -43,24 +45,32 @@ void DidShowPromoAtStartup(Profile* profile); void SetUserSkippedPromo(Profile* profile); // Gets the sign in landing page URL. -GURL GetLandingURL(const char* option, int value); +GURL GetLandingURL(signin_metrics::AccessPoint access_point); // Returns the sign in promo URL wth the given arguments in the query. -// |source| identifies from where the sign in promo is being called, and is -// used to record sync promo UMA stats in the context of the source. +// |access_point| indicates where the sign in is being initiated. +// |reason| indicates the purpose of using this URL. // |auto_close| whether to close the sign in promo automatically when done. // |is_constrained} whether to load the URL in a constrained window, false // by default. -GURL GetPromoURL(signin_metrics::Source source, bool auto_close); -GURL GetPromoURL(signin_metrics::Source source, +GURL GetPromoURL(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, + bool auto_close); +GURL GetPromoURL(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, bool auto_close, bool is_constrained); // Returns a sign in promo URL specifically for reauthenticating |account_id|. -GURL GetReauthURL(Profile* profile, const std::string& account_id); +GURL GetReauthURL(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, + Profile* profile, + const std::string& account_id); // Returns a sign in promo URL specifically for reauthenticating |email|. -GURL GetReauthURLWithEmail(const std::string& email); +GURL GetReauthURLWithEmail(signin_metrics::AccessPoint access_point, + signin_metrics::Reason reason, + const std::string& email); // Gets the next page URL from the query portion of the sign in promo URL. GURL GetNextPageURLForPromoURL(const GURL& url); @@ -71,11 +81,14 @@ GURL GetSigninPartitionURL(); // Gets the signin URL to be used to display the sign in flow for |mode| in // |profile|. GURL GetSigninURLFromBubbleViewMode(Profile* profile, - profiles::BubbleViewMode mode); + profiles::BubbleViewMode mode, + signin_metrics::AccessPoint access_point); -// Gets the source from the query portion of the sign in promo URL. -// The source identifies from where the sign in promo was opened. -signin_metrics::Source GetSourceForPromoURL(const GURL& url); +// Gets the access point from the query portion of the sign in promo URL. +signin_metrics::AccessPoint GetAccessPointForPromoURL(const GURL& url); + +// Gets the sign in reason from the query portion of the sign in promo URL. +signin_metrics::Reason GetSigninReasonForPromoURL(const GURL& url); // Returns true if the auto_close parameter in the given URL is set to true. bool IsAutoCloseEnabledInURL(const GURL& url); diff --git a/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc b/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc index 6400e2d..b78d631 100644 --- a/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc +++ b/chrome/browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc @@ -25,7 +25,8 @@ BookmarkBubbleSignInDelegate::~BookmarkBubbleSignInDelegate() { void BookmarkBubbleSignInDelegate::OnSignInLinkClicked() { EnsureBrowser(); - chrome::ShowBrowserSignin(browser_, signin_metrics::SOURCE_BOOKMARK_BUBBLE); + chrome::ShowBrowserSignin( + browser_, signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE); } void BookmarkBubbleSignInDelegate::OnBrowserRemoved(Browser* browser) { diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index ac6ec7d..ac6d4e8 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc @@ -781,7 +781,8 @@ void BrowserCommandController::ExecuteCommandWithDisposition( ShowHelp(browser_, HELP_SOURCE_MENU); break; case IDC_SHOW_SIGNIN: - ShowBrowserSigninOrSettings(browser_, signin_metrics::SOURCE_MENU); + ShowBrowserSigninOrSettings( + browser_, signin_metrics::AccessPoint::ACCESS_POINT_MENU); break; case IDC_DISTILL_PAGE: DistillCurrentPage(browser_); diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 0af8c48..8ea5de4 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc @@ -1103,14 +1103,15 @@ void ShowAppMenu(Browser* browser) { void ShowAvatarMenu(Browser* browser) { browser->window()->ShowAvatarBubbleFromAvatarButton( - BrowserWindow::AVATAR_BUBBLE_MODE_DEFAULT, - signin::ManageAccountsParams()); + BrowserWindow::AVATAR_BUBBLE_MODE_DEFAULT, signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); } void ShowFastUserSwitcher(Browser* browser) { browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_FAST_USER_SWITCH, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); } void OpenUpdateChromeDialog(Browser* browser) { diff --git a/chrome/browser/ui/browser_mac.cc b/chrome/browser/ui/browser_mac.cc index 9606835..05f1a63 100644 --- a/chrome/browser/ui/browser_mac.cc +++ b/chrome/browser/ui/browser_mac.cc @@ -51,11 +51,12 @@ void OpenOptionsWindow(Profile* profile) { browser->window()->Show(); } -void OpenSyncSetupWindow(Profile* profile, signin_metrics::Source source) { +void OpenSyncSetupWindow(Profile* profile, + signin_metrics::AccessPoint access_point) { Browser* browser = new Browser(Browser::CreateParams(profile, chrome::HOST_DESKTOP_TYPE_NATIVE)); - ShowBrowserSigninOrSettings(browser, source); + ShowBrowserSigninOrSettings(browser, access_point); browser->window()->Show(); } diff --git a/chrome/browser/ui/browser_mac.h b/chrome/browser/ui/browser_mac.h index 4ecd1b7..2c11822 100644 --- a/chrome/browser/ui/browser_mac.h +++ b/chrome/browser/ui/browser_mac.h @@ -19,7 +19,8 @@ void OpenHistoryWindow(Profile* profile); void OpenDownloadsWindow(Profile* profile); void OpenHelpWindow(Profile* profile, HelpSource source); void OpenOptionsWindow(Profile* profile); -void OpenSyncSetupWindow(Profile* profile, signin_metrics::Source source); +void OpenSyncSetupWindow(Profile* profile, + signin_metrics::AccessPoint access_point); void OpenClearBrowsingDataDialogWindow(Profile* profile); void OpenImportSettingsDialogWindow(Profile* profile); void OpenBookmarkManagerWindow(Profile* profile); diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h index 668a98c..3301b13 100644 --- a/chrome/browser/ui/browser_window.h +++ b/chrome/browser/ui/browser_window.h @@ -57,6 +57,10 @@ class Rect; class Size; } +namespace signin_metrics { +enum class AccessPoint; +} + namespace web_modal { class WebContentsModalDialogHost; } @@ -363,6 +367,8 @@ class BrowserWindow : public ui::BaseWindow { // Shows the avatar bubble on the window frame off of the avatar button with // the given mode. The Service Type specified by GAIA is provided as well. + // |access_point| indicates the access point used to open the Gaia sign in + // page. enum AvatarBubbleMode { AVATAR_BUBBLE_MODE_DEFAULT, AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT, @@ -373,11 +379,17 @@ class BrowserWindow : public ui::BaseWindow { AVATAR_BUBBLE_MODE_SHOW_ERROR, AVATAR_BUBBLE_MODE_FAST_USER_SWITCH, }; - virtual void ShowAvatarBubbleFromAvatarButton(AvatarBubbleMode mode, - const signin::ManageAccountsParams& manage_accounts_params) = 0; + virtual void ShowAvatarBubbleFromAvatarButton( + AvatarBubbleMode mode, + const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point) = 0; // Shows the signin flow for |mode| in a tab-modal dialog. - virtual void ShowModalSigninWindow(AvatarBubbleMode mode) = 0; + // |access_point| indicates the access point used to open the Gaia sign in + // page. + virtual void ShowModalSigninWindow( + AvatarBubbleMode mode, + signin_metrics::AccessPoint access_point) = 0; // Closes the tab-modal signin flow opened with ShowModalSigninWindow, if it's // open. Does nothing otherwise. diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index 35609ea..80a3a9f 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc @@ -357,7 +357,8 @@ void ShowSearchEngineSettings(Browser* browser) { } #if !defined(OS_ANDROID) && !defined(OS_IOS) -void ShowBrowserSignin(Browser* browser, signin_metrics::Source source) { +void ShowBrowserSignin(Browser* browser, + signin_metrics::AccessPoint access_point) { Profile* original_profile = browser->profile()->GetOriginalProfile(); SigninManagerBase* manager = SigninManagerFactory::GetForProfile(original_profile); @@ -374,14 +375,13 @@ void ShowBrowserSignin(Browser* browser, signin_metrics::Source source) { browser = displayer->browser(); } - signin_metrics::LogSigninSource(source); - - // Since the app launcher is a separate application, it might steal focus + // Since the extension is a separate application, it might steal focus // away from Chrome, and accidentally close the avatar bubble. The same will // happen if we had to switch browser windows to show the sign in page. In // this case, fallback to the full-tab signin page. bool show_avatar_bubble = - source != signin_metrics::SOURCE_APP_LAUNCHER && !switched_browser; + access_point != signin_metrics::AccessPoint::ACCESS_POINT_EXTENSIONS && + !switched_browser; #if defined(OS_CHROMEOS) // ChromeOS doesn't have the avatar bubble. show_avatar_bubble = false; @@ -390,16 +390,19 @@ void ShowBrowserSignin(Browser* browser, signin_metrics::Source source) { if (show_avatar_bubble) { browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), access_point); } else { - NavigateToSingletonTab(browser, GURL(signin::GetPromoURL(source, false))); + NavigateToSingletonTab( + browser, + signin::GetPromoURL( + access_point, signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, + false)); DCHECK_GT(browser->tab_strip_model()->count(), 0); } } -void ShowBrowserSigninOrSettings( - Browser* browser, - signin_metrics::Source source) { +void ShowBrowserSigninOrSettings(Browser* browser, + signin_metrics::AccessPoint access_point) { Profile* original_profile = browser->profile()->GetOriginalProfile(); SigninManagerBase* manager = SigninManagerFactory::GetForProfile(original_profile); @@ -407,7 +410,7 @@ void ShowBrowserSigninOrSettings( if (manager->IsAuthenticated()) ShowSettings(browser); else - ShowBrowserSignin(browser, source); + ShowBrowserSignin(browser, access_point); } #endif diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h index 72f4e03..4b2ff57 100644 --- a/chrome/browser/ui/chrome_pages.h +++ b/chrome/browser/ui/chrome_pages.h @@ -92,12 +92,13 @@ void ShowSearchEngineSettings(Browser* browser); #if !defined(OS_ANDROID) && !defined(OS_IOS) // Initiates signin in a new browser tab. -void ShowBrowserSignin(Browser* browser, signin_metrics::Source source); +void ShowBrowserSignin(Browser* browser, + signin_metrics::AccessPoint access_point); // If the user is already signed in, shows the "Signin" portion of Settings, // otherwise initiates signin in a new browser tab. void ShowBrowserSigninOrSettings(Browser* browser, - signin_metrics::Source source); + signin_metrics::AccessPoint access_point); #endif } // namespace chrome diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_sync_promo_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_sync_promo_controller.mm index be3a25d..be81a2e 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_sync_promo_controller.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_sync_promo_controller.mm @@ -108,7 +108,8 @@ const int kFontSize = 11; - (BOOL)textView:(NSTextView *)textView clickedOnLink:(id)link atIndex:(NSUInteger)charIndex { - chrome::ShowBrowserSignin(browser_, signin_metrics::SOURCE_BOOKMARK_BUBBLE); + chrome::ShowBrowserSignin( + browser_, signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE); return YES; } diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.h b/chrome/browser/ui/cocoa/browser_window_cocoa.h index e6b9d2e..5a354b3 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.h +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.h @@ -158,8 +158,10 @@ class BrowserWindowCocoa override; void ShowAvatarBubbleFromAvatarButton( AvatarBubbleMode mode, - const signin::ManageAccountsParams& manage_accounts_params) override; - void ShowModalSigninWindow(AvatarBubbleMode mode) override; + const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point) override; + void ShowModalSigninWindow(AvatarBubbleMode mode, + signin_metrics::AccessPoint access_point) override; void CloseModalSigninWindow() override; int GetRenderViewHeightInsetWithDetachedBookmarkBar() override; void ExecuteExtensionCommand(const extensions::Extension* extension, diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_cocoa.mm index c1982e0c..9a6071a 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.mm +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.mm @@ -840,17 +840,21 @@ NSWindow* BrowserWindowCocoa::window() const { void BrowserWindowCocoa::ShowAvatarBubbleFromAvatarButton( AvatarBubbleMode mode, - const signin::ManageAccountsParams& manage_accounts_params) { + const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point) { AvatarBaseController* controller = [controller_ avatarButtonController]; NSView* anchor = [controller buttonView]; if ([anchor isHiddenOrHasHiddenAncestor]) anchor = [[controller_ toolbarController] wrenchButton]; [controller showAvatarBubbleAnchoredAt:anchor withMode:mode - withServiceType:manage_accounts_params.service_type]; + withServiceType:manage_accounts_params.service_type + fromAccessPoint:access_point]; } -void BrowserWindowCocoa::ShowModalSigninWindow(AvatarBubbleMode mode) { +void BrowserWindowCocoa::ShowModalSigninWindow( + AvatarBubbleMode mode, + signin_metrics::AccessPoint access_point) { NOTREACHED(); } void BrowserWindowCocoa::CloseModalSigninWindow() { diff --git a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm index 63883b0..77c9a1b 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm @@ -224,8 +224,9 @@ void ExtensionInstalledBubbleBridge::UpdateAnchorPosition() { clickedOnLink:(id)link atIndex:(NSUInteger)charIndex { DCHECK_EQ(promo_.get(), aTextView); - chrome::ShowBrowserSignin(browser_, - signin_metrics::SOURCE_EXTENSION_INSTALL_BUBBLE); + chrome::ShowBrowserSignin( + browser_, + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE); return YES; } diff --git a/chrome/browser/ui/cocoa/profiles/avatar_base_controller.h b/chrome/browser/ui/cocoa/profiles/avatar_base_controller.h index 01d2527..8d2fb97 100644 --- a/chrome/browser/ui/cocoa/profiles/avatar_base_controller.h +++ b/chrome/browser/ui/cocoa/profiles/avatar_base_controller.h @@ -44,7 +44,8 @@ class ProfileInfoUpdateObserver; // Shows the avatar bubble in the given mode. - (void)showAvatarBubbleAnchoredAt:(NSView*)anchor withMode:(BrowserWindow::AvatarBubbleMode)mode - withServiceType:(signin::GAIAServiceType)serviceType; + withServiceType:(signin::GAIAServiceType)serviceType + fromAccessPoint:(signin_metrics::AccessPoint)accessPoint; @end diff --git a/chrome/browser/ui/cocoa/profiles/avatar_base_controller.mm b/chrome/browser/ui/cocoa/profiles/avatar_base_controller.mm index abda2f1..24a969d 100644 --- a/chrome/browser/ui/cocoa/profiles/avatar_base_controller.mm +++ b/chrome/browser/ui/cocoa/profiles/avatar_base_controller.mm @@ -145,7 +145,8 @@ class ProfileInfoUpdateObserver : public ProfileInfoCacheObserver, - (void)showAvatarBubbleAnchoredAt:(NSView*)anchor withMode:(BrowserWindow::AvatarBubbleMode)mode - withServiceType:(signin::GAIAServiceType)serviceType { + withServiceType:(signin::GAIAServiceType)serviceType + fromAccessPoint:(signin_metrics::AccessPoint)accessPoint { if (menuController_) { profiles::BubbleViewMode viewMode; profiles::TutorialMode tutorialMode; @@ -196,7 +197,8 @@ class ProfileInfoUpdateObserver : public ProfileInfoCacheObserver, anchoredAt:point viewMode:viewMode tutorialMode:tutorialMode - serviceType:serviceType]; + serviceType:serviceType + accessPoint:accessPoint]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -220,7 +222,9 @@ class ProfileInfoUpdateObserver : public ProfileInfoCacheObserver, [self showAvatarBubbleAnchoredAt:button_ withMode:mode - withServiceType:signin::GAIA_SERVICE_TYPE_NONE]; + withServiceType:signin::GAIA_SERVICE_TYPE_NONE + fromAccessPoint:signin_metrics::AccessPoint:: + ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN]; } - (IBAction)buttonRightClicked:(id)sender { @@ -229,7 +233,9 @@ class ProfileInfoUpdateObserver : public ProfileInfoCacheObserver, [self showAvatarBubbleAnchoredAt:button_ withMode:mode - withServiceType:signin::GAIA_SERVICE_TYPE_NONE]; + withServiceType:signin::GAIA_SERVICE_TYPE_NONE + fromAccessPoint:signin_metrics::AccessPoint:: + ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN]; } - (void)bubbleWillClose:(NSNotification*)notif { diff --git a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h index 4df0939..722d129 100644 --- a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h +++ b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.h @@ -23,6 +23,11 @@ class ProfileOAuth2TokenService; namespace content { class WebContents; } + +namespace signin_metrics { +enum class AccessPoint; +} + class GaiaWebContentsDelegate; // This window controller manages the bubble that displays a "menu" of profiles. @@ -64,13 +69,17 @@ class GaiaWebContentsDelegate; // The GAIA service type that caused this menu to open. signin::GAIAServiceType serviceType_; + + // The current access point of sign in. + signin_metrics::AccessPoint accessPoint_; } - (id)initWithBrowser:(Browser*)browser anchoredAt:(NSPoint)point viewMode:(profiles::BubbleViewMode)viewMode tutorialMode:(profiles::TutorialMode)tutorialMode - serviceType:(signin::GAIAServiceType)GAIAServiceType; + serviceType:(signin::GAIAServiceType)GAIAServiceType + accessPoint:(signin_metrics::AccessPoint)accessPoint; // Creates all the subviews of the avatar bubble for |viewToDisplay|. - (void)initMenuContentsWithView:(profiles::BubbleViewMode)viewToDisplay; diff --git a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm index a4346b0..46cfa20 100644 --- a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm +++ b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm @@ -50,6 +50,7 @@ #include "chrome/grit/generated_resources.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_manager.h" +#include "components/signin/core/browser/signin_metrics.h" #include "components/signin/core/common/profile_management_switches.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/browser/notification_service.h" @@ -1194,7 +1195,8 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, anchoredAt:(NSPoint)point viewMode:(profiles::BubbleViewMode)viewMode tutorialMode:(profiles::TutorialMode)tutorialMode - serviceType:(signin::GAIAServiceType)serviceType { + serviceType:(signin::GAIAServiceType)serviceType + accessPoint:(signin_metrics::AccessPoint)accessPoint { base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater styleMask:NSBorderlessWindowMask @@ -1209,6 +1211,7 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, tutorialMode_ = tutorialMode; observer_.reset(new ActiveProfileObserverBridge(self, browser_)); serviceType_ = serviceType; + accessPoint_ = accessPoint; avatarMenu_.reset(new AvatarMenu( &g_browser_process->profile_manager()->GetProfileInfoCache(), @@ -2076,21 +2079,21 @@ class ActiveProfileObserverBridge : public AvatarMenuObserver, int messageId = -1; switch (viewMode_) { case profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN: - url = signin::GetPromoURL(signin_metrics::SOURCE_AVATAR_BUBBLE_SIGN_IN, - false /* auto_close */, - true /* is_constrained */); + url = signin::GetPromoURL( + accessPoint_, signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, + false /* auto_close */, true /* is_constrained */); messageId = IDS_PROFILES_GAIA_SIGNIN_TITLE; break; case profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT: url = signin::GetPromoURL( - signin_metrics::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT, - false /* auto_close */, - true /* is_constrained */); + accessPoint_, signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT, + false /* auto_close */, true /* is_constrained */); messageId = IDS_PROFILES_GAIA_ADD_ACCOUNT_TITLE; break; case profiles::BUBBLE_VIEW_MODE_GAIA_REAUTH: DCHECK(HasAuthError(browser_->profile())); url = signin::GetReauthURL( + accessPoint_, signin_metrics::Reason::REASON_REAUTHENTICATION, browser_->profile(), GetAuthErrorAccountId(browser_->profile())); messageId = IDS_PROFILES_GAIA_REAUTH_TITLE; break; diff --git a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm index ee721b0..7520220 100644 --- a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm @@ -95,7 +95,9 @@ class ProfileChooserControllerTest : public CocoaProfileTest { anchoredAt:point viewMode:profiles::BUBBLE_VIEW_MODE_PROFILE_CHOOSER tutorialMode:mode - serviceType:signin::GAIA_SERVICE_TYPE_NONE]); + serviceType:signin::GAIA_SERVICE_TYPE_NONE + accessPoint:signin_metrics::AccessPoint:: + ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN]); [controller_ showWindow:nil]; } @@ -134,7 +136,9 @@ class ProfileChooserControllerTest : public CocoaProfileTest { anchoredAt:point viewMode:profiles::BUBBLE_VIEW_MODE_FAST_PROFILE_CHOOSER tutorialMode:profiles::TUTORIAL_MODE_NONE - serviceType:signin::GAIA_SERVICE_TYPE_NONE]); + serviceType:signin::GAIA_SERVICE_TYPE_NONE + accessPoint:signin_metrics::AccessPoint:: + ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN]); [controller_ showWindow:nil]; } diff --git a/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm b/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm index e5bf1c2..aa80c6e 100644 --- a/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm +++ b/chrome/browser/ui/cocoa/profiles/user_manager_mac.mm @@ -219,7 +219,9 @@ class ReauthDialogDelegate : public UserManager::ReauthDialogObserver, } - (void)show { - GURL url = signin::GetReauthURLWithEmail(emailAddress_); + GURL url = signin::GetReauthURLWithEmail( + signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, + signin_metrics::Reason::REASON_UNLOCK, emailAddress_); reauthWebContents_->GetController().LoadURL(url, content::Referrer(), ui::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string()); diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc index e0fadee..afc324f 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc @@ -135,6 +135,12 @@ void ProcessCommandLineAlreadyRunningDefaultProfile( } #endif // defined(OS_WIN) +GURL GetSigninPromoURL() { + return signin::GetPromoURL( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false); +} + } // namespace class StartupBrowserCreatorTest : public ExtensionBrowserTest { @@ -614,8 +620,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoNoWelcomePage) { if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) { // The browser should show only the promo. ASSERT_EQ(1, tab_strip->count()); - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(0)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(0)->GetURL()); } else if (IsWindows10OrNewer()) { // The browser should show the welcome page and the NTP. ASSERT_EQ(2, tab_strip->count()); @@ -655,8 +660,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoWithWelcomePage) { tab_strip->GetWebContentsAt(1)->GetURL()); } else { if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) { - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(0)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(0)->GetURL()); } else { EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), tab_strip->GetWebContentsAt(0)->GetURL()); @@ -691,8 +695,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoWithFirstRunTabs) { TabStripModel* tab_strip = new_browser->tab_strip_model(); if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) { EXPECT_EQ(2, tab_strip->count()); - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(0)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(0)->GetURL()); EXPECT_EQ("title1.html", tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName()); } else { @@ -726,8 +729,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, TabStripModel* tab_strip = new_browser->tab_strip_model(); if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) { EXPECT_EQ(3, tab_strip->count()); - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(0)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(0)->GetURL()); EXPECT_EQ("title1.html", tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName()); EXPECT_EQ(internals::GetWelcomePageURL(), @@ -1407,8 +1409,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest, // Verify that the sync promo and the welcome page are shown. TabStripModel* tab_strip = new_browser->tab_strip_model(); ASSERT_EQ(2, tab_strip->count()); - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(0)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(0)->GetURL()); EXPECT_EQ(internals::GetWelcomePageURL(), tab_strip->GetWebContentsAt(1)->GetURL()); } @@ -1453,8 +1454,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest, // Verify that the first-run tab is shown and the sync promo has been added. TabStripModel* tab_strip = new_browser->tab_strip_model(); ASSERT_EQ(2, tab_strip->count()); - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(0)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(0)->GetURL()); EXPECT_EQ("title1.html", tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName()); } @@ -1484,8 +1484,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest, StartupBrowserCreator browser_creator; browser_creator.AddFirstRunTab( embedded_test_server()->GetURL("/title1.html")); - browser_creator.AddFirstRunTab( - signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false)); + browser_creator.AddFirstRunTab(GetSigninPromoURL()); browser()->profile()->GetPrefs()->SetBoolean( prefs::kSignInPromoShowOnFirstRunAllowed, true); @@ -1506,8 +1505,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest, ASSERT_EQ(2, tab_strip->count()); EXPECT_EQ("title1.html", tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName()); - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(1)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(1)->GetURL()); } #if defined(GOOGLE_CHROME_BUILD) && defined(OS_MACOSX) @@ -1555,8 +1553,7 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest, // been replaced by the sync promo. TabStripModel* tab_strip = new_browser->tab_strip_model(); ASSERT_EQ(2, tab_strip->count()); - EXPECT_EQ(signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - tab_strip->GetWebContentsAt(0)->GetURL()); + EXPECT_EQ(GetSigninPromoURL(), tab_strip->GetWebContentsAt(0)->GetURL()); EXPECT_EQ("title1.html", tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName()); } diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index 95cae74..98cb2c4 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc @@ -872,7 +872,8 @@ void StartupBrowserCreatorImpl::AddStartupURLs( signin::DidShowPromoAtStartup(profile_); const GURL sync_promo_url = signin::GetPromoURL( - signin_metrics::SOURCE_START_PAGE, false); + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false); // No need to add if the sync promo is already in the startup list. bool add_promo = true; diff --git a/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc index 6ebb1b9..36a7265 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc @@ -175,7 +175,9 @@ IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTriggeredResetTest, GURL expected_first_tab_url = signin::ShouldShowPromoAtStartup(browser()->profile(), true) - ? signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false) + ? signin::GetPromoURL( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false) : GURL(chrome::kChromeUINewTabURL); EXPECT_EQ(expected_first_tab_url, tab_strip->GetWebContentsAt(0)->GetURL()); diff --git a/chrome/browser/ui/sync/one_click_signin_sync_observer.cc b/chrome/browser/ui/sync/one_click_signin_sync_observer.cc index 69069dd..38ed198 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_observer.cc +++ b/chrome/browser/ui/sync/one_click_signin_sync_observer.cc @@ -79,8 +79,8 @@ void OneClickSigninSyncObserver::OnStateChanged() { } if (sync_service->IsSyncActive() && - signin::GetSourceForPromoURL(continue_url_) - != signin_metrics::SOURCE_SETTINGS) { + signin::GetAccessPointForPromoURL(continue_url_) != + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS) { // TODO(isherman): Having multiple settings pages open can cause issues // redirecting after Sync is set up: http://crbug.com/355885 LoadContinueUrl(); diff --git a/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc b/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc index e1a0c32..ced33b0 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc +++ b/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc @@ -236,7 +236,8 @@ TEST_F(OneClickSigninSyncObserverTest, TEST_F(OneClickSigninSyncObserverTest, OnSyncStateChanged_SyncConfiguredSuccessfully_SourceIsSettings) { GURL continue_url = signin::GetPromoURL( - signin_metrics::SOURCE_SETTINGS, false); + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false); CreateSyncObserver(continue_url.spec()); sync_service_->set_first_setup_in_progress(false); sync_service_->set_sync_active(true); diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc index 61e6906..6a0c0e1 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc +++ b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc @@ -79,6 +79,7 @@ OneClickSigninSyncStarter::OneClickSigninSyncStarter( StartSyncMode start_mode, content::WebContents* web_contents, ConfirmationRequired confirmation_required, + const GURL& current_url, const GURL& continue_url, Callback sync_setup_completed_callback) : content::WebContentsObserver(web_contents), @@ -86,6 +87,7 @@ OneClickSigninSyncStarter::OneClickSigninSyncStarter( start_mode_(start_mode), desktop_type_(chrome::HOST_DESKTOP_TYPE_NATIVE), confirmation_required_(confirmation_required), + current_url_(current_url), continue_url_(continue_url), sync_setup_completed_callback_(sync_setup_completed_callback), weak_pointer_factory_(this) { @@ -429,6 +431,12 @@ void OneClickSigninSyncStarter::SigninFailed( } void OneClickSigninSyncStarter::SigninSuccess() { + if (!current_url_.is_valid()) // Could be invalid for tests. + return; + signin_metrics::LogSigninAccessPointCompleted( + signin::GetAccessPointForPromoURL(current_url_)); + signin_metrics::LogSigninReason( + signin::GetSigninReasonForPromoURL(current_url_)); } void OneClickSigninSyncStarter::AccountAddedToCookie( diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter.h b/chrome/browser/ui/sync/one_click_signin_sync_starter.h index 0e4c815..5309daa 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_starter.h +++ b/chrome/browser/ui/sync/one_click_signin_sync_starter.h @@ -101,6 +101,7 @@ class OneClickSigninSyncStarter : public SigninTracker::Observer, StartSyncMode start_mode, content::WebContents* web_contents, ConfirmationRequired display_confirmation, + const GURL& current_url, const GURL& continue_url, Callback callback); @@ -225,6 +226,7 @@ class OneClickSigninSyncStarter : public SigninTracker::Observer, StartSyncMode start_mode_; chrome::HostDesktopType desktop_type_; ConfirmationRequired confirmation_required_; + GURL current_url_; GURL continue_url_; // Callback executed when sync setup succeeds or fails. diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter_unittest.cc b/chrome/browser/ui/sync/one_click_signin_sync_starter_unittest.cc index 861f648..9cbb628 100644 --- a/chrome/browser/ui/sync/one_click_signin_sync_starter_unittest.cc +++ b/chrome/browser/ui/sync/one_click_signin_sync_starter_unittest.cc @@ -75,17 +75,10 @@ class OneClickSigninSyncStarterTest : public ChromeRenderViewHostTestHarness { void CreateSyncStarter(OneClickSigninSyncStarter::Callback callback, const GURL& continue_url) { sync_starter_ = new OneClickSigninSyncStarter( - profile(), - NULL, - kTestingGaiaId, - kTestingUsername, - std::string(), - "refresh_token", - OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS, - web_contents(), - OneClickSigninSyncStarter::NO_CONFIRMATION, - continue_url, - callback); + profile(), NULL, kTestingGaiaId, kTestingUsername, std::string(), + "refresh_token", OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS, + web_contents(), OneClickSigninSyncStarter::NO_CONFIRMATION, GURL(), + continue_url, callback); } // Deletes itself when SigninFailed() or SigninSuccess() is called. diff --git a/chrome/browser/ui/user_manager.cc b/chrome/browser/ui/user_manager.cc index 2e826f8..9426c81 100644 --- a/chrome/browser/ui/user_manager.cc +++ b/chrome/browser/ui/user_manager.cc @@ -44,7 +44,10 @@ void UserManager::ReauthDialogObserver::DidStopLoading() { // webview and observe it instead. The webview may not be found in the // initial page load since it loads asynchronously. if (url.GetOrigin() != - signin::GetReauthURLWithEmail(email_address_).GetOrigin()) { + signin::GetReauthURLWithEmail( + signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, + signin_metrics::Reason::REASON_UNLOCK, email_address_) + .GetOrigin()) { return; } diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc index 7442f2b..46e291e 100644 --- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc @@ -422,7 +422,8 @@ void InstalledBubbleContent::LinkClicked(views::Link* source, int event_flags) { NOTIMPLEMENTED(); #else chrome::ShowBrowserSignin( - browser_, signin_metrics::SOURCE_EXTENSION_INSTALL_BUBBLE); + browser_, + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE); #endif return; } diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 9769133..c260c67 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -2554,7 +2554,8 @@ void BrowserView::UpdateAcceleratorMetrics(const ui::Accelerator& accelerator, void BrowserView::ShowAvatarBubbleFromAvatarButton( AvatarBubbleMode mode, - const signin::ManageAccountsParams& manage_accounts_params) { + const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point) { #if defined(FRAME_AVATAR_BUTTON) // Do not show avatar bubble if there is no avatar menu button. if (!frame_->GetNewAvatarMenuButton()) @@ -2566,10 +2567,10 @@ void BrowserView::ShowAvatarBubbleFromAvatarButton( &tutorial_mode); if (SigninViewController::ShouldShowModalSigninForMode(bubble_view_mode)) { - ShowModalSigninWindow(mode); + ShowModalSigninWindow(mode, access_point); } else { ProfileChooserView::ShowBubble( - bubble_view_mode, tutorial_mode, manage_accounts_params, + bubble_view_mode, tutorial_mode, manage_accounts_params, access_point, frame_->GetNewAvatarMenuButton(), views::BubbleBorder::TOP_RIGHT, views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE, browser()); ProfileMetrics::LogProfileOpenMethod(ProfileMetrics::ICON_AVATAR_BUBBLE); @@ -2579,12 +2580,15 @@ void BrowserView::ShowAvatarBubbleFromAvatarButton( #endif } -void BrowserView::ShowModalSigninWindow(AvatarBubbleMode mode) { +void BrowserView::ShowModalSigninWindow( + AvatarBubbleMode mode, + signin_metrics::AccessPoint access_point) { profiles::BubbleViewMode bubble_view_mode; profiles::TutorialMode tutorial_mode; profiles::BubbleViewModeFromAvatarBubbleMode(mode, &bubble_view_mode, &tutorial_mode); - signin_view_controller_.ShowModalSignin(bubble_view_mode, browser()); + signin_view_controller_.ShowModalSignin(bubble_view_mode, browser(), + access_point); } void BrowserView::CloseModalSigninWindow() { diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index 1374534..4f09d1c 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h @@ -364,8 +364,10 @@ class BrowserView : public BrowserWindow, override; void ShowAvatarBubbleFromAvatarButton( AvatarBubbleMode mode, - const signin::ManageAccountsParams& manage_accounts_params) override; - void ShowModalSigninWindow(AvatarBubbleMode mode) override; + const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point) override; + void ShowModalSigninWindow(AvatarBubbleMode mode, + signin_metrics::AccessPoint access_point) override; void CloseModalSigninWindow() override; int GetRenderViewHeightInsetWithDetachedBookmarkBar() override; void ExecuteExtensionCommand(const extensions::Extension* extension, diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc index eeff55f..801c90a 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc @@ -275,8 +275,8 @@ void GlassBrowserFrameView::ButtonPressed(views::Button* sender, mode = BrowserWindow::AVATAR_BUBBLE_MODE_FAST_USER_SWITCH; } browser_view()->ShowAvatarBubbleFromAvatarButton( - mode, - signin::ManageAccountsParams()); + mode, signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); } } diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc index 2129500..597fd14 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc @@ -328,8 +328,8 @@ void OpaqueBrowserFrameView::ButtonPressed(views::Button* sender, mode = BrowserWindow::AVATAR_BUBBLE_MODE_FAST_USER_SWITCH; } browser_view()->ShowAvatarBubbleFromAvatarButton( - mode, - signin::ManageAccountsParams()); + mode, signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); #endif } } diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc index e7a061e..ea09024 100644 --- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc +++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc @@ -601,6 +601,7 @@ void ProfileChooserView::ShowBubble( profiles::BubbleViewMode view_mode, profiles::TutorialMode tutorial_mode, const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point, views::View* anchor_view, views::BubbleBorder::Arrow arrow, views::BubbleBorder::BubbleAlignment border_alignment, @@ -621,8 +622,9 @@ void ProfileChooserView::ShowBubble( return; } - profile_bubble_ = new ProfileChooserView(anchor_view, arrow, browser, - view_mode, tutorial_mode, manage_accounts_params.service_type); + profile_bubble_ = new ProfileChooserView( + anchor_view, arrow, browser, view_mode, tutorial_mode, + manage_accounts_params.service_type, access_point); views::BubbleDelegateView::CreateBubble(profile_bubble_); profile_bubble_->set_close_on_deactivate(close_on_deactivate_for_testing_); profile_bubble_->SetAlignment(border_alignment); @@ -646,12 +648,14 @@ ProfileChooserView::ProfileChooserView(views::View* anchor_view, Browser* browser, profiles::BubbleViewMode view_mode, profiles::TutorialMode tutorial_mode, - signin::GAIAServiceType service_type) + signin::GAIAServiceType service_type, + signin_metrics::AccessPoint access_point) : BubbleDelegateView(anchor_view, arrow), browser_(browser), view_mode_(view_mode), tutorial_mode_(tutorial_mode), - gaia_service_type_(service_type) { + gaia_service_type_(service_type), + access_point_(access_point) { // Reset the default margins inherited from the BubbleDelegateView. // Add a small bottom inset so that the bubble's rounded corners show up. set_margins(gfx::Insets(0, 0, 1, 0)); @@ -843,7 +847,7 @@ void ProfileChooserView::ShowViewFromMode(profiles::BubbleViewMode mode) { converted_mode = BrowserWindow::AVATAR_BUBBLE_MODE_REAUTH; } - browser_->window()->ShowModalSigninWindow(converted_mode); + browser_->window()->ShowModalSigninWindow(converted_mode, access_point_); } else { ShowView(mode, avatar_menu_.get()); } @@ -1637,7 +1641,7 @@ void ProfileChooserView::CreateAccountButton(views::GridLayout* layout, views::View* ProfileChooserView::CreateGaiaSigninView( views::View** signin_content_view) { views::WebView* web_view = SigninViewController::CreateGaiaWebView( - this, view_mode_, browser_->profile()); + this, view_mode_, browser_->profile(), access_point_); int message_id; switch (view_mode_) { diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.h b/chrome/browser/ui/views/profiles/profile_chooser_view.h index 923989e..da0eee2 100644 --- a/chrome/browser/ui/views/profiles/profile_chooser_view.h +++ b/chrome/browser/ui/views/profiles/profile_chooser_view.h @@ -58,6 +58,7 @@ class ProfileChooserView : public content::WebContentsDelegate, profiles::BubbleViewMode view_mode, profiles::TutorialMode tutorial_mode, const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point, views::View* anchor_view, views::BubbleBorder::Arrow arrow, views::BubbleBorder::BubbleAlignment border_alignment, @@ -77,7 +78,8 @@ class ProfileChooserView : public content::WebContentsDelegate, Browser* browser, profiles::BubbleViewMode view_mode, profiles::TutorialMode tutorial_mode, - signin::GAIAServiceType service_type); + signin::GAIAServiceType service_type, + signin_metrics::AccessPoint access_point); ~ProfileChooserView() override; // views::BubbleDelegateView: @@ -272,6 +274,9 @@ class ProfileChooserView : public content::WebContentsDelegate, // The GAIA service type provided in the response header. signin::GAIAServiceType gaia_service_type_; + // The current access point of sign in. + const signin_metrics::AccessPoint access_point_; + DISALLOW_COPY_AND_ASSIGN(ProfileChooserView); }; diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc index 23229a4..91aebea 100644 --- a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc @@ -205,7 +205,8 @@ IN_PROC_BROWSER_TEST_F(ProfileChooserViewExtensionsTest, Browser* browser = CreateBrowser(new_profile); browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_CONFIRM_SIGNIN, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); ASSERT_FALSE(ProfileChooserView::IsShowing()); CloseBrowserSynchronously(browser); } diff --git a/chrome/browser/ui/views/profiles/signin_view_controller.cc b/chrome/browser/ui/views/profiles/signin_view_controller.cc index d5fd524..18e9b5c 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller.cc +++ b/chrome/browser/ui/views/profiles/signin_view_controller.cc @@ -97,8 +97,10 @@ SigninViewController::~SigninViewController() { views::WebView* SigninViewController::CreateGaiaWebView( content::WebContentsDelegate* delegate, profiles::BubbleViewMode mode, - Profile* profile) { - GURL url = signin::GetSigninURLFromBubbleViewMode(profile, mode); + Profile* profile, + signin_metrics::AccessPoint access_point) { + GURL url = + signin::GetSigninURLFromBubbleViewMode(profile, mode, access_point); // Adds Gaia signin webview. const gfx::Size pref_size = switches::UsePasswordSeparatedSigninFlow() @@ -121,12 +123,15 @@ views::WebView* SigninViewController::CreateGaiaWebView( } void SigninViewController::ShowModalSignin( - profiles::BubbleViewMode mode, Browser* browser) { + profiles::BubbleViewMode mode, + Browser* browser, + signin_metrics::AccessPoint access_point) { CloseModalSignin(); // The delegate will delete itself on request of the views code when the // widget is closed. modal_signin_delegate_ = new ModalSigninDelegate( - this, CreateGaiaWebView(nullptr, mode, browser->profile()), browser); + this, CreateGaiaWebView(nullptr, mode, browser->profile(), access_point), + browser); } void SigninViewController::CloseModalSignin() { diff --git a/chrome/browser/ui/views/profiles/signin_view_controller.h b/chrome/browser/ui/views/profiles/signin_view_controller.h index 668be14..fdc3b92 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller.h +++ b/chrome/browser/ui/views/profiles/signin_view_controller.h @@ -17,6 +17,10 @@ namespace content { class WebContentsDelegate; } +namespace signin_metrics { +enum class AccessPoint; +} + namespace views { class WebView; } @@ -35,11 +39,16 @@ class SigninViewController { static views::WebView* CreateGaiaWebView( content::WebContentsDelegate* delegate, profiles::BubbleViewMode mode, - Profile* profile); + Profile* profile, + signin_metrics::AccessPoint access_point); // Shows the signin flow as a tab modal dialog attached to |browser|'s active // web contents. - void ShowModalSignin(profiles::BubbleViewMode mode, Browser* browser); + // |access_point| indicates the access point used to open the Gaia sign in + // page. + void ShowModalSignin(profiles::BubbleViewMode mode, + Browser* browser, + signin_metrics::AccessPoint access_point); // Closes the tab-modal signin flow previously shown using this // SigninViewController, if one exists. Does nothing otherwise. diff --git a/chrome/browser/ui/views/profiles/supervised_user_avatar_label.cc b/chrome/browser/ui/views/profiles/supervised_user_avatar_label.cc index ce4e839..8498e62 100644 --- a/chrome/browser/ui/views/profiles/supervised_user_avatar_label.cc +++ b/chrome/browser/ui/views/profiles/supervised_user_avatar_label.cc @@ -9,6 +9,7 @@ #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/grit/generated_resources.h" #include "components/signin/core/browser/signin_header_helper.h" +#include "components/signin/core/browser/signin_metrics.h" #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/theme_provider.h" @@ -109,8 +110,8 @@ bool SupervisedUserAvatarLabel::OnMousePressed(const ui::MouseEvent& event) { return false; browser_view_->ShowAvatarBubbleFromAvatarButton( - BrowserWindow::AVATAR_BUBBLE_MODE_DEFAULT, - signin::ManageAccountsParams()); + BrowserWindow::AVATAR_BUBBLE_MODE_DEFAULT, signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); return true; } diff --git a/chrome/browser/ui/views/profiles/user_manager_view.cc b/chrome/browser/ui/views/profiles/user_manager_view.cc index 8e6c6a74..2c0dfd4 100644 --- a/chrome/browser/ui/views/profiles/user_manager_view.cc +++ b/chrome/browser/ui/views/profiles/user_manager_view.cc @@ -98,7 +98,9 @@ ReauthDelegate::ReauthDelegate(views::WebView* web_view, // Load the re-auth URL, prepopulated with the user's email address. // Add the index of the profile to the URL so that the inline login page // knows which profile to load and update the credentials. - GURL url = signin::GetReauthURLWithEmail(email_address_); + GURL url = signin::GetReauthURLWithEmail( + signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, + signin_metrics::Reason::REASON_UNLOCK, email_address_); web_view_->LoadInitialURL(url); } diff --git a/chrome/browser/ui/webui/app_launcher_login_handler.cc b/chrome/browser/ui/webui/app_launcher_login_handler.cc index c5cdb44..460ec65 100644 --- a/chrome/browser/ui/webui/app_launcher_login_handler.cc +++ b/chrome/browser/ui/webui/app_launcher_login_handler.cc @@ -126,11 +126,11 @@ void AppLauncherLoginHandler::HandleShowSyncLoginUI( return; // The user isn't signed in, show the sign in promo. - signin_metrics::Source source = - web_contents->GetURL().spec() == chrome::kChromeUIAppsURL ? - signin_metrics::SOURCE_APPS_PAGE_LINK : - signin_metrics::SOURCE_NTP_LINK; - chrome::ShowBrowserSignin(browser, source); + signin_metrics::AccessPoint access_point = + web_contents->GetURL().spec() == chrome::kChromeUIAppsURL + ? signin_metrics::AccessPoint::ACCESS_POINT_APPS_PAGE_LINK + : signin_metrics::AccessPoint::ACCESS_POINT_NTP_LINK; + chrome::ShowBrowserSignin(browser, access_point); RecordInHistogram(NTP_SIGN_IN_PROMO_CLICKED); } @@ -157,10 +157,15 @@ void AppLauncherLoginHandler::HandleLoginMessageSeen( void AppLauncherLoginHandler::HandleShowAdvancedLoginUI( const base::ListValue* args) { - Browser* browser = - chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); - if (browser) - chrome::ShowBrowserSignin(browser, signin_metrics::SOURCE_NTP_LINK); + content::WebContents* web_contents = web_ui()->GetWebContents(); + Browser* browser = chrome::FindBrowserWithWebContents(web_contents); + if (!browser) + return; + signin_metrics::AccessPoint access_point = + web_contents->GetURL().spec() == chrome::kChromeUIAppsURL + ? signin_metrics::AccessPoint::ACCESS_POINT_APPS_PAGE_LINK + : signin_metrics::AccessPoint::ACCESS_POINT_NTP_LINK; + chrome::ShowBrowserSignin(browser, access_point); } void AppLauncherLoginHandler::UpdateLogin() { diff --git a/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc b/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc index ce801c8..1568401 100644 --- a/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc +++ b/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc @@ -261,7 +261,8 @@ void LocalDiscoveryUIHandler::HandleShowSyncUI( Browser* browser = chrome::FindBrowserWithWebContents( web_ui()->GetWebContents()); DCHECK(browser); - chrome::ShowBrowserSignin(browser, signin_metrics::SOURCE_DEVICES_PAGE); + chrome::ShowBrowserSignin( + browser, signin_metrics::AccessPoint::ACCESS_POINT_DEVICES_PAGE); } void LocalDiscoveryUIHandler::StartRegisterHTTP( diff --git a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.cc b/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.cc index d30cd2e..7dcad46 100644 --- a/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.cc +++ b/chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.cc @@ -130,7 +130,8 @@ void NewTabPageSyncHandler::HandleSyncLinkClicked(const base::ListValue* args) { chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); if (!browser || browser->IsAttemptingToCloseBrowser()) return; - chrome::ShowBrowserSignin(browser, signin_metrics::SOURCE_NTP_LINK); + chrome::ShowBrowserSignin(browser, + signin_metrics::AccessPoint::ACCESS_POINT_NTP_LINK); if (sync_service_->HasSyncSetupCompleted()) { base::string16 user = base::UTF8ToUTF16( diff --git a/chrome/browser/ui/webui/options/sync_setup_handler.cc b/chrome/browser/ui/webui/options/sync_setup_handler.cc index 142ab3c..67ecc43 100644 --- a/chrome/browser/ui/webui/options/sync_setup_handler.cc +++ b/chrome/browser/ui/webui/options/sync_setup_handler.cc @@ -335,16 +335,18 @@ void SyncSetupHandler::RegisterMessages() { } #if !defined(OS_CHROMEOS) -void SyncSetupHandler::DisplayGaiaLogin() { +void SyncSetupHandler::DisplayGaiaLogin( + signin_metrics::AccessPoint access_point) { DCHECK(!sync_startup_tracker_); // Advanced options are no longer being configured if the login screen is // visible. If the user exits the signin wizard after this without // configuring sync, CloseSyncSetup() will ensure they are logged out. configuring_sync_ = false; - DisplayGaiaLoginInNewTabOrWindow(); + DisplayGaiaLoginInNewTabOrWindow(access_point); } -void SyncSetupHandler::DisplayGaiaLoginInNewTabOrWindow() { +void SyncSetupHandler::DisplayGaiaLoginInNewTabOrWindow( + signin_metrics::AccessPoint access_point) { Browser* browser = chrome::FindBrowserWithWebContents( web_ui()->GetWebContents()); bool force_new_tab = false; @@ -371,19 +373,21 @@ void SyncSetupHandler::DisplayGaiaLoginInNewTabOrWindow() { if (!force_new_tab) { browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_REAUTH, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), access_point); } else { - url = signin::GetReauthURL(browser->profile(), - error_controller->error_account_id()); + url = signin::GetReauthURL( + access_point, signin_metrics::Reason::REASON_REAUTHENTICATION, + browser->profile(), error_controller->error_account_id()); } } else { - signin_metrics::LogSigninSource(signin_metrics::SOURCE_SETTINGS); if (!force_new_tab) { browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), access_point); } else { - url = signin::GetPromoURL(signin_metrics::SOURCE_SETTINGS, true); + url = signin::GetPromoURL( + access_point, signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, + true); } } @@ -628,7 +632,7 @@ void SyncSetupHandler::HandleShowSetupUI(const base::ListValue* args) { // If a setup wizard is present on this page or another, bring it to focus. // Otherwise, display a new one on this page. if (!FocusExistingWizardIfPresent()) - OpenSyncSetup(); + OpenSyncSetup(args); } #if defined(OS_CHROMEOS) @@ -645,7 +649,7 @@ void SyncSetupHandler::HandleStartSignin(const base::ListValue* args) { // Should only be called if the user is not already signed in. DCHECK(!SigninManagerFactory::GetForProfile(GetProfile())-> IsAuthenticated()); - OpenSyncSetup(); + OpenSyncSetup(args); } void SyncSetupHandler::HandleStopSyncing(const base::ListValue* args) { @@ -717,7 +721,7 @@ void SyncSetupHandler::CloseSyncSetup() { configuring_sync_ = false; } -void SyncSetupHandler::OpenSyncSetup() { +void SyncSetupHandler::OpenSyncSetup(const base::ListValue* args) { if (!PrepareSyncSetup()) return; @@ -743,7 +747,15 @@ void SyncSetupHandler::OpenSyncSetup() { // setup including any visible overlays, and display the gaia auth page. // Control will be returned to the sync settings page once auth is complete. CloseUI(); - DisplayGaiaLogin(); + if (args) { + std::string access_point = base::UTF16ToUTF8(ExtractStringValue(args)); + if (access_point == "access-point-supervised-user") { + DisplayGaiaLogin( + signin_metrics::AccessPoint::ACCESS_POINT_SUPERVISED_USER); + return; + } + } + DisplayGaiaLogin(signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); return; } #endif diff --git a/chrome/browser/ui/webui/options/sync_setup_handler.h b/chrome/browser/ui/webui/options/sync_setup_handler.h index 0065ecc..86ac6bc 100644 --- a/chrome/browser/ui/webui/options/sync_setup_handler.h +++ b/chrome/browser/ui/webui/options/sync_setup_handler.h @@ -20,6 +20,10 @@ namespace content { class WebContents; } +namespace signin_metrics { +enum class AccessPoint; +} + class SyncSetupHandler : public options::OptionsPageUIHandler, public SyncStartupTracker::Observer, public LoginUIService::LoginUI { @@ -44,7 +48,7 @@ class SyncSetupHandler : public options::OptionsPageUIHandler, content::WebUI* web_ui); // Initializes the sync setup flow and shows the setup UI. - void OpenSyncSetup(); + void OpenSyncSetup(const base::ListValue* args); // Shows advanced configuration dialog without going through sign in dialog. // Kicks the sync backend if necessary with showing spinner dialog until it @@ -105,11 +109,12 @@ class SyncSetupHandler : public options::OptionsPageUIHandler, void HandleCloseTimeout(const base::ListValue* args); #if !defined(OS_CHROMEOS) // Displays the GAIA login form. - void DisplayGaiaLogin(); + void DisplayGaiaLogin(signin_metrics::AccessPoint access_point); // When web-flow is enabled, displays the Gaia login form in a new tab. // This function is virtual so that tests can override. - virtual void DisplayGaiaLoginInNewTabOrWindow(); + virtual void DisplayGaiaLoginInNewTabOrWindow( + signin_metrics::AccessPoint access_point); #endif // Helper routine that gets the Profile associated with this object (virtual diff --git a/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc b/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc index 233d473..99035ac 100644 --- a/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc +++ b/chrome/browser/ui/webui/options/sync_setup_handler_unittest.cc @@ -163,7 +163,8 @@ class TestingSyncSetupHandler : public SyncSetupHandler { private: #if !defined(OS_CHROMEOS) - void DisplayGaiaLoginInNewTabOrWindow() override {} + void DisplayGaiaLoginInNewTabOrWindow( + signin_metrics::AccessPoint access_point) override {} #endif // Weak pointer to parent profile. @@ -393,7 +394,7 @@ TEST_F(SyncSetupHandlerTest, EXPECT_CALL(*mock_pss_, IsBackendInitialized()).WillRepeatedly(Return(false)); SetDefaultExpectationsForConfigPage(); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); // We expect a call to SyncSetupOverlay.showSyncSetupPage. EXPECT_EQ(1U, web_ui_.call_data().size()); @@ -444,7 +445,7 @@ TEST_F(SyncSetupHandlerTest, .WillOnce(Return(false)) .WillRepeatedly(Return(true)); SetDefaultExpectationsForConfigPage(); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); // It's important to tell sync the user cancelled the setup flow before we // tell it we're through with the setup progress. @@ -468,7 +469,7 @@ TEST_F(SyncSetupHandlerTest, error_ = GoogleServiceAuthError::AuthErrorNone(); EXPECT_CALL(*mock_pss_, IsBackendInitialized()).WillRepeatedly(Return(false)); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data.function_name()); std::string page; @@ -502,7 +503,7 @@ TEST_F(SyncSetupHandlerNonCrosTest, HandleGaiaAuthFailure) { EXPECT_CALL(*mock_pss_, HasSyncSetupCompleted()) .WillRepeatedly(Return(false)); // Open the web UI. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ASSERT_FALSE(handler_->is_configuring_sync()); } @@ -515,7 +516,7 @@ TEST_F(SyncSetupHandlerNonCrosTest, UnrecoverableErrorInitializingSync) { EXPECT_CALL(*mock_pss_, HasSyncSetupCompleted()) .WillRepeatedly(Return(false)); // Open the web UI. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ASSERT_FALSE(handler_->is_configuring_sync()); } @@ -527,7 +528,7 @@ TEST_F(SyncSetupHandlerNonCrosTest, GaiaErrorInitializingSync) { EXPECT_CALL(*mock_pss_, HasSyncSetupCompleted()) .WillRepeatedly(Return(false)); // Open the web UI. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ASSERT_FALSE(handler_->is_configuring_sync()); } @@ -756,7 +757,7 @@ TEST_F(SyncSetupHandlerTest, ShowSyncSetup) { SetupInitializedProfileSyncService(); // This should display the sync setup dialog (not login). SetDefaultExpectationsForConfigPage(); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); } @@ -793,7 +794,7 @@ TEST_F(SyncSetupHandlerTest, ShowSigninOnAuthError) { // On ChromeOS, this should display the spinner while we try to startup the // sync backend, and on desktop this displays the login dialog. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); // Sync setup is closed when re-auth is in progress. EXPECT_EQ(NULL, @@ -812,7 +813,7 @@ TEST_F(SyncSetupHandlerTest, ShowSetupSyncEverything) { SetupInitializedProfileSyncService(); SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -846,7 +847,7 @@ TEST_F(SyncSetupHandlerTest, ShowSetupManuallySyncAll) { sync_prefs.SetKeepEverythingSynced(false); SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -873,7 +874,7 @@ TEST_F(SyncSetupHandlerTest, ShowSetupSyncForAllTypesIndividually) { WillRepeatedly(Return(types)); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); // Close the config overlay. @@ -898,7 +899,7 @@ TEST_F(SyncSetupHandlerTest, ShowSetupGaiaPassphraseRequired) { SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -920,7 +921,7 @@ TEST_F(SyncSetupHandlerTest, ShowSetupCustomPassphraseRequired) { SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -942,7 +943,7 @@ TEST_F(SyncSetupHandlerTest, ShowSetupEncryptAll) { .WillRepeatedly(Return(true)); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -962,7 +963,7 @@ TEST_F(SyncSetupHandlerTest, ShowSetupEncryptAllDisallowed) { .WillRepeatedly(Return(false)); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; diff --git a/chrome/browser/ui/webui/settings/sync_handler.cc b/chrome/browser/ui/webui/settings/sync_handler.cc index 3928f18..b60851a 100644 --- a/chrome/browser/ui/webui/settings/sync_handler.cc +++ b/chrome/browser/ui/webui/settings/sync_handler.cc @@ -244,16 +244,17 @@ void SyncHandler::RegisterMessages() { } #if !defined(OS_CHROMEOS) -void SyncHandler::DisplayGaiaLogin() { +void SyncHandler::DisplayGaiaLogin(signin_metrics::AccessPoint access_point) { DCHECK(!sync_startup_tracker_); // Advanced options are no longer being configured if the login screen is // visible. If the user exits the signin wizard after this without // configuring sync, CloseSyncSetup() will ensure they are logged out. configuring_sync_ = false; - DisplayGaiaLoginInNewTabOrWindow(); + DisplayGaiaLoginInNewTabOrWindow(access_point); } -void SyncHandler::DisplayGaiaLoginInNewTabOrWindow() { +void SyncHandler::DisplayGaiaLoginInNewTabOrWindow( + signin_metrics::AccessPoint access_point) { Browser* browser = chrome::FindBrowserWithWebContents( web_ui()->GetWebContents()); bool force_new_tab = false; @@ -280,19 +281,21 @@ void SyncHandler::DisplayGaiaLoginInNewTabOrWindow() { if (!force_new_tab) { browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_REAUTH, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), access_point); } else { - url = signin::GetReauthURL(browser->profile(), - error_controller->error_account_id()); + url = signin::GetReauthURL( + access_point, signin_metrics::Reason::REASON_REAUTHENTICATION, + browser->profile(), error_controller->error_account_id()); } } else { - signin_metrics::LogSigninSource(signin_metrics::SOURCE_SETTINGS); if (!force_new_tab) { browser->window()->ShowAvatarBubbleFromAvatarButton( BrowserWindow::AVATAR_BUBBLE_MODE_SIGNIN, - signin::ManageAccountsParams()); + signin::ManageAccountsParams(), access_point); } else { - url = signin::GetPromoURL(signin_metrics::SOURCE_SETTINGS, true); + url = signin::GetPromoURL( + access_point, signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, + true); } } @@ -531,7 +534,7 @@ void SyncHandler::HandleShowSetupUI(const base::ListValue* args) { // If a setup wizard is present on this page or another, bring it to focus. // Otherwise, display a new one on this page. if (!FocusExistingWizardIfPresent()) - OpenSyncSetup(); + OpenSyncSetup(args); } #if defined(OS_CHROMEOS) @@ -547,7 +550,7 @@ void SyncHandler::HandleDoSignOutOnAuthError(const base::ListValue* args) { void SyncHandler::HandleStartSignin(const base::ListValue* args) { // Should only be called if the user is not already signed in. DCHECK(!SigninManagerFactory::GetForProfile(profile_)->IsAuthenticated()); - OpenSyncSetup(); + OpenSyncSetup(args); } void SyncHandler::HandleStopSyncing(const base::ListValue* args) { @@ -628,7 +631,7 @@ void SyncHandler::CloseSyncSetup() { configuring_sync_ = false; } -void SyncHandler::OpenSyncSetup() { +void SyncHandler::OpenSyncSetup(const base::ListValue* args) { if (!PrepareSyncSetup()) return; @@ -653,7 +656,15 @@ void SyncHandler::OpenSyncSetup() { // setup including any visible overlays, and display the gaia auth page. // Control will be returned to the sync settings page once auth is complete. CloseUI(); - DisplayGaiaLogin(); + if (args) { + std::string access_point = base::UTF16ToUTF8(ExtractStringValue(args)); + if (access_point == "access-point-supervised-user") { + DisplayGaiaLogin( + signin_metrics::AccessPoint::ACCESS_POINT_SUPERVISED_USER); + return; + } + } + DisplayGaiaLogin(signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); return; } #endif diff --git a/chrome/browser/ui/webui/settings/sync_handler.h b/chrome/browser/ui/webui/settings/sync_handler.h index ec67f44..b17ddb8 100644 --- a/chrome/browser/ui/webui/settings/sync_handler.h +++ b/chrome/browser/ui/webui/settings/sync_handler.h @@ -10,6 +10,7 @@ #include "base/memory/scoped_ptr.h" #include "base/prefs/pref_change_registrar.h" #include "base/scoped_observer.h" +#include "base/strings/utf_string_conversions.h" #include "base/timer/timer.h" #include "chrome/browser/sync/sync_startup_tracker.h" #include "chrome/browser/ui/webui/signin/login_ui_service.h" @@ -26,6 +27,10 @@ class WebContents; class WebUI; } +namespace signin_metrics { +enum class AccessPoint; +} + namespace settings { class SyncHandler : public content::WebUIMessageHandler, @@ -59,7 +64,7 @@ class SyncHandler : public content::WebUIMessageHandler, void OnStateChanged() override; // Initializes the sync setup flow and shows the setup UI. - void OpenSyncSetup(); + void OpenSyncSetup(const base::ListValue* args); // Shows advanced configuration dialog without going through sign in dialog. // Kicks the sync backend if necessary with showing spinner dialog until it @@ -127,11 +132,12 @@ class SyncHandler : public content::WebUIMessageHandler, #if !defined(OS_CHROMEOS) // Displays the GAIA login form. - void DisplayGaiaLogin(); + void DisplayGaiaLogin(signin_metrics::AccessPoint access_point); // When web-flow is enabled, displays the Gaia login form in a new tab. // This function is virtual so that tests can override. - virtual void DisplayGaiaLoginInNewTabOrWindow(); + virtual void DisplayGaiaLoginInNewTabOrWindow( + signin_metrics::AccessPoint access_point); #endif // A utility function to call before actually showing setup dialog. Makes sure diff --git a/chrome/browser/ui/webui/settings/sync_handler_unittest.cc b/chrome/browser/ui/webui/settings/sync_handler_unittest.cc index d647b09..80d09aa 100644 --- a/chrome/browser/ui/webui/settings/sync_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/sync_handler_unittest.cc @@ -166,7 +166,8 @@ class TestingSyncHandler : public SyncHandler { private: #if !defined(OS_CHROMEOS) - void DisplayGaiaLoginInNewTabOrWindow() override {} + void DisplayGaiaLoginInNewTabOrWindow( + signin_metrics::AccessPoint access_point) override {} #endif DISALLOW_COPY_AND_ASSIGN(TestingSyncHandler); @@ -397,7 +398,7 @@ TEST_F(SyncHandlerTest, EXPECT_CALL(*mock_pss_, IsBackendInitialized()).WillRepeatedly(Return(false)); SetDefaultExpectationsForConfigPage(); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); // We expect a call to settings.SyncPrivateApi.showSyncSetupPage. EXPECT_EQ(1U, web_ui_.call_data().size()); @@ -448,7 +449,7 @@ TEST_F(SyncHandlerTest, .WillOnce(Return(false)) .WillRepeatedly(Return(true)); SetDefaultExpectationsForConfigPage(); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); // It's important to tell sync the user cancelled the setup flow before we // tell it we're through with the setup progress. @@ -472,7 +473,7 @@ TEST_F(SyncHandlerTest, error_ = GoogleServiceAuthError::AuthErrorNone(); EXPECT_CALL(*mock_pss_, IsBackendInitialized()).WillRepeatedly(Return(false)); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage", data.function_name()); std::string page; @@ -506,7 +507,7 @@ TEST_F(SyncHandlerNonCrosTest, HandleGaiaAuthFailure) { EXPECT_CALL(*mock_pss_, HasSyncSetupCompleted()) .WillRepeatedly(Return(false)); // Open the web UI. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ASSERT_FALSE(handler_->is_configuring_sync()); } @@ -519,7 +520,7 @@ TEST_F(SyncHandlerNonCrosTest, UnrecoverableErrorInitializingSync) { EXPECT_CALL(*mock_pss_, HasSyncSetupCompleted()) .WillRepeatedly(Return(false)); // Open the web UI. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ASSERT_FALSE(handler_->is_configuring_sync()); } @@ -531,7 +532,7 @@ TEST_F(SyncHandlerNonCrosTest, GaiaErrorInitializingSync) { EXPECT_CALL(*mock_pss_, HasSyncSetupCompleted()) .WillRepeatedly(Return(false)); // Open the web UI. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ASSERT_FALSE(handler_->is_configuring_sync()); } @@ -760,7 +761,7 @@ TEST_F(SyncHandlerTest, ShowSyncSetup) { SetupInitializedProfileSyncService(); // This should display the sync setup dialog (not login). SetDefaultExpectationsForConfigPage(); - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); } @@ -797,7 +798,7 @@ TEST_F(SyncHandlerTest, ShowSigninOnAuthError) { // On ChromeOS, this should display the spinner while we try to startup the // sync backend, and on desktop this displays the login dialog. - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); // Sync setup is closed when re-auth is in progress. EXPECT_EQ(NULL, @@ -816,7 +817,7 @@ TEST_F(SyncHandlerTest, ShowSetupSyncEverything) { SetupInitializedProfileSyncService(); SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -850,7 +851,7 @@ TEST_F(SyncHandlerTest, ShowSetupManuallySyncAll) { sync_prefs.SetKeepEverythingSynced(false); SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -877,7 +878,7 @@ TEST_F(SyncHandlerTest, ShowSetupSyncForAllTypesIndividually) { WillRepeatedly(Return(types)); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); // Close the config overlay. @@ -902,7 +903,7 @@ TEST_F(SyncHandlerTest, ShowSetupGaiaPassphraseRequired) { SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -924,7 +925,7 @@ TEST_F(SyncHandlerTest, ShowSetupCustomPassphraseRequired) { SetDefaultExpectationsForConfigPage(); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -946,7 +947,7 @@ TEST_F(SyncHandlerTest, ShowSetupEncryptAll) { .WillRepeatedly(Return(true)); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; @@ -966,7 +967,7 @@ TEST_F(SyncHandlerTest, ShowSetupEncryptAllDisallowed) { .WillRepeatedly(Return(false)); // This should display the sync setup dialog (not login). - handler_->OpenSyncSetup(); + handler_->OpenSyncSetup(nullptr); ExpectConfig(); const content::TestWebUI::CallData& data = *web_ui_.call_data()[0]; diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chrome/browser/ui/webui/signin/inline_login_handler.cc index f021456..89b171c 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler.cc @@ -69,17 +69,17 @@ void InlineLoginHandler::ContinueHandleInitializeMessage() { params.SetInteger("authMode", InlineLoginHandler::kDesktopAuthMode); const GURL& current_url = web_ui()->GetWebContents()->GetURL(); - signin_metrics::Source source = signin::GetSourceForPromoURL(current_url); + signin_metrics::AccessPoint access_point = + signin::GetAccessPointForPromoURL(current_url); + signin_metrics::LogSigninAccessPointStarted(access_point); - params.SetString( - "continueUrl", - signin::GetLandingURL(signin::kSignInPromoQueryKeySource, - static_cast<int>(source)).spec()); + params.SetString("continueUrl", signin::GetLandingURL(access_point).spec()); Profile* profile = Profile::FromWebUI(web_ui()); + signin_metrics::Reason reason = + signin::GetSigninReasonForPromoURL(current_url); std::string default_email; - if (source != signin_metrics::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT && - source != signin_metrics::SOURCE_REAUTH) { + if (reason == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) { default_email = profile->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername); } else { diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc index 9ec70e8..350905e 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc @@ -74,7 +74,7 @@ bool IsSystemProfile(Profile* profile) { } void RedirectToNtpOrAppsPage(content::WebContents* contents, - signin_metrics::Source source) { + signin_metrics::AccessPoint access_point) { // Do nothing if a navigation is pending, since this call can be triggered // from DidStartLoading. This avoids deleting the pending entry while we are // still navigating to it. See crbug/346632. @@ -83,8 +83,10 @@ void RedirectToNtpOrAppsPage(content::WebContents* contents, VLOG(1) << "RedirectToNtpOrAppsPage"; // Redirect to NTP/Apps page and display a confirmation bubble - GURL url(source == signin_metrics::SOURCE_APPS_PAGE_LINK ? - chrome::kChromeUIAppsURL : chrome::kChromeUINewTabURL); + GURL url(access_point == + signin_metrics::AccessPoint::ACCESS_POINT_APPS_PAGE_LINK + ? chrome::kChromeUIAppsURL + : chrome::kChromeUINewTabURL); content::OpenURLParams params(url, content::Referrer(), CURRENT_TAB, @@ -93,10 +95,11 @@ void RedirectToNtpOrAppsPage(content::WebContents* contents, contents->OpenURL(params); } -void RedirectToNtpOrAppsPageIfNecessary(content::WebContents* contents, - signin_metrics::Source source) { - if (source != signin_metrics::SOURCE_SETTINGS) - RedirectToNtpOrAppsPage(contents, source); +void RedirectToNtpOrAppsPageIfNecessary( + content::WebContents* contents, + signin_metrics::AccessPoint access_point) { + if (access_point != signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS) + RedirectToNtpOrAppsPage(contents, access_point); } class ConfirmEmailDialogDelegate : public TabModalConfirmDialogDelegate { @@ -272,21 +275,25 @@ void InlineSigninHelper::OnClientOAuthSuccess(const ClientOAuthResult& result) { AccountTrackerServiceFactory::GetForProfile(profile_) ->SeedAccountInfo(gaia_id_, email_); - signin_metrics::Source source = signin::GetSourceForPromoURL(current_url_); + signin_metrics::AccessPoint access_point = + signin::GetAccessPointForPromoURL(current_url_); + signin_metrics::Reason reason = + signin::GetSigninReasonForPromoURL(current_url_); SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile_); std::string primary_email = signin_manager->GetAuthenticatedAccountInfo().email; if (gaia::AreEmailsSame(email_, primary_email) && - source == signin_metrics::SOURCE_REAUTH && - switches::IsNewProfileManagement() && - !password_.empty() && + (reason == signin_metrics::Reason::REASON_REAUTHENTICATION || + reason == signin_metrics::Reason::REASON_UNLOCK) && + switches::IsNewProfileManagement() && !password_.empty() && profiles::IsLockAvailable(profile_)) { LocalAuth::SetLocalAuthCredentials(profile_, password_); } - if (source == signin_metrics::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT || - source == signin_metrics::SOURCE_REAUTH) { + if (reason == signin_metrics::Reason::REASON_REAUTHENTICATION || + reason == signin_metrics::Reason::REASON_UNLOCK || + reason == signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT) { ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)-> UpdateCredentials(account_id, result.refresh_token); @@ -299,8 +306,10 @@ void InlineSigninHelper::OnClientOAuthSuccess(const ClientOAuthResult& result) { signin::ShouldShowAccountManagement(current_url_))); } - if (source == signin_metrics::SOURCE_REAUTH) + if (reason == signin_metrics::Reason::REASON_REAUTHENTICATION || + reason == signin_metrics::Reason::REASON_UNLOCK) { signin_manager->MergeSigninCredentialIntoCookieJar(); + } } else { ProfileSyncService* sync_service = ProfileSyncServiceFactory::GetForProfile(profile_); @@ -309,7 +318,8 @@ void InlineSigninHelper::OnClientOAuthSuccess(const ClientOAuthResult& result) { OneClickSigninSyncStarter::StartSyncMode start_mode = OneClickSigninSyncStarter::CONFIRM_SYNC_SETTINGS_FIRST; - if (source == signin_metrics::SOURCE_SETTINGS || choose_what_to_sync_) { + if (access_point == signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS || + choose_what_to_sync_) { bool show_settings_without_configure = error_controller->HasError() && sync_service && @@ -324,14 +334,12 @@ void InlineSigninHelper::OnClientOAuthSuccess(const ClientOAuthResult& result) { OneClickSigninSyncStarter::CONFIRM_UNTRUSTED_SIGNIN : OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN; - bool start_signin = !HandleCrossAccountError(result.refresh_token, source, - confirmation_required, start_mode); + bool start_signin = !HandleCrossAccountError( + result.refresh_token, confirmation_required, start_mode); if (start_signin) { - CreateSyncStarter(browser, - contents, + CreateSyncStarter(browser, contents, current_url_, signin::GetNextPageURLForPromoURL(current_url_), - result.refresh_token, - start_mode, + result.refresh_token, start_mode, confirmation_required); base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); } @@ -341,24 +349,20 @@ void InlineSigninHelper::OnClientOAuthSuccess(const ClientOAuthResult& result) { void InlineSigninHelper::CreateSyncStarter( Browser* browser, content::WebContents* contents, - const GURL& url, + const GURL& current_url, + const GURL& continue_url, const std::string& refresh_token, OneClickSigninSyncStarter::StartSyncMode start_mode, OneClickSigninSyncStarter::ConfirmationRequired confirmation_required) { // OneClickSigninSyncStarter will delete itself once the job is done. new OneClickSigninSyncStarter( - profile_, browser, - gaia_id_, email_, password_, refresh_token, - start_mode, - contents, - confirmation_required, - url, + profile_, browser, gaia_id_, email_, password_, refresh_token, start_mode, + contents, confirmation_required, current_url, continue_url, base::Bind(&InlineLoginHandlerImpl::SyncStarterCallback, handler_)); } bool InlineSigninHelper::HandleCrossAccountError( const std::string& refresh_token, - signin_metrics::Source source, OneClickSigninSyncStarter::ConfirmationRequired confirmation_required, OneClickSigninSyncStarter::StartSyncMode start_mode) { std::string last_email = @@ -380,7 +384,6 @@ bool InlineSigninHelper::HandleCrossAccountError( base::Unretained(this), web_contents, refresh_token, - source, confirmation_required, start_mode)); return true; @@ -389,7 +392,6 @@ bool InlineSigninHelper::HandleCrossAccountError( void InlineSigninHelper::ConfirmEmailAction( content::WebContents* web_contents, const std::string& refresh_token, - signin_metrics::Source source, OneClickSigninSyncStarter::ConfirmationRequired confirmation_required, OneClickSigninSyncStarter::StartSyncMode start_mode, InlineSigninHelper::Action action) { @@ -405,8 +407,8 @@ void InlineSigninHelper::ConfirmEmailAction( std::string(chrome::kCreateProfileSubPage)); break; case InlineSigninHelper::START_SYNC: - CreateSyncStarter(browser, web_contents, GURL(), refresh_token, - start_mode, confirmation_required); + CreateSyncStarter(browser, web_contents, current_url_, GURL(), + refresh_token, start_mode, confirmation_required); break; case InlineSigninHelper::CLOSE: if (handler_) { @@ -559,7 +561,8 @@ void InlineLoginHandlerImpl::SetExtraInitParams(base::DictionaryValue& params) { content::WebContents* contents = web_ui()->GetWebContents(); const GURL& current_url = contents->GetURL(); - signin_metrics::Source source = signin::GetSourceForPromoURL(current_url); + signin_metrics::Reason reason = + signin::GetSigninReasonForPromoURL(current_url); std::string is_constrained; net::GetValueForKeyInQuery(current_url, "constrained", &is_constrained); @@ -576,11 +579,12 @@ void InlineLoginHandlerImpl::SetExtraInitParams(base::DictionaryValue& params) { params.SetString("gaiaPath", url.path().substr(1)); std::string flow; - switch (source) { - case signin_metrics::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT: + switch (reason) { + case signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT: flow = "addaccount"; break; - case signin_metrics::SOURCE_REAUTH: + case signin_metrics::Reason::REASON_REAUTHENTICATION: + case signin_metrics::Reason::REASON_UNLOCK: flow = "reauth"; break; default: @@ -739,20 +743,25 @@ void InlineLoginHandlerImpl::FinishCompleteLogin( } } - signin_metrics::Source source = signin::GetSourceForPromoURL(params.url); + signin_metrics::AccessPoint access_point = + signin::GetAccessPointForPromoURL(params.url); + signin_metrics::Reason reason = + signin::GetSigninReasonForPromoURL(params.url); LogHistogramValue(signin_metrics::HISTOGRAM_ACCEPTED); bool switch_to_advanced = - params.choose_what_to_sync && (source != signin_metrics::SOURCE_SETTINGS); + params.choose_what_to_sync && + (access_point != signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); LogHistogramValue( switch_to_advanced ? signin_metrics::HISTOGRAM_WITH_ADVANCED : signin_metrics::HISTOGRAM_WITH_DEFAULTS); CanOfferFor can_offer_for = CAN_OFFER_FOR_ALL; - switch (source) { - case signin_metrics::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT: + switch (reason) { + case signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT: can_offer_for = CAN_OFFER_FOR_SECONDARY_ACCOUNT; break; - case signin_metrics::SOURCE_REAUTH: { + case signin_metrics::Reason::REASON_REAUTHENTICATION: + case signin_metrics::Reason::REASON_UNLOCK: { std::string primary_username = SigninManagerFactory::GetForProfile(profile) ->GetAuthenticatedAccountInfo() @@ -848,11 +857,12 @@ void InlineLoginHandlerImpl::SyncStarterCallback( } const GURL& current_url = contents->GetLastCommittedURL(); - signin_metrics::Source source = signin::GetSourceForPromoURL(current_url); + signin_metrics::AccessPoint access_point = + signin::GetAccessPointForPromoURL(current_url); bool auto_close = signin::IsAutoCloseEnabledInURL(current_url); if (result == OneClickSigninSyncStarter::SYNC_SETUP_FAILURE) { - RedirectToNtpOrAppsPage(contents, source); + RedirectToNtpOrAppsPage(contents, access_point); } else if (auto_close) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, @@ -860,7 +870,7 @@ void InlineLoginHandlerImpl::SyncStarterCallback( weak_factory_.GetWeakPtr(), signin::ShouldShowAccountManagement(current_url))); } else { - RedirectToNtpOrAppsPageIfNecessary(contents, source); + RedirectToNtpOrAppsPageIfNecessary(contents, access_point); } } @@ -879,8 +889,9 @@ void InlineLoginHandlerImpl::CloseTab(bool show_account_management) { if (show_account_management) { browser->window()->ShowAvatarBubbleFromAvatarButton( - BrowserWindow::AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT, - signin::ManageAccountsParams()); + BrowserWindow::AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT, + signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN); } } } diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.h b/chrome/browser/ui/webui/signin/inline_login_handler_impl.h index 138b4fb..f20256b 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.h +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.h @@ -170,7 +170,6 @@ class InlineSigninHelper : public GaiaAuthConsumer { // cross account error, and false otherwise. bool HandleCrossAccountError( const std::string& refresh_token, - signin_metrics::Source source, OneClickSigninSyncStarter::ConfirmationRequired confirmation_required, OneClickSigninSyncStarter::StartSyncMode start_mode); @@ -178,7 +177,6 @@ class InlineSigninHelper : public GaiaAuthConsumer { void ConfirmEmailAction( content::WebContents* web_contents, const std::string& refresh_token, - signin_metrics::Source source, OneClickSigninSyncStarter::ConfirmationRequired confirmation_required, OneClickSigninSyncStarter::StartSyncMode start_mode, Action action); @@ -193,7 +191,8 @@ class InlineSigninHelper : public GaiaAuthConsumer { virtual void CreateSyncStarter( Browser* browser, content::WebContents* contents, - const GURL& url, + const GURL& current_url, + const GURL& continue_url, const std::string& refresh_token, OneClickSigninSyncStarter::StartSyncMode start_mode, OneClickSigninSyncStarter::ConfirmationRequired confirmation_required); diff --git a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc index 6357b36..583234e 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc +++ b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc @@ -102,6 +102,12 @@ ACTION(ReturnNewWebUI) { return new content::WebUIController(arg0); } +GURL GetSigninPromoURL() { + return signin::GetPromoURL( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false); +} + // Mock the TestChromeWebUIControllerFactory::WebUIProvider to prove that we are // not called as expected. class FooWebUIProvider @@ -144,10 +150,11 @@ class MockInlineSigninHelper : public InlineSigninHelper { MOCK_METHOD1(OnClientOAuthSuccess, void(const ClientOAuthResult& result)); MOCK_METHOD1(OnClientOAuthFailure, void(const GoogleServiceAuthError& error)); - MOCK_METHOD6(CreateSyncStarter, + MOCK_METHOD7(CreateSyncStarter, void(Browser*, content::WebContents*, const GURL&, + const GURL&, const std::string&, OneClickSigninSyncStarter::StartSyncMode, OneClickSigninSyncStarter::ConfirmationRequired)); @@ -200,10 +207,11 @@ class MockSyncStarterInlineSigninHelper : public InlineSigninHelper { bool choose_what_to_sync, bool confirm_untrusted_signin); - MOCK_METHOD6(CreateSyncStarter, + MOCK_METHOD7(CreateSyncStarter, void(Browser*, content::WebContents*, const GURL&, + const GURL&, const std::string&, OneClickSigninSyncStarter::StartSyncMode, OneClickSigninSyncStarter::ConfirmationRequired)); @@ -303,10 +311,8 @@ void InlineLoginUIBrowserTest::SetAllowedUsernamePattern( #endif IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, MAYBE_DifferentStorageId) { if (switches::IsEnableWebviewBasedSignin()) { - ContentInfo info = NavigateAndGetInfo( - browser(), - signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - CURRENT_TAB); + ContentInfo info = + NavigateAndGetInfo(browser(), GetSigninPromoURL(), CURRENT_TAB); WaitUntilUIReady(browser()); // Make sure storage partition of embedded webview is different from @@ -328,15 +334,11 @@ IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, MAYBE_DifferentStorageId) { ContentInfo info1 = NavigateAndGetInfo(browser(), test_url, CURRENT_TAB); - ContentInfo info2 = NavigateAndGetInfo( - browser(), - signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - CURRENT_TAB); + ContentInfo info2 = + NavigateAndGetInfo(browser(), GetSigninPromoURL(), CURRENT_TAB); NavigateAndGetInfo(browser(), test_url, CURRENT_TAB); - ContentInfo info3 = NavigateAndGetInfo( - browser(), - signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - NEW_FOREGROUND_TAB); + ContentInfo info3 = + NavigateAndGetInfo(browser(), GetSigninPromoURL(), NEW_FOREGROUND_TAB); // The info for signin should be the same. ASSERT_EQ(info2.storage_partition, info3.storage_partition); @@ -361,10 +363,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, OneProcessLimit) { NavigateAndGetInfo(browser(), test_url_1, CURRENT_TAB); ContentInfo info2 = NavigateAndGetInfo(browser(), test_url_2, CURRENT_TAB); - ContentInfo info3 = NavigateAndGetInfo( - browser(), - signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - CURRENT_TAB); + ContentInfo info3 = + NavigateAndGetInfo(browser(), GetSigninPromoURL(), CURRENT_TAB); ASSERT_EQ(info1.pid, info2.pid); ASSERT_NE(info1.pid, info3.pid); @@ -587,8 +587,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, WithAuthCode) { IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, SigninCreatesSyncStarter1) { // See Source enum in components/signin/core/browser/signin_metrics.h for - // possible values of source=. - GURL url("chrome://chrome-signin/?source=0"); + // possible values of access_point=, reason=. + GURL url("chrome://chrome-signin/?access_point=0&reason=0"); base::WeakPtr<InlineLoginHandlerImpl> handler; // MockSyncStarterInlineSigninHelper will delete itself when done using // base::ThreadTaskRunnerHandle::DeleteSoon(), so need to delete here. But @@ -607,10 +607,11 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, std::string(), false, // choose what to sync false); // confirm untrusted signin - EXPECT_CALL(*helper, CreateSyncStarter( - _, _, _, "refresh_token", - OneClickSigninSyncStarter::CONFIRM_SYNC_SETTINGS_FIRST, - OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN)); + EXPECT_CALL( + *helper, + CreateSyncStarter(_, _, _, _, "refresh_token", + OneClickSigninSyncStarter::CONFIRM_SYNC_SETTINGS_FIRST, + OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN)); SimulateOnClientOAuthSuccess(helper, "refresh_token"); base::MessageLoop::current()->RunUntilIdle(); @@ -621,8 +622,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, SigninCreatesSyncStarter2) { // See Source enum in components/signin/core/browser/signin_metrics.h for - // possible values of source=. - const GURL url("chrome://chrome-signin/?source=0"); + // possible values of access_point=, reason=. + const GURL url("chrome://chrome-signin/?access_point=0&reason=0"); base::WeakPtr<InlineLoginHandlerImpl> handler; // MockSyncStarterInlineSigninHelper will delete itself when done using // base::ThreadTaskRunnerHandle::DeleteSoon(), so need to delete here. But @@ -642,9 +643,9 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, true, // choose what to sync false); // confirm untrusted signin EXPECT_CALL(*helper, CreateSyncStarter( - _, _, _, "refresh_token", - OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST, - OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN)); + _, _, _, _, "refresh_token", + OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST, + OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN)); SimulateOnClientOAuthSuccess(helper, "refresh_token"); base::MessageLoop::current()->RunUntilIdle(); @@ -655,8 +656,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, SigninCreatesSyncStarter3) { // See Source enum in components/signin/core/browser/signin_metrics.h for - // possible values of source=. - GURL url("chrome://chrome-signin/?source=0"); + // possible values of access_point=, reason=. + GURL url("chrome://chrome-signin/?access_point=0&reason=0"); base::WeakPtr<InlineLoginHandlerImpl> handler; // MockSyncStarterInlineSigninHelper will delete itself when done using // base::ThreadTaskRunnerHandle::DeleteSoon(), so need to delete here. But @@ -675,10 +676,11 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, std::string(), false, // choose what to sync true); // confirm untrusted signin - EXPECT_CALL(*helper, CreateSyncStarter( - _, _, _, "refresh_token", - OneClickSigninSyncStarter::CONFIRM_SYNC_SETTINGS_FIRST, - OneClickSigninSyncStarter::CONFIRM_UNTRUSTED_SIGNIN)); + EXPECT_CALL( + *helper, + CreateSyncStarter(_, _, _, _, "refresh_token", + OneClickSigninSyncStarter::CONFIRM_SYNC_SETTINGS_FIRST, + OneClickSigninSyncStarter::CONFIRM_UNTRUSTED_SIGNIN)); SimulateOnClientOAuthSuccess(helper, "refresh_token"); base::MessageLoop::current()->RunUntilIdle(); @@ -689,8 +691,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, SigninCreatesSyncStarter4) { // See Source enum in components/signin/core/browser/signin_metrics.h for - // possible values of source=. - const GURL url("chrome://chrome-signin/?source=3"); + // possible values of access_point=, reason=. + const GURL url("chrome://chrome-signin/?access_point=3&reason=0"); base::WeakPtr<InlineLoginHandlerImpl> handler; // MockSyncStarterInlineSigninHelper will delete itself when done using // base::ThreadTaskRunnerHandle::DeleteSoon(), so need to delete here. But @@ -713,9 +715,9 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, // Even though "choose what to sync" is false, the source of the URL is // settings, which means the user wants to CONFIGURE_SYNC_FIRST. EXPECT_CALL(*helper, CreateSyncStarter( - _, _, _, "refresh_token", - OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST, - OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN)); + _, _, _, _, "refresh_token", + OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST, + OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN)); SimulateOnClientOAuthSuccess(helper, "refresh_token"); base::MessageLoop::current()->RunUntilIdle(); @@ -727,8 +729,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, ASSERT_EQ(0ul, token_service()->GetAccounts().size()); // See Source enum in components/signin/core/browser/signin_metrics.h for - // possible values of source=. - GURL url("chrome://chrome-signin/?source=11"); + // possible values of access_point=, reason=. + GURL url("chrome://chrome-signin/?access_point=3&reason=2"); base::WeakPtr<InlineLoginHandlerImpl> handler; InlineSigninHelper helper(handler, browser()->profile()->GetRequestContext(), @@ -754,8 +756,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest, ASSERT_EQ(0ul, token_service()->GetAccounts().size()); // See Source enum in components/signin/core/browser/signin_metrics.h for - // possible values of source=. - GURL url("chrome://chrome-signin/?source=9"); + // possible values of access_point=, reason=. + GURL url("chrome://chrome-signin/?access_point=10&reason=1"); base::WeakPtr<InlineLoginHandlerImpl> handler; InlineSigninHelper helper(handler, browser()->profile()->GetRequestContext(), @@ -832,8 +834,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, Basic) { // Make sure that the foo webui handler does not get created when we try to // load it inside the iframe of the login ui. IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, NoWebUIInIframe) { - GURL url = signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false). - Resolve("?source=0&frameUrl=chrome://foo"); + GURL url = GetSigninPromoURL().Resolve( + "?source=0&access_point=0&reason=0&frameUrl=chrome://foo"); EXPECT_CALL(foo_provider(), NewWebUI(_, _)).Times(0); ui_test_utils::NavigateToURL(browser(), url); } @@ -851,9 +853,8 @@ IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, MAYBE_TopFrameNavigationDisallowed) { // Loads into gaia iframe a web page that attempts to deframe on load. GURL deframe_url(embedded_test_server()->GetURL("/login/deframe.html")); - GURL url(net::AppendOrReplaceQueryParameter( - signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false), - "frameUrl", deframe_url.spec())); + GURL url(net::AppendOrReplaceQueryParameter(GetSigninPromoURL(), "frameUrl", + deframe_url.spec())); ui_test_utils::NavigateToURL(browser(), url); WaitUntilUIReady(browser()); @@ -870,8 +871,7 @@ IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, // Also flaky on Linux which is just too flaky IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, DISABLED_NavigationToOtherChromeURLDisallowed) { - ui_test_utils::NavigateToURL( - browser(), signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false)); + ui_test_utils::NavigateToURL(browser(), GetSigninPromoURL()); WaitUntilUIReady(browser()); content::WebContents* contents = @@ -900,8 +900,7 @@ IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, // Navigates to the Chrome signin page which loads the fake gaia auth page. // Since the fake gaia auth page is served over HTTP, thus expects to see an // untrusted signin confirmation dialog upon submitting credentials below. - ui_test_utils::NavigateToURL( - browser(), signin::GetPromoURL(signin_metrics::SOURCE_START_PAGE, false)); + ui_test_utils::NavigateToURL(browser(), GetSigninPromoURL()); WaitUntilUIReady(browser()); MockLoginUIObserver observer; diff --git a/chrome/browser/ui/webui/signin/login_ui_service.cc b/chrome/browser/ui/webui/signin/login_ui_service.cc index cc1681d..115396b 100644 --- a/chrome/browser/ui/webui/signin/login_ui_service.cc +++ b/chrome/browser/ui/webui/signin/login_ui_service.cc @@ -68,7 +68,8 @@ void LoginUIService::ShowLoginPopup() { chrome::ScopedTabbedBrowserDisplayer displayer( profile_, chrome::GetActiveDesktop()); chrome::ShowBrowserSignin( - displayer.browser(), signin_metrics::SOURCE_APP_LAUNCHER); + displayer.browser(), + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSIONS); #endif } @@ -80,9 +81,10 @@ void LoginUIService::DisplayLoginResult(Browser* browser, #endif last_login_result_ = message; browser->window()->ShowAvatarBubbleFromAvatarButton( - message.empty() ? BrowserWindow::AVATAR_BUBBLE_MODE_CONFIRM_SIGNIN : - BrowserWindow::AVATAR_BUBBLE_MODE_SHOW_ERROR, - signin::ManageAccountsParams()); + message.empty() ? BrowserWindow::AVATAR_BUBBLE_MODE_CONFIRM_SIGNIN + : BrowserWindow::AVATAR_BUBBLE_MODE_SHOW_ERROR, + signin::ManageAccountsParams(), + signin_metrics::AccessPoint::ACCESS_POINT_EXTENSIONS); } const base::string16& LoginUIService::GetLastLoginResult() { diff --git a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc index c154837..44dcc6b 100644 --- a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc +++ b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc @@ -206,13 +206,15 @@ bool SignInWithUI(Browser* browser, const std::string& username, const std::string& password, bool wait_for_account_cookies, - signin_metrics::Source signin_source) { + signin_metrics::AccessPoint access_point) { SignInObserver signin_observer(wait_for_account_cookies); scoped_ptr<SigninTracker> tracker = SigninTrackerFactory::CreateForProfile(browser->profile(), &signin_observer); - GURL signin_url = signin::GetPromoURL(signin_source, false); + GURL signin_url = signin::GetPromoURL( + access_point, signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, + false); DVLOG(1) << "Navigating to " << signin_url; // For some tests, the window is not shown yet and this might be the first tab // navigation, so GetActiveWebContents() for CURRENT_TAB is NULL. That's why @@ -236,8 +238,8 @@ bool SignInWithUI(Browser* browser, const std::string& username, const std::string& password) { return SignInWithUI(browser, username, password, - false /* wait_for_account_cookies */, - signin_metrics::SOURCE_START_PAGE); + false /* wait_for_account_cookies */, + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE); } } // namespace login_ui_test_utils diff --git a/chrome/browser/ui/webui/signin/login_ui_test_utils.h b/chrome/browser/ui/webui/signin/login_ui_test_utils.h index acddd39..9fdc689 100644 --- a/chrome/browser/ui/webui/signin/login_ui_test_utils.h +++ b/chrome/browser/ui/webui/signin/login_ui_test_utils.h @@ -45,12 +45,12 @@ void SigninInOldGaiaFlow(Browser* browser, // This will block until a signin succeeded or failed notification is observed. // In case |wait_for_account_cookies|, the call will block until the account // cookies have been written to the cookie jar. -// |signin_source| identifies the source used to load the signin page. +// |access_point| identifies the access point used to load the signin page. bool SignInWithUI(Browser* browser, const std::string& email, const std::string& password, bool wait_for_account_cookies, - signin_metrics::Source signin_source); + signin_metrics::AccessPoint access_point); // Most common way to sign in a user, it does not wait for cookies to be set // and uses the SOURCE_START_PAGE as signin source. diff --git a/chrome/browser/ui/webui/sync_setup_browsertest.js b/chrome/browser/ui/webui/sync_setup_browsertest.js index e65c402..528c2fe 100644 --- a/chrome/browser/ui/webui/sync_setup_browsertest.js +++ b/chrome/browser/ui/webui/sync_setup_browsertest.js @@ -85,8 +85,8 @@ TEST_F('SyncSetupWebUITestAsync', 'VerifySignIn', function() { // Handle SyncSetupStartSignIn by displaying the sync setup dialog, verifying // that a confirmation dialog appears, and clicking OK to dismiss the dialog. // Note that this test doesn't actually do a gaia sign in. - this.mockHandler.expects(once()).SyncSetupStartSignIn().will(callFunction( - function() { + this.mockHandler.expects(once()).SyncSetupStartSignIn( + 'access-point-settings').will(callFunction(function() { SyncSetupOverlay.showSyncSetupPage('configure'); var okButton = $('confirm-everything-ok'); assertNotEquals(null, okButton); @@ -103,8 +103,8 @@ TEST_F('SyncSetupWebUITestAsync', 'VerifySignIn', function() { // Test that switching to and from "Sync everything" saves and restores types. TEST_F('SyncSetupWebUITestAsync', 'RestoreSyncDataTypes', function() { - this.mockHandler.expects(once()).SyncSetupStartSignIn().will(callFunction( - function() { + this.mockHandler.expects(once()).SyncSetupStartSignIn( + 'access-point-settings').will(callFunction(function() { SyncSetupOverlay.showSyncSetupPage('configure', {}); $('sync-select-datatypes').selectedIndex = 1; diff --git a/chrome/browser/ui/webui/webui_webview_browsertest.cc b/chrome/browser/ui/webui/webui_webview_browsertest.cc index 2ed4fa8..7329d0f4 100644 --- a/chrome/browser/ui/webui/webui_webview_browsertest.cc +++ b/chrome/browser/ui/webui/webui_webview_browsertest.cc @@ -6,6 +6,7 @@ #include "base/path_service.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h" +#include "chrome/browser/signin/signin_promo.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_paths.h" @@ -37,7 +38,9 @@ class WebUIWebViewBrowserTest : public WebUIBrowserTest { } GURL GetWebViewEnabledWebUIURL() const { - return GURL(chrome::kChromeUIChromeSigninURL); + return GURL(signin::GetPromoURL( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false)); } private: diff --git a/chrome/browser/ui/zoom/zoom_controller_browsertest.cc b/chrome/browser/ui/zoom/zoom_controller_browsertest.cc index d8bcbdd..68c43c4 100644 --- a/chrome/browser/ui/zoom/zoom_controller_browsertest.cc +++ b/chrome/browser/ui/zoom/zoom_controller_browsertest.cc @@ -276,8 +276,8 @@ IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, NavigationResetsManualMode) { // Regression test: crbug.com/438979. IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, SettingsZoomAfterSigninWorks) { - GURL signin_url( - std::string(chrome::kChromeUIChromeSigninURL).append("?source=0")); + GURL signin_url(std::string(chrome::kChromeUIChromeSigninURL) + .append("?access_point=0&reason=0")); // We open the signin page in a new tab so that the ZoomController is // created against the HostZoomMap of the special StoragePartition that // backs the signin page. When we subsequently navigate away from the diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h index 51d6ead..a58e281 100644 --- a/chrome/test/base/test_browser_window.h +++ b/chrome/test/base/test_browser_window.h @@ -140,8 +140,11 @@ class TestBrowserWindow : public BrowserWindow { override; void ShowAvatarBubbleFromAvatarButton( AvatarBubbleMode mode, - const signin::ManageAccountsParams& manage_accounts_params) override {} - void ShowModalSigninWindow(AvatarBubbleMode mode) override {} + const signin::ManageAccountsParams& manage_accounts_params, + signin_metrics::AccessPoint access_point) override {} + void ShowModalSigninWindow( + AvatarBubbleMode mode, + signin_metrics::AccessPoint access_point) override {} void CloseModalSigninWindow() override {} int GetRenderViewHeightInsetWithDetachedBookmarkBar() override; void ExecuteExtensionCommand(const extensions::Extension* extension, diff --git a/components/signin/core/browser/signin_metrics.cc b/components/signin/core/browser/signin_metrics.cc index a154d11..e0fe72c6 100644 --- a/components/signin/core/browser/signin_metrics.cc +++ b/components/signin/core/browser/signin_metrics.cc @@ -21,6 +21,23 @@ DifferentPrimaryAccounts ComparePrimaryAccounts(bool primary_accounts_same, return COOKIE_AND_TOKEN_PRIMARIES_DIFFERENT; } +void LogSigninAccessPointStarted(AccessPoint access_point) { + UMA_HISTOGRAM_ENUMERATION("Signin.SigninStartedAccessPoint", + static_cast<int>(access_point), + static_cast<int>(AccessPoint::ACCESS_POINT_MAX)); +} + +void LogSigninAccessPointCompleted(AccessPoint access_point) { + UMA_HISTOGRAM_ENUMERATION("Signin.SigninCompletedAccessPoint", + static_cast<int>(access_point), + static_cast<int>(AccessPoint::ACCESS_POINT_MAX)); +} + +void LogSigninReason(Reason reason) { + UMA_HISTOGRAM_ENUMERATION("Signin.SigninReason", static_cast<int>(reason), + static_cast<int>(Reason::REASON_MAX)); +} + void LogSigninAccountReconciliation(int total_number_accounts, int count_added_to_cookie_jar, int count_removed_from_cookie_jar, @@ -73,10 +90,6 @@ void LogSigninProfile(bool is_first_run, base::Time install_date) { elapsed_time.InMinutes()); } -void LogSigninSource(Source source) { - UMA_HISTOGRAM_ENUMERATION("Signin.SigninSource", source, HISTOGRAM_MAX); -} - void LogSigninAddAccount() { // Account signin may fail for a wide variety of reasons. There is no // explicit false, but one can compare this value with the various UI diff --git a/components/signin/core/browser/signin_metrics.h b/components/signin/core/browser/signin_metrics.h index fa7242b..958fa0b 100644 --- a/components/signin/core/browser/signin_metrics.h +++ b/components/signin/core/browser/signin_metrics.h @@ -98,22 +98,50 @@ enum { HISTOGRAM_CONFIRM_MAX }; -// Enum valus used with the "Signin.SigninSource" histogram, which tracks the -// source that launched a Gaia signin page. +// TODO(gogerald): right now, gaia server needs to distinguish the source from +// signin_metrics::SOURCE_START_PAGE, signin_metrics::SOURCE_SETTINGS and the +// others to show advanced sync setting, remove them after switching to Minute +// Maid sign in flow. +// This was previously used in Signin.SigninSource UMA histogram, but no longer +// used after having below AccessPoint and Reason related histograms. enum Source { - SOURCE_START_PAGE = 0, // This must be first. - SOURCE_NTP_LINK, - SOURCE_MENU, - SOURCE_SETTINGS, - SOURCE_EXTENSION_INSTALL_BUBBLE, - SOURCE_APP_LAUNCHER, - SOURCE_APPS_PAGE_LINK, - SOURCE_BOOKMARK_BUBBLE, - SOURCE_AVATAR_BUBBLE_SIGN_IN, - SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT, - SOURCE_DEVICES_PAGE, - SOURCE_REAUTH, - SOURCE_UNKNOWN, // This must be last. + SOURCE_START_PAGE = 0, // This must be first. + SOURCE_SETTINGS = 3, + SOURCE_OTHERS = 13, +}; + +// Enum values which enumerates all access points where sign in could be +// initiated. Not all of them exist on all platforms. They are used with +// "Signin.SigninStartedAccessPoint" and "Signin.SigninCompletedAccessPoint" +// histograms. +enum class AccessPoint : int { + ACCESS_POINT_START_PAGE = 0, + ACCESS_POINT_NTP_LINK, + ACCESS_POINT_MENU, + ACCESS_POINT_SETTINGS, + ACCESS_POINT_SUPERVISED_USER, + ACCESS_POINT_EXTENSION_INSTALL_BUBBLE, + ACCESS_POINT_EXTENSIONS, + ACCESS_POINT_APPS_PAGE_LINK, + ACCESS_POINT_BOOKMARK_BUBBLE, + ACCESS_POINT_BOOKMARK_MANAGER, + ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN, + ACCESS_POINT_USER_MANAGER, + ACCESS_POINT_DEVICES_PAGE, + ACCESS_POINT_CLOUD_PRINT, + ACCESS_POINT_CONTENT_AREA, + ACCESS_POINT_SIGNIN_PROMO, + ACCESS_POINT_RECENT_TABS, + ACCESS_POINT_MAX // This must be last. +}; + +// Enum values which enumerates all reasons to start sign in process. +enum class Reason : int { + REASON_SIGNIN_PRIMARY_ACCOUNT = 0, + REASON_ADD_SECONDARY_ACCOUNT, + REASON_REAUTHENTICATION, + REASON_UNLOCK, + REASON_MAX // This must be last. }; // Enum values used for use with the "Signin.Reauth" histogram. @@ -177,6 +205,13 @@ enum AccountReconcilorState { ACCOUNT_RECONCILOR_HISTOGRAM_COUNT, }; +// Tracks the access point of sign in. +void LogSigninAccessPointStarted(AccessPoint access_point); +void LogSigninAccessPointCompleted(AccessPoint access_point); + +// Tracks the reason of sign in. +void LogSigninReason(Reason reason); + // Log to UMA histograms and UserCounts stats about a single execution of the // AccountReconciler. // |total_number_accounts| - How many accounts are in the browser for this @@ -207,9 +242,6 @@ void LogSigninAccountReconciliationDuration(base::TimeDelta duration, // Track a successful signin. void LogSigninAddAccount(); -// Tracks the original source that showed the signin page. -void LogSigninSource(Source source); - // Track a successful signin of a profile. void LogSigninProfile(bool is_first_run, base::Time install_date); diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index df007a5..1260e4d 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml @@ -44212,7 +44212,22 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries. </summary> </histogram> +<histogram name="Signin.SigninCompletedAccessPoint" enum="SigninAccessPoint"> + <owner>gogerald@chromium.org</owner> + <summary>Logs the original access point of each completed sign in.</summary> +</histogram> + +<histogram name="Signin.SigninReason" enum="SigninReason"> + <owner>gogerald@chromium.org</owner> + <summary>Logs the reason of each completed sign in.</summary> +</histogram> + <histogram name="Signin.SigninSource" enum="SigninSource"> + <obsolete> + Removed this histogram since we have had newly designed histograms + Signin.SigninStartedAccessPoint, Signin.SigninCompletedAccessPoint, and + Signin.SigninReason. + </obsolete> <owner>noms@chromium.org</owner> <summary> Logs the original source that displayed the signin or reauth Gaia page, @@ -44220,6 +44235,14 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries. </summary> </histogram> +<histogram name="Signin.SigninStartedAccessPoint" enum="SigninAccessPoint"> + <owner>gogerald@chromium.org</owner> + <summary> + Logs the original access point that displayed the signin or reauth Gaia + page, before the page is displayed. + </summary> +</histogram> + <histogram name="Signin.SignoutProfile" enum="SigninSignoutProfile"> <owner>mlerman@chromium.org</owner> <summary>Track how a profile gets signed out.</summary> @@ -75240,6 +75263,26 @@ To add a new entry, add it with any value and run test to compute valid value. <int value="2" label="Dismiss"/> </enum> +<enum name="SigninAccessPoint" type="int"> + <int value="0" label="Start page"/> + <int value="1" label="NTP Link"/> + <int value="2" label="Menu"/> + <int value="3" label="Settings"/> + <int value="4" label="Supervised user"/> + <int value="5" label="Extension install bubble"/> + <int value="6" label="Extensions"/> + <int value="7" label="Apps page link"/> + <int value="8" label="Bookmark bubble"/> + <int value="9" label="Bookmark manager"/> + <int value="10" label="Avatar bubble sign in"/> + <int value="11" label="User manager"/> + <int value="12" label="Devices page"/> + <int value="13" label="Cloud print"/> + <int value="14" label="Content area"/> + <int value="15" label="Signin promo"/> + <int value="16" label="Recent tabs"/> +</enum> + <enum name="SigninAccountReconcilorState" type="int"> <int value="0" label="OK"> The account reconcilor has finished running and is up-to-date. @@ -75304,6 +75347,13 @@ To add a new entry, add it with any value and run test to compute valid value. <int value="10" label="Undo">The sync was aborted with an undo button.</int> </enum> +<enum name="SigninReason" type="int"> + <int value="0" label="Signin primary account"/> + <int value="1" label="Add secondary account"/> + <int value="2" label="Reauthentication"/> + <int value="3" label="Unlock profile"/> +</enum> + <enum name="SigninReauthStates" type="int"> <int value="0" label="Account mismatch"/> <int value="1" label="Reauth Shown"/> |