Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: components/password_manager/core/browser/password_form_manager_unittest.cc

Issue 2912783002: Measure how often PSL and same-organization name credentials are suppressed. (Closed)
Patch Set: Addressed comments from kolos@. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698