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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "chrome/browser/password_manager/mock_password_store.h" | 10 #include "chrome/browser/password_manager/mock_password_store.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 } | 60 } |
61 | 61 |
62 static TestPasswordManager* CreateForWebContentsAndDelegate( | 62 static TestPasswordManager* CreateForWebContentsAndDelegate( |
63 content::WebContents* contents, | 63 content::WebContents* contents, |
64 PasswordManagerDelegate* delegate) { | 64 PasswordManagerDelegate* delegate) { |
65 TestPasswordManager* tpm = new TestPasswordManager(contents, delegate); | 65 TestPasswordManager* tpm = new TestPasswordManager(contents, delegate); |
66 contents->SetUserData(UserDataKey(), tpm); | 66 contents->SetUserData(UserDataKey(), tpm); |
67 return tpm; | 67 return tpm; |
68 } | 68 } |
69 | 69 |
| 70 int PendingManagersCount() { return pending_login_managers_.size(); } |
| 71 |
70 private: | 72 private: |
71 DISALLOW_COPY_AND_ASSIGN(TestPasswordManager); | 73 DISALLOW_COPY_AND_ASSIGN(TestPasswordManager); |
72 }; | 74 }; |
73 | 75 |
74 } // namespace | 76 } // namespace |
75 | 77 |
76 class PasswordManagerTest : public ChromeRenderViewHostTestHarness { | 78 class PasswordManagerTest : public ChromeRenderViewHostTestHarness { |
77 protected: | 79 protected: |
78 virtual void SetUp() { | 80 virtual void SetUp() { |
79 ChromeRenderViewHostTestHarness::SetUp(); | 81 ChromeRenderViewHostTestHarness::SetUp(); |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 manager()->ProvisionallySavePassword(login_form); | 521 manager()->ProvisionallySavePassword(login_form); |
520 | 522 |
521 PasswordForm failed_login_form(MakeTwitterFailedLoginForm()); | 523 PasswordForm failed_login_form(MakeTwitterFailedLoginForm()); |
522 observed.clear(); | 524 observed.clear(); |
523 observed.push_back(failed_login_form); | 525 observed.push_back(failed_login_form); |
524 // A PasswordForm appears, and is visible in the layout: | 526 // A PasswordForm appears, and is visible in the layout: |
525 // No expected calls to the PasswordStore... | 527 // No expected calls to the PasswordStore... |
526 manager()->OnPasswordFormsParsed(observed); | 528 manager()->OnPasswordFormsParsed(observed); |
527 manager()->OnPasswordFormsRendered(observed); | 529 manager()->OnPasswordFormsRendered(observed); |
528 } | 530 } |
| 531 |
| 532 TEST_F(PasswordManagerTest, RemovePasswordFormSubmitEmptyStore) { |
| 533 |
| 534 std::vector<PasswordForm*> result; // Empty password store. |
| 535 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
| 536 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
| 537 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
| 538 std::vector<PasswordForm> observed; |
| 539 PasswordForm form(MakeSimpleForm()); |
| 540 observed.push_back(form); |
| 541 manager()->OnPasswordFormsParsed(observed); // The initial load. |
| 542 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
| 543 |
| 544 // And the form submit contract is to call ProvisionallySavePassword. |
| 545 manager()->ProvisionallySavePassword(form); |
| 546 |
| 547 scoped_ptr<PasswordFormManager> form_to_save; |
| 548 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
| 549 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
| 550 |
| 551 // Now the password manager waits for the navigation to complete. |
| 552 observed.clear(); |
| 553 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
| 554 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
| 555 |
| 556 ASSERT_TRUE(form_to_save.get()); |
| 557 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
| 558 |
| 559 // Simulate saving the form, as if the info bar was accepted. |
| 560 form_to_save->Save(); |
| 561 |
| 562 EXPECT_CALL(*store_.get(), RemoveLoginImpl(_)).Times(Exactly(1)); |
| 563 EXPECT_CALL(delegate_, DidLastPageLoadEncounterSSLErrors()).Times(Exactly(0)); |
| 564 |
| 565 manager()->OnRemovePasswordSuggestion(form); |
| 566 } |
| 567 |
| 568 TEST_F(PasswordManagerTest, RemovePasswordFormSubmitEmptyStore2) { |
| 569 |
| 570 std::vector<PasswordForm*> result; // Empty password store. |
| 571 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
| 572 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
| 573 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
| 574 std::vector<PasswordForm> observed; |
| 575 PasswordForm form(MakeSimpleForm()); |
| 576 observed.push_back(form); |
| 577 ASSERT_TRUE(manager()->PendingManagersCount() == 0); |
| 578 manager()->OnPasswordFormsParsed(observed); // The initial load. |
| 579 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
| 580 ASSERT_TRUE(manager()->PendingManagersCount() == 1); |
| 581 // And the form submit contract is to call ProvisionallySavePassword. |
| 582 manager()->ProvisionallySavePassword(form); |
| 583 |
| 584 scoped_ptr<PasswordFormManager> form_to_save; |
| 585 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
| 586 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
| 587 |
| 588 EXPECT_CALL(*store_.get(), RemoveLoginImpl(_)).Times(Exactly(1)); |
| 589 EXPECT_CALL(delegate_, DidLastPageLoadEncounterSSLErrors()).Times(Exactly(1)); |
| 590 manager()->OnRemovePasswordSuggestion(form); |
| 591 |
| 592 // Now the password manager waits for the navigation to complete. |
| 593 observed.clear(); |
| 594 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
| 595 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
| 596 ASSERT_TRUE(manager()->PendingManagersCount() == 0); |
| 597 ASSERT_TRUE(form_to_save.get()); |
| 598 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
| 599 |
| 600 // Simulate saving the form, as if the info bar was accepted. |
| 601 form_to_save->Save(); |
| 602 |
| 603 ASSERT_TRUE(manager()->PendingManagersCount() == 0); |
| 604 } |
OLD | NEW |