| 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 "components/password_manager/content/browser/credential_manager_impl.h" | 5 #include "components/password_manager/content/browser/credential_manager_impl.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <tuple> | 10 #include <tuple> |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 | 51 |
| 52 class MockPasswordManagerClient : public StubPasswordManagerClient { | 52 class MockPasswordManagerClient : public StubPasswordManagerClient { |
| 53 public: | 53 public: |
| 54 MOCK_CONST_METHOD0(IsSavingAndFillingEnabledForCurrentPage, bool()); | 54 MOCK_CONST_METHOD0(IsSavingAndFillingEnabledForCurrentPage, bool()); |
| 55 MOCK_CONST_METHOD0(IsOffTheRecord, bool()); | 55 MOCK_CONST_METHOD0(IsOffTheRecord, bool()); |
| 56 MOCK_CONST_METHOD0(DidLastPageLoadEncounterSSLErrors, bool()); | 56 MOCK_CONST_METHOD0(DidLastPageLoadEncounterSSLErrors, bool()); |
| 57 MOCK_METHOD1(NotifyUserAutoSigninPtr, | 57 MOCK_METHOD1(NotifyUserAutoSigninPtr, |
| 58 bool(const std::vector<autofill::PasswordForm*>& local_forms)); | 58 bool(const std::vector<autofill::PasswordForm*>& local_forms)); |
| 59 MOCK_METHOD1(NotifyUserCouldBeAutoSignedInPtr, | 59 MOCK_METHOD1(NotifyUserCouldBeAutoSignedInPtr, |
| 60 bool(autofill::PasswordForm* form)); | 60 bool(autofill::PasswordForm* form)); |
| 61 MOCK_METHOD0(NotifyStorePasswordCalled, void()); |
| 61 MOCK_METHOD2(PromptUserToSavePasswordPtr, | 62 MOCK_METHOD2(PromptUserToSavePasswordPtr, |
| 62 void(PasswordFormManager*, CredentialSourceType type)); | 63 void(PasswordFormManager*, CredentialSourceType type)); |
| 63 MOCK_METHOD4(PromptUserToChooseCredentialsPtr, | 64 MOCK_METHOD4(PromptUserToChooseCredentialsPtr, |
| 64 bool(const std::vector<autofill::PasswordForm*>& local_forms, | 65 bool(const std::vector<autofill::PasswordForm*>& local_forms, |
| 65 const std::vector<autofill::PasswordForm*>& federated_forms, | 66 const std::vector<autofill::PasswordForm*>& federated_forms, |
| 66 const GURL& origin, | 67 const GURL& origin, |
| 67 const CredentialsCallback& callback)); | 68 const CredentialsCallback& callback)); |
| 68 | 69 |
| 69 explicit MockPasswordManagerClient(PasswordStore* store) : store_(store) { | 70 explicit MockPasswordManagerClient(PasswordStore* store) : store_(store) { |
| 70 prefs_.registry()->RegisterBooleanPref(prefs::kCredentialsEnableAutosignin, | 71 prefs_.registry()->RegisterBooleanPref(prefs::kCredentialsEnableAutosignin, |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 client_->set_zero_click_enabled(false); | 388 client_->set_zero_click_enabled(false); |
| 388 client_->set_first_run_seen(false); | 389 client_->set_first_run_seen(false); |
| 389 EXPECT_FALSE(cm_service_impl()->IsZeroClickAllowed()); | 390 EXPECT_FALSE(cm_service_impl()->IsZeroClickAllowed()); |
| 390 } | 391 } |
| 391 | 392 |
| 392 TEST_F(CredentialManagerImplTest, CredentialManagerOnStore) { | 393 TEST_F(CredentialManagerImplTest, CredentialManagerOnStore) { |
| 393 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); | 394 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); |
| 394 EXPECT_CALL(*client_, PromptUserToSavePasswordPtr( | 395 EXPECT_CALL(*client_, PromptUserToSavePasswordPtr( |
| 395 _, CredentialSourceType::CREDENTIAL_SOURCE_API)) | 396 _, CredentialSourceType::CREDENTIAL_SOURCE_API)) |
| 396 .Times(testing::Exactly(1)); | 397 .Times(testing::Exactly(1)); |
| 398 EXPECT_CALL(*client_, NotifyStorePasswordCalled()); |
| 397 | 399 |
| 398 bool called = false; | 400 bool called = false; |
| 399 CallStore(info, base::Bind(&RespondCallback, &called)); | 401 CallStore(info, base::Bind(&RespondCallback, &called)); |
| 400 | 402 |
| 401 // Allow the PasswordFormManager to talk to the password store, determine | 403 // Allow the PasswordFormManager to talk to the password store, determine |
| 402 // that the form is new, and set it as pending. | 404 // that the form is new, and set it as pending. |
| 403 RunAllPendingTasks(); | 405 RunAllPendingTasks(); |
| 404 | 406 |
| 405 EXPECT_TRUE(called); | 407 EXPECT_TRUE(called); |
| 406 EXPECT_TRUE(client_->pending_manager()->HasCompletedMatching()); | 408 EXPECT_TRUE(client_->pending_manager()->HasCompletedMatching()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 417 | 419 |
| 418 TEST_F(CredentialManagerImplTest, CredentialManagerStoreOverwrite) { | 420 TEST_F(CredentialManagerImplTest, CredentialManagerStoreOverwrite) { |
| 419 // Populate the PasswordStore with a form. | 421 // Populate the PasswordStore with a form. |
| 420 store_->AddLogin(form_); | 422 store_->AddLogin(form_); |
| 421 RunAllPendingTasks(); | 423 RunAllPendingTasks(); |
| 422 | 424 |
| 423 // Calling 'Store' with a credential that matches |form_| should update | 425 // Calling 'Store' with a credential that matches |form_| should update |
| 424 // the password without prompting the user. | 426 // the password without prompting the user. |
| 425 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); | 427 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); |
| 426 info.password = base::ASCIIToUTF16("Totally new password."); | 428 info.password = base::ASCIIToUTF16("Totally new password."); |
| 429 EXPECT_CALL(*client_, PromptUserToSavePasswordPtr(_, _)).Times(0); |
| 430 EXPECT_CALL(*client_, NotifyStorePasswordCalled()); |
| 427 bool called = false; | 431 bool called = false; |
| 428 CallStore(info, base::Bind(&RespondCallback, &called)); | 432 CallStore(info, base::Bind(&RespondCallback, &called)); |
| 429 | 433 |
| 430 EXPECT_CALL(*client_, PromptUserToSavePasswordPtr( | |
| 431 _, CredentialSourceType::CREDENTIAL_SOURCE_API)) | |
| 432 .Times(testing::Exactly(0)); | |
| 433 | |
| 434 // Allow the PasswordFormManager to talk to the password store, determine | 434 // Allow the PasswordFormManager to talk to the password store, determine |
| 435 // the form is a match for an existing form, and update the PasswordStore. | 435 // the form is a match for an existing form, and update the PasswordStore. |
| 436 RunAllPendingTasks(); | 436 RunAllPendingTasks(); |
| 437 | 437 |
| 438 EXPECT_TRUE(called); | 438 EXPECT_TRUE(called); |
| 439 | 439 |
| 440 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); | 440 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); |
| 441 EXPECT_EQ(1U, passwords.size()); | 441 EXPECT_EQ(1U, passwords.size()); |
| 442 EXPECT_EQ(1U, passwords[form_.signon_realm].size()); | 442 EXPECT_EQ(1U, passwords[form_.signon_realm].size()); |
| 443 EXPECT_EQ(base::ASCIIToUTF16("Totally new password."), | 443 EXPECT_EQ(base::ASCIIToUTF16("Totally new password."), |
| 444 passwords[form_.signon_realm][0].password_value); | 444 passwords[form_.signon_realm][0].password_value); |
| 445 } | 445 } |
| 446 | 446 |
| 447 TEST_F(CredentialManagerImplTest, CredentialManagerStoreOverwriteZeroClick) { | 447 TEST_F(CredentialManagerImplTest, CredentialManagerStoreOverwriteZeroClick) { |
| 448 // Set the global zero click flag on, and populate the PasswordStore with a | 448 // Set the global zero click flag on, and populate the PasswordStore with a |
| 449 // form that's set to skip zero click. | 449 // form that's set to skip zero click. |
| 450 client_->set_zero_click_enabled(true); | 450 client_->set_zero_click_enabled(true); |
| 451 client_->set_first_run_seen(true); | 451 client_->set_first_run_seen(true); |
| 452 form_.skip_zero_click = true; | 452 form_.skip_zero_click = true; |
| 453 store_->AddLogin(form_); | 453 store_->AddLogin(form_); |
| 454 RunAllPendingTasks(); | 454 RunAllPendingTasks(); |
| 455 | 455 |
| 456 // Calling 'Store' with a credential that matches |form_| should update | 456 // Calling 'Store' with a credential that matches |form_| should update |
| 457 // the credential without prompting the user. | 457 // the credential without prompting the user. |
| 458 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); | 458 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); |
| 459 bool called = false; | 459 bool called = false; |
| 460 EXPECT_CALL(*client_, NotifyStorePasswordCalled()); |
| 460 CallStore(info, base::Bind(&RespondCallback, &called)); | 461 CallStore(info, base::Bind(&RespondCallback, &called)); |
| 461 | 462 |
| 462 // Allow the PasswordFormManager to talk to the password store, determine | 463 // Allow the PasswordFormManager to talk to the password store, determine |
| 463 // the form is a match for an existing form, and update the PasswordStore. | 464 // the form is a match for an existing form, and update the PasswordStore. |
| 464 RunAllPendingTasks(); | 465 RunAllPendingTasks(); |
| 465 | 466 |
| 466 // Verify that the update toggled the skip_zero_click flag off. | 467 // Verify that the update toggled the skip_zero_click flag off. |
| 467 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); | 468 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); |
| 468 EXPECT_FALSE(passwords[form_.signon_realm][0].skip_zero_click); | 469 EXPECT_FALSE(passwords[form_.signon_realm][0].skip_zero_click); |
| 469 } | 470 } |
| 470 | 471 |
| 471 TEST_F(CredentialManagerImplTest, | 472 TEST_F(CredentialManagerImplTest, |
| 472 CredentialManagerFederatedStoreOverwriteZeroClick) { | 473 CredentialManagerFederatedStoreOverwriteZeroClick) { |
| 473 // Set the global zero click flag on, and populate the PasswordStore with a | 474 // Set the global zero click flag on, and populate the PasswordStore with a |
| 474 // form that's set to skip zero click. | 475 // form that's set to skip zero click. |
| 475 client_->set_zero_click_enabled(true); | 476 client_->set_zero_click_enabled(true); |
| 476 client_->set_first_run_seen(true); | 477 client_->set_first_run_seen(true); |
| 477 form_.federation_origin = url::Origin(GURL("https://example.com/")); | 478 form_.federation_origin = url::Origin(GURL("https://example.com/")); |
| 478 form_.skip_zero_click = true; | 479 form_.skip_zero_click = true; |
| 479 form_.signon_realm = "federation://example.com/example.com"; | 480 form_.signon_realm = "federation://example.com/example.com"; |
| 480 store_->AddLogin(form_); | 481 store_->AddLogin(form_); |
| 481 RunAllPendingTasks(); | 482 RunAllPendingTasks(); |
| 482 | 483 |
| 483 // Calling 'Store' with a credential that matches |form_| should update | 484 // Calling 'Store' with a credential that matches |form_| should update |
| 484 // the credential without prompting the user. | 485 // the credential without prompting the user. |
| 485 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_FEDERATED); | 486 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_FEDERATED); |
| 486 bool called = false; | 487 bool called = false; |
| 488 EXPECT_CALL(*client_, NotifyStorePasswordCalled()); |
| 487 CallStore(info, base::Bind(&RespondCallback, &called)); | 489 CallStore(info, base::Bind(&RespondCallback, &called)); |
| 488 | 490 |
| 489 // Allow the PasswordFormManager to talk to the password store, determine | 491 // Allow the PasswordFormManager to talk to the password store, determine |
| 490 // the form is a match for an existing form, and update the PasswordStore. | 492 // the form is a match for an existing form, and update the PasswordStore. |
| 491 RunAllPendingTasks(); | 493 RunAllPendingTasks(); |
| 492 | 494 |
| 493 // Verify that the update toggled the skip_zero_click flag off. | 495 // Verify that the update toggled the skip_zero_click flag off. |
| 494 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); | 496 TestPasswordStore::PasswordMap passwords = store_->stored_passwords(); |
| 495 EXPECT_FALSE(passwords[form_.signon_realm][0].skip_zero_click); | 497 EXPECT_FALSE(passwords[form_.signon_realm][0].skip_zero_click); |
| 496 } | 498 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 } | 532 } |
| 531 | 533 |
| 532 TEST_F(CredentialManagerImplTest, | 534 TEST_F(CredentialManagerImplTest, |
| 533 CredentialManagerSignInWithSavingDisabledForCurrentPage) { | 535 CredentialManagerSignInWithSavingDisabledForCurrentPage) { |
| 534 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); | 536 CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD); |
| 535 EXPECT_CALL(*client_, IsSavingAndFillingEnabledForCurrentPage()) | 537 EXPECT_CALL(*client_, IsSavingAndFillingEnabledForCurrentPage()) |
| 536 .WillRepeatedly(testing::Return(false)); | 538 .WillRepeatedly(testing::Return(false)); |
| 537 EXPECT_CALL(*client_, PromptUserToSavePasswordPtr( | 539 EXPECT_CALL(*client_, PromptUserToSavePasswordPtr( |
| 538 _, CredentialSourceType::CREDENTIAL_SOURCE_API)) | 540 _, CredentialSourceType::CREDENTIAL_SOURCE_API)) |
| 539 .Times(testing::Exactly(0)); | 541 .Times(testing::Exactly(0)); |
| 542 EXPECT_CALL(*client_, NotifyStorePasswordCalled()).Times(0); |
| 540 | 543 |
| 541 bool called = false; | 544 bool called = false; |
| 542 CallStore(info, base::Bind(&RespondCallback, &called)); | 545 CallStore(info, base::Bind(&RespondCallback, &called)); |
| 543 | 546 |
| 544 RunAllPendingTasks(); | 547 RunAllPendingTasks(); |
| 545 | 548 |
| 546 EXPECT_TRUE(called); | 549 EXPECT_TRUE(called); |
| 547 EXPECT_FALSE(client_->pending_manager()); | 550 EXPECT_FALSE(client_->pending_manager()); |
| 548 } | 551 } |
| 549 | 552 |
| (...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1255 _, CredentialSourceType::CREDENTIAL_SOURCE_API)); | 1258 _, CredentialSourceType::CREDENTIAL_SOURCE_API)); |
| 1256 CallStore(info, base::Bind(&RespondCallback, &called)); | 1259 CallStore(info, base::Bind(&RespondCallback, &called)); |
| 1257 // Allow the PasswordFormManager to talk to the password store | 1260 // Allow the PasswordFormManager to talk to the password store |
| 1258 RunAllPendingTasks(); | 1261 RunAllPendingTasks(); |
| 1259 | 1262 |
| 1260 ASSERT_TRUE(client_->pending_manager()); | 1263 ASSERT_TRUE(client_->pending_manager()); |
| 1261 EXPECT_TRUE(client_->pending_manager()->IsBlacklisted()); | 1264 EXPECT_TRUE(client_->pending_manager()->IsBlacklisted()); |
| 1262 } | 1265 } |
| 1263 | 1266 |
| 1264 } // namespace password_manager | 1267 } // namespace password_manager |
| OLD | NEW |