| Index: chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
|
| diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
|
| index ea97c61823c588f4c2dc089330f8780c89905891..30be83e7ee376a56d60124547467d36f893da93d 100644
|
| --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
|
| +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
|
| @@ -19,16 +19,71 @@
|
| #include "components/password_manager/core/browser/stub_password_manager_client.h"
|
| #include "components/password_manager/core/browser/stub_password_manager_driver.h"
|
| #include "components/password_manager/core/common/password_manager_ui.h"
|
| +#include "content/public/browser/navigation_details.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| #include "content/public/test/web_contents_tester.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +using ::testing::ElementsAre;
|
| +using ::testing::Pointee;
|
| +
|
| namespace {
|
|
|
| const int64 kSlowNavigationDelayInMS = 2000;
|
| const int64 kQuickNavigationDelayInMS = 500;
|
|
|
| +// This sublass is used to disable some code paths which are not essential for
|
| +// testing.
|
| +class TestManagePasswordsUIController : public ManagePasswordsUIController {
|
| + public:
|
| + TestManagePasswordsUIController(
|
| + content::WebContents* contents,
|
| + password_manager::PasswordManagerClient* client);
|
| + ~TestManagePasswordsUIController() override;
|
| +
|
| + base::TimeDelta Elapsed() const override;
|
| + void SetElapsed(base::TimeDelta elapsed) { elapsed_ = elapsed; }
|
| +
|
| + using ManagePasswordsUIController::DidNavigateMainFrame;
|
| +
|
| + private:
|
| + void UpdateBubbleAndIconVisibility() override;
|
| + void UpdateAndroidAccountChooserInfoBarVisibility() override;
|
| + void SavePasswordInternal() override {}
|
| + void NeverSavePasswordInternal() override {}
|
| +
|
| + base::TimeDelta elapsed_;
|
| +};
|
| +
|
| +TestManagePasswordsUIController::TestManagePasswordsUIController(
|
| + content::WebContents* contents,
|
| + password_manager::PasswordManagerClient* client)
|
| + : ManagePasswordsUIController(contents) {
|
| + // Do not silently replace an existing ManagePasswordsUIController because it
|
| + // unregisters itself in WebContentsDestroyed().
|
| + EXPECT_FALSE(contents->GetUserData(UserDataKey()));
|
| + contents->SetUserData(UserDataKey(), this);
|
| + set_client(client);
|
| +}
|
| +
|
| +TestManagePasswordsUIController::~TestManagePasswordsUIController() {
|
| +}
|
| +
|
| +base::TimeDelta TestManagePasswordsUIController::Elapsed() const {
|
| + return elapsed_;
|
| +}
|
| +
|
| +void TestManagePasswordsUIController::UpdateBubbleAndIconVisibility() {
|
| + ManagePasswordsUIController::UpdateBubbleAndIconVisibility();
|
| + OnBubbleShown();
|
| +}
|
| +
|
| +void TestManagePasswordsUIController::
|
| + UpdateAndroidAccountChooserInfoBarVisibility() {
|
| + OnBubbleShown();
|
| +}
|
| +
|
| } // namespace
|
|
|
| class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness {
|
| @@ -41,7 +96,7 @@ class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness {
|
| // Create the test UIController here so that it's bound to
|
| // |test_web_contents_|, and will be retrieved correctly via
|
| // ManagePasswordsUIController::FromWebContents in |controller()|.
|
| - new ManagePasswordsUIControllerMock(web_contents());
|
| + new TestManagePasswordsUIController(web_contents(), &client_);
|
|
|
| test_local_form_.origin = GURL("http://example.com");
|
| test_local_form_.username_value = base::ASCIIToUTF16("username");
|
| @@ -62,8 +117,8 @@ class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness {
|
| return credential_info_.get();
|
| }
|
|
|
| - ManagePasswordsUIControllerMock* controller() {
|
| - return static_cast<ManagePasswordsUIControllerMock*>(
|
| + TestManagePasswordsUIController* controller() {
|
| + return static_cast<TestManagePasswordsUIController*>(
|
| ManagePasswordsUIController::FromWebContents(web_contents()));
|
| }
|
|
|
| @@ -71,12 +126,24 @@ class ManagePasswordsUIControllerTest : public ChromeRenderViewHostTestHarness {
|
| credential_info_.reset(new password_manager::CredentialInfo(info));
|
| }
|
|
|
| + scoped_ptr<password_manager::PasswordFormManager> CreateFormManager();
|
| +
|
| private:
|
| + password_manager::StubPasswordManagerClient client_;
|
| +
|
| autofill::PasswordForm test_local_form_;
|
| autofill::PasswordForm test_federated_form_;
|
| scoped_ptr<password_manager::CredentialInfo> credential_info_;
|
| };
|
|
|
| +scoped_ptr<password_manager::PasswordFormManager>
|
| +ManagePasswordsUIControllerTest::CreateFormManager() {
|
| + ScopedVector<autofill::PasswordForm> stored_forms;
|
| + stored_forms.push_back(new autofill::PasswordForm(test_local_form()));
|
| + return ManagePasswordsUIControllerMock::CreateFormManager(
|
| + &client_, test_local_form(), stored_forms.Pass());
|
| +}
|
| +
|
| TEST_F(ManagePasswordsUIControllerTest, DefaultState) {
|
| EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state());
|
| EXPECT_FALSE(controller()->PasswordPendingUserDecision());
|
| @@ -88,7 +155,7 @@ TEST_F(ManagePasswordsUIControllerTest, DefaultState) {
|
| }
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, PasswordAutofilled) {
|
| - base::string16 kTestUsername = base::ASCIIToUTF16("test_username");
|
| + base::string16 kTestUsername = test_local_form().username_value;
|
| autofill::PasswordFormMap map;
|
| map[kTestUsername] = &test_local_form();
|
| controller()->OnPasswordAutofilled(map);
|
| @@ -96,12 +163,11 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordAutofilled) {
|
| EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state());
|
| EXPECT_FALSE(controller()->PasswordPendingUserDecision());
|
| EXPECT_EQ(test_local_form().origin, controller()->origin());
|
| - EXPECT_EQ(1u, controller()->best_matches().size());
|
| - ASSERT_EQ(1u, controller()->best_matches().count(kTestUsername));
|
| + ASSERT_EQ(1u, controller()->GetCurrentForms().size());
|
| + EXPECT_EQ(kTestUsername, controller()->GetCurrentForms()[0]->username_value);
|
|
|
| // Controller should store a separate copy of the form as it doesn't own it.
|
| - EXPECT_NE(&test_local_form(),
|
| - controller()->best_matches().find(kTestUsername)->second);
|
| + EXPECT_NE(&test_local_form(), controller()->GetCurrentForms()[0]);
|
|
|
| ManagePasswordsIconMock mock;
|
| controller()->UpdateIconAndBubbleState(&mock);
|
| @@ -109,11 +175,8 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordAutofilled) {
|
| }
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, PasswordSubmitted) {
|
| - password_manager::StubPasswordManagerClient client;
|
| - password_manager::StubPasswordManagerDriver driver;
|
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager(
|
| - new password_manager::PasswordFormManager(
|
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false));
|
| + CreateFormManager());
|
| controller()->OnPasswordSubmitted(test_form_manager.Pass());
|
| EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE,
|
| controller()->state());
|
| @@ -131,11 +194,11 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSubmitted) {
|
| }
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, PasswordSaved) {
|
| - password_manager::StubPasswordManagerClient client;
|
| - password_manager::StubPasswordManagerDriver driver;
|
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager(
|
| - new password_manager::PasswordFormManager(
|
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false));
|
| + CreateFormManager());
|
| + test_form_manager->ProvisionallySave(
|
| + test_local_form(),
|
| + password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES);
|
| controller()->OnPasswordSubmitted(test_form_manager.Pass());
|
|
|
| ManagePasswordsIconMock mock;
|
| @@ -146,11 +209,11 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSaved) {
|
| }
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, PasswordBlacklisted) {
|
| - password_manager::StubPasswordManagerClient client;
|
| - password_manager::StubPasswordManagerDriver driver;
|
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager(
|
| - new password_manager::PasswordFormManager(
|
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false));
|
| + CreateFormManager());
|
| + test_form_manager->ProvisionallySave(
|
| + test_local_form(),
|
| + password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES);
|
| controller()->OnPasswordSubmitted(test_form_manager.Pass());
|
|
|
| ManagePasswordsIconMock mock;
|
| @@ -161,11 +224,8 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordBlacklisted) {
|
| }
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, QuickNavigations) {
|
| - password_manager::StubPasswordManagerClient client;
|
| - password_manager::StubPasswordManagerDriver driver;
|
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager(
|
| - new password_manager::PasswordFormManager(
|
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false));
|
| + CreateFormManager());
|
| controller()->OnPasswordSubmitted(test_form_manager.Pass());
|
| ManagePasswordsIconMock mock;
|
| controller()->UpdateIconAndBubbleState(&mock);
|
| @@ -187,11 +247,8 @@ TEST_F(ManagePasswordsUIControllerTest, QuickNavigations) {
|
| }
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, SlowNavigations) {
|
| - password_manager::StubPasswordManagerClient client;
|
| - password_manager::StubPasswordManagerDriver driver;
|
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager(
|
| - new password_manager::PasswordFormManager(
|
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false));
|
| + CreateFormManager());
|
| controller()->OnPasswordSubmitted(test_form_manager.Pass());
|
| ManagePasswordsIconMock mock;
|
| controller()->UpdateIconAndBubbleState(&mock);
|
| @@ -214,11 +271,8 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedToNonWebbyURL) {
|
| content::WebContentsTester::For(web_contents())
|
| ->NavigateAndCommit(GURL("chrome://sign-in"));
|
|
|
| - password_manager::StubPasswordManagerClient client;
|
| - password_manager::StubPasswordManagerDriver driver;
|
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager(
|
| - new password_manager::PasswordFormManager(
|
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false));
|
| + CreateFormManager());
|
| controller()->OnPasswordSubmitted(test_form_manager.Pass());
|
| EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state());
|
| EXPECT_FALSE(controller()->PasswordPendingUserDecision());
|
| @@ -235,7 +289,7 @@ TEST_F(ManagePasswordsUIControllerTest, PasswordSubmittedToNonWebbyURL) {
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, BlacklistBlockedAutofill) {
|
| test_local_form().blacklisted_by_user = true;
|
| - base::string16 kTestUsername = base::ASCIIToUTF16("test_username");
|
| + base::string16 kTestUsername = test_local_form().username_value;
|
| autofill::PasswordFormMap map;
|
| map[kTestUsername] = &test_local_form();
|
| controller()->OnBlacklistBlockedAutofill(map);
|
| @@ -243,12 +297,11 @@ TEST_F(ManagePasswordsUIControllerTest, BlacklistBlockedAutofill) {
|
| EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, controller()->state());
|
| EXPECT_FALSE(controller()->PasswordPendingUserDecision());
|
| EXPECT_EQ(test_local_form().origin, controller()->origin());
|
| - EXPECT_EQ(1u, controller()->best_matches().size());
|
| - ASSERT_EQ(1u, controller()->best_matches().count(kTestUsername));
|
| + ASSERT_EQ(1u, controller()->GetCurrentForms().size());
|
| + EXPECT_EQ(kTestUsername, controller()->GetCurrentForms()[0]->username_value);
|
|
|
| // Controller should store a separate copy of the form as it doesn't own it.
|
| - EXPECT_NE(&test_local_form(),
|
| - controller()->best_matches().find(kTestUsername)->second);
|
| + EXPECT_NE(&test_local_form(), controller()->GetCurrentForms()[0]);
|
|
|
| ManagePasswordsIconMock mock;
|
| controller()->UpdateIconAndBubbleState(&mock);
|
| @@ -259,6 +312,7 @@ TEST_F(ManagePasswordsUIControllerTest, ClickedUnblacklist) {
|
| base::string16 kTestUsername = base::ASCIIToUTF16("test_username");
|
| autofill::PasswordFormMap map;
|
| map[kTestUsername] = &test_local_form();
|
| + test_local_form().blacklisted_by_user = true;
|
| controller()->OnBlacklistBlockedAutofill(map);
|
| controller()->UnblacklistSite();
|
|
|
| @@ -314,11 +368,8 @@ TEST_F(ManagePasswordsUIControllerTest, BlacklistedElsewhere) {
|
| }
|
|
|
| TEST_F(ManagePasswordsUIControllerTest, AutomaticPasswordSave) {
|
| - password_manager::StubPasswordManagerClient client;
|
| - password_manager::StubPasswordManagerDriver driver;
|
| scoped_ptr<password_manager::PasswordFormManager> test_form_manager(
|
| - new password_manager::PasswordFormManager(
|
| - NULL, &client, driver.AsWeakPtr(), test_local_form(), false));
|
| + CreateFormManager());
|
|
|
| controller()->OnAutomaticPasswordSave(test_form_manager.Pass());
|
| EXPECT_EQ(password_manager::ui::CONFIRMATION_STATE, controller()->state());
|
| @@ -342,7 +393,8 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocal) {
|
| controller()->state());
|
| EXPECT_FALSE(controller()->PasswordPendingUserDecision());
|
| EXPECT_EQ(origin, controller()->origin());
|
| - EXPECT_EQ(autofill::ConstPasswordFormMap(), controller()->best_matches());
|
| + EXPECT_THAT(controller()->GetCurrentForms(),
|
| + ElementsAre(Pointee(test_local_form())));
|
|
|
| ManagePasswordsIconMock mock;
|
| controller()->UpdateIconAndBubbleState(&mock);
|
| @@ -352,7 +404,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocal) {
|
| test_local_form(),
|
| password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL);
|
| controller()->OnBubbleHidden();
|
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state());
|
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state());
|
| ASSERT_TRUE(credential_info());
|
| EXPECT_EQ(test_local_form().username_value, credential_info()->id);
|
| EXPECT_EQ(test_local_form().password_value, credential_info()->password);
|
| @@ -375,7 +427,8 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocalButFederated) {
|
| controller()->state());
|
| EXPECT_FALSE(controller()->PasswordPendingUserDecision());
|
| EXPECT_EQ(origin, controller()->origin());
|
| - EXPECT_EQ(autofill::ConstPasswordFormMap(), controller()->best_matches());
|
| + EXPECT_THAT(controller()->GetCurrentForms(),
|
| + ElementsAre(Pointee(test_federated_form())));
|
|
|
| ManagePasswordsIconMock mock;
|
| controller()->UpdateIconAndBubbleState(&mock);
|
| @@ -385,7 +438,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialLocalButFederated) {
|
| test_federated_form(),
|
| password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL);
|
| controller()->OnBubbleHidden();
|
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state());
|
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state());
|
| ASSERT_TRUE(credential_info());
|
| EXPECT_EQ(test_federated_form().username_value, credential_info()->id);
|
| EXPECT_EQ(test_federated_form().federation_url,
|
| @@ -408,7 +461,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialFederated) {
|
| EXPECT_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE,
|
| controller()->state());
|
| EXPECT_FALSE(controller()->PasswordPendingUserDecision());
|
| - EXPECT_EQ(autofill::ConstPasswordFormMap(), controller()->best_matches());
|
| + EXPECT_EQ(0u, controller()->GetCurrentForms().size());
|
| EXPECT_EQ(origin, controller()->origin());
|
|
|
| ManagePasswordsIconMock mock;
|
| @@ -419,7 +472,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialFederated) {
|
| test_local_form(),
|
| password_manager::CredentialType::CREDENTIAL_TYPE_FEDERATED);
|
| controller()->OnBubbleHidden();
|
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state());
|
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state());
|
| ASSERT_TRUE(credential_info());
|
| EXPECT_EQ(test_local_form().username_value, credential_info()->id);
|
| EXPECT_TRUE(credential_info()->password.empty());
|
| @@ -443,7 +496,7 @@ TEST_F(ManagePasswordsUIControllerTest, ChooseCredentialCancel) {
|
| test_local_form(),
|
| password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY);
|
| controller()->OnBubbleHidden();
|
| - EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->state());
|
| + EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->state());
|
| ASSERT_TRUE(credential_info());
|
| EXPECT_TRUE(credential_info()->federation.is_empty());
|
| EXPECT_TRUE(credential_info()->password.empty());
|
| @@ -457,8 +510,8 @@ TEST_F(ManagePasswordsUIControllerTest, AutoSignin) {
|
| controller()->OnAutoSignin(local_credentials.Pass());
|
| EXPECT_EQ(password_manager::ui::AUTO_SIGNIN_STATE, controller()->state());
|
| EXPECT_EQ(test_local_form().origin, controller()->origin());
|
| - ASSERT_FALSE(controller()->local_credentials_forms().empty());
|
| - EXPECT_EQ(test_local_form(), *controller()->local_credentials_forms()[0]);
|
| + ASSERT_FALSE(controller()->GetCurrentForms().empty());
|
| + EXPECT_EQ(test_local_form(), *controller()->GetCurrentForms()[0]);
|
| ManagePasswordsIconMock mock;
|
| controller()->UpdateIconAndBubbleState(&mock);
|
| EXPECT_EQ(password_manager::ui::AUTO_SIGNIN_STATE, mock.state());
|
|
|