[signin][dice] Log Signin_SigninPage_Shown user action.
Bug: 792394
Change-Id: Ie5d044a4c7847c34223ee8c2f9471d78316f9511
Reviewed-on: https://chromium-review.googlesource.com/814435
Commit-Queue: Mihai Sardarescu <msarda@chromium.org>
Reviewed-by: David Roger <droger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#523074}
diff --git a/chrome/browser/signin/dice_tab_helper.cc b/chrome/browser/signin/dice_tab_helper.cc
index b9e98a5..5897268 100644
--- a/chrome/browser/signin/dice_tab_helper.cc
+++ b/chrome/browser/signin/dice_tab_helper.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/signin/dice_tab_helper.h"
#include "base/logging.h"
+#include "base/metrics/user_metrics.h"
#include "chrome/browser/signin/dice_tab_helper.h"
#include "chrome/browser/signin/signin_util.h"
#include "chrome/browser/ui/browser_finder.h"
@@ -15,13 +16,9 @@
DEFINE_WEB_CONTENTS_USER_DATA_KEY(DiceTabHelper);
DiceTabHelper::DiceTabHelper(content::WebContents* web_contents)
- : content::WebContentsObserver(web_contents),
- signin_access_point_(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN),
- signin_reason_(signin_metrics::Reason::REASON_UNKNOWN_REASON),
- should_start_sync_after_web_signin_(true) {
-}
+ : content::WebContentsObserver(web_contents) {}
-DiceTabHelper::~DiceTabHelper() {}
+DiceTabHelper::~DiceTabHelper() = default;
void DiceTabHelper::InitializeSigninFlow(
signin_metrics::AccessPoint access_point,
@@ -29,6 +26,13 @@
signin_access_point_ = access_point;
signin_reason_ = reason;
should_start_sync_after_web_signin_ = true;
+ did_finish_loading_signin_page_ = false;
+
+ if (signin_reason_ == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) {
+ signin_metrics::LogSigninAccessPointStarted(access_point);
+ signin_metrics::RecordSigninUserActionForAccessPoint(access_point);
+ base::RecordAction(base::UserMetricsAction("Signin_SigninPage_Loading"));
+ }
}
void DiceTabHelper::DidStartNavigation(
@@ -56,11 +60,16 @@
should_start_sync_after_web_signin_ = false;
return;
}
+}
- // TODO(msarda): Figure out if this condition can be restricted even more
- // (e.g. avoid starting sync after a browser initiated navigation).
- // if (!navigation_handle->IsRendererInitiated()) {
- // // Avoid starting sync if the navigations comes from the browser.
- // should_start_sync_after_web_signin_ = false;
- //}
+void DiceTabHelper::DidFinishLoad(content::RenderFrameHost* render_frame_host,
+ const GURL& validated_url) {
+ if (!should_start_sync_after_web_signin_ || did_finish_loading_signin_page_)
+ return;
+
+ if (validated_url.GetOrigin() == GaiaUrls::GetInstance()->gaia_url()) {
+ VLOG(1) << "Finished loading sign-in page: " << validated_url.spec();
+ did_finish_loading_signin_page_ = true;
+ base::RecordAction(base::UserMetricsAction("Signin_SigninPage_Shown"));
+ }
}
diff --git a/chrome/browser/signin/dice_tab_helper.h b/chrome/browser/signin/dice_tab_helper.h
index 8e9aecf..c336b0cf 100644
--- a/chrome/browser/signin/dice_tab_helper.h
+++ b/chrome/browser/signin/dice_tab_helper.h
@@ -10,6 +10,9 @@
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
+namespace content {
+class RenderFrameHost;
+}
// Tab helper used for DICE to mark that sync should start after a web sign-in
// with a Google account.
class DiceTabHelper : public content::WebContentsUserData<DiceTabHelper>,
@@ -36,14 +39,19 @@
// content::WebContentsObserver:
void DidStartNavigation(
content::NavigationHandle* navigation_handle) override;
+ void DidFinishLoad(content::RenderFrameHost* render_frame_host,
+ const GURL& validated_url) override;
private:
friend class content::WebContentsUserData<DiceTabHelper>;
explicit DiceTabHelper(content::WebContents* web_contents);
- signin_metrics::AccessPoint signin_access_point_;
- signin_metrics::Reason signin_reason_;
- bool should_start_sync_after_web_signin_;
+ signin_metrics::AccessPoint signin_access_point_ =
+ signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN;
+ signin_metrics::Reason signin_reason_ =
+ signin_metrics::Reason::REASON_UNKNOWN_REASON;
+ bool should_start_sync_after_web_signin_ = true;
+ bool did_finish_loading_signin_page_ = false;
DISALLOW_COPY_AND_ASSIGN(DiceTabHelper);
};
diff --git a/chrome/browser/signin/dice_tab_helper_unittest.cc b/chrome/browser/signin/dice_tab_helper_unittest.cc
index 0c66541..a6b01e9 100644
--- a/chrome/browser/signin/dice_tab_helper_unittest.cc
+++ b/chrome/browser/signin/dice_tab_helper_unittest.cc
@@ -4,10 +4,13 @@
#include "chrome/browser/signin/dice_tab_helper.h"
+#include "base/test/histogram_tester.h"
+#include "base/test/user_action_tester.h"
#include "chrome/test/base/testing_profile.h"
#include "components/signin/core/browser/signin_metrics.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_web_contents_factory.h"
+#include "google_apis/gaia/gaia_urls.h"
#include "testing/gtest/include/gtest/gtest.h"
// Tests DiceTabHelper intialization.
@@ -35,3 +38,55 @@
EXPECT_EQ(access_point, dice_tab_helper->signin_access_point());
EXPECT_EQ(reason, dice_tab_helper->signin_reason());
}
+
+// Tests DiceTabHelper metrics.
+TEST(DiceTabHelperTest, Metrics) {
+ base::UserActionTester ua_tester;
+ base::HistogramTester h_tester;
+ content::TestBrowserThreadBundle thread_bundle;
+ TestingProfile profile;
+ content::TestWebContentsFactory factory;
+ content::WebContents* web_contents = factory.CreateWebContents(&profile);
+ DiceTabHelper::CreateForWebContents(web_contents);
+ DiceTabHelper* dice_tab_helper = DiceTabHelper::FromWebContents(web_contents);
+
+ // No metrics are logged when the Dice tab helper is created.
+ EXPECT_EQ(0, ua_tester.GetActionCount("Signin_Signin_FromStartPage"));
+ EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+ EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+
+ // Check metrics logged when the Dice tab helper is initialized.
+ dice_tab_helper->InitializeSigninFlow(
+ signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE,
+ signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT);
+ EXPECT_EQ(1, ua_tester.GetActionCount("Signin_Signin_FromStartPage"));
+ EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+ EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+ EXPECT_EQ(1, h_tester.GetBucketCount(
+ "Signin.SigninStartedAccessPoint",
+ static_cast<int>(
+ signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE)));
+
+ // First call to did finish load does logs any Signin_SigninPage_Shown user
+ // action.
+ GURL signin_page_url = GaiaUrls::GetInstance()->gaia_url();
+ dice_tab_helper->DidFinishLoad(nullptr, signin_page_url);
+ EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+ EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+
+ // Second call to did finish load does not log any metrics.
+ dice_tab_helper->DidFinishLoad(nullptr, signin_page_url);
+ EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+ EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+
+ // Check metrics are logged again when the Dice tab helper is re-initialized.
+ dice_tab_helper->InitializeSigninFlow(
+ signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE,
+ signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT);
+ EXPECT_EQ(2, ua_tester.GetActionCount("Signin_Signin_FromStartPage"));
+ EXPECT_EQ(2, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+ EXPECT_EQ(2, h_tester.GetBucketCount(
+ "Signin.SigninStartedAccessPoint",
+ static_cast<int>(
+ signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE)));
+}
diff --git a/chrome/browser/ui/signin_view_controller.cc b/chrome/browser/ui/signin_view_controller.cc
index 83a9450..201e8ce 100644
--- a/chrome/browser/ui/signin_view_controller.cc
+++ b/chrome/browser/ui/signin_view_controller.cc
@@ -155,11 +155,6 @@
DiceTabHelper::CreateForWebContents(active_contents);
DiceTabHelper* tab_helper = DiceTabHelper::FromWebContents(active_contents);
tab_helper->InitializeSigninFlow(access_point, signin_reason);
-
- if (signin_reason == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) {
- signin_metrics::LogSigninAccessPointStarted(access_point);
- signin_metrics::RecordSigninUserActionForAccessPoint(access_point);
- }
}
content::WebContents*