diff options
-rw-r--r-- | chrome/renderer/form_manager.cc | 6 | ||||
-rw-r--r-- | chrome/renderer/form_manager_unittest.cc | 81 |
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 |