diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-08 02:04:12 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-08 02:04:12 +0000 |
commit | 9a421428e238a6dbb9ea9c2f7fd2dde97385252b (patch) | |
tree | 5400fda26e4205cd5aca36079dc0db66d31f60a6 /chrome/renderer | |
parent | fee4f34561031e3411cf09e2ff3f0142d4ac00a6 (diff) | |
download | chromium_src-9a421428e238a6dbb9ea9c2f7fd2dde97385252b.zip chromium_src-9a421428e238a6dbb9ea9c2f7fd2dde97385252b.tar.gz chromium_src-9a421428e238a6dbb9ea9c2f7fd2dde97385252b.tar.bz2 |
AutoFill: Respect the maxlength attribute when filling input elements.
BUG=40274
TEST=FormManager.FillFormMaxLength
Review URL: http://codereview.chromium.org/1630005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43915 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/form_manager.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/form_manager_unittest.cc | 171 |
2 files changed, 175 insertions, 1 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc index 87cfcea..5f19c48 100644 --- a/chrome/renderer/form_manager.cc +++ b/chrome/renderer/form_manager.cc @@ -367,7 +367,10 @@ bool FormManager::FillForm(const FormData& form) { element->formControlType() != WebString::fromUTF8("submit")) { if (element->formControlType() == WebString::fromUTF8("text")) { WebInputElement input_element = element->toElement<WebInputElement>(); - input_element.setValue(form.fields[i].value()); + // If the maxlength attribute contains a negative value, maxLength() + // returns the default maxlength value. + input_element.setValue( + form.fields[i].value().substr(0, input_element.maxLength())); input_element.setAutofilled(true); } else if (element->formControlType() == WebString::fromUTF8("select-one")) { diff --git a/chrome/renderer/form_manager_unittest.cc b/chrome/renderer/form_manager_unittest.cc index 6d97d23..0142af4 100644 --- a/chrome/renderer/form_manager_unittest.cc +++ b/chrome/renderer/form_manager_unittest.cc @@ -743,4 +743,175 @@ TEST_F(FormManagerTest, InferredLabelsWithSameName) { fields[2]); } +TEST_F(FormManagerTest, FillFormMaxLength) { + LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" + " <INPUT type=\"text\" id=\"firstname\" maxlength=\"5\"/>" + " <INPUT type=\"text\" id=\"lastname\" maxlength=\"5\"/>" + " <INPUT type=\"submit\" name=\"reply-send\" 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(), + ASCIIToUTF16("reply-send"), + ASCIIToUTF16("Send"), + ASCIIToUTF16("submit")), + fields[2]); + + // Fill the form. + form.fields[0].set_value(ASCIIToUTF16("Brother")); + form.fields[1].set_value(ASCIIToUTF16("Jonathan")); + 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); + + // TODO(jhawkins): We don't actually compare the value of the field in + // FormField::operator==()! + const std::vector<FormField>& fields2 = form2.fields; + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("firstname"), + ASCIIToUTF16("Broth"), + ASCIIToUTF16("text")), + fields2[0]); + EXPECT_EQ(ASCIIToUTF16("Broth"), fields2[0].value()); + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("lastname"), + ASCIIToUTF16("Jonat"), + ASCIIToUTF16("text")), + fields2[1]); + EXPECT_EQ(ASCIIToUTF16("Jonat"), fields2[1].value()); + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("reply-send"), + ASCIIToUTF16("Send"), + ASCIIToUTF16("submit")), + fields2[2]); +} + +// This test uses negative values of the maxlength attribute for input elements. +// In this case, the maxlength of the input elements is set to the default +// maxlength (defined in WebKit.) +TEST_F(FormManagerTest, FillFormNegativeMaxLength) { + LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" + " <INPUT type=\"text\" id=\"firstname\" maxlength=\"-1\"/>" + " <INPUT type=\"text\" id=\"lastname\" maxlength=\"-10\"/>" + " <INPUT type=\"submit\" name=\"reply-send\" 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(), + ASCIIToUTF16("reply-send"), + ASCIIToUTF16("Send"), + ASCIIToUTF16("submit")), + fields[2]); + + // Fill the form. + form.fields[0].set_value(ASCIIToUTF16("Brother")); + form.fields[1].set_value(ASCIIToUTF16("Jonathan")); + 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); + + // TODO(jhawkins): We don't actually compare the value of the field in + // FormField::operator==()! + const std::vector<FormField>& fields2 = form2.fields; + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("firstname"), + ASCIIToUTF16("Brother"), + ASCIIToUTF16("text")), + fields2[0]); + EXPECT_EQ(ASCIIToUTF16("Brother"), fields2[0].value()); + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("lastname"), + ASCIIToUTF16("Jonathan"), + ASCIIToUTF16("text")), + fields2[1]); + EXPECT_EQ(ASCIIToUTF16("Jonathan"), fields2[1].value()); + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("reply-send"), + ASCIIToUTF16("Send"), + ASCIIToUTF16("submit")), + fields2[2]); +} + } // namespace |