summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-08 02:04:12 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-08 02:04:12 +0000
commit9a421428e238a6dbb9ea9c2f7fd2dde97385252b (patch)
tree5400fda26e4205cd5aca36079dc0db66d31f60a6 /chrome/renderer
parentfee4f34561031e3411cf09e2ff3f0142d4ac00a6 (diff)
downloadchromium_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.cc5
-rw-r--r--chrome/renderer/form_manager_unittest.cc171
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