OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "components/password_manager/core/browser/password_form_manager.h" | 5 #include "components/password_manager/core/browser/password_form_manager.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <memory> | 8 #include <memory> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 | 706 |
707 PasswordManager* password_manager() { return password_manager_.get(); } | 707 PasswordManager* password_manager() { return password_manager_.get(); } |
708 | 708 |
709 PasswordFormManager* form_manager() { return form_manager_.get(); } | 709 PasswordFormManager* form_manager() { return form_manager_.get(); } |
710 | 710 |
711 FakeFormFetcher* fake_form_fetcher() { return &fake_form_fetcher_; } | 711 FakeFormFetcher* fake_form_fetcher() { return &fake_form_fetcher_; } |
712 | 712 |
713 // To spare typing for PasswordFormManager instances which need no driver. | 713 // To spare typing for PasswordFormManager instances which need no driver. |
714 const base::WeakPtr<PasswordManagerDriver> kNoDriver; | 714 const base::WeakPtr<PasswordManagerDriver> kNoDriver; |
715 | 715 |
| 716 protected: |
| 717 enum class SimulatedManagerAction { NONE, AUTOFILLED, OFFERED, OFFERED_PSL }; |
| 718 enum class SimulatedSubmitResult { NONE, PASSED, FAILED }; |
| 719 enum class SuppressedFormType { HTTPS, PSL_MATCH, SAME_ORGANIZATION_NAME }; |
| 720 |
| 721 PasswordForm CreateSuppressedForm(SuppressedFormType suppression_type, |
| 722 const char* username, |
| 723 const char* password, |
| 724 PasswordForm::Type manual_or_generated) { |
| 725 PasswordForm form = *saved_match(); |
| 726 switch (suppression_type) { |
| 727 case SuppressedFormType::HTTPS: |
| 728 form.origin = GURL("https://accounts.google.com/a/LoginAuth"); |
| 729 form.signon_realm = "https://accounts.google.com/"; |
| 730 break; |
| 731 case SuppressedFormType::PSL_MATCH: |
| 732 form.origin = GURL("http://other.google.com/"); |
| 733 form.signon_realm = "http://other.google.com/"; |
| 734 break; |
| 735 case SuppressedFormType::SAME_ORGANIZATION_NAME: |
| 736 form.origin = GURL("https://may-or-may-not-be.google.appspot.com/"); |
| 737 form.signon_realm = "https://may-or-may-not-be.google.appspot.com/"; |
| 738 break; |
| 739 } |
| 740 form.type = manual_or_generated; |
| 741 form.username_value = ASCIIToUTF16(username); |
| 742 form.password_value = ASCIIToUTF16(password); |
| 743 return form; |
| 744 } |
| 745 |
| 746 void SimulateActionsOnHTTPObservedForm( |
| 747 FakeFormFetcher* fetcher, |
| 748 SimulatedManagerAction manager_action, |
| 749 SimulatedSubmitResult submit_result, |
| 750 const char* filled_username, |
| 751 const char* filled_password, |
| 752 const char* submitted_password = nullptr) { |
| 753 PasswordFormManager form_manager( |
| 754 password_manager(), client(), client()->driver(), *observed_form(), |
| 755 base::MakeUnique<NiceMock<MockFormSaver>>(), fetcher); |
| 756 |
| 757 EXPECT_CALL(*client()->mock_driver()->mock_autofill_download_manager(), |
| 758 StartUploadRequest(_, _, _, _, _)) |
| 759 .Times(::testing::AnyNumber()); |
| 760 |
| 761 PasswordForm http_stored_form = *saved_match(); |
| 762 http_stored_form.username_value = base::ASCIIToUTF16(filled_username); |
| 763 http_stored_form.password_value = base::ASCIIToUTF16(filled_password); |
| 764 if (manager_action == SimulatedManagerAction::OFFERED_PSL) |
| 765 http_stored_form.is_public_suffix_match = true; |
| 766 |
| 767 std::vector<const PasswordForm*> matches; |
| 768 if (manager_action != SimulatedManagerAction::NONE) |
| 769 matches.push_back(&http_stored_form); |
| 770 |
| 771 // Extra mile: kUserActionChoose is only recorded if there were multiple |
| 772 // logins available and the preferred one was changed. |
| 773 PasswordForm http_stored_form2 = http_stored_form; |
| 774 if (manager_action == SimulatedManagerAction::OFFERED) { |
| 775 http_stored_form.preferred = false; |
| 776 http_stored_form2.username_value = ASCIIToUTF16("user-other@gmail.com"); |
| 777 matches.push_back(&http_stored_form2); |
| 778 } |
| 779 |
| 780 fetcher->Fetch(); |
| 781 fetcher->SetNonFederated(matches, 0u); |
| 782 |
| 783 if (submit_result != SimulatedSubmitResult::NONE) { |
| 784 PasswordForm submitted_form(*observed_form()); |
| 785 submitted_form.preferred = true; |
| 786 submitted_form.username_value = base::ASCIIToUTF16(filled_username); |
| 787 submitted_form.password_value = |
| 788 submitted_password ? base::ASCIIToUTF16(submitted_password) |
| 789 : base::ASCIIToUTF16(filled_password); |
| 790 |
| 791 form_manager.ProvisionallySave( |
| 792 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
| 793 if (submit_result == SimulatedSubmitResult::PASSED) { |
| 794 form_manager.LogSubmitPassed(); |
| 795 form_manager.Save(); |
| 796 } else { |
| 797 form_manager.LogSubmitFailed(); |
| 798 } |
| 799 } |
| 800 } |
| 801 |
716 private: | 802 private: |
717 // Necessary for callbacks, and for TestAutofillDriver. | 803 // Necessary for callbacks, and for TestAutofillDriver. |
718 base::MessageLoop message_loop_; | 804 base::MessageLoop message_loop_; |
719 | 805 |
720 PasswordForm observed_form_; | 806 PasswordForm observed_form_; |
721 PasswordForm saved_match_; | 807 PasswordForm saved_match_; |
722 PasswordForm psl_saved_match_; | 808 PasswordForm psl_saved_match_; |
723 TestPasswordManagerClient client_; | 809 TestPasswordManagerClient client_; |
724 std::unique_ptr<PasswordManager> password_manager_; | 810 std::unique_ptr<PasswordManager> password_manager_; |
725 // Define |fake_form_fetcher_| before |form_manager_|, because the former | 811 // Define |fake_form_fetcher_| before |form_manager_|, because the former |
(...skipping 2449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3175 form_to_save.password_value = ASCIIToUTF16("password"); | 3261 form_to_save.password_value = ASCIIToUTF16("password"); |
3176 | 3262 |
3177 auto* mock_autofill_manager = | 3263 auto* mock_autofill_manager = |
3178 client()->mock_driver()->mock_autofill_manager(); | 3264 client()->mock_driver()->mock_autofill_manager(); |
3179 EXPECT_CALL(*mock_autofill_manager, StartUploadProcessPtr(_, _, _)).Times(0); | 3265 EXPECT_CALL(*mock_autofill_manager, StartUploadProcessPtr(_, _, _)).Times(0); |
3180 form_manager.ProvisionallySave( | 3266 form_manager.ProvisionallySave( |
3181 form_to_save, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | 3267 form_to_save, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
3182 form_manager.Save(); | 3268 form_manager.Save(); |
3183 } | 3269 } |
3184 | 3270 |
3185 // If the frame containing the login form is served over HTTPS, no histograms | |
3186 // should be recorded. | |
3187 TEST_F(PasswordFormManagerTest, | |
3188 SuppressedHTTPSFormsHistogram_NotRecordedOnHTTPSLoginForms) { | |
3189 base::HistogramTester histogram_tester; | |
3190 | |
3191 PasswordForm https_observed_form = *observed_form(); | |
3192 https_observed_form.origin = GURL("https://accounts.google.com/a/LoginAuth"); | |
3193 https_observed_form.signon_realm = "https://accounts.google.com/"; | |
3194 | |
3195 // Only the scheme of the frame containing the login form maters, not the | |
3196 // scheme of the main frame. | |
3197 ASSERT_FALSE(client()->IsMainFrameSecure()); | |
3198 | |
3199 // Even if there are suppressed results, they are ignored (but there should be | |
3200 // none in production in this case, though). | |
3201 FakeFormFetcher fetcher; | |
3202 fetcher.set_suppressed_https_forms({saved_match()}); | |
3203 fetcher.set_did_complete_querying_suppressed_https_forms(true); | |
3204 fetcher.Fetch(); | |
3205 | |
3206 std::unique_ptr<PasswordFormManager> form_manager = | |
3207 base::MakeUnique<PasswordFormManager>( | |
3208 password_manager(), client(), client()->driver(), https_observed_form, | |
3209 base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); | |
3210 fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); | |
3211 form_manager.reset(); | |
3212 | |
3213 histogram_tester.ExpectTotalCount( | |
3214 "PasswordManager.QueryingSuppressedAccountsFinished", 0); | |
3215 const auto sample_counts = histogram_tester.GetTotalCountsForPrefix( | |
3216 "PasswordManager.SuppressedAccount."); | |
3217 EXPECT_THAT(sample_counts, IsEmpty()); | |
3218 } | |
3219 | |
3220 TEST_F(PasswordFormManagerTest, | 3271 TEST_F(PasswordFormManagerTest, |
3221 SuppressedHTTPSFormsHistogram_NotRecordedIfStoreWasTooSlow) { | 3272 SuppressedHTTPSFormsHistogram_NotRecordedIfStoreWasTooSlow) { |
3222 base::HistogramTester histogram_tester; | 3273 base::HistogramTester histogram_tester; |
3223 | 3274 |
3224 fake_form_fetcher()->set_did_complete_querying_suppressed_https_forms(false); | 3275 fake_form_fetcher()->set_did_complete_querying_suppressed_forms(false); |
3225 fake_form_fetcher()->Fetch(); | 3276 fake_form_fetcher()->Fetch(); |
3226 std::unique_ptr<PasswordFormManager> form_manager = | 3277 std::unique_ptr<PasswordFormManager> form_manager = |
3227 base::MakeUnique<PasswordFormManager>( | 3278 base::MakeUnique<PasswordFormManager>( |
3228 password_manager(), client(), client()->driver(), *observed_form(), | 3279 password_manager(), client(), client()->driver(), *observed_form(), |
3229 base::MakeUnique<NiceMock<MockFormSaver>>(), fake_form_fetcher()); | 3280 base::MakeUnique<NiceMock<MockFormSaver>>(), fake_form_fetcher()); |
3230 fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); | 3281 fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
3231 form_manager.reset(); | 3282 form_manager.reset(); |
3232 | 3283 |
3233 histogram_tester.ExpectUniqueSample( | 3284 histogram_tester.ExpectUniqueSample( |
3234 "PasswordManager.QueryingSuppressedAccountsFinished", false, 1); | 3285 "PasswordManager.QueryingSuppressedAccountsFinished", false, 1); |
3235 const auto sample_counts = histogram_tester.GetTotalCountsForPrefix( | 3286 const auto sample_counts = histogram_tester.GetTotalCountsForPrefix( |
3236 "PasswordManager.SuppressedAccount."); | 3287 "PasswordManager.SuppressedAccount."); |
3237 EXPECT_THAT(sample_counts, IsEmpty()); | 3288 EXPECT_THAT(sample_counts, IsEmpty()); |
3238 } | 3289 } |
3239 | 3290 |
3240 TEST_F(PasswordFormManagerTest, | 3291 TEST_F(PasswordFormManagerTest, SuppressedFormsHistograms) { |
3241 SuppressedHTTPSFormsHistogram_RecordedForHTTPPages) { | 3292 static constexpr const struct { |
3242 const char kUsernameAlpha[] = "user-alpha@gmail.com"; | 3293 SuppressedFormType type; |
3243 const char kPasswordAlpha[] = "password-alpha"; | 3294 const char* expected_histogram_suffix; |
3244 const char kUsernameBeta[] = "user-beta@gmail.com"; | 3295 void (FakeFormFetcher::*suppressed_forms_setter_func)( |
3245 const char kPasswordBeta[] = "password-beta"; | 3296 const std::vector<const autofill::PasswordForm*>&); |
| 3297 } kSuppressedFormTypeParams[] = { |
| 3298 {SuppressedFormType::HTTPS, "HTTPSNotHTTP", |
| 3299 &FakeFormFetcher::set_suppressed_https_forms}, |
| 3300 {SuppressedFormType::PSL_MATCH, "PSLMatching", |
| 3301 &FakeFormFetcher::set_suppressed_psl_matching_forms}, |
| 3302 {SuppressedFormType::SAME_ORGANIZATION_NAME, "SameOrganizationName", |
| 3303 &FakeFormFetcher::set_suppressed_same_organization_name_forms}}; |
3246 | 3304 |
3247 const auto CreateHTTPSSuppressedForm = [this](const char* username, | 3305 struct SuppressedFormData { |
3248 const char* password, | 3306 const char* username_value; |
3249 PasswordForm::Type type) { | 3307 const char* password_value; |
3250 PasswordForm form = *saved_match(); | 3308 PasswordForm::Type manual_or_generated; |
3251 form.origin = GURL("https://accounts.google.com/a/LoginAuth"); | |
3252 form.signon_realm = "https://accounts.google.com/"; | |
3253 form.type = type; | |
3254 form.username_value = ASCIIToUTF16(username); | |
3255 form.password_value = ASCIIToUTF16(password); | |
3256 return form; | |
3257 }; | 3309 }; |
3258 | 3310 |
3259 const PasswordForm kSuppressedGeneratedForm = CreateHTTPSSuppressedForm( | 3311 static constexpr const char kUsernameAlpha[] = "user-alpha@gmail.com"; |
3260 kUsernameAlpha, kPasswordAlpha, PasswordForm::TYPE_GENERATED); | 3312 static constexpr const char kPasswordAlpha[] = "password-alpha"; |
3261 const PasswordForm kOtherSuppressedGeneratedForm = CreateHTTPSSuppressedForm( | 3313 static constexpr const char kUsernameBeta[] = "user-beta@gmail.com"; |
3262 kUsernameBeta, kPasswordBeta, PasswordForm::TYPE_GENERATED); | 3314 static constexpr const char kPasswordBeta[] = "password-beta"; |
3263 const PasswordForm kSuppressedManualForm = CreateHTTPSSuppressedForm( | |
3264 kUsernameAlpha, kPasswordBeta, PasswordForm::TYPE_MANUAL); | |
3265 | 3315 |
3266 const std::vector<const PasswordForm*> kSuppressedFormsNone; | 3316 static constexpr const SuppressedFormData kSuppressedGeneratedForm = { |
3267 const std::vector<const PasswordForm*> kSuppressedFormsOneGenerated = { | 3317 kUsernameAlpha, kPasswordAlpha, PasswordForm::TYPE_GENERATED}; |
| 3318 static constexpr const SuppressedFormData kOtherSuppressedGeneratedForm = { |
| 3319 kUsernameBeta, kPasswordBeta, PasswordForm::TYPE_GENERATED}; |
| 3320 static constexpr const SuppressedFormData kSuppressedManualForm = { |
| 3321 kUsernameAlpha, kPasswordBeta, PasswordForm::TYPE_MANUAL}; |
| 3322 |
| 3323 const std::vector<const SuppressedFormData*> kSuppressedFormsNone; |
| 3324 const std::vector<const SuppressedFormData*> kSuppressedFormsOneGenerated = { |
3268 &kSuppressedGeneratedForm}; | 3325 &kSuppressedGeneratedForm}; |
3269 const std::vector<const PasswordForm*> kSuppressedFormsTwoGenerated = { | 3326 const std::vector<const SuppressedFormData*> kSuppressedFormsTwoGenerated = { |
3270 &kSuppressedGeneratedForm, &kOtherSuppressedGeneratedForm}; | 3327 &kSuppressedGeneratedForm, &kOtherSuppressedGeneratedForm}; |
3271 const std::vector<const PasswordForm*> kSuppressedFormsOneManual = { | 3328 const std::vector<const SuppressedFormData*> kSuppressedFormsOneManual = { |
3272 &kSuppressedManualForm}; | 3329 &kSuppressedManualForm}; |
3273 const std::vector<const PasswordForm*> kSuppressedFormsTwoMixed = { | 3330 const std::vector<const SuppressedFormData*> kSuppressedFormsTwoMixed = { |
3274 &kSuppressedGeneratedForm, &kSuppressedManualForm}; | 3331 &kSuppressedGeneratedForm, &kSuppressedManualForm}; |
3275 | 3332 |
3276 enum class ManagerAction { NONE, AUTOFILLED, OFFERED, OFFERED_PSL }; | |
3277 enum class SubmitResult { NONE, PASSED, FAILED }; | |
3278 | |
3279 const struct { | 3333 const struct { |
3280 std::vector<const PasswordForm*> simulated_suppressed_forms; | 3334 std::vector<const SuppressedFormData*> simulated_suppressed_forms; |
3281 ManagerAction simulate_manager_action; | 3335 SimulatedManagerAction simulate_manager_action; |
3282 SubmitResult simulate_submit_result; | 3336 SimulatedSubmitResult simulate_submit_result; |
3283 const char* filled_username; | 3337 const char* filled_username; |
3284 const char* filled_password; | 3338 const char* filled_password; |
3285 int expected_histogram_sample_generated; | 3339 int expected_histogram_sample_generated; |
3286 int expected_histogram_sample_manual; | 3340 int expected_histogram_sample_manual; |
3287 const char* submitted_password; // nullptr if same as |filled_password|. | 3341 const char* submitted_password; // nullptr if same as |filled_password|. |
3288 } kTestCases[] = { | 3342 } kTestCases[] = { |
3289 // See PasswordManagerSuppressedAccountCrossActionsTaken in enums.xml. | 3343 // See PasswordManagerSuppressedAccountCrossActionsTaken in enums.xml. |
3290 // | 3344 // |
3291 // Legend: (SuppressAccountType, SubmitResult, ManagerAction, UserAction) | 3345 // Legend: (SuppressAccountType, SubmitResult, SimulatedManagerAction, |
| 3346 // UserAction) |
3292 // 24 = (None, Passed, None, OverrideUsernameAndPassword) | 3347 // 24 = (None, Passed, None, OverrideUsernameAndPassword) |
3293 {kSuppressedFormsNone, ManagerAction::NONE, SubmitResult::PASSED, | 3348 {kSuppressedFormsNone, SimulatedManagerAction::NONE, |
3294 kUsernameAlpha, kPasswordAlpha, 24, 24}, | 3349 SimulatedSubmitResult::PASSED, kUsernameAlpha, kPasswordAlpha, 24, 24}, |
3295 // 5 = (None, NotSubmitted, Autofilled, None) | 3350 // 5 = (None, NotSubmitted, Autofilled, None) |
3296 {kSuppressedFormsNone, ManagerAction::AUTOFILLED, SubmitResult::NONE, | 3351 {kSuppressedFormsNone, SimulatedManagerAction::AUTOFILLED, |
3297 kUsernameAlpha, kPasswordAlpha, 5, 5}, | 3352 SimulatedSubmitResult::NONE, kUsernameAlpha, kPasswordAlpha, 5, 5}, |
3298 // 15 = (None, Failed, Autofilled, None) | 3353 // 15 = (None, Failed, Autofilled, None) |
3299 {kSuppressedFormsNone, ManagerAction::AUTOFILLED, SubmitResult::FAILED, | 3354 {kSuppressedFormsNone, SimulatedManagerAction::AUTOFILLED, |
3300 kUsernameAlpha, kPasswordAlpha, 15, 15}, | 3355 SimulatedSubmitResult::FAILED, kUsernameAlpha, kPasswordAlpha, 15, 15}, |
3301 | 3356 |
3302 // 35 = (Exists, NotSubmitted, Autofilled, None) | 3357 // 35 = (Exists, NotSubmitted, Autofilled, None) |
3303 {kSuppressedFormsOneGenerated, ManagerAction::AUTOFILLED, | 3358 {kSuppressedFormsOneGenerated, SimulatedManagerAction::AUTOFILLED, |
3304 SubmitResult::NONE, kUsernameAlpha, kPasswordAlpha, 35, 5}, | 3359 SimulatedSubmitResult::NONE, kUsernameAlpha, kPasswordAlpha, 35, 5}, |
3305 // 145 = (ExistsSameUsernameAndPassword, Passed, Autofilled, None) | 3360 // 145 = (ExistsSameUsernameAndPassword, Passed, Autofilled, None) |
3306 // 25 = (None, Passed, Autofilled, None) | 3361 // 25 = (None, Passed, Autofilled, None) |
3307 {kSuppressedFormsOneGenerated, ManagerAction::AUTOFILLED, | 3362 {kSuppressedFormsOneGenerated, SimulatedManagerAction::AUTOFILLED, |
3308 SubmitResult::PASSED, kUsernameAlpha, kPasswordAlpha, 145, 25}, | 3363 SimulatedSubmitResult::PASSED, kUsernameAlpha, kPasswordAlpha, 145, 25}, |
3309 // 104 = (ExistsSameUsername, Failed, None, OverrideUsernameAndPassword) | 3364 // 104 = (ExistsSameUsername, Failed, None, OverrideUsernameAndPassword) |
3310 // 14 = (None, Failed, None, OverrideUsernameAndPassword) | 3365 // 14 = (None, Failed, None, OverrideUsernameAndPassword) |
3311 {kSuppressedFormsOneGenerated, ManagerAction::NONE, SubmitResult::FAILED, | 3366 {kSuppressedFormsOneGenerated, SimulatedManagerAction::NONE, |
3312 kUsernameAlpha, kPasswordBeta, 104, 14}, | 3367 SimulatedSubmitResult::FAILED, kUsernameAlpha, kPasswordBeta, 104, 14}, |
3313 // 84 = (ExistsDifferentUsername, Passed, None, | 3368 // 84 = (ExistsDifferentUsername, Passed, None, |
3314 // OverrideUsernameAndPassword) | 3369 // OverrideUsernameAndPassword) |
3315 {kSuppressedFormsOneGenerated, ManagerAction::NONE, SubmitResult::PASSED, | 3370 {kSuppressedFormsOneGenerated, SimulatedManagerAction::NONE, |
3316 kUsernameBeta, kPasswordAlpha, 84, 24}, | 3371 SimulatedSubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 84, 24}, |
3317 | 3372 |
3318 // 144 = (ExistsSameUsernameAndPassword, Passed, None, | 3373 // 144 = (ExistsSameUsernameAndPassword, Passed, None, |
3319 // OverrideUsernameAndPassword) | 3374 // OverrideUsernameAndPassword) |
3320 {kSuppressedFormsOneManual, ManagerAction::NONE, SubmitResult::PASSED, | 3375 {kSuppressedFormsOneManual, SimulatedManagerAction::NONE, |
3321 kUsernameAlpha, kPasswordBeta, 24, 144}, | 3376 SimulatedSubmitResult::PASSED, kUsernameAlpha, kPasswordBeta, 24, 144}, |
3322 {kSuppressedFormsTwoMixed, ManagerAction::NONE, SubmitResult::PASSED, | 3377 {kSuppressedFormsTwoMixed, SimulatedManagerAction::NONE, |
3323 kUsernameBeta, kPasswordAlpha, 84, 84}, | 3378 SimulatedSubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 84, 84}, |
3324 | 3379 |
3325 // 115 = (ExistsSameUsername, Passed, Autofilled, None) | 3380 // 115 = (ExistsSameUsername, Passed, Autofilled, None) |
3326 {kSuppressedFormsTwoGenerated, ManagerAction::AUTOFILLED, | 3381 {kSuppressedFormsTwoGenerated, SimulatedManagerAction::AUTOFILLED, |
3327 SubmitResult::PASSED, kUsernameAlpha, kPasswordAlpha, 145, 25}, | 3382 SimulatedSubmitResult::PASSED, kUsernameAlpha, kPasswordAlpha, 145, 25}, |
3328 {kSuppressedFormsTwoGenerated, ManagerAction::AUTOFILLED, | 3383 {kSuppressedFormsTwoGenerated, SimulatedManagerAction::AUTOFILLED, |
3329 SubmitResult::PASSED, kUsernameAlpha, kPasswordBeta, 115, 25}, | 3384 SimulatedSubmitResult::PASSED, kUsernameAlpha, kPasswordBeta, 115, 25}, |
3330 {kSuppressedFormsTwoGenerated, ManagerAction::AUTOFILLED, | 3385 {kSuppressedFormsTwoGenerated, SimulatedManagerAction::AUTOFILLED, |
3331 SubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 115, 25}, | 3386 SimulatedSubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 115, 25}, |
3332 {kSuppressedFormsTwoGenerated, ManagerAction::AUTOFILLED, | 3387 {kSuppressedFormsTwoGenerated, SimulatedManagerAction::AUTOFILLED, |
3333 SubmitResult::PASSED, kUsernameBeta, kPasswordBeta, 145, 25}, | 3388 SimulatedSubmitResult::PASSED, kUsernameBeta, kPasswordBeta, 145, 25}, |
3334 | 3389 |
3335 // 86 = (ExistsDifferentUsername, Passed, Autofilled, Choose) | 3390 // 86 = (ExistsDifferentUsername, Passed, Autofilled, Choose) |
3336 // 26 = (None, Passed, Autofilled, Choose) | 3391 // 26 = (None, Passed, Autofilled, Choose) |
3337 {kSuppressedFormsOneGenerated, ManagerAction::OFFERED, | 3392 {kSuppressedFormsOneGenerated, SimulatedManagerAction::OFFERED, |
3338 SubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 86, 26}, | 3393 SimulatedSubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 86, 26}, |
3339 // 72 = (ExistsDifferentUsername, Failed, None, ChoosePSL) | 3394 // 72 = (ExistsDifferentUsername, Failed, None, ChoosePSL) |
3340 // 12 = (None, Failed, None, ChoosePSL) | 3395 // 12 = (None, Failed, None, ChoosePSL) |
3341 {kSuppressedFormsOneGenerated, ManagerAction::OFFERED_PSL, | 3396 {kSuppressedFormsOneGenerated, SimulatedManagerAction::OFFERED_PSL, |
3342 SubmitResult::FAILED, kUsernameBeta, kPasswordAlpha, 72, 12}, | 3397 SimulatedSubmitResult::FAILED, kUsernameBeta, kPasswordAlpha, 72, 12}, |
3343 // 148 = (ExistsSameUsernameAndPassword, Passed, Autofilled, | 3398 // 148 = (ExistsSameUsernameAndPassword, Passed, Autofilled, |
3344 // OverridePassword) | 3399 // OverridePassword) |
3345 // 28 = (None, Passed, Autofilled, OverridePassword) | 3400 // 28 = (None, Passed, Autofilled, OverridePassword) |
3346 {kSuppressedFormsTwoGenerated, ManagerAction::AUTOFILLED, | 3401 {kSuppressedFormsTwoGenerated, SimulatedManagerAction::AUTOFILLED, |
3347 SubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 148, 28, | 3402 SimulatedSubmitResult::PASSED, kUsernameBeta, kPasswordAlpha, 148, 28, |
3348 kPasswordBeta}, | 3403 kPasswordBeta}, |
3349 }; | 3404 }; |
3350 | 3405 |
3351 EXPECT_CALL(*client()->mock_driver()->mock_autofill_download_manager(), | 3406 for (const auto& suppression_params : kSuppressedFormTypeParams) { |
3352 StartUploadRequest(_, _, _, _, _)) | 3407 for (const auto& test_case : kTestCases) { |
3353 .Times(::testing::AtLeast(0)); | 3408 SCOPED_TRACE(suppression_params.expected_histogram_suffix); |
| 3409 SCOPED_TRACE(test_case.expected_histogram_sample_manual); |
| 3410 SCOPED_TRACE(test_case.expected_histogram_sample_generated); |
3354 | 3411 |
3355 for (const auto& test_case : kTestCases) { | 3412 base::HistogramTester histogram_tester; |
3356 SCOPED_TRACE(test_case.expected_histogram_sample_manual); | |
3357 SCOPED_TRACE(test_case.expected_histogram_sample_generated); | |
3358 | 3413 |
3359 base::HistogramTester histogram_tester; | 3414 std::vector<PasswordForm> suppressed_forms; |
| 3415 for (const auto* form_data : test_case.simulated_suppressed_forms) { |
| 3416 suppressed_forms.push_back(CreateSuppressedForm( |
| 3417 suppression_params.type, form_data->username_value, |
| 3418 form_data->password_value, form_data->manual_or_generated)); |
| 3419 } |
3360 | 3420 |
3361 const base::string16 filled_username = | 3421 std::vector<const PasswordForm*> suppressed_forms_ptrs; |
3362 ASCIIToUTF16(test_case.filled_username); | 3422 for (const auto& form : suppressed_forms) |
3363 const base::string16 filled_password = | 3423 suppressed_forms_ptrs.push_back(&form); |
3364 ASCIIToUTF16(test_case.filled_password); | |
3365 | 3424 |
3366 FakeFormFetcher fetcher; | 3425 FakeFormFetcher fetcher; |
3367 std::unique_ptr<PasswordFormManager> form_manager = | 3426 fetcher.set_did_complete_querying_suppressed_forms(true); |
3368 base::MakeUnique<PasswordFormManager>( | |
3369 password_manager(), client(), client()->driver(), *observed_form(), | |
3370 base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); | |
3371 | 3427 |
3372 PasswordForm http_stored_form = *saved_match(); | 3428 (&fetcher->*suppression_params.suppressed_forms_setter_func)( |
3373 http_stored_form.username_value = filled_username; | 3429 suppressed_forms_ptrs); |
3374 http_stored_form.password_value = filled_password; | |
3375 if (test_case.simulate_manager_action == ManagerAction::OFFERED_PSL) | |
3376 http_stored_form.is_public_suffix_match = true; | |
3377 | 3430 |
3378 std::vector<const PasswordForm*> matches; | 3431 SimulateActionsOnHTTPObservedForm( |
3379 if (test_case.simulate_manager_action != ManagerAction::NONE) | 3432 &fetcher, test_case.simulate_manager_action, |
3380 matches.push_back(&http_stored_form); | 3433 test_case.simulate_submit_result, test_case.filled_username, |
| 3434 test_case.filled_password, test_case.submitted_password); |
3381 | 3435 |
3382 // Extra mile: kUserActionChoose is only recorded if there were multiple | 3436 histogram_tester.ExpectUniqueSample( |
3383 // logins available and the preferred one was changed. | 3437 "PasswordManager.QueryingSuppressedAccountsFinished", true, 1); |
3384 PasswordForm http_stored_form2 = http_stored_form; | 3438 |
3385 if (test_case.simulate_manager_action == ManagerAction::OFFERED) { | 3439 EXPECT_THAT( |
3386 http_stored_form.preferred = false; | 3440 histogram_tester.GetAllSamples( |
3387 http_stored_form2.username_value = ASCIIToUTF16("user-other@gmail.com"); | 3441 "PasswordManager.SuppressedAccount.Generated." + |
3388 matches.push_back(&http_stored_form2); | 3442 std::string(suppression_params.expected_histogram_suffix)), |
| 3443 ::testing::ElementsAre( |
| 3444 base::Bucket(test_case.expected_histogram_sample_generated, 1))); |
| 3445 EXPECT_THAT( |
| 3446 histogram_tester.GetAllSamples( |
| 3447 "PasswordManager.SuppressedAccount.Manual." + |
| 3448 std::string(suppression_params.expected_histogram_suffix)), |
| 3449 ::testing::ElementsAre( |
| 3450 base::Bucket(test_case.expected_histogram_sample_manual, 1))); |
3389 } | 3451 } |
3390 | |
3391 fetcher.set_did_complete_querying_suppressed_https_forms(true); | |
3392 fetcher.set_suppressed_https_forms(test_case.simulated_suppressed_forms); | |
3393 fetcher.Fetch(); | |
3394 fetcher.SetNonFederated(matches, 0u); | |
3395 | |
3396 if (test_case.simulate_submit_result != SubmitResult::NONE) { | |
3397 PasswordForm submitted_form(*observed_form()); | |
3398 submitted_form.preferred = true; | |
3399 submitted_form.username_value = filled_username; | |
3400 submitted_form.password_value = | |
3401 test_case.submitted_password | |
3402 ? ASCIIToUTF16(test_case.submitted_password) | |
3403 : filled_password; | |
3404 | |
3405 form_manager->ProvisionallySave( | |
3406 submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | |
3407 if (test_case.simulate_submit_result == SubmitResult::PASSED) { | |
3408 form_manager->LogSubmitPassed(); | |
3409 form_manager->Save(); | |
3410 } else { | |
3411 form_manager->LogSubmitFailed(); | |
3412 } | |
3413 } | |
3414 | |
3415 form_manager.reset(); | |
3416 | |
3417 histogram_tester.ExpectUniqueSample( | |
3418 "PasswordManager.QueryingSuppressedAccountsFinished", true, 1); | |
3419 | |
3420 EXPECT_THAT(histogram_tester.GetAllSamples( | |
3421 "PasswordManager.SuppressedAccount.Generated.HTTPSNotHTTP"), | |
3422 ::testing::ElementsAre(base::Bucket( | |
3423 test_case.expected_histogram_sample_generated, 1))); | |
3424 EXPECT_THAT(histogram_tester.GetAllSamples( | |
3425 "PasswordManager.SuppressedAccount.Manual.HTTPSNotHTTP"), | |
3426 ::testing::ElementsAre(base::Bucket( | |
3427 test_case.expected_histogram_sample_manual, 1))); | |
3428 } | 3452 } |
3429 } | 3453 } |
3430 | 3454 |
| 3455 // If the frame containing the login form is served over HTTPS, no histograms on |
| 3456 // supressed HTTPS forms should be recorded. Everything else should still be. |
| 3457 TEST_F(PasswordFormManagerTest, SuppressedHTTPSFormsHistogram_NotRecordedFor) { |
| 3458 base::HistogramTester histogram_tester; |
| 3459 |
| 3460 PasswordForm https_observed_form = *observed_form(); |
| 3461 https_observed_form.origin = GURL("https://accounts.google.com/a/LoginAuth"); |
| 3462 https_observed_form.signon_realm = "https://accounts.google.com/"; |
| 3463 |
| 3464 // Only the scheme of the frame containing the login form maters, not the |
| 3465 // scheme of the main frame. |
| 3466 ASSERT_FALSE(client()->IsMainFrameSecure()); |
| 3467 |
| 3468 // Even if there were any suppressed HTTPS forms, they should be are ignored |
| 3469 // (but there should be none in production in this case). |
| 3470 FakeFormFetcher fetcher; |
| 3471 fetcher.set_suppressed_https_forms({saved_match()}); |
| 3472 fetcher.set_did_complete_querying_suppressed_forms(true); |
| 3473 fetcher.Fetch(); |
| 3474 |
| 3475 std::unique_ptr<PasswordFormManager> form_manager = |
| 3476 base::MakeUnique<PasswordFormManager>( |
| 3477 password_manager(), client(), client()->driver(), https_observed_form, |
| 3478 base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
| 3479 fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
| 3480 form_manager.reset(); |
| 3481 |
| 3482 histogram_tester.ExpectUniqueSample( |
| 3483 "PasswordManager.QueryingSuppressedAccountsFinished", true, 1); |
| 3484 histogram_tester.ExpectTotalCount( |
| 3485 "PasswordManager.SuppressedAccount.Generated.HTTPSNotHTTP", 0); |
| 3486 histogram_tester.ExpectTotalCount( |
| 3487 "PasswordManager.SuppressedAccount.Manual.HTTPSNotHTTP", 0); |
| 3488 histogram_tester.ExpectTotalCount( |
| 3489 "PasswordManager.SuppressedAccount.Generated.PSLMatching", 1); |
| 3490 histogram_tester.ExpectTotalCount( |
| 3491 "PasswordManager.SuppressedAccount.Manual.PSLMatching", 1); |
| 3492 histogram_tester.ExpectTotalCount( |
| 3493 "PasswordManager.SuppressedAccount.Generated.SameOrganizationName", 1); |
| 3494 histogram_tester.ExpectTotalCount( |
| 3495 "PasswordManager.SuppressedAccount.Manual.SameOrganizationName", 1); |
| 3496 } |
| 3497 |
3431 } // namespace password_manager | 3498 } // namespace password_manager |
OLD | NEW |