summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-04 08:38:33 +0000
committerisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-04 08:38:33 +0000
commitcdf047a47971aa5695cc730ca52695978a6d87d6 (patch)
treeff56d893c725058e1f84edf1f0cfb554476c8af3
parent597386eef934e4d06dd3b15261bf066c06da5485 (diff)
downloadchromium_src-cdf047a47971aa5695cc730ca52695978a6d87d6.zip
chromium_src-cdf047a47971aa5695cc730ca52695978a6d87d6.tar.gz
chromium_src-cdf047a47971aa5695cc730ca52695978a6d87d6.tar.bz2
Only cache <input type="text"> and <select> elements for autofill.
BUG=none TEST=none Review URL: http://codereview.chromium.org/6359019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@73783 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/autofill/autofill_manager_unittest.cc35
-rw-r--r--chrome/browser/autofill/form_field.cc30
-rw-r--r--chrome/browser/autofill/form_structure.cc19
-rw-r--r--chrome/browser/autofill/form_structure_unittest.cc332
-rw-r--r--chrome/renderer/autofill/form_manager.cc66
-rw-r--r--chrome/renderer/autofill/form_manager_browsertest.cc2031
-rw-r--r--chrome/renderer/render_view_browsertest.cc17
7 files changed, 956 insertions, 1574 deletions
diff --git a/chrome/browser/autofill/autofill_manager_unittest.cc b/chrome/browser/autofill/autofill_manager_unittest.cc
index c010ae55..d22f0fd 100644
--- a/chrome/browser/autofill/autofill_manager_unittest.cc
+++ b/chrome/browser/autofill/autofill_manager_unittest.cc
@@ -505,10 +505,6 @@ class AutoFillManagerTest : public RenderViewHostTestHarness {
autofill_manager_->OnFormsSeen(forms);
}
- void FormSubmitted(const webkit_glue::FormData& form) {
- autofill_manager_->OnFormSubmitted(form);
- }
-
void FillAutoFillFormData(int query_id,
const webkit_glue::FormData& form,
const webkit_glue::FormField& field,
@@ -1742,37 +1738,6 @@ TEST_F(AutoFillManagerTest, FormChangesAddField) {
ExpectFilledAddressFormElvis(page_id, results, kDefaultPageID, false);
}
-TEST_F(AutoFillManagerTest, HiddenFields) {
- FormData form;
- form.name = ASCIIToUTF16("MyForm");
- form.method = ASCIIToUTF16("POST");
- form.origin = GURL("http://myform.com/form.html");
- form.action = GURL("http://myform.com/submit.html");
- form.user_submitted = true;
-
- FormField field;
- autofill_test::CreateTestFormField(
- "E-mail", "one", "one", "hidden", &field);
- form.fields.push_back(field);
- autofill_test::CreateTestFormField(
- "E-mail", "two", "two", "hidden", &field);
- form.fields.push_back(field);
- autofill_test::CreateTestFormField(
- "E-mail", "three", "three", "hidden", &field);
- form.fields.push_back(field);
-
- // Set up our form data.
- std::vector<FormData> forms;
- forms.push_back(form);
- FormsSeen(forms);
-
- // Submit the form.
- FormSubmitted(form);
-
- // TODO(jhawkins): We can't use the InfoBar anymore to determine if we saved
- // fields. Need to query the PDM.
-}
-
// Checks that resetting the auxiliary profile enabled preference does the right
// thing on all platforms.
TEST_F(AutoFillManagerTest, AuxiliaryProfilesReset) {
diff --git a/chrome/browser/autofill/form_field.cc b/chrome/browser/autofill/form_field.cc
index b6aa754..f364af0 100644
--- a/chrome/browser/autofill/form_field.cc
+++ b/chrome/browser/autofill/form_field.cc
@@ -64,19 +64,6 @@ const char kEcmlCardExpireDay[] = "ecom_payment_card_expdate_day";
const char kEcmlCardExpireMonth[] = "ecom_payment_card_expdate_month";
const char kEcmlCardExpireYear[] = "ecom_payment_card_expdate_year";
-namespace {
-
-// The name of the hidden form control element.
-const char* const kControlTypeHidden = "hidden";
-
-// The name of the radio form control element.
-const char* const kControlTypeRadio = "radio";
-
-// The name of the checkbox form control element.
-const char* const kControlTypeCheckBox = "checkbox";
-
-} // namespace
-
class EmailField : public FormField {
public:
virtual bool GetFieldInfo(FieldTypeMap* field_type_map) const {
@@ -213,12 +200,6 @@ 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;
@@ -289,17 +270,6 @@ FormFieldSet::FormFieldSet(FormStructure* fields) {
// Parse fields.
std::vector<AutoFillField*>::const_iterator field = fields->begin();
while (field != fields->end() && *field != NULL) {
- // Don't parse hidden fields or radio or checkbox controls.
- if (LowerCaseEqualsASCII((*field)->form_control_type(),
- kControlTypeHidden) ||
- LowerCaseEqualsASCII((*field)->form_control_type(),
- kControlTypeRadio) ||
- LowerCaseEqualsASCII((*field)->form_control_type(),
- kControlTypeCheckBox)) {
- field++;
- continue;
- }
-
FormField* form_field = FormField::ParseFormField(&field, is_ecml);
if (!form_field) {
field++;
diff --git a/chrome/browser/autofill/form_structure.cc b/chrome/browser/autofill/form_structure.cc
index 46d8ed3..0805241 100644
--- a/chrome/browser/autofill/form_structure.cc
+++ b/chrome/browser/autofill/form_structure.cc
@@ -38,10 +38,6 @@ const char kXMLElementAutoFillUpload[] = "autofillupload";
const char kXMLElementForm[] = "form";
const char kXMLElementField[] = "field";
-// The list of form control types we handle.
-const char kControlTypeSelect[] = "select-one";
-const char kControlTypeText[] = "text";
-
// The number of fillable fields necessary for a form to be fillable.
const size_t kRequiredFillableFields = 3;
@@ -59,17 +55,10 @@ FormStructure::FormStructure(const FormData& form)
std::vector<webkit_glue::FormField>::const_iterator field;
for (field = form.fields.begin();
field != form.fields.end(); field++) {
- // We currently only handle text and select fields; however, we need to
- // store all fields in order to match the fields stored in the FormManager.
- // We don't append other field types to the form signature though in order
- // to match the form signature of the AutoFill servers.
- if (LowerCaseEqualsASCII(field->form_control_type(), kControlTypeText) ||
- LowerCaseEqualsASCII(field->form_control_type(), kControlTypeSelect)) {
- // Add all supported form fields (including with empty names) to
- // signature. This is a requirement for AutoFill servers.
- form_signature_field_names_.append("&");
- form_signature_field_names_.append(UTF16ToUTF8(field->name()));
- }
+ // Add all supported form fields (including with empty names) to the
+ // signature. This is a requirement for AutoFill servers.
+ form_signature_field_names_.append("&");
+ form_signature_field_names_.append(UTF16ToUTF8(field->name()));
// Generate a unique name for this field by appending a counter to the name.
string16 unique_name = field->name() +
diff --git a/chrome/browser/autofill/form_structure_unittest.cc b/chrome/browser/autofill/form_structure_unittest.cc
index 8532b21..bd3056a 100644
--- a/chrome/browser/autofill/form_structure_unittest.cc
+++ b/chrome/browser/autofill/form_structure_unittest.cc
@@ -359,141 +359,6 @@ 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,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden1"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
- ASCIIToUTF16("lastname"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden2"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("EMail"),
- ASCIIToUTF16("email"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden3"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Phone"),
- ASCIIToUTF16("phone"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden4"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Fax"),
- ASCIIToUTF16("fax"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden5"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
- ASCIIToUTF16("address"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden6"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("City"),
- ASCIIToUTF16("city"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden7"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Zip code"),
- ASCIIToUTF16("zipcode"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("hidden8"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("Submit"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false));
- form_structure.reset(new FormStructure(form));
- EXPECT_TRUE(form_structure->IsAutoFillable(true));
-
- // 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;
@@ -1281,100 +1146,6 @@ TEST(FormStructureTest, ThreePartPhoneNumber) {
EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type());
}
-TEST(FormStructureTest, MatchSpecificInputTypes) {
- 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,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
- ASCIIToUTF16("lastname"),
- string16(),
- ASCIIToUTF16("text"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("EMail"),
- ASCIIToUTF16("email"),
- string16(),
- ASCIIToUTF16("email"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Phone"),
- ASCIIToUTF16("phone"),
- string16(),
- ASCIIToUTF16("number"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Country"),
- ASCIIToUTF16("country"),
- string16(),
- ASCIIToUTF16("select-one"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Fax"),
- ASCIIToUTF16("fax"),
- string16(),
- ASCIIToUTF16("tel"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
- ASCIIToUTF16("address"),
- string16(),
- ASCIIToUTF16("radio"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("City"),
- ASCIIToUTF16("city"),
- string16(),
- ASCIIToUTF16("checkbox"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("State"),
- ASCIIToUTF16("state"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false));
- form.fields.push_back(webkit_glue::FormField(string16(),
- ASCIIToUTF16("Submit"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false));
- form_structure.reset(new FormStructure(form));
- EXPECT_TRUE(form_structure->IsAutoFillable(true));
-
- // Expect the correct number of fields.
- ASSERT_EQ(10U, form_structure->field_count());
- ASSERT_EQ(6U, 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(1)->heuristic_type());
- // Email.
- EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
- // Phone.
- EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
- form_structure->field(3)->heuristic_type());
- // Country.
- EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(4)->heuristic_type());
- // Fax.
- EXPECT_EQ(PHONE_FAX_WHOLE_NUMBER, form_structure->field(5)->heuristic_type());
- // Address. Invalid input type.
- EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type());
- // City. Invalid input type.
- EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type());
- // State. Invalid input type.
- EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(8)->heuristic_type());
- // Submit. Invalid input type.
- EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(9)->heuristic_type());
-}
-
TEST(FormStructureTest, HeuristicsInfernoCC) {
scoped_ptr<FormStructure> form_structure;
FormData form;
@@ -1665,42 +1436,41 @@ TEST(FormStructureTest, EncodeUploadRequest) {
false));
possible_field_types.push_back(FieldTypeSet());
possible_field_types.back().insert(PHONE_FAX_WHOLE_NUMBER);
- form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
- ASCIIToUTF16("address"),
- string16(),
- ASCIIToUTF16("radio"),
- 0,
- false));
- possible_field_types.push_back(FieldTypeSet());
- possible_field_types.back().insert(ADDRESS_HOME_LINE1);
form_structure.reset(new FormStructure(form));
- std::string encoded_xml;
+
ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
for (size_t i = 0; i < form_structure->field_count(); ++i)
form_structure->set_possible_types(i, possible_field_types[i]);
+
+ std::string encoded_xml;
EXPECT_TRUE(form_structure->EncodeUploadRequest(false, &encoded_xml));
- EXPECT_EQ(encoded_xml,
- "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?><autofillupload "
- "clientversion=\"6.1.1715.1442/en (GGLL)\" formsignature=\""
- "8269229441054798720\" autofillused=\"false\" datapresent=\"1442008208\">"
- "<field signature=\"3763331450\" autofilltype=\"3\"/><field signature=\""
- "3494530716\" autofilltype=\"5\"/><field signature=\"1029417091\" "
- "autofilltype=\"9\"/><field signature=\"466116101\" autofilltype="
- "\"14\"/><field signature=\"2799270304\" autofilltype=\"36\"/><field "
- "signature=\"1876771436\" autofilltype=\"24\"/><field signature="
- "\"263446779\" autofilltype=\"30\"/></autofillupload>");
+ EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
+ "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
+ "formsignature=\"7641728017676399335\" autofillused=\"false\" "
+ "datapresent=\"1442008008\">"
+ "<field signature=\"3763331450\" autofilltype=\"3\"/>"
+ "<field signature=\"3494530716\" autofilltype=\"5\"/>"
+ "<field signature=\"1029417091\" autofilltype=\"9\"/>"
+ "<field signature=\"466116101\" autofilltype=\"14\"/>"
+ "<field signature=\"2799270304\" autofilltype=\"36\"/>"
+ "<field signature=\"1876771436\" autofilltype=\"24\"/>"
+ "</autofillupload>",
+ encoded_xml);
EXPECT_TRUE(form_structure->EncodeUploadRequest(true, &encoded_xml));
- EXPECT_EQ(encoded_xml,
- "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?><autofillupload "
- "clientversion=\"6.1.1715.1442/en (GGLL)\" formsignature=\""
- "8269229441054798720\" autofillused=\"true\" datapresent=\"1442008208\">"
- "<field signature=\"3763331450\" autofilltype=\"3\"/><field signature=\""
- "3494530716\" autofilltype=\"5\"/><field signature=\"1029417091\" "
- "autofilltype=\"9\"/><field signature=\"466116101\" autofilltype="
- "\"14\"/><field signature=\"2799270304\" autofilltype=\"36\"/><field "
- "signature=\"1876771436\" autofilltype=\"24\"/><field signature="
- "\"263446779\" autofilltype=\"30\"/></autofillupload>");
- // Add 4 address fields - this should be still a valid form.
+ EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
+ "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
+ "formsignature=\"7641728017676399335\" autofillused=\"true\" "
+ "datapresent=\"1442008008\">"
+ "<field signature=\"3763331450\" autofilltype=\"3\"/>"
+ "<field signature=\"3494530716\" autofilltype=\"5\"/>"
+ "<field signature=\"1029417091\" autofilltype=\"9\"/>"
+ "<field signature=\"466116101\" autofilltype=\"14\"/>"
+ "<field signature=\"2799270304\" autofilltype=\"36\"/>"
+ "<field signature=\"1876771436\" autofilltype=\"24\"/>"
+ "</autofillupload>",
+ encoded_xml);
+
+ // Add 2 address fields - this should be still a valid form.
for (size_t i = 0; i < 2; ++i) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
ASCIIToUTF16("address"),
@@ -1719,26 +1489,28 @@ TEST(FormStructureTest, EncodeUploadRequest) {
for (size_t i = 0; i < form_structure->field_count(); ++i)
form_structure->set_possible_types(i, possible_field_types[i]);
EXPECT_TRUE(form_structure->EncodeUploadRequest(false, &encoded_xml));
- EXPECT_EQ(encoded_xml,
- "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?><autofillupload "
- "clientversion=\"6.1.1715.1442/en (GGLL)\" formsignature=\""
- "9124126510289951497\" autofillused=\"false\" datapresent=\"144200830e\">"
- "<field signature=\"3763331450\" autofilltype=\"3\"/><field signature=\""
- "3494530716\" autofilltype=\"5\"/><field signature=\"1029417091\" "
- "autofilltype=\"9\"/><field signature=\"466116101\" autofilltype=\"14\"/>"
- "<field signature=\"2799270304\" autofilltype=\"36\"/><field signature=\""
- "1876771436\" autofilltype=\"24\"/><field signature=\"263446779\" "
- "autofilltype=\"30\"/>"
- "<field signature=\"509334676\" autofilltype=\"30\"/>"
- "<field signature=\"509334676\" autofilltype=\"31\"/>"
- "<field signature=\"509334676\" autofilltype=\"37\"/>"
- "<field signature=\"509334676\" autofilltype=\"38\"/>"
- "<field signature=\"509334676\" autofilltype=\"30\"/>"
- "<field signature=\"509334676\" autofilltype=\"31\"/>"
- "<field signature=\"509334676\" autofilltype=\"37\"/>"
- "<field signature=\"509334676\" autofilltype=\"38\"/>"
- "</autofillupload>");
- // Add 50 address fields - now the form is invalid.
+ EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
+ "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
+ "formsignature=\"12226592129574322128\" autofillused=\"false\" "
+ "datapresent=\"144200830e\">"
+ "<field signature=\"3763331450\" autofilltype=\"3\"/>"
+ "<field signature=\"3494530716\" autofilltype=\"5\"/>"
+ "<field signature=\"1029417091\" autofilltype=\"9\"/>"
+ "<field signature=\"466116101\" autofilltype=\"14\"/>"
+ "<field signature=\"2799270304\" autofilltype=\"36\"/>"
+ "<field signature=\"1876771436\" autofilltype=\"24\"/>"
+ "<field signature=\"509334676\" autofilltype=\"30\"/>"
+ "<field signature=\"509334676\" autofilltype=\"31\"/>"
+ "<field signature=\"509334676\" autofilltype=\"37\"/>"
+ "<field signature=\"509334676\" autofilltype=\"38\"/>"
+ "<field signature=\"509334676\" autofilltype=\"30\"/>"
+ "<field signature=\"509334676\" autofilltype=\"31\"/>"
+ "<field signature=\"509334676\" autofilltype=\"37\"/>"
+ "<field signature=\"509334676\" autofilltype=\"38\"/>"
+ "</autofillupload>",
+ encoded_xml);
+
+ // Add 50 address fields - now the form is invalid, as it has too many fields.
for (size_t i = 0; i < 50; ++i) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
ASCIIToUTF16("address"),
@@ -1757,7 +1529,7 @@ TEST(FormStructureTest, EncodeUploadRequest) {
for (size_t i = 0; i < form_structure->field_count(); ++i)
form_structure->set_possible_types(i, possible_field_types[i]);
EXPECT_FALSE(form_structure->EncodeUploadRequest(false, &encoded_xml));
- EXPECT_EQ(encoded_xml, "");
+ EXPECT_EQ("", encoded_xml);
}
TEST(FormStructureTest, CheckDataPresence) {
diff --git a/chrome/renderer/autofill/form_manager.cc b/chrome/renderer/autofill/form_manager.cc
index 3e2b482..901fdbb 100644
--- a/chrome/renderer/autofill/form_manager.cc
+++ b/chrome/renderer/autofill/form_manager.cc
@@ -69,6 +69,11 @@ bool IsOptionElement(const WebElement& element) {
return element.hasTagName("option");
}
+bool IsAutoFillableElement(const WebFormControlElement& element) {
+ const WebInputElement* input_element = toWebInputElement(&element);
+ return IsTextInput(input_element) || IsSelectElement(element);
+}
+
// This is a helper function for the FindChildText() function (see below).
// Search depth is limited with the |depth| parameter.
string16 FindChildTextInner(const WebNode& node, int depth) {
@@ -268,10 +273,6 @@ string16 InferLabelFromDefinitionList(const WebFormControlElement& element) {
// Infers corresponding label for |element| from surrounding context in the DOM.
// Contents of preceding <p> tag or preceding text element found in the form.
string16 InferLabelForElement(const WebFormControlElement& element) {
- // Don't scrape labels for hidden elements.
- if (element.formControlType() == WebString::fromUTF8("hidden"))
- return string16();
-
string16 inferred_label = InferLabelFromPrevious(element);
// If we didn't find a label, check for table cell case.
@@ -289,21 +290,18 @@ string16 InferLabelForElement(const WebFormControlElement& element) {
return inferred_label;
}
-void GetOptionStringsFromElement(const WebFormControlElement& element,
+void GetOptionStringsFromElement(const WebSelectElement& select_element,
std::vector<string16>* option_strings) {
- DCHECK(!element.isNull());
+ DCHECK(!select_element.isNull());
DCHECK(option_strings);
+
option_strings->clear();
- if (IsSelectElement(element)) {
- // For <select> elements, copy the option strings.
- const WebSelectElement select_element = element.toConst<WebSelectElement>();
- WebVector<WebElement> list_items = select_element.listItems();
- option_strings->reserve(list_items.size());
- for (size_t i = 0; i < list_items.size(); ++i) {
- if (IsOptionElement(list_items[i])) {
- option_strings->push_back(
- list_items[i].toConst<WebOptionElement>().value());
- }
+ WebVector<WebElement> list_items = select_element.listItems();
+ option_strings->reserve(list_items.size());
+ for (size_t i = 0; i < list_items.size(); ++i) {
+ if (IsOptionElement(list_items[i])) {
+ option_strings->push_back(
+ list_items[i].toConst<WebOptionElement>().value());
}
}
}
@@ -331,6 +329,7 @@ void FormManager::WebFormControlElementToFormField(
ExtractMask extract_mask,
FormField* field) {
DCHECK(field);
+ DCHECK(!element.isNull());
// The label is not officially part of a WebFormControlElement; however, the
// labels for all form control elements are scraped from the DOM and set in
@@ -338,15 +337,19 @@ void FormManager::WebFormControlElementToFormField(
field->set_name(element.nameForAutofill());
field->set_form_control_type(element.formControlType());
+ if (!IsAutoFillableElement(element))
+ return;
+
const WebInputElement* input_element = toWebInputElement(&element);
if (IsTextInput(input_element)) {
- const WebInputElement& input_element = element.toConst<WebInputElement>();
- field->set_max_length(input_element.maxLength());
- field->set_autofilled(input_element.isAutofilled());
+ field->set_max_length(input_element->maxLength());
+ field->set_autofilled(input_element->isAutofilled());
} else if (extract_mask & EXTRACT_OPTIONS) {
// Set option strings on the field if available.
+ DCHECK(IsSelectElement(element));
+ const WebSelectElement select_element = element.toConst<WebSelectElement>();
std::vector<string16> option_strings;
- GetOptionStringsFromElement(element, &option_strings);
+ GetOptionStringsFromElement(select_element, &option_strings);
field->set_option_strings(option_strings);
}
@@ -354,10 +357,10 @@ void FormManager::WebFormControlElementToFormField(
return;
string16 value;
- if (IsTextInput(input_element) ||
- element.formControlType() == WebString::fromUTF8("hidden")) {
+ if (IsTextInput(input_element)) {
value = input_element->value();
- } else if (IsSelectElement(element)) {
+ } else {
+ DCHECK(IsSelectElement(element));
const WebSelectElement select_element = element.toConst<WebSelectElement>();
value = select_element.value();
@@ -389,8 +392,8 @@ void FormManager::WebFormControlElementToFormField(
// static
string16 FormManager::LabelForElement(const WebFormControlElement& element) {
- // Don't scrape labels for hidden elements.
- if (element.formControlType() == WebString::fromUTF8("hidden"))
+ // Don't scrape labels for elements we can't possibly autofill anyway.
+ if (!IsAutoFillableElement(element))
return string16();
WebNodeList labels = element.document().getElementsByTagName("label");
@@ -447,6 +450,9 @@ bool FormManager::WebFormElementToFormData(const WebFormElement& element,
for (size_t i = 0; i < control_elements.size(); ++i) {
const WebFormControlElement& control_element = control_elements[i];
+ if (!IsAutoFillableElement(control_element))
+ continue;
+
const WebInputElement* input_element = toWebInputElement(&control_element);
if (requirements & REQUIRE_AUTOCOMPLETE && IsTextInput(input_element) &&
!input_element->autoComplete())
@@ -536,6 +542,9 @@ void FormManager::ExtractForms(const WebFrame* frame) {
form_element->form_element.getFormControlElements(control_elements);
for (size_t j = 0; j < control_elements.size(); ++j) {
WebFormControlElement element = control_elements[j];
+ if (!IsAutoFillableElement(element))
+ continue;
+
form_element->control_elements.push_back(element);
// Save original values of <select> elements so we can restore them
@@ -671,7 +680,8 @@ bool FormManager::ClearFormWithNode(const WebNode& node) {
int length = input_element->value().length();
input_element->setSelectionRange(length, length);
}
- } else if (IsSelectElement(element)) {
+ } else {
+ DCHECK(IsSelectElement(element));
WebSelectElement select_element = element.to<WebSelectElement>();
select_element.setValue(form_element->control_values[i]);
}
@@ -875,7 +885,6 @@ void FormManager::FillFormField(WebFormControlElement* field,
WebInputElement* input_element = toWebInputElement(field);
if (IsTextInput(input_element)) {
-
// If the maxlength attribute contains a negative value, maxLength()
// returns the default maxlength value.
input_element->setValue(
@@ -885,7 +894,8 @@ void FormManager::FillFormField(WebFormControlElement* field,
int length = input_element->value().length();
input_element->setSelectionRange(length, length);
}
- } else if (IsSelectElement(*field)) {
+ } else {
+ DCHECK(IsSelectElement(*field));
WebSelectElement select_element = field->to<WebSelectElement>();
select_element.setValue(data->value());
}
diff --git a/chrome/renderer/autofill/form_manager_browsertest.cc b/chrome/renderer/autofill/form_manager_browsertest.cc
index d6243fa..3e7fc9f 100644
--- a/chrome/renderer/autofill/form_manager_browsertest.cc
+++ b/chrome/renderer/autofill/form_manager_browsertest.cc
@@ -2,6 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <vector>
+
+#include "base/string16.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/renderer/autofill/form_manager.h"
@@ -37,16 +40,310 @@ using webkit_glue::FormField;
namespace {
-typedef RenderViewTest FormManagerTest;
-
// TODO(isherman): Pull this as a named constant from WebKit
const int kDefaultMaxLength = 0x80000;
+} // namespace
+
+class FormManagerTest : public RenderViewTest {
+ public:
+ FormManagerTest() : RenderViewTest() {}
+ virtual ~FormManagerTest() {}
+
+ void ExpectLabels(const char* html,
+ const std::vector<string16>& labels,
+ const std::vector<string16>& names,
+ const std::vector<string16>& values) {
+ ASSERT_EQ(labels.size(), names.size());
+ ASSERT_EQ(labels.size(), values.size());
+
+ LoadHTML(html);
+
+ WebFrame* web_frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame);
+
+ FormManager form_manager;
+ form_manager.ExtractForms(web_frame);
+
+ std::vector<FormData> forms;
+ form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_AUTOCOMPLETE,
+ &forms);
+ ASSERT_EQ(1U, forms.size());
+
+ const FormData& form = forms[0];
+ EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
+ EXPECT_EQ(GURL(web_frame->url()), form.origin);
+ EXPECT_EQ(GURL("http://cnn.com"), form.action);
+
+ const std::vector<FormField>& fields = form.fields;
+ ASSERT_EQ(labels.size(), fields.size());
+ for (size_t i = 0; i < labels.size(); ++i) {
+ FormField expected = FormField(labels[i],
+ names[i],
+ values[i],
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
+ false);
+ EXPECT_TRUE(fields[i].StrictlyEqualsHack(expected))
+ << "Expected \"" << expected << "\", got \"" << fields[i] << "\"";
+ }
+ }
+
+ void ExpectJohnSmithLabels(const char* html) {
+ std::vector<string16> labels, names, values;
+
+ labels.push_back(ASCIIToUTF16("First name:"));
+ names.push_back(ASCIIToUTF16("firstname"));
+ values.push_back(ASCIIToUTF16("John"));
+
+ labels.push_back(ASCIIToUTF16("Last name:"));
+ names.push_back(ASCIIToUTF16("lastname"));
+ values.push_back(ASCIIToUTF16("Smith"));
+
+ labels.push_back(ASCIIToUTF16("Email:"));
+ names.push_back(ASCIIToUTF16("email"));
+ values.push_back(ASCIIToUTF16("john@example.com"));
+
+ ExpectLabels(html, labels, names, values);
+ }
+
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FormManagerTest);
+};
+
+// We should be able to extract a normal text field.
+TEST_F(FormManagerTest, WebFormControlElementToFormField) {
+ LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>");
+
+ WebFrame* frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
+
+ WebElement web_element = frame->document().getElementById("element");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormField result1;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_NONE,
+ &result1);
+ EXPECT_TRUE(result1.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ string16(),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
+ false)));
+ FormField result2;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result2);
+ EXPECT_TRUE(result2.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ ASCIIToUTF16("value"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
+ false)));
+}
+
+// We should be able to extract a text field with autocomplete="off".
+TEST_F(FormManagerTest, WebFormControlElementToFormFieldAutocompleteOff) {
+ LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\""
+ " autocomplete=\"off\"/>");
+
+ WebFrame* frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
+
+ WebElement web_element = frame->document().getElementById("element");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormField result;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ ASCIIToUTF16("value"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
+ false)));
+}
+
+// We should be able to extract a text field with maxlength specified.
+TEST_F(FormManagerTest, WebFormControlElementToFormFieldMaxLength) {
+ LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\""
+ " maxlength=\"5\"/>");
+
+ WebFrame* frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
+
+ WebElement web_element = frame->document().getElementById("element");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormField result;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ ASCIIToUTF16("value"),
+ ASCIIToUTF16("text"),
+ 5,
+ false)));
+}
+
+// We should be able to extract a text field that has been autofilled.
+TEST_F(FormManagerTest, WebFormControlElementToFormFieldAutofilled) {
+ LoadHTML("<INPUT type=\"text\" id=\"element\" value=\"value\"/>");
+
+ WebFrame* frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
+
+ WebElement web_element = frame->document().getElementById("element");
+ WebInputElement element = web_element.to<WebInputElement>();
+ element.setAutofilled(true);
+ FormField result;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ ASCIIToUTF16("value"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
+ true)));
+}
+
+// We should be able to extract a <select> field.
+TEST_F(FormManagerTest, WebFormControlElementToFormFieldSelect) {
+ LoadHTML("<SELECT id=\"element\"/>"
+ " <OPTION value=\"CA\">California</OPTION>"
+ " <OPTION value=\"TX\">Texas</OPTION>"
+ "</SELECT>");
+
+ WebFrame* frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
+
+ WebElement web_element = frame->document().getElementById("element");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormField result1;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result1);
+ EXPECT_TRUE(result1.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ ASCIIToUTF16("CA"),
+ ASCIIToUTF16("select-one"),
+ 0,
+ false)));
+ FormField result2;
+ FormManager::WebFormControlElementToFormField(
+ element,
+ static_cast<FormManager::ExtractMask>(FormManager::EXTRACT_VALUE |
+ FormManager::EXTRACT_OPTION_TEXT),
+ &result2);
+ EXPECT_TRUE(result2.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ ASCIIToUTF16("California"),
+ ASCIIToUTF16("select-one"),
+ 0,
+ false)));
+ FormField result3;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_OPTIONS,
+ &result3);
+ EXPECT_TRUE(result3.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("element"),
+ string16(),
+ ASCIIToUTF16("select-one"),
+ 0,
+ false)));
+ ASSERT_EQ(2U, result3.option_strings().size());
+ EXPECT_EQ(ASCIIToUTF16("CA"), result3.option_strings()[0]);
+ EXPECT_EQ(ASCIIToUTF16("TX"), result3.option_strings()[1]);
+}
+
+// We should be not extract the value for non-text and non-select fields.
+TEST_F(FormManagerTest, WebFormControlElementToFormFieldInvalidType) {
+ LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " <INPUT type=\"hidden\" id=\"hidden\" value=\"apple\"/>"
+ " <INPUT type=\"password\" id=\"password\" value=\"secret\"/>"
+ " <INPUT type=\"checkbox\" id=\"checkbox\" value=\"mail\"/>"
+ " <INPUT type=\"radio\" id=\"radio\" value=\"male\"/>"
+ " <INPUT type=\"submit\" id=\"submit\" value=\"Send\"/>"
+ "</FORM>");
+
+ WebFrame* frame = GetMainFrame();
+ ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
+
+ WebElement web_element = frame->document().getElementById("hidden");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormField result;
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("hidden"),
+ string16(),
+ ASCIIToUTF16("hidden"),
+ 0,
+ false)));
+
+ web_element = frame->document().getElementById("password");
+ element = web_element.to<WebFormControlElement>();
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("password"),
+ string16(),
+ ASCIIToUTF16("password"),
+ 0,
+ false)));
+
+ web_element = frame->document().getElementById("checkbox");
+ element = web_element.to<WebFormControlElement>();
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("checkbox"),
+ string16(),
+ ASCIIToUTF16("checkbox"),
+ 0,
+ false)));
+
+ web_element = frame->document().getElementById("radio");
+ element = web_element.to<WebFormControlElement>();
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("radio"),
+ string16(),
+ ASCIIToUTF16("radio"),
+ 0,
+ false)));
+
+ web_element = frame->document().getElementById("submit");
+ element = web_element.to<WebFormControlElement>();
+ FormManager::WebFormControlElementToFormField(element,
+ FormManager::EXTRACT_VALUE,
+ &result);
+ EXPECT_TRUE(result.StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("submit"),
+ string16(),
+ ASCIIToUTF16("submit"),
+ 0,
+ false)));
+}
+
TEST_F(FormManagerTest, WebFormElementToFormData) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <SELECT id=\"state\"/>"
+ " <OPTION value=\"CA\">California</OPTION>"
+ " <OPTION value=\"TX\">Texas</OPTION>"
+ " </SELECT>"
+ // The below inputs should be ignored
" <INPUT type=\"hidden\" id=\"notvisible\" value=\"apple\"/>"
+ " <INPUT type=\"password\" id=\"password\" value=\"secret\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -67,7 +364,7 @@ TEST_F(FormManagerTest, WebFormElementToFormData) {
EXPECT_EQ(GURL("http://cnn.com"), form.action);
const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(4U, fields.size());
+ ASSERT_EQ(3U, fields.size());
EXPECT_TRUE(fields[0].StrictlyEqualsHack(
FormField(string16(),
ASCIIToUTF16("firstname"),
@@ -84,16 +381,9 @@ TEST_F(FormManagerTest, WebFormElementToFormData) {
false)));
EXPECT_TRUE(fields[2].StrictlyEqualsHack(
FormField(string16(),
- ASCIIToUTF16("notvisible"),
- ASCIIToUTF16("apple"),
- ASCIIToUTF16("hidden"),
- 0,
- false)));
- EXPECT_TRUE(fields[3].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
+ ASCIIToUTF16("state"),
+ ASCIIToUTF16("CA"),
+ ASCIIToUTF16("select-one"),
0,
false)));
}
@@ -102,6 +392,7 @@ TEST_F(FormManagerTest, ExtractForms) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -137,10 +428,10 @@ TEST_F(FormManagerTest, ExtractForms) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("john@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
}
@@ -149,11 +440,13 @@ TEST_F(FormManagerTest, ExtractMultipleForms) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>"
"<FORM name=\"TestForm2\" action=\"http://zoo.com\" method=\"post\">"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"Jack\"/>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Adams\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"jack@example.com\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -190,10 +483,10 @@ TEST_F(FormManagerTest, ExtractMultipleForms) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("john@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
@@ -207,25 +500,44 @@ TEST_F(FormManagerTest, ExtractMultipleForms) {
ASSERT_EQ(3U, fields2.size());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
+ ASCIIToUTF16("Jack"),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
+ ASCIIToUTF16("Adams"),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
fields2[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("jack@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
- fields2[2]);
+ fields[2]);
+}
+
+// We should not extract a form if it has too few fillable fields.
+TEST_F(FormManagerTest, ExtractFormsTooFewFields) {
+ LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <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);
+
+ std::vector<FormData> forms;
+ form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
+ EXPECT_EQ(0U, forms.size());
}
TEST_F(FormManagerTest, GetFormsAutocomplete) {
@@ -234,6 +546,7 @@ TEST_F(FormManagerTest, GetFormsAutocomplete) {
" autocomplete=off>"
" <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -260,6 +573,7 @@ TEST_F(FormManagerTest, GetFormsAutocomplete) {
" autocomplete=off>"
" <INPUT type=\"text\" id=\"middlename\" value=\"Jack\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
" <INPUT type=\"submit\" name=\"reply\" value=\"Send\"/>"
"</FORM>");
@@ -296,10 +610,10 @@ TEST_F(FormManagerTest, GetFormsAutocomplete) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("john@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
}
@@ -310,6 +624,7 @@ TEST_F(FormManagerTest, GetFormsElementsEnabled) {
" <INPUT disabled type=\"text\" id=\"firstname\" value=\"John\"/>"
" <INPUT type=\"text\" id=\"middlename\" value=\"Jack\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"jack@example.com\"/>"
" <INPUT type=\"submit\" name=\"submit\" value=\"Send\"/>"
"</FORM>");
@@ -345,10 +660,10 @@ TEST_F(FormManagerTest, GetFormsElementsEnabled) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("submit"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("jack@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
}
@@ -357,6 +672,7 @@ TEST_F(FormManagerTest, FindForm) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -400,10 +716,10 @@ TEST_F(FormManagerTest, FindForm) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("john@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
}
@@ -443,7 +759,7 @@ TEST_F(FormManagerTest, FillForm) {
EXPECT_EQ(GURL("http://buh.com"), form.action);
const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(7U, fields.size());
+ ASSERT_EQ(5U, fields.size());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
string16(),
@@ -459,40 +775,26 @@ TEST_F(FormManagerTest, FillForm) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("imhidden"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false),
- fields[2]);
- EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("notempty"),
ASCIIToUTF16("Hi"),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields[3]);
+ fields[2]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("noautocomplete"),
string16(),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields[4]);
+ fields[3]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("notenabled"),
string16(),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields[5]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[6]);
+ fields[4]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Wyatt"));
@@ -500,7 +802,6 @@ TEST_F(FormManagerTest, FillForm) {
form.fields[2].set_value(ASCIIToUTF16("Alpha"));
form.fields[3].set_value(ASCIIToUTF16("Beta"));
form.fields[4].set_value(ASCIIToUTF16("Gamma"));
- form.fields[5].set_value(ASCIIToUTF16("Delta"));
EXPECT_TRUE(form_manager.FillForm(form, input_element));
// Verify the filled elements.
@@ -517,12 +818,6 @@ TEST_F(FormManagerTest, FillForm) {
EXPECT_TRUE(lastname.isAutofilled());
EXPECT_EQ(ASCIIToUTF16("Earp"), lastname.value());
- // Hidden fields are not filled.
- WebInputElement imhidden =
- document.getElementById("imhidden").to<WebInputElement>();
- EXPECT_FALSE(imhidden.isAutofilled());
- EXPECT_TRUE(imhidden.value().isEmpty());
-
// Non-empty fields are not filled.
WebInputElement notempty =
document.getElementById("notempty").to<WebInputElement>();
@@ -546,7 +841,6 @@ TEST_F(FormManagerTest, PreviewForm) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"firstname\"/>"
" <INPUT type=\"text\" id=\"lastname\"/>"
- " <INPUT type=\"hidden\" id=\"imhidden\"/>"
" <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>"
" <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>"
" <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>"
@@ -577,7 +871,7 @@ TEST_F(FormManagerTest, PreviewForm) {
EXPECT_EQ(GURL("http://buh.com"), form.action);
const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(7U, fields.size());
+ ASSERT_EQ(5U, fields.size());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
string16(),
@@ -593,40 +887,26 @@ TEST_F(FormManagerTest, PreviewForm) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("imhidden"),
- string16(),
- ASCIIToUTF16("hidden"),
- 0,
- false),
- fields[2]);
- EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("notempty"),
ASCIIToUTF16("Hi"),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields[3]);
+ fields[2]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("noautocomplete"),
string16(),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields[4]);
+ fields[3]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("notenabled"),
string16(),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields[5]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[6]);
+ fields[4]);
// Preview the form.
form.fields[0].set_value(ASCIIToUTF16("Wyatt"));
@@ -634,7 +914,6 @@ TEST_F(FormManagerTest, PreviewForm) {
form.fields[2].set_value(ASCIIToUTF16("Alpha"));
form.fields[3].set_value(ASCIIToUTF16("Beta"));
form.fields[4].set_value(ASCIIToUTF16("Gamma"));
- form.fields[5].set_value(ASCIIToUTF16("Delta"));
EXPECT_TRUE(form_manager.PreviewForm(form, input_element));
// Verify the previewed elements.
@@ -651,12 +930,6 @@ TEST_F(FormManagerTest, PreviewForm) {
EXPECT_TRUE(lastname.isAutofilled());
EXPECT_EQ(ASCIIToUTF16("Earp"), lastname.suggestedValue());
- // Hidden fields are not previewed.
- WebInputElement imhidden =
- document.getElementById("imhidden").to<WebInputElement>();
- EXPECT_FALSE(imhidden.isAutofilled());
- EXPECT_TRUE(imhidden.suggestedValue().isEmpty());
-
// Non-empty fields are not previewed.
WebInputElement notempty =
document.getElementById("notempty").to<WebInputElement>();
@@ -680,6 +953,7 @@ TEST_F(FormManagerTest, Reset) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@exmaple.com\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -702,101 +976,29 @@ TEST_F(FormManagerTest, Reset) {
}
TEST_F(FormManagerTest, Labels) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " <LABEL for=\"firstname\"> First name: </LABEL>"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " <LABEL for=\"lastname\"> Last name: </LABEL>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_TRUE(fields[0].StrictlyEqualsHack(
- FormField(ASCIIToUTF16("First name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false)));
- EXPECT_TRUE(fields[1].StrictlyEqualsHack(
- FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false)));
- EXPECT_TRUE(fields[2].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " <LABEL for=\"firstname\"> First name: </LABEL>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " <LABEL for=\"lastname\"> Last name: </LABEL>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <LABEL for=\"email\"> Email: </LABEL>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>");
}
TEST_F(FormManagerTest, LabelsWithSpans) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " <LABEL for=\"firstname\"><span>First name: </span></LABEL>"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " <LABEL for=\"lastname\"><span>Last name: </span></LABEL>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_TRUE(fields[0].StrictlyEqualsHack(
- FormField(ASCIIToUTF16("First name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false)));
- EXPECT_TRUE(fields[1].StrictlyEqualsHack(
- FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false)));
- EXPECT_TRUE(fields[2].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " <LABEL for=\"firstname\"><span>First name: </span></LABEL>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " <LABEL for=\"lastname\"><span>Last name: </span></LABEL>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <LABEL for=\"email\"><span>Email: </span></LABEL>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>");
}
// This test is different from FormManagerTest.Labels in that the label elements
@@ -806,848 +1008,435 @@ TEST_F(FormManagerTest, LabelsWithSpans) {
// however, current label parsing code will extract the text from the previous
// label element and apply it to the following input field.
TEST_F(FormManagerTest, InvalidLabels) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " <LABEL for=\"firstname\"> First name: </LABEL>"
- " <INPUT type=\"text\" name=\"firstname\" value=\"John\"/>"
- " <LABEL for=\"lastname\"> Last name: </LABEL>"
- " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_TRUE(fields[0].StrictlyEqualsHack(
- FormField(ASCIIToUTF16("First name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false)));
- EXPECT_TRUE(fields[1].StrictlyEqualsHack(
- FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false)));
- EXPECT_TRUE(fields[2].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " <LABEL for=\"firstname\"> First name: </LABEL>"
+ " <INPUT type=\"text\" name=\"firstname\" value=\"John\"/>"
+ " <LABEL for=\"lastname\"> Last name: </LABEL>"
+ " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\"/>"
+ " <LABEL for=\"email\"> Email: </LABEL>"
+ " <INPUT type=\"text\" name=\"email\" value=\"john@example.com\"/>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>");
}
-// This test has three form control elements, only one of which has a label
-// element associated with it. The first element is disabled because of the
+// This test has four form control elements, only one of which has a label
+// element associated with it. The second element is disabled because of the
// autocomplete=off attribute.
TEST_F(FormManagerTest, OneLabelElementFirstControlElementDisabled) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " First name:"
- " <INPUT type=\"text\" id=\"firstname\" autocomplete=\"off\"/>"
- " <LABEL for=\"middlename\">Middle name: </LABEL>"
- " <INPUT type=\"text\" id=\"middlename\"/>"
- " Last name:"
- " <INPUT type=\"text\" id=\"lastname\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(
- web_frame, FormManager::REQUIRE_AUTOCOMPLETE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("Middle name:"),
- ASCIIToUTF16("middlename"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
-}
-
-TEST_F(FormManagerTest, LabelsInferredFromText) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
" First name:"
" <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " Last name:"
+ " Middle name:"
+ " <INPUT type=\"text\" id=\"middlename\" value=\"Jack\""
+ " autocomplete=\"off\"/>"
+ " <LABEL for=\"lastname\">Last name: </LABEL>"
" <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " Email:"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
" <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
}
-TEST_F(FormManagerTest, LabelsInferredFromTextHidden) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " First name:"
- " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>"
- " Last name:"
- " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("hidden"),
- 0,
- false)));
- EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("hidden"),
- 0,
- false)));
- EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
+TEST_F(FormManagerTest, LabelsInferredFromText) {
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " First name:"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " Last name:"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " Email:"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>");
}
TEST_F(FormManagerTest, LabelsInferredFromParagraph) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " <P>First name:</P><INPUT type=\"text\" "
- " id=\"firstname\" value=\"John\"/>"
- " <P>Last name:</P>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " <P>First name:</P><INPUT type=\"text\" "
+ " id=\"firstname\" value=\"John\"/>"
+ " <P>Last name:</P>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <P>Email:</P>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>");
}
TEST_F(FormManagerTest, LabelsInferredFromTableCell) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- "<TABLE>"
- " <TR>"
- " <TD>First name:</TD>"
- " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>"
- " </TR>"
- " <TR>"
- " <TD>Last name:</TD>"
- " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></TD>"
- " </TR>"
- " <TR>"
- " <TD></TD>"
- " <TD>"
- " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
- " </TD>"
- " </TR>"
- "</TABLE>"
- "</FORM>");
-
- WebFrame* web_frame = GetMainFrame();
- ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame);
-
- FormManager form_manager;
- form_manager.ExtractForms(web_frame);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ "<TABLE>"
+ " <TR>"
+ " <TD>First name:</TD>"
+ " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>Last name:</TD>"
+ " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>Email:</TD>"
+ " <TD><INPUT type=\"text\" id=\"email\""
+ " value=\"john@example.com\"/></TD>"
+ " </TR>"
+ " <TR>"
+ " <TD></TD>"
+ " <TD>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ " </TD>"
+ " </TR>"
+ "</TABLE>"
+ "</FORM>");
}
TEST_F(FormManagerTest, LabelsInferredFromTableCellNested) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- "<TABLE>"
- " <TR>"
- " <TD>"
- " <FONT>"
- " First name:"
- " </FONT>"
- " <FONT>"
- " Bogus"
- " </FONT>"
- " </TD>"
- " <TD>"
- " <FONT>"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " </FONT>"
- " </TD>"
- " </TR>"
- " <TR>"
- " <TD>"
- " <FONT>"
- " Last name:"
- " </FONT>"
- " </TD>"
- " <TD>"
- " <FONT>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
- " </FONT>"
- " </TD>"
- " </TR>"
- " <TR>"
- " <TD></TD>"
- " <TD>"
- " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
- " </TD>"
- " </TR>"
- "</TABLE>"
- "</FORM>");
-
- WebFrame* web_frame = GetMainFrame();
- ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame);
-
- FormManager form_manager;
- form_manager.ExtractForms(web_frame);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("First name:Bogus"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ std::vector<string16> labels, names, values;
+
+ labels.push_back(ASCIIToUTF16("First name:Bogus"));
+ names.push_back(ASCIIToUTF16("firstname"));
+ values.push_back(ASCIIToUTF16("John"));
+
+ labels.push_back(ASCIIToUTF16("Last name:"));
+ names.push_back(ASCIIToUTF16("lastname"));
+ values.push_back(ASCIIToUTF16("Smith"));
+
+ labels.push_back(ASCIIToUTF16("Email:"));
+ names.push_back(ASCIIToUTF16("email"));
+ values.push_back(ASCIIToUTF16("john@example.com"));
+
+ ExpectLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ "<TABLE>"
+ " <TR>"
+ " <TD>"
+ " <FONT>"
+ " First name:"
+ " </FONT>"
+ " <FONT>"
+ " Bogus"
+ " </FONT>"
+ " </TD>"
+ " <TD>"
+ " <FONT>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " </FONT>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " <FONT>"
+ " Last name:"
+ " </FONT>"
+ " </TD>"
+ " <TD>"
+ " <FONT>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " </FONT>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " <FONT>"
+ " Email:"
+ " </FONT>"
+ " </TD>"
+ " <TD>"
+ " <FONT>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " </FONT>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD></TD>"
+ " <TD>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ " </TD>"
+ " </TR>"
+ "</TABLE>"
+ "</FORM>",
+ labels, names, values);
}
TEST_F(FormManagerTest, LabelsInferredFromTableEmptyTDs) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- "<TABLE>"
- " <TR>"
- " <TD>"
- " <SPAN>*</SPAN>"
- " <B>First Name</B>"
- " </TD>"
- " <TD></TD>"
- " <TD>"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " </TD>"
- " </TR>"
- " <TR>"
- " <TD>"
- " <SPAN>*</SPAN>"
- " <B>Last Name</B>"
- " </TD>"
- " <TD></TD>"
- " <TD>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Milton\"/>"
- " </TD>"
- " </TR>"
- " <TR>"
- " <TD></TD>"
- " <TD>"
- " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
- " </TD>"
- " </TR>"
- "</TABLE>"
- "</FORM>");
-
- WebFrame* web_frame = GetMainFrame();
- ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame);
-
- FormManager form_manager;
- form_manager.ExtractForms(web_frame);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("*First Name"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("*Last Name"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Milton"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ std::vector<string16> labels, names, values;
+
+ labels.push_back(ASCIIToUTF16("*First Name"));
+ names.push_back(ASCIIToUTF16("firstname"));
+ values.push_back(ASCIIToUTF16("John"));
+
+ labels.push_back(ASCIIToUTF16("*Last Name"));
+ names.push_back(ASCIIToUTF16("lastname"));
+ values.push_back(ASCIIToUTF16("Smith"));
+
+ labels.push_back(ASCIIToUTF16("*Email"));
+ names.push_back(ASCIIToUTF16("email"));
+ values.push_back(ASCIIToUTF16("john@example.com"));
+
+ ExpectLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ "<TABLE>"
+ " <TR>"
+ " <TD>"
+ " <SPAN>*</SPAN>"
+ " <B>First Name</B>"
+ " </TD>"
+ " <TD></TD>"
+ " <TD>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " <SPAN>*</SPAN>"
+ " <B>Last Name</B>"
+ " </TD>"
+ " <TD></TD>"
+ " <TD>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " <SPAN>*</SPAN>"
+ " <B>Email</B>"
+ " </TD>"
+ " <TD></TD>"
+ " <TD>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD></TD>"
+ " <TD>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ " </TD>"
+ " </TR>"
+ "</TABLE>"
+ "</FORM>",
+ labels, names, values);
}
TEST_F(FormManagerTest, LabelsInferredFromTableLabels) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- "<TABLE>"
- " <TR>"
- " <TD>"
- " <LABEL>First Name:</LABEL>"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " </TD>"
- " </TR>"
- " <TR>"
- " <TD>"
- " <LABEL>Last Name:</LABEL>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
- " </TD>"
- " </TR>"
- "</TABLE>"
- "<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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("First Name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last Name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ "<TABLE>"
+ " <TR>"
+ " <TD>"
+ " <LABEL>First name:</LABEL>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " <LABEL>Last name:</LABEL>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " <LABEL>Email:</LABEL>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " </TD>"
+ " </TR>"
+ "</TABLE>"
+ "<INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>");
}
TEST_F(FormManagerTest, LabelsInferredFromTableTDInterveningElements) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- "<TABLE>"
- " <TR>"
- " <TD>"
- " First Name:"
- " <BR>"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " </TD>"
- " </TR>"
- " <TR>"
- " <TD>"
- " Last Name:"
- " <BR>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
- " </TD>"
- " </TR>"
- "</TABLE>"
- "<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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("First Name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last Name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ "<TABLE>"
+ " <TR>"
+ " <TD>"
+ " First name:"
+ " <BR>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " Last name:"
+ " <BR>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " </TD>"
+ " </TR>"
+ " <TR>"
+ " <TD>"
+ " Email:"
+ " <BR>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " </TD>"
+ " </TR>"
+ "</TABLE>"
+ "<INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>");
}
TEST_F(FormManagerTest, LabelsInferredFromDefinitionList) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- "<DL>"
- " <DT>"
- " <SPAN>"
- " *"
- " </SPAN>"
- " <SPAN>"
- " First name:"
- " </SPAN>"
- " <SPAN>"
- " Bogus"
- " </SPAN>"
- " </DT>"
- " <DD>"
- " <FONT>"
- " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
- " </FONT>"
- " </DD>"
- " <DT>"
- " <SPAN>"
- " Last name:"
- " </SPAN>"
- " </DT>"
- " <DD>"
- " <FONT>"
- " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
- " </FONT>"
- " </DD>"
- " <DT></DT>"
- " <DD>"
- " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
- " </DD>"
- "</DL>"
- "</FORM>");
-
- WebFrame* web_frame = GetMainFrame();
- ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame);
-
- FormManager form_manager;
- form_manager.ExtractForms(web_frame);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("*First name:Bogus"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ std::vector<string16> labels, names, values;
+
+ labels.push_back(ASCIIToUTF16("*First name:Bogus"));
+ names.push_back(ASCIIToUTF16("firstname"));
+ values.push_back(ASCIIToUTF16("John"));
+
+ labels.push_back(ASCIIToUTF16("Last name:"));
+ names.push_back(ASCIIToUTF16("lastname"));
+ values.push_back(ASCIIToUTF16("Smith"));
+
+ labels.push_back(ASCIIToUTF16("Email:"));
+ names.push_back(ASCIIToUTF16("email"));
+ values.push_back(ASCIIToUTF16("john@example.com"));
+
+ ExpectLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ "<DL>"
+ " <DT>"
+ " <SPAN>"
+ " *"
+ " </SPAN>"
+ " <SPAN>"
+ " First name:"
+ " </SPAN>"
+ " <SPAN>"
+ " Bogus"
+ " </SPAN>"
+ " </DT>"
+ " <DD>"
+ " <FONT>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " </FONT>"
+ " </DD>"
+ " <DT>"
+ " <SPAN>"
+ " Last name:"
+ " </SPAN>"
+ " </DT>"
+ " <DD>"
+ " <FONT>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " </FONT>"
+ " </DD>"
+ " <DT>"
+ " <SPAN>"
+ " Email:"
+ " </SPAN>"
+ " </DT>"
+ " <DD>"
+ " <FONT>"
+ " <INPUT type=\"text\" id=\"email\" value=\"john@example.com\"/>"
+ " </FONT>"
+ " </DD>"
+ " <DT></DT>"
+ " <DD>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ " </DD>"
+ "</DL>"
+ "</FORM>",
+ labels, names, values);
}
TEST_F(FormManagerTest, LabelsInferredWithSameName) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " Address Line 1:"
- " <INPUT type=\"text\" name=\"Address\"/>"
- " Address Line 2:"
- " <INPUT type=\"text\" name=\"Address\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 1:"),
- ASCIIToUTF16("Address"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 2:"),
- ASCIIToUTF16("Address"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ std::vector<string16> labels, names, values;
+
+ labels.push_back(ASCIIToUTF16("Address Line 1:"));
+ names.push_back(ASCIIToUTF16("Address"));
+ values.push_back(string16());
+
+ labels.push_back(ASCIIToUTF16("Address Line 2:"));
+ names.push_back(ASCIIToUTF16("Address"));
+ values.push_back(string16());
+
+ labels.push_back(ASCIIToUTF16("Address Line 3:"));
+ names.push_back(ASCIIToUTF16("Address"));
+ values.push_back(string16());
+
+ ExpectLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " Address Line 1:"
+ " <INPUT type=\"text\" name=\"Address\"/>"
+ " Address Line 2:"
+ " <INPUT type=\"text\" name=\"Address\"/>"
+ " Address Line 3:"
+ " <INPUT type=\"text\" name=\"Address\"/>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</FORM>",
+ labels, names, values);
}
TEST_F(FormManagerTest, LabelsInferredWithImageTags) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " Phone:"
- " <input type=\"text\" name=\"dayphone1\">"
- " <img/>"
- " -"
- " <img/>"
- " <input type=\"text\" name=\"dayphone2\">"
- " <img/>"
- " -"
- " <img/>"
- " <input type=\"text\" name=\"dayphone3\">"
- " ext.:"
- " <input type=\"text\" name=\"dayphone4\">"
- " <input type=\"text\" name=\"dummy\">"
- " <input type=\"submit\" name=\"reply-send\" value=\"Send\">"
- "</FORM>");
-
- WebFrame* frame = GetMainFrame();
- ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
-
- WebVector<WebFormElement> forms;
- frame->forms(forms);
- ASSERT_EQ(1U, forms.size());
-
- FormData form;
- EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0],
- FormManager::REQUIRE_NONE,
- FormManager::EXTRACT_VALUE,
- &form));
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(6U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"),
- ASCIIToUTF16("dayphone1"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("-"),
- ASCIIToUTF16("dayphone2"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(ASCIIToUTF16("-"),
- ASCIIToUTF16("dayphone3"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[2]);
- EXPECT_EQ(FormField(ASCIIToUTF16("ext.:"),
- ASCIIToUTF16("dayphone4"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[3]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("dummy"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[4]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[5]);
+ std::vector<string16> labels, names, values;
+
+ labels.push_back(ASCIIToUTF16("Phone:"));
+ names.push_back(ASCIIToUTF16("dayphone1"));
+ values.push_back(string16());
+
+ labels.push_back(ASCIIToUTF16("-"));
+ names.push_back(ASCIIToUTF16("dayphone2"));
+ values.push_back(string16());
+
+ labels.push_back(ASCIIToUTF16("-"));
+ names.push_back(ASCIIToUTF16("dayphone3"));
+ values.push_back(string16());
+
+ labels.push_back(ASCIIToUTF16("ext.:"));
+ names.push_back(ASCIIToUTF16("dayphone4"));
+ values.push_back(string16());
+
+ labels.push_back(string16());
+ names.push_back(ASCIIToUTF16("dummy"));
+ values.push_back(string16());
+
+ ExpectLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " Phone:"
+ " <input type=\"text\" name=\"dayphone1\">"
+ " <img/>"
+ " -"
+ " <img/>"
+ " <input type=\"text\" name=\"dayphone2\">"
+ " <img/>"
+ " -"
+ " <img/>"
+ " <input type=\"text\" name=\"dayphone3\">"
+ " ext.:"
+ " <input type=\"text\" name=\"dayphone4\">"
+ " <input type=\"text\" name=\"dummy\">"
+ " <input type=\"submit\" name=\"reply-send\" value=\"Send\">"
+ "</FORM>",
+ labels, names, values);
}
TEST_F(FormManagerTest, LabelsInferredFromDivTable) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- "<DIV>First Name:<BR>"
- " <SPAN>"
- " <INPUT type=\"text\" name=\"firstname\" value=\"John\">"
- " </SPAN>"
- "</DIV>"
- "<DIV>Last Name:<BR>"
- " <SPAN>"
- " <INPUT type=\"text\" name=\"lastname\" value=\"Doe\">"
- " </SPAN>"
- "</DIV>"
- "<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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_EQ(FormField(ASCIIToUTF16("First Name:"),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[0]);
- EXPECT_EQ(FormField(ASCIIToUTF16("Last Name:"),
- ASCIIToUTF16("lastname"),
- string16(),
- ASCIIToUTF16("text"),
- kDefaultMaxLength,
- false),
- fields[1]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[2]);
+ ExpectJohnSmithLabels(
+ "<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ "<DIV>First name:<BR>"
+ " <SPAN>"
+ " <INPUT type=\"text\" name=\"firstname\" value=\"John\">"
+ " </SPAN>"
+ "</DIV>"
+ "<DIV>Last name:<BR>"
+ " <SPAN>"
+ " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\">"
+ " </SPAN>"
+ "</DIV>"
+ "<DIV>Email:<BR>"
+ " <SPAN>"
+ " <INPUT type=\"text\" name=\"email\" value=\"john@example.com\">"
+ " </SPAN>"
+ "</DIV>"
+ "<input type=\"submit\" name=\"reply-send\" value=\"Send\">"
+ "</FORM>");
}
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=\"text\" id=\"lastname\" maxlength=\"7\"/>"
+ " <INPUT type=\"text\" id=\"email\" maxlength=\"9\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -1687,20 +1476,21 @@ TEST_F(FormManagerTest, FillFormMaxLength) {
ASCIIToUTF16("lastname"),
string16(),
ASCIIToUTF16("text"),
- 5,
+ 7,
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 9,
false),
fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Brother"));
form.fields[1].set_value(ASCIIToUTF16("Jonathan"));
+ form.fields[2].set_value(ASCIIToUTF16("brotherj@example.com"));
EXPECT_TRUE(form_manager.FillForm(form, WebNode()));
// Find the newly-filled form that contains the input element.
@@ -1712,27 +1502,25 @@ TEST_F(FormManagerTest, FillFormMaxLength) {
EXPECT_EQ(GURL("http://buh.com"), form2.action);
const std::vector<FormField>& fields2 = form2.fields;
- EXPECT_TRUE(fields2[0].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("Broth"),
- ASCIIToUTF16("text"),
- 5,
- false)));
- EXPECT_TRUE(fields2[1].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Jonat"),
- ASCIIToUTF16("text"),
- 5,
- false)));
- EXPECT_TRUE(fields2[2].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
+ ASSERT_EQ(3U, fields2.size());
+ EXPECT_TRUE(fields2[0].StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("firstname"),
+ ASCIIToUTF16("Broth"),
+ ASCIIToUTF16("text"),
+ 5,
+ false)));
+ EXPECT_TRUE(fields2[1].StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("lastname"),
+ ASCIIToUTF16("Jonatha"),
+ ASCIIToUTF16("text"),
+ 7,
+ false)));
+ EXPECT_TRUE(fields2[2].StrictlyEqualsHack(FormField(string16(),
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("brotherj@"),
+ ASCIIToUTF16("text"),
+ 9,
+ false)));
}
// This test uses negative values of the maxlength attribute for input elements.
@@ -1742,6 +1530,7 @@ 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=\"text\" id=\"email\" maxlength=\"-13\"/>"
" <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
"</FORM>");
@@ -1785,16 +1574,17 @@ TEST_F(FormManagerTest, FillFormNegativeMaxLength) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ string16(),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Brother"));
form.fields[1].set_value(ASCIIToUTF16("Jonathan"));
+ form.fields[2].set_value(ASCIIToUTF16("brotherj@example.com"));
EXPECT_TRUE(form_manager.FillForm(form, WebNode()));
// Find the newly-filled form that contains the input element.
@@ -1823,10 +1613,10 @@ TEST_F(FormManagerTest, FillFormNegativeMaxLength) {
false)));
EXPECT_TRUE(fields2[2].StrictlyEqualsHack(
FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("brotherj@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false)));
}
@@ -1917,7 +1707,7 @@ TEST_F(FormManagerTest, FillFormMoreFormDataFields) {
EXPECT_EQ(GURL("http://buh.com"), form2.action);
const std::vector<FormField>& fields = form2.fields;
- ASSERT_EQ(4U, fields.size());
+ ASSERT_EQ(3U, fields.size());
EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Brother"),
@@ -1936,12 +1726,6 @@ TEST_F(FormManagerTest, FillFormMoreFormDataFields) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false)));
- EXPECT_TRUE(fields[3].StrictlyEqualsHack(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
}
// This test sends a FormData object to FillForm with fewer fields than are in
@@ -1999,7 +1783,7 @@ TEST_F(FormManagerTest, FillFormFewerFormDataFields) {
EXPECT_EQ(GURL("http://buh.com"), form2.action);
const std::vector<FormField>& fields = form2.fields;
- ASSERT_EQ(8U, fields.size());
+ ASSERT_EQ(7U, fields.size());
EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(),
ASCIIToUTF16("prefix"),
string16(),
@@ -2042,12 +1826,6 @@ TEST_F(FormManagerTest, FillFormFewerFormDataFields) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false)));
- EXPECT_TRUE(fields[7].StrictlyEqualsHack(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
}
// This test sends a FormData object to FillForm with a field changed from
@@ -2102,7 +1880,7 @@ TEST_F(FormManagerTest, FillFormChangedFormDataFields) {
EXPECT_EQ(GURL("http://buh.com"), form2.action);
const std::vector<FormField>& fields = form2.fields;
- ASSERT_EQ(4U, fields.size());
+ ASSERT_EQ(3U, fields.size());
EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Brother"),
@@ -2121,12 +1899,6 @@ TEST_F(FormManagerTest, FillFormChangedFormDataFields) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false)));
- EXPECT_TRUE(fields[3].StrictlyEqualsHack(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
}
// This test sends a FormData object to FillForm with fewer fields than are in
@@ -2178,7 +1950,7 @@ TEST_F(FormManagerTest, FillFormExtraFieldInCache) {
EXPECT_EQ(GURL("http://buh.com"), form2.action);
const std::vector<FormField>& fields = form2.fields;
- ASSERT_EQ(5U, fields.size());
+ ASSERT_EQ(4U, fields.size());
EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Brother"),
@@ -2203,18 +1975,13 @@ TEST_F(FormManagerTest, FillFormExtraFieldInCache) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false)));
- EXPECT_TRUE(fields[4].StrictlyEqualsHack(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
}
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=\"text\" id=\"email\"/>"
" <INPUT type=\"submit\" value=\"Send\"/>"
"</FORM>");
@@ -2258,16 +2025,17 @@ TEST_F(FormManagerTest, FillFormEmptyName) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("email"),
string16(),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Wyatt"));
form.fields[1].set_value(ASCIIToUTF16("Earp"));
+ form.fields[2].set_value(ASCIIToUTF16("wyatt@example.com"));
EXPECT_TRUE(form_manager.FillForm(form, WebNode()));
// Find the newly-filled form that contains the input element.
@@ -2286,21 +2054,21 @@ TEST_F(FormManagerTest, FillFormEmptyName) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields2[0]);
+ fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Earp"),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields2[1]);
+ fields2[1]);
EXPECT_EQ(FormField(string16(),
- string16(),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("wyatt@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
- fields2[2]);
+ fields2[2]);
}
TEST_F(FormManagerTest, FillFormEmptyFormNames) {
@@ -2313,6 +2081,7 @@ TEST_F(FormManagerTest, FillFormEmptyFormNames) {
"<FORM action=\"http://abc.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"apple\"/>"
" <INPUT type=\"text\" id=\"banana\"/>"
+ " <INPUT type=\"text\" id=\"cantelope\"/>"
" <INPUT type=\"submit\" value=\"Send\"/>"
"</FORM>");
@@ -2356,16 +2125,17 @@ TEST_F(FormManagerTest, FillFormEmptyFormNames) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("cantelope"),
string16(),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Red"));
form.fields[1].set_value(ASCIIToUTF16("Yellow"));
+ form.fields[2].set_value(ASCIIToUTF16("Also Yellow"));
EXPECT_TRUE(form_manager.FillForm(form, WebNode()));
// Find the newly-filled form that contains the input element.
@@ -2384,21 +2154,21 @@ TEST_F(FormManagerTest, FillFormEmptyFormNames) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields2[0]);
+ fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("banana"),
ASCIIToUTF16("Yellow"),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields2[1]);
+ fields2[1]);
EXPECT_EQ(FormField(string16(),
- string16(),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("cantelope"),
+ ASCIIToUTF16("Also Yellow"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
- fields2[2]);
+ fields2[2]);
}
TEST_F(FormManagerTest, ThreePartPhone) {
@@ -2432,7 +2202,7 @@ TEST_F(FormManagerTest, ThreePartPhone) {
EXPECT_EQ(GURL("http://cnn.com"), form.action);
const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(5U, fields.size());
+ ASSERT_EQ(4U, fields.size());
EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"),
ASCIIToUTF16("dayphone1"),
string16(),
@@ -2461,13 +2231,6 @@ TEST_F(FormManagerTest, ThreePartPhone) {
kDefaultMaxLength,
false),
fields[3]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[4]);
}
@@ -2504,7 +2267,7 @@ TEST_F(FormManagerTest, MaxLengthFields) {
EXPECT_EQ(GURL("http://cnn.com"), form.action);
const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(7U, fields.size());
+ ASSERT_EQ(6U, fields.size());
EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"),
ASCIIToUTF16("dayphone1"),
string16(),
@@ -2549,13 +2312,6 @@ TEST_F(FormManagerTest, MaxLengthFields) {
kDefaultMaxLength,
false),
fields[5]);
- EXPECT_EQ(FormField(string16(),
- ASCIIToUTF16("reply-send"),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
- false),
- fields[6]);
}
// This test re-creates the experience of typing in a field then selecting a
@@ -2565,6 +2321,7 @@ TEST_F(FormManagerTest, FillFormNonEmptyField) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">"
" <INPUT type=\"text\" id=\"firstname\"/>"
" <INPUT type=\"text\" id=\"lastname\"/>"
+ " <INPUT type=\"text\" id=\"email\"/>"
" <INPUT type=\"submit\" value=\"Send\"/>"
"</FORM>");
@@ -2611,16 +2368,17 @@ TEST_F(FormManagerTest, FillFormNonEmptyField) {
false),
fields[1]);
EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("email"),
string16(),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Wyatt"));
form.fields[1].set_value(ASCIIToUTF16("Earp"));
+ form.fields[2].set_value(ASCIIToUTF16("wyatt@example.com"));
EXPECT_TRUE(form_manager.FillForm(form, input_element));
// Find the newly-filled form that contains the input element.
@@ -2639,21 +2397,21 @@ TEST_F(FormManagerTest, FillFormNonEmptyField) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields2[0]);
+ fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Earp"),
ASCIIToUTF16("text"),
kDefaultMaxLength,
false),
- fields2[1]);
+ fields2[1]);
EXPECT_EQ(FormField(string16(),
- string16(),
- ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit"),
- 0,
+ ASCIIToUTF16("email"),
+ ASCIIToUTF16("wyatt@example.com"),
+ ASCIIToUTF16("text"),
+ kDefaultMaxLength,
false),
- fields2[2]);
+ fields2[2]);
// Verify that the cursor position has been updated.
EXPECT_EQ(5, input_element.selectionStart());
@@ -2667,7 +2425,6 @@ TEST_F(FormManagerTest, ClearFormWithNode) {
" <INPUT type=\"text\" id=\"lastname\" value=\"Earp\"/>"
" <INPUT type=\"text\" autocomplete=\"off\" id=\"noAC\" value=\"one\"/>"
" <INPUT type=\"text\" id=\"notenabled\" disabled=\"disabled\">"
- " <INPUT type=\"hidden\" id=\"notvisible\" value=\"apple\">"
" <INPUT type=\"submit\" value=\"Send\"/>"
"</FORM>");
@@ -2707,7 +2464,7 @@ TEST_F(FormManagerTest, ClearFormWithNode) {
EXPECT_EQ(GURL("http://buh.com"), form2.action);
const std::vector<FormField>& fields2 = form2.fields;
- ASSERT_EQ(6U, fields2.size());
+ ASSERT_EQ(4U, fields2.size());
EXPECT_TRUE(fields2[0].StrictlyEqualsHack(
FormField(string16(),
ASCIIToUTF16("firstname"),
@@ -2736,20 +2493,6 @@ TEST_F(FormManagerTest, ClearFormWithNode) {
ASCIIToUTF16("text"),
kDefaultMaxLength,
false)));
- EXPECT_TRUE(fields2[4].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("notvisible"),
- ASCIIToUTF16("apple"),
- ASCIIToUTF16("hidden"),
- 0,
- false)));
- EXPECT_TRUE(fields2[5].StrictlyEqualsHack(
- FormField(string16(),
- string16(),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
// Verify that the cursor position has been updated.
EXPECT_EQ(0, firstname.selectionStart());
@@ -2806,7 +2549,7 @@ TEST_F(FormManagerTest, ClearFormWithNodeContainingSelectOne) {
EXPECT_EQ(GURL("http://buh.com"), form2.action);
const std::vector<FormField>& fields2 = form2.fields;
- ASSERT_EQ(4U, fields2.size());
+ ASSERT_EQ(3U, fields2.size());
EXPECT_TRUE(fields2[0].StrictlyEqualsHack(
FormField(string16(),
ASCIIToUTF16("firstname"),
@@ -2828,13 +2571,6 @@ TEST_F(FormManagerTest, ClearFormWithNodeContainingSelectOne) {
ASCIIToUTF16("select-one"),
0,
false)));
- EXPECT_TRUE(fields2[3].StrictlyEqualsHack(
- FormField(string16(),
- string16(),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
// Verify that the cursor position has been updated.
EXPECT_EQ(0, firstname.selectionStart());
@@ -3086,55 +2822,6 @@ TEST_F(FormManagerTest, FormWithNodeIsAutoFilled) {
EXPECT_TRUE(form_manager.FormWithNodeIsAutoFilled(firstname));
}
-TEST_F(FormManagerTest, LabelsHiddenFields) {
- LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
- " <LABEL for=\"firstname\"> First name: </LABEL>"
- " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>"
- " <LABEL for=\"lastname\"> Last name: </LABEL>"
- " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>"
- " <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);
-
- std::vector<FormData> forms;
- form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms);
- ASSERT_EQ(1U, forms.size());
-
- const FormData& form = forms[0];
- EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name);
- EXPECT_EQ(GURL(web_frame->url()), form.origin);
- EXPECT_EQ(GURL("http://cnn.com"), form.action);
-
- const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(3U, fields.size());
- EXPECT_TRUE(fields[0].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("firstname"),
- ASCIIToUTF16("John"),
- ASCIIToUTF16("hidden"),
- 0,
- false)));
- EXPECT_TRUE(fields[1].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("lastname"),
- ASCIIToUTF16("Smith"),
- ASCIIToUTF16("hidden"),
- 0,
- false)));
- EXPECT_TRUE(fields[2].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
-}
-
TEST_F(FormManagerTest, LabelForElementHidden) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
" <LABEL for=\"firstname\"> First name: </LABEL>"
@@ -3192,7 +2879,7 @@ TEST_F(FormManagerTest, SelectOneAsText) {
EXPECT_EQ(GURL("http://cnn.com"), form.action);
const std::vector<FormField>& fields = form.fields;
- ASSERT_EQ(4U, fields.size());
+ ASSERT_EQ(3U, fields.size());
EXPECT_TRUE(fields[0].StrictlyEqualsHack(
FormField(string16(),
ASCIIToUTF16("firstname"),
@@ -3214,13 +2901,6 @@ TEST_F(FormManagerTest, SelectOneAsText) {
ASCIIToUTF16("select-one"),
0,
false)));
- EXPECT_TRUE(fields[3].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
form.fields.clear();
// Extract the country select-one value as value.
@@ -3232,7 +2912,7 @@ TEST_F(FormManagerTest, SelectOneAsText) {
EXPECT_EQ(GURL(frame->url()), form.origin);
EXPECT_EQ(GURL("http://cnn.com"), form.action);
- ASSERT_EQ(4U, fields.size());
+ ASSERT_EQ(3U, fields.size());
EXPECT_TRUE(fields[0].StrictlyEqualsHack(
FormField(string16(),
ASCIIToUTF16("firstname"),
@@ -3254,13 +2934,4 @@ TEST_F(FormManagerTest, SelectOneAsText) {
ASCIIToUTF16("select-one"),
0,
false)));
- EXPECT_TRUE(fields[3].StrictlyEqualsHack(
- FormField(string16(),
- ASCIIToUTF16("reply-send"),
- string16(),
- ASCIIToUTF16("submit"),
- 0,
- false)));
}
-
-} // namespace
diff --git a/chrome/renderer/render_view_browsertest.cc b/chrome/renderer/render_view_browsertest.cc
index ee0d1da..0d4db39 100644
--- a/chrome/renderer/render_view_browsertest.cc
+++ b/chrome/renderer/render_view_browsertest.cc
@@ -1023,6 +1023,11 @@ TEST_F(RenderViewTest, SendForms) {
" <input type=\"text\" id=\"firstname\"/>"
" <input type=\"text\" id=\"middlename\" autoComplete=\"off\"/>"
" <input type=\"hidden\" id=\"lastname\"/>"
+ " <select id=\"state\"/>"
+ " <option>?</option>"
+ " <option>California</option>"
+ " <option>Texas</option>"
+ " </select>"
"</form>");
// Verify that "FormsSeen" sends the expected number of fields.
@@ -1051,9 +1056,9 @@ TEST_F(RenderViewTest, SendForms) {
false))) << forms[0].fields[1];
EXPECT_TRUE(forms[0].fields[2].StrictlyEqualsHack(
FormField(string16(),
- ASCIIToUTF16("lastname"),
- string16(),
- ASCIIToUTF16("hidden"),
+ ASCIIToUTF16("state"),
+ ASCIIToUTF16("?"),
+ ASCIIToUTF16("select-one"),
0,
false))) << forms[0].fields[2];
@@ -1098,9 +1103,9 @@ TEST_F(RenderViewTest, SendForms) {
false))) << form2.fields[1];
EXPECT_TRUE(form2.fields[2].StrictlyEqualsHack(
FormField(string16(),
- ASCIIToUTF16("lastname"),
- string16(),
- ASCIIToUTF16("hidden"),
+ ASCIIToUTF16("state"),
+ ASCIIToUTF16("?"),
+ ASCIIToUTF16("select-one"),
0,
false))) << form2.fields[2];
}