summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-21 23:51:33 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-21 23:51:33 +0000
commit75a0fc40f52f44c7c11324b840895c716cf1752e (patch)
tree38c0894249d7177cf5047ef3cbf9063d7ff187d4
parent63345aa81fdd15732b446502b401dd57cc4ce0ea (diff)
downloadchromium_src-75a0fc40f52f44c7c11324b840895c716cf1752e.zip
chromium_src-75a0fc40f52f44c7c11324b840895c716cf1752e.tar.gz
chromium_src-75a0fc40f52f44c7c11324b840895c716cf1752e.tar.bz2
AutoFill: Skip past empty strings when comparing form fields for filling.
Empty WebString != Empty string16! BUG=none TEST=FormManagerTest.FillFormEmptyName Review URL: http://codereview.chromium.org/1750004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45264 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/renderer/form_manager.cc6
-rw-r--r--chrome/renderer/form_manager_unittest.cc81
2 files changed, 87 insertions, 0 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc
index 144e23d..c66cd74 100644
--- a/chrome/renderer/form_manager.cc
+++ b/chrome/renderer/form_manager.cc
@@ -394,6 +394,12 @@ bool FormManager::FillForm(const FormData& form) {
for (size_t i = 0, j = 0;
i < form_element->control_elements.size() && j < form.fields.size();
++i, ++j) {
+ // Once again, empty WebString != empty string16, so we have to explicitly
+ // check for this case.
+ if (form_element->control_elements[i].nameForAutofill().length() == 0 &&
+ form.fields[j].name().empty())
+ continue;
+
// We assume that the intersection of the fields in
// |form_element->control_elements| and |form.fields| is ordered, but it's
// possible that one or the other sets may have more fields than the other,
diff --git a/chrome/renderer/form_manager_unittest.cc b/chrome/renderer/form_manager_unittest.cc
index 316822d..877cbb6f 100644
--- a/chrome/renderer/form_manager_unittest.cc
+++ b/chrome/renderer/form_manager_unittest.cc
@@ -1132,4 +1132,85 @@ TEST_F(FormManagerTest, FillFormFewerFormDataFields) {
fields[7]);
}
+TEST_F(FormManagerTest, FillFormEmptyName) {
+ LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">"
+ " <INPUT type=\"text\" id=\"firstname\"/>"
+ " <INPUT type=\"text\" id=\"lastname\"/>"
+ " <INPUT type=\"submit\" value=\"Send\"/>"
+ "</FORM>");
+
+ WebFrame* web_frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame);
+
+ FormManager form_manager;
+ form_manager.ExtractForms(web_frame);
+
+ // Verify that we have the form.
+ std::vector<FormData> forms;
+ form_manager.GetForms(FormManager::REQUIRE_NONE, &forms);
+ ASSERT_EQ(1U, forms.size());
+
+ // Get the input element we want to find.
+ WebElement element =
+ web_frame->document().getElementById(WebString::fromUTF8("firstname"));
+ WebInputElement input_element = element.toElement<WebInputElement>();
+
+ // Find the form that contains the input element.
+ FormData form;
+ EXPECT_TRUE(form_manager.FindFormWithFormControlElement(
+ input_element, FormManager::REQUIRE_NONE, &form));
+ EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
+ EXPECT_EQ(GURL(web_frame->url()), form.origin);
+ EXPECT_EQ(GURL("http://buh.com"), form.action);
+
+ const std::vector<FormField>& fields = form.fields;
+ ASSERT_EQ(3U, fields.size());
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("firstname"),
+ string16(),
+ ASCIIToUTF16("text")),
+ fields[0]);
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("lastname"),
+ string16(),
+ ASCIIToUTF16("text")),
+ fields[1]);
+ EXPECT_EQ(FormField(string16(),
+ string16(),
+ ASCIIToUTF16("Send"),
+ ASCIIToUTF16("submit")),
+ fields[2]);
+
+ // Fill the form.
+ form.fields[0].set_value(ASCIIToUTF16("Wyatt"));
+ form.fields[1].set_value(ASCIIToUTF16("Earp"));
+ EXPECT_TRUE(form_manager.FillForm(form));
+
+ // Find the newly-filled form that contains the input element.
+ FormData form2;
+ EXPECT_TRUE(form_manager.FindFormWithFormControlElement(
+ input_element, FormManager::REQUIRE_NONE, &form2));
+ EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name);
+ EXPECT_EQ(GURL(web_frame->url()), form2.origin);
+ EXPECT_EQ(GURL("http://buh.com"), form2.action);
+
+ const std::vector<FormField>& fields2 = form2.fields;
+ ASSERT_EQ(3U, fields2.size());
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("firstname"),
+ ASCIIToUTF16("Wyatt"),
+ ASCIIToUTF16("text")),
+ fields2[0]);
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("lastname"),
+ ASCIIToUTF16("Earp"),
+ ASCIIToUTF16("text")),
+ fields2[1]);
+ EXPECT_EQ(FormField(string16(),
+ string16(),
+ ASCIIToUTF16("Send"),
+ ASCIIToUTF16("submit")),
+ fields2[2]);
+}
+
} // namespace