| Index: components/password_manager/core/browser/password_manager_unittest.cc
|
| diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
|
| index 1ec170b7f73c8f55389143332a65ab96e5058cdd..a3cc8fc2cd5e185535fcbbe8030a4773d8b52119 100644
|
| --- a/components/password_manager/core/browser/password_manager_unittest.cc
|
| +++ b/components/password_manager/core/browser/password_manager_unittest.cc
|
| @@ -937,4 +937,104 @@ TEST_F(PasswordManagerTest, InPageNavigation) {
|
| manager()->OnInPageNavigation(&driver_, form);
|
| }
|
|
|
| +TEST_F(PasswordManagerTest, SavingSignupForms_NoHTMLMatch) {
|
| + // Signup forms don't require HTML attributes match in order to save.
|
| + // Verify that we prefer a better match (action + origin vs. origin).
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm expected_form;
|
| + PasswordForm form(MakeSimpleForm());
|
| + observed.push_back(form);
|
| + form.action = GURL("http://www.google.com/other/action");
|
| + observed.push_back(form);
|
| + expected_form = form;
|
| +
|
| + // The initial load.
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + // The initial layout.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + // Simulate either form changing or heuristics choosing other fields
|
| + // after the user has entered their information.
|
| + form.new_password_element = ASCIIToUTF16("new_password");
|
| + form.new_password_value = form.password_value;
|
| + form.password_element.clear();
|
| + form.password_value.clear();
|
| +
|
| + // Saved signup forms don't have password set.
|
| + expected_form.password_element.clear();
|
| +
|
| + manager()->ProvisionallySavePassword(form);
|
| +
|
| + scoped_ptr<PasswordFormManager> form_to_save;
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
|
| +
|
| + // Now the password manager waits for the navigation to complete.
|
| + observed.clear();
|
| + manager()->OnPasswordFormsParsed(&driver_,
|
| + observed); // The post-navigation load.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed,
|
| + true); // The post-navigation layout.
|
| +
|
| + ASSERT_TRUE(form_to_save);
|
| + EXPECT_CALL(*store_, AddLogin(FormMatches(expected_form)));
|
| +
|
| + // Simulate saving the form, as if the info bar was accepted.
|
| + form_to_save->Save();
|
| +}
|
| +
|
| +TEST_F(PasswordManagerTest, SavingSignupForms_NoActionMatch) {
|
| + // Signup forms don't require HTML attributes match in order to save.
|
| + // Verify that we prefer a better match (HTML attributes + origin vs. origin).
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm expected_form;
|
| + PasswordForm form(MakeSimpleForm());
|
| + observed.push_back(form);
|
| + // Change the submit element so we can track which of the two forms is
|
| + // chosen as a better match.
|
| + form.submit_element = ASCIIToUTF16("different_signin");
|
| + expected_form = form;
|
| + form.new_password_element = ASCIIToUTF16("new_password");
|
| + form.new_password_value = form.password_value;
|
| + form.password_element.clear();
|
| + form.password_value.clear();
|
| + observed.push_back(form);
|
| +
|
| + // The initial load.
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + // The initial layout.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + // Simulate form changing it's action. Update expectation as well since
|
| + // the action is copied during saving.
|
| + form.action = GURL("http://www.google.com/other/action");
|
| + expected_form.action = form.action;
|
| +
|
| + // Signup forms clear password element when saving.
|
| + expected_form.password_element.clear();
|
| +
|
| + manager()->ProvisionallySavePassword(form);
|
| +
|
| + scoped_ptr<PasswordFormManager> form_to_save;
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
|
| +
|
| + // Now the password manager waits for the navigation to complete.
|
| + observed.clear();
|
| + manager()->OnPasswordFormsParsed(&driver_,
|
| + observed); // The post-navigation load.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed,
|
| + true); // The post-navigation layout.
|
| +
|
| + ASSERT_TRUE(form_to_save);
|
| + EXPECT_CALL(*store_, AddLogin(FormMatches(expected_form)));
|
| +
|
| + // Simulate saving the form, as if the info bar was accepted.
|
| + form_to_save->Save();
|
| +}
|
| +
|
| } // namespace password_manager
|
|
|