OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" | 5 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "components/browser_sync/browser/profile_sync_service_mock.h" | 21 #include "components/browser_sync/browser/profile_sync_service_mock.h" |
22 #include "components/password_manager/core/browser/mock_password_store.h" | 22 #include "components/password_manager/core/browser/mock_password_store.h" |
23 #include "components/password_manager/core/browser/password_bubble_experiment.h" | 23 #include "components/password_manager/core/browser/password_bubble_experiment.h" |
24 #include "components/password_manager/core/browser/password_manager_metrics_util
.h" | 24 #include "components/password_manager/core/browser/password_manager_metrics_util
.h" |
25 #include "components/password_manager/core/browser/password_manager_test_utils.h
" | 25 #include "components/password_manager/core/browser/password_manager_test_utils.h
" |
26 #include "components/password_manager/core/browser/statistics_table.h" | 26 #include "components/password_manager/core/browser/statistics_table.h" |
27 #include "components/password_manager/core/common/credential_manager_types.h" | 27 #include "components/password_manager/core/common/credential_manager_types.h" |
28 #include "components/password_manager/core/common/password_manager_pref_names.h" | 28 #include "components/password_manager/core/common/password_manager_pref_names.h" |
29 #include "components/password_manager/core/common/password_manager_ui.h" | 29 #include "components/password_manager/core/common/password_manager_ui.h" |
30 #include "components/prefs/pref_service.h" | 30 #include "components/prefs/pref_service.h" |
| 31 #include "components/variations/variations_associated_data.h" |
31 #include "content/public/test/test_browser_thread_bundle.h" | 32 #include "content/public/test/test_browser_thread_bundle.h" |
32 #include "content/public/test/web_contents_tester.h" | 33 #include "content/public/test/web_contents_tester.h" |
33 #include "testing/gmock/include/gmock/gmock.h" | 34 #include "testing/gmock/include/gmock/gmock.h" |
34 #include "testing/gtest/include/gtest/gtest.h" | 35 #include "testing/gtest/include/gtest/gtest.h" |
35 | 36 |
36 using password_bubble_experiment::kBrandingExperimentName; | 37 using password_bubble_experiment::kBrandingExperimentName; |
| 38 using password_bubble_experiment::kChromeSignInPasswordPromoExperimentName; |
| 39 using password_bubble_experiment::kChromeSignInPasswordPromoThresholdParam; |
37 using password_bubble_experiment::kSmartLockBrandingGroupName; | 40 using password_bubble_experiment::kSmartLockBrandingGroupName; |
38 using password_bubble_experiment::kSmartLockBrandingSavePromptOnlyGroupName; | 41 using password_bubble_experiment::kSmartLockBrandingSavePromptOnlyGroupName; |
39 using ::testing::AnyNumber; | 42 using ::testing::AnyNumber; |
40 using ::testing::Return; | 43 using ::testing::Return; |
41 using ::testing::ReturnRef; | 44 using ::testing::ReturnRef; |
42 using ::testing::_; | 45 using ::testing::_; |
43 | 46 |
44 namespace { | 47 namespace { |
45 | 48 |
| 49 const char kFakeGroup[] = "FakeGroup"; |
| 50 const char kSignInPromoDismissalReasonMetric[] = "PasswordManager.SignInPromo"; |
46 const char kSiteOrigin[] = "http://example.com/login"; | 51 const char kSiteOrigin[] = "http://example.com/login"; |
47 const char kUsername[] = "Admin"; | 52 const char kUsername[] = "Admin"; |
48 const char kUIDismissalReasonMetric[] = "PasswordManager.UIDismissalReason"; | 53 const char kUIDismissalReasonMetric[] = "PasswordManager.UIDismissalReason"; |
49 | 54 |
50 class TestSyncService : public ProfileSyncServiceMock { | 55 class TestSyncService : public ProfileSyncServiceMock { |
51 public: | 56 public: |
52 explicit TestSyncService(Profile* profile) | 57 explicit TestSyncService(Profile* profile) |
53 : ProfileSyncServiceMock(CreateProfileSyncServiceParamsForTest(profile)), | 58 : ProfileSyncServiceMock(CreateProfileSyncServiceParamsForTest(profile)), |
54 smartlock_enabled_(false) {} | 59 smartlock_enabled_(false) {} |
55 ~TestSyncService() override {} | 60 ~TestSyncService() override {} |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 profile(), | 104 profile(), |
100 password_manager::BuildPasswordStore< | 105 password_manager::BuildPasswordStore< |
101 content::BrowserContext, | 106 content::BrowserContext, |
102 testing::StrictMock<password_manager::MockPasswordStore>>); | 107 testing::StrictMock<password_manager::MockPasswordStore>>); |
103 } | 108 } |
104 | 109 |
105 void TearDown() override { | 110 void TearDown() override { |
106 // Reset WebContents first. It can happen if the user closes the tab. | 111 // Reset WebContents first. It can happen if the user closes the tab. |
107 test_web_contents_.reset(); | 112 test_web_contents_.reset(); |
108 model_.reset(); | 113 model_.reset(); |
| 114 variations::testing::ClearAllVariationIDs(); |
| 115 variations::testing::ClearAllVariationParams(); |
109 } | 116 } |
110 | 117 |
111 PrefService* prefs() { return profile_.GetPrefs(); } | 118 PrefService* prefs() { return profile_.GetPrefs(); } |
112 | 119 |
113 TestingProfile* profile() { return &profile_; } | 120 TestingProfile* profile() { return &profile_; } |
114 | 121 |
115 password_manager::MockPasswordStore* GetStore() { | 122 password_manager::MockPasswordStore* GetStore() { |
116 return static_cast<password_manager::MockPasswordStore*>( | 123 return static_cast<password_manager::MockPasswordStore*>( |
117 PasswordStoreFactory::GetInstance() | 124 PasswordStoreFactory::GetInstance() |
118 ->GetForProfile(profile(), ServiceAccessType::EXPLICIT_ACCESS) | 125 ->GetForProfile(profile(), ServiceAccessType::EXPLICIT_ACCESS) |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 password_manager::prefs::kWasSavePrompFirstRunExperienceShown)); | 360 password_manager::prefs::kWasSavePrompFirstRunExperienceShown)); |
354 } | 361 } |
355 | 362 |
356 TEST_F(ManagePasswordsBubbleModelTest, OnBrandLinkClicked) { | 363 TEST_F(ManagePasswordsBubbleModelTest, OnBrandLinkClicked) { |
357 PretendPasswordWaiting(); | 364 PretendPasswordWaiting(); |
358 | 365 |
359 EXPECT_CALL(*controller(), NavigateToSmartLockHelpPage()); | 366 EXPECT_CALL(*controller(), NavigateToSmartLockHelpPage()); |
360 model()->OnBrandLinkClicked(); | 367 model()->OnBrandLinkClicked(); |
361 } | 368 } |
362 | 369 |
| 370 TEST_F(ManagePasswordsBubbleModelTest, SuppressSignInPromo) { |
| 371 base::HistogramTester histogram_tester; |
| 372 PretendPasswordWaiting(); |
| 373 EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); |
| 374 EXPECT_CALL(*controller(), SavePassword()); |
| 375 model()->OnSaveClicked(); |
| 376 |
| 377 EXPECT_FALSE(model()->ReplaceToShowSignInPromoIfNeeded()); |
| 378 DestroyModel(); |
| 379 histogram_tester.ExpectTotalCount(kSignInPromoDismissalReasonMetric, 0); |
| 380 } |
| 381 |
| 382 TEST_F(ManagePasswordsBubbleModelTest, SignInPromoOK) { |
| 383 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
| 384 kChromeSignInPasswordPromoExperimentName, kFakeGroup)); |
| 385 variations::AssociateVariationParams( |
| 386 kChromeSignInPasswordPromoExperimentName, kFakeGroup, |
| 387 {{kChromeSignInPasswordPromoThresholdParam, "3"}}); |
| 388 base::HistogramTester histogram_tester; |
| 389 PretendPasswordWaiting(); |
| 390 EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); |
| 391 EXPECT_CALL(*controller(), SavePassword()); |
| 392 model()->OnSaveClicked(); |
| 393 |
| 394 EXPECT_TRUE(model()->ReplaceToShowSignInPromoIfNeeded()); |
| 395 EXPECT_CALL(*controller(), NavigateToChromeSignIn()); |
| 396 model()->OnSignInToChromeClicked(); |
| 397 DestroyModel(); |
| 398 histogram_tester.ExpectUniqueSample( |
| 399 kUIDismissalReasonMetric, |
| 400 password_manager::metrics_util::CLICKED_SAVE, 1); |
| 401 histogram_tester.ExpectUniqueSample( |
| 402 kSignInPromoDismissalReasonMetric, |
| 403 password_manager::metrics_util::CHROME_SIGNIN_OK, 1); |
| 404 EXPECT_TRUE(prefs()->GetBoolean( |
| 405 password_manager::prefs::kWasSignInPasswordPromoClicked)); |
| 406 } |
| 407 |
| 408 TEST_F(ManagePasswordsBubbleModelTest, SignInPromoCancel) { |
| 409 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
| 410 kChromeSignInPasswordPromoExperimentName, kFakeGroup)); |
| 411 variations::AssociateVariationParams( |
| 412 kChromeSignInPasswordPromoExperimentName, kFakeGroup, |
| 413 {{kChromeSignInPasswordPromoThresholdParam, "3"}}); |
| 414 base::HistogramTester histogram_tester; |
| 415 PretendPasswordWaiting(); |
| 416 EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); |
| 417 EXPECT_CALL(*controller(), SavePassword()); |
| 418 model()->OnSaveClicked(); |
| 419 |
| 420 EXPECT_TRUE(model()->ReplaceToShowSignInPromoIfNeeded()); |
| 421 model()->OnSkipSignInClicked(); |
| 422 DestroyModel(); |
| 423 histogram_tester.ExpectUniqueSample( |
| 424 kUIDismissalReasonMetric, |
| 425 password_manager::metrics_util::CLICKED_SAVE, 1); |
| 426 histogram_tester.ExpectUniqueSample( |
| 427 kSignInPromoDismissalReasonMetric, |
| 428 password_manager::metrics_util::CHROME_SIGNIN_CANCEL, 1); |
| 429 EXPECT_TRUE(prefs()->GetBoolean( |
| 430 password_manager::prefs::kWasSignInPasswordPromoClicked)); |
| 431 } |
| 432 |
| 433 TEST_F(ManagePasswordsBubbleModelTest, SignInPromoDismiss) { |
| 434 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
| 435 kChromeSignInPasswordPromoExperimentName, kFakeGroup)); |
| 436 variations::AssociateVariationParams( |
| 437 kChromeSignInPasswordPromoExperimentName, kFakeGroup, |
| 438 {{kChromeSignInPasswordPromoThresholdParam, "3"}}); |
| 439 base::HistogramTester histogram_tester; |
| 440 PretendPasswordWaiting(); |
| 441 EXPECT_CALL(*GetStore(), RemoveSiteStatsImpl(GURL(kSiteOrigin).GetOrigin())); |
| 442 EXPECT_CALL(*controller(), SavePassword()); |
| 443 model()->OnSaveClicked(); |
| 444 |
| 445 EXPECT_TRUE(model()->ReplaceToShowSignInPromoIfNeeded()); |
| 446 DestroyModel(); |
| 447 histogram_tester.ExpectUniqueSample( |
| 448 kUIDismissalReasonMetric, |
| 449 password_manager::metrics_util::CLICKED_SAVE, 1); |
| 450 histogram_tester.ExpectUniqueSample( |
| 451 kSignInPromoDismissalReasonMetric, |
| 452 password_manager::metrics_util::CHROME_SIGNIN_DISMISSED, 1); |
| 453 EXPECT_FALSE(prefs()->GetBoolean( |
| 454 password_manager::prefs::kWasSignInPasswordPromoClicked)); |
| 455 } |
| 456 |
363 namespace { | 457 namespace { |
364 | 458 |
365 enum class SmartLockStatus { ENABLE, DISABLE }; | 459 enum class SmartLockStatus { ENABLE, DISABLE }; |
366 | 460 |
367 struct TitleTestCase { | 461 struct TitleTestCase { |
368 const char* experiment_group; | 462 const char* experiment_group; |
369 SmartLockStatus smartlock_status; | 463 SmartLockStatus smartlock_status; |
370 const char* expected_title; | 464 const char* expected_title; |
371 }; | 465 }; |
372 | 466 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 ManageLinkTarget::SETTINGS_PAGE}, | 568 ManageLinkTarget::SETTINGS_PAGE}, |
475 {nullptr, SmartLockStatus::DISABLE, ManageLinkTarget::SETTINGS_PAGE}, | 569 {nullptr, SmartLockStatus::DISABLE, ManageLinkTarget::SETTINGS_PAGE}, |
476 {"Default", SmartLockStatus::DISABLE, ManageLinkTarget::SETTINGS_PAGE}, | 570 {"Default", SmartLockStatus::DISABLE, ManageLinkTarget::SETTINGS_PAGE}, |
477 }; | 571 }; |
478 | 572 |
479 } // namespace | 573 } // namespace |
480 | 574 |
481 INSTANTIATE_TEST_CASE_P(Default, | 575 INSTANTIATE_TEST_CASE_P(Default, |
482 ManagePasswordsBubbleModelManageLinkTest, | 576 ManagePasswordsBubbleModelManageLinkTest, |
483 ::testing::ValuesIn(kManageLinkTestCases)); | 577 ::testing::ValuesIn(kManageLinkTestCases)); |
OLD | NEW |