summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/autofill/form_field.cc6
-rw-r--r--chrome/browser/autofill/form_structure_unittest.cc118
2 files changed, 124 insertions, 0 deletions
diff --git a/chrome/browser/autofill/form_field.cc b/chrome/browser/autofill/form_field.cc
index 24b45ed..95b1e55 100644
--- a/chrome/browser/autofill/form_field.cc
+++ b/chrome/browser/autofill/form_field.cc
@@ -207,6 +207,12 @@ bool FormField::ParseText(std::vector<AutoFillField*>::const_iterator* iter,
const string16& pattern,
AutoFillField** dest,
bool match_label_only) {
+ // Some forms have one or more hidden fields before each visible input; skip
+ // past these.
+ while (**iter && LowerCaseEqualsASCII((**iter)->form_control_type(),
+ kControlTypeHidden))
+ (*iter)++;
+
AutoFillField* field = **iter;
if (!field)
return false;
diff --git a/chrome/browser/autofill/form_structure_unittest.cc b/chrome/browser/autofill/form_structure_unittest.cc
index f9f808a..73317a3 100644
--- a/chrome/browser/autofill/form_structure_unittest.cc
+++ b/chrome/browser/autofill/form_structure_unittest.cc
@@ -319,6 +319,124 @@ TEST(FormStructureTest, HeuristicsContactInfo) {
EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(8)->heuristic_type());
}
+TEST(FormStructureTest, HeuristicsHiddenFields) {
+ scoped_ptr<FormStructure> form_structure;
+ FormData form;
+
+ form.method = ASCIIToUTF16("post");
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"),
+ ASCIIToUTF16("firstname"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden1"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
+ ASCIIToUTF16("lastname"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden2"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("EMail"),
+ ASCIIToUTF16("email"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden3"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Phone"),
+ ASCIIToUTF16("phone"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden4"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Fax"),
+ ASCIIToUTF16("fax"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden5"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
+ ASCIIToUTF16("address"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden6"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("City"),
+ ASCIIToUTF16("city"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden7"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Zip code"),
+ ASCIIToUTF16("zipcode"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("hidden8"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0));
+ form.fields.push_back(webkit_glue::FormField(string16(),
+ ASCIIToUTF16("Submit"),
+ string16(),
+ ASCIIToUTF16("submit"),
+ 0));
+ form_structure.reset(new FormStructure(form));
+ EXPECT_TRUE(form_structure->IsAutoFillable());
+
+ // Expect the correct number of fields.
+ ASSERT_EQ(17U, form_structure->field_count());
+ ASSERT_EQ(8U, form_structure->autofill_count());
+
+ // First name.
+ EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
+ // Last name.
+ EXPECT_EQ(NAME_LAST, form_structure->field(2)->heuristic_type());
+ // Email.
+ EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(4)->heuristic_type());
+ // Phone.
+ EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
+ form_structure->field(6)->heuristic_type());
+ // Fax.
+ EXPECT_EQ(PHONE_FAX_WHOLE_NUMBER, form_structure->field(8)->heuristic_type());
+ // Address.
+ EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(10)->heuristic_type());
+ // City.
+ EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(12)->heuristic_type());
+ // Zip.
+ EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(14)->heuristic_type());
+ // Submit.
+ EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(16)->heuristic_type());
+}
+
TEST(FormStructureTest, HeuristicsSample8) {
scoped_ptr<FormStructure> form_structure;
FormData form;