Index: components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
diff --git a/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc b/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
index 771cdc7284ff8b2b5e7e56ba6855ca2d5e2046a1..fe2a3920e5fd2bdebec2afab1817a83c212222d9 100644 |
--- a/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
+++ b/components/autofill/content/renderer/password_form_conversion_utils_browsertest.cc |
@@ -110,6 +110,14 @@ class PasswordFormBuilder { |
return html_ + "</FORM>"; |
} |
+ // Appends a field of |type| without name or id attribute at the end of the |
+ // form. |
+ void AddAnonymousInputField(const char* type) { |
+ std::string type_attribute(type ? base::StringPrintf("type=\"%s\"", type) |
+ : ""); |
+ base::StringAppendF(&html_, "<INPUT %s/>", type_attribute.c_str()); |
+ } |
+ |
private: |
std::string html_; |
@@ -982,4 +990,68 @@ TEST_F(MAYBE_PasswordFormConversionUtilsTest, IsGaiaReauthFormIgnored) { |
GURL("https://google.com"), control_elements)); |
} |
+TEST_F(MAYBE_PasswordFormConversionUtilsTest, |
+ IdentifyingFieldsWithoutNameOrIdAttributes) { |
+ const char* kEmpty = nullptr; |
+ const struct { |
+ const char* username_fieldname; |
+ const char* password_fieldname; |
+ const char* new_password_fieldname; |
+ const char* expected_username_element; |
+ const char* expected_password_element; |
+ const char* expected_new_password_element; |
+ } test_cases[] = { |
+ {"username", "password", "new_password", "username", "password", |
+ "new_password"}, |
+ {"username", "password", kEmpty, "username", "password", |
+ "anonymous_new_password"}, |
+ {"username", kEmpty, kEmpty, "username", "anonymous_password", |
+ "anonymous_new_password"}, |
+ {kEmpty, kEmpty, kEmpty, "anonymous_username", "anonymous_password", |
+ "anonymous_new_password"}, |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(test_cases); ++i) { |
+ SCOPED_TRACE(testing::Message() |
+ << "Iteration " << i << ", expected_username " |
+ << test_cases[i].expected_username_element |
+ << ", expected_password" |
+ << test_cases[i].expected_password_element |
+ << ", expected_new_password " |
+ << test_cases[i].expected_new_password_element); |
+ |
+ PasswordFormBuilder builder(kTestFormActionURL); |
+ if (test_cases[i].username_fieldname == kEmpty) { |
+ builder.AddAnonymousInputField("text"); |
+ } else { |
+ builder.AddTextField(test_cases[i].username_fieldname, "", kEmpty); |
+ } |
+ |
+ if (test_cases[i].password_fieldname == kEmpty) { |
+ builder.AddAnonymousInputField("password"); |
+ } else { |
+ builder.AddPasswordField(test_cases[i].password_fieldname, "", kEmpty); |
+ } |
+ |
+ if (test_cases[i].new_password_fieldname == kEmpty) { |
+ builder.AddAnonymousInputField("password"); |
+ } else { |
+ builder.AddPasswordField(test_cases[i].new_password_fieldname, "", |
+ kEmpty); |
+ } |
+ std::string html = builder.ProduceHTML(); |
+ |
+ scoped_ptr<PasswordForm> password_form; |
+ LoadHTMLAndConvertForm(html, &password_form, nullptr); |
+ EXPECT_TRUE(password_form); |
+ |
+ EXPECT_EQ(base::UTF8ToUTF16(test_cases[i].expected_username_element), |
+ password_form->username_element); |
+ EXPECT_EQ(base::UTF8ToUTF16(test_cases[i].expected_password_element), |
+ password_form->password_element); |
+ EXPECT_EQ(base::UTF8ToUTF16(test_cases[i].expected_new_password_element), |
+ password_form->new_password_element); |
+ } |
+} |
+ |
} // namespace autofill |