summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 19:21:18 +0000
committerdhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-14 19:21:18 +0000
commitee0e2d945e34a794f5268137f71fc9e7d1cdc82b (patch)
treeceac50e53dc7d55b85e9ca2d0ab359fa9a236deb
parent1b2b9e175adf3b51215ca88f75ea66605f74ef33 (diff)
downloadchromium_src-ee0e2d945e34a794f5268137f71fc9e7d1cdc82b.zip
chromium_src-ee0e2d945e34a794f5268137f71fc9e7d1cdc82b.tar.gz
chromium_src-ee0e2d945e34a794f5268137f71fc9e7d1cdc82b.tar.bz2
Form AutoFill Phone number should be displayed as xxx-xxx-xxxx
Modifies the AutoFill label inferencing logic to skip over <img> tags when deriving labels. It is common to use small images as spacers between elements. Also, extends the phone number heuristics to recognize numbers that are split into three fields of the form [xxx]-[yyy]-[zzzz] where xxx is the area code, yyy is the phone number prefix and zzz is the phone number suffix. Note: This change has a dependency on WebKit change: https://bugs.webkit.org/show_bug.cgi?id=38825. Will need to wait for that to land before committing this change. BUG=38218 TEST=FormManagerTest.LabelsInferredWithImageTags:FormStructureTest.ThreePartPhoneNumber:PhoneFieldTest.ThreePartPhoneNumber Review URL: http://codereview.chromium.org/1979008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47297 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/autofill/address_field_unittest.cc57
-rw-r--r--chrome/browser/autofill/autofill_download_unittest.cc33
-rw-r--r--chrome/browser/autofill/autofill_manager.cc39
-rw-r--r--chrome/browser/autofill/autofill_manager.h10
-rw-r--r--chrome/browser/autofill/autofill_manager_unittest.cc2
-rw-r--r--chrome/browser/autofill/credit_card_field_unittest.cc81
-rw-r--r--chrome/browser/autofill/fax_field_unittest.cc3
-rw-r--r--chrome/browser/autofill/form_structure_unittest.cc289
-rw-r--r--chrome/browser/autofill/name_field_unittest.cc39
-rw-r--r--chrome/browser/autofill/phone_field.cc20
-rw-r--r--chrome/browser/autofill/phone_field_unittest.cc69
-rw-r--r--chrome/browser/webdata/web_data_service_unittest.cc3
-rw-r--r--chrome/browser/webdata/web_database_unittest.cc78
-rw-r--r--chrome/common/render_messages.h4
-rw-r--r--chrome/renderer/form_manager.cc23
-rw-r--r--chrome/renderer/form_manager_unittest.cc654
-rw-r--r--webkit/glue/form_field.cc19
-rw-r--r--webkit/glue/form_field.h6
-rw-r--r--webkit/glue/password_form_dom_manager.cc8
19 files changed, 1066 insertions, 371 deletions
diff --git a/chrome/browser/autofill/address_field_unittest.cc b/chrome/browser/autofill/address_field_unittest.cc
index 8b82dda..7e3c2dd 100644
--- a/chrome/browser/autofill/address_field_unittest.cc
+++ b/chrome/browser/autofill/address_field_unittest.cc
@@ -44,7 +44,8 @@ TEST_F(AddressFieldTest, ParseOneLineAddress) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address"),
ASCIIToUTF16("address"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -63,7 +64,8 @@ TEST_F(AddressFieldTest, ParseOneLineAddressEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address"),
kEcmlShipToAddress1,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -82,13 +84,15 @@ TEST_F(AddressFieldTest, ParseTwoLineAddress) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address"),
ASCIIToUTF16("address"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
string16(),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr2")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -110,19 +114,22 @@ TEST_F(AddressFieldTest, ParseThreeLineAddress) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address Line1"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address Line2"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr2")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address Line3"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr3")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -146,13 +153,15 @@ TEST_F(AddressFieldTest, ParseTwoLineAddressEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address"),
kEcmlShipToAddress1,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
kEcmlShipToAddress2,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr2")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -174,7 +183,8 @@ TEST_F(AddressFieldTest, ParseCity) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("City"),
ASCIIToUTF16("city"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("city1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -193,7 +203,8 @@ TEST_F(AddressFieldTest, ParseCityEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("City"),
kEcmlShipToCity,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("city1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -212,7 +223,8 @@ TEST_F(AddressFieldTest, ParseState) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("State"),
ASCIIToUTF16("state"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("state1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -231,7 +243,8 @@ TEST_F(AddressFieldTest, ParseStateEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("State"),
kEcmlShipToStateProv,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("state1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -250,7 +263,8 @@ TEST_F(AddressFieldTest, ParseZip) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Zip"),
ASCIIToUTF16("zip"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("zip1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -269,7 +283,8 @@ TEST_F(AddressFieldTest, ParseZipEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Zip"),
kEcmlShipToPostalCode,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("zip1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -288,7 +303,8 @@ TEST_F(AddressFieldTest, ParseCountry) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Country"),
ASCIIToUTF16("country"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("country1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -307,7 +323,8 @@ TEST_F(AddressFieldTest, ParseCountryEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Country"),
kEcmlShipToCountry,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("country1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -326,13 +343,15 @@ TEST_F(AddressFieldTest, ParseTwoLineAddressMissingLabel) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Address"),
ASCIIToUTF16("address"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("bogus"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("addr2")));
list_.push_back(NULL);
iter_ = list_.begin();
diff --git a/chrome/browser/autofill/autofill_download_unittest.cc b/chrome/browser/autofill/autofill_download_unittest.cc
index 085059f..3074ecd 100644
--- a/chrome/browser/autofill/autofill_download_unittest.cc
+++ b/chrome/browser/autofill/autofill_download_unittest.cc
@@ -98,31 +98,38 @@ TEST(AutoFillDownloadTest, QueryAndUploadTest) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("username"),
ASCIIToUTF16("username"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"),
ASCIIToUTF16("firstname"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("email"),
ASCIIToUTF16("email"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("email2"),
ASCIIToUTF16("email2"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("password"),
ASCIIToUTF16("password"),
string16(),
- ASCIIToUTF16("password")));
+ ASCIIToUTF16("password"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
FormStructure *form_structure = new FormStructure(form);
ScopedVector<FormStructure> form_structures;
@@ -132,19 +139,23 @@ TEST(AutoFillDownloadTest, QueryAndUploadTest) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("address"),
ASCIIToUTF16("address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("address2"),
ASCIIToUTF16("address2"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("city"),
ASCIIToUTF16("address2"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure = new FormStructure(form);
form_structures.push_back(form_structure);
diff --git a/chrome/browser/autofill/autofill_manager.cc b/chrome/browser/autofill/autofill_manager.cc
index 8ba0030..5c49249 100644
--- a/chrome/browser/autofill/autofill_manager.cc
+++ b/chrome/browser/autofill/autofill_manager.cc
@@ -27,6 +27,12 @@ namespace {
// The rate for positive/negative matches potentially could be different.
const double kAutoFillPositiveUploadRateDefaultValue = 0.01;
const double kAutoFillNegativeUploadRateDefaultValue = 0.01;
+
+// Size and offset of the prefix and suffix portions of phone numbers.
+const int kAutoFillPhoneNumberPrefixOffset = 0;
+const int kAutoFillPhoneNumberPrefixCount = 3;
+const int kAutoFillPhoneNumberSuffixOffset = 3;
+const int kAutoFillPhoneNumberSuffixCount = 4;
} // namespace
// TODO(jhawkins): Maybe this should be in a grd file?
@@ -239,7 +245,7 @@ bool AutoFillManager::FillAutoFillFormData(int query_id,
result.fields[i].set_value(
credit_card->GetFieldText(autofill_type));
} else if (profile) {
- result.fields[i].set_value(profile->GetFieldText(autofill_type));
+ FillFormField(profile, autofill_type, &result.fields[i]);
}
}
}
@@ -459,3 +465,34 @@ void AutoFillManager::GetCreditCardSuggestions(const FormField& field,
}
}
}
+
+void AutoFillManager::FillFormField(const AutoFillProfile* profile,
+ AutoFillType type,
+ webkit_glue::FormField* field) {
+ DCHECK(profile);
+ DCHECK(field);
+
+ if (type.subgroup() == AutoFillType::PHONE_NUMBER) {
+ FillPhoneNumberField(profile, field);
+ } else {
+ field->set_value(profile->GetFieldText(type));
+ }
+}
+
+void AutoFillManager::FillPhoneNumberField(const AutoFillProfile* profile,
+ webkit_glue::FormField* field) {
+ // If we are filling a phone number, check to see if the size field
+ // matches the "prefix" or "suffix" sizes and fill accordingly.
+ string16 number = profile->GetFieldText(AutoFillType(PHONE_HOME_NUMBER));
+ if (field->size() == kAutoFillPhoneNumberPrefixCount) {
+ number = number.substr(kAutoFillPhoneNumberPrefixOffset,
+ kAutoFillPhoneNumberPrefixCount);
+ field->set_value(number);
+ } else if (field->size() == kAutoFillPhoneNumberSuffixCount) {
+ number = number.substr(kAutoFillPhoneNumberSuffixOffset,
+ kAutoFillPhoneNumberSuffixCount);
+ field->set_value(number);
+ } else {
+ field->set_value(number);
+ }
+}
diff --git a/chrome/browser/autofill/autofill_manager.h b/chrome/browser/autofill/autofill_manager.h
index 0a7a523..c33ae7e 100644
--- a/chrome/browser/autofill/autofill_manager.h
+++ b/chrome/browser/autofill/autofill_manager.h
@@ -115,6 +115,16 @@ class AutoFillManager : public RenderViewHostDelegate::AutoFill,
std::vector<string16>* values,
std::vector<string16>* labels);
+ // Set |field| argument's value based on |type| and contents of the |profile|.
+ void FillFormField(const AutoFillProfile* profile,
+ AutoFillType type,
+ webkit_glue::FormField* field);
+
+ // Set |field| argument's value for phone number based on contents of the
+ // |profile|.
+ void FillPhoneNumberField(const AutoFillProfile* profile,
+ webkit_glue::FormField* field);
+
// The TabContents hosting this AutoFillManager.
// Weak reference.
// May not be NULL.
diff --git a/chrome/browser/autofill/autofill_manager_unittest.cc b/chrome/browser/autofill/autofill_manager_unittest.cc
index 1997a3c..cbb050a 100644
--- a/chrome/browser/autofill/autofill_manager_unittest.cc
+++ b/chrome/browser/autofill/autofill_manager_unittest.cc
@@ -95,7 +95,7 @@ void CreateTestFormField(const char* label,
const char* type,
webkit_glue::FormField* field) {
*field = webkit_glue::FormField(ASCIIToUTF16(label), ASCIIToUTF16(name),
- ASCIIToUTF16(value), ASCIIToUTF16(type));
+ ASCIIToUTF16(value), ASCIIToUTF16(type), 0);
}
void CreateTestFormData(FormData* form) {
diff --git a/chrome/browser/autofill/credit_card_field_unittest.cc b/chrome/browser/autofill/credit_card_field_unittest.cc
index e972c62..684ac78 100644
--- a/chrome/browser/autofill/credit_card_field_unittest.cc
+++ b/chrome/browser/autofill/credit_card_field_unittest.cc
@@ -44,13 +44,15 @@ TEST_F(CreditCardFieldTest, ParseCreditCardNoNumber) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Month"),
ASCIIToUTF16("ccmonth"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("month1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Year"),
ASCIIToUTF16("ccyear"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("year1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -63,7 +65,8 @@ TEST_F(CreditCardFieldTest, ParseCreditCardNoDate) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
ASCIIToUTF16("card_number"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("number1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -76,19 +79,22 @@ TEST_F(CreditCardFieldTest, ParseMiniumCreditCard) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
ASCIIToUTF16("card_number"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("number1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Month"),
ASCIIToUTF16("ccmonth"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("month1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Year"),
ASCIIToUTF16("ccyear"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("year1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -112,19 +118,22 @@ TEST_F(CreditCardFieldTest, ParseMiniumCreditCardEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
kEcmlCardNumber,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("number1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Month"),
kEcmlCardExpireMonth,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("month1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Year"),
kEcmlCardExpireYear,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("year1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -148,31 +157,36 @@ TEST_F(CreditCardFieldTest, ParseFullCreditCard) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Name on Card"),
ASCIIToUTF16("name on card"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
ASCIIToUTF16("card_number"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("number1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Month"),
ASCIIToUTF16("ccmonth"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("month1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Year"),
ASCIIToUTF16("ccyear"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("year1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Verification"),
ASCIIToUTF16("verification"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("cvc1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -203,31 +217,36 @@ TEST_F(CreditCardFieldTest, ParseFullCreditCardEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Name on Card"),
kEcmlCardHolder,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
kEcmlCardNumber,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("number1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Month"),
kEcmlCardExpireMonth,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("month1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Exp Year"),
kEcmlCardExpireYear,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("year1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Verification"),
kEcmlCardVerification,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("cvc1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -258,27 +277,31 @@ TEST_F(CreditCardFieldTest, ParseExpMonthYear) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Name on Card"),
ASCIIToUTF16("Name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
ASCIIToUTF16("Card"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("number")));
list_.push_back(
new AutoFillField(
webkit_glue::FormField(ASCIIToUTF16("ExpDate Month / Year"),
ASCIIToUTF16("ExpDate"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("month")));
list_.push_back(
new AutoFillField(
webkit_glue::FormField(ASCIIToUTF16("ExpDate Month / Year"),
ASCIIToUTF16("ExpDate"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("year")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -305,27 +328,31 @@ TEST_F(CreditCardFieldTest, ParseExpMonthYear2) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Name on Card"),
ASCIIToUTF16("Name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
ASCIIToUTF16("Card"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("number")));
list_.push_back(
new AutoFillField(
webkit_glue::FormField(ASCIIToUTF16("Expiration date Month / Year"),
ASCIIToUTF16("ExpDate"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("month")));
list_.push_back(
new AutoFillField(
webkit_glue::FormField(ASCIIToUTF16("Expiration date Month / Year"),
ASCIIToUTF16("ExpDate"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("year")));
list_.push_back(NULL);
iter_ = list_.begin();
diff --git a/chrome/browser/autofill/fax_field_unittest.cc b/chrome/browser/autofill/fax_field_unittest.cc
index 4cccac4..258f8d0 100644
--- a/chrome/browser/autofill/fax_field_unittest.cc
+++ b/chrome/browser/autofill/fax_field_unittest.cc
@@ -44,7 +44,8 @@ TEST_F(FaxFieldTest, ParseOneLineFax) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Fax"),
ASCIIToUTF16("faxnumber"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("fax1")));
list_.push_back(NULL);
iter_ = list_.begin();
diff --git a/chrome/browser/autofill/form_structure_unittest.cc b/chrome/browser/autofill/form_structure_unittest.cc
index 1286f9a..f8f8f87 100644
--- a/chrome/browser/autofill/form_structure_unittest.cc
+++ b/chrome/browser/autofill/form_structure_unittest.cc
@@ -43,15 +43,18 @@ TEST(FormStructureTest, FieldCount) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("username"),
ASCIIToUTF16("username"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("password"),
ASCIIToUTF16("password"),
string16(),
- ASCIIToUTF16("password")));
+ ASCIIToUTF16("password"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
FormStructure form_structure(form);
// All fields are counted.
@@ -64,19 +67,23 @@ TEST(FormStructureTest, AutoFillCount) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("username"),
ASCIIToUTF16("username"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("password"),
ASCIIToUTF16("password"),
string16(),
- ASCIIToUTF16("password")));
+ ASCIIToUTF16("password"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("state"),
ASCIIToUTF16("state"),
string16(),
- ASCIIToUTF16("select-one")));
+ ASCIIToUTF16("select-one"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
FormStructure form_structure(form);
// Only text and select fields that are heuristically matched are counted.
@@ -89,19 +96,23 @@ TEST(FormStructureTest, ConvertToFormData) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("username"),
ASCIIToUTF16("username"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("password"),
ASCIIToUTF16("password"),
string16(),
- ASCIIToUTF16("password")));
+ ASCIIToUTF16("password"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("state"),
ASCIIToUTF16("state"),
string16(),
- ASCIIToUTF16("select")));
+ ASCIIToUTF16("select"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
FormStructure form_structure(form);
FormData converted = form_structure.ConvertToFormData();
@@ -117,11 +128,13 @@ TEST(FormStructureTest, HasAutoFillableValues) {
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit1"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit2"),
ASCIIToUTF16("dummy value"),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_FALSE(form_structure->HasAutoFillableValues());
@@ -129,11 +142,13 @@ TEST(FormStructureTest, HasAutoFillableValues) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Email"),
ASCIIToUTF16("email"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("state"),
ASCIIToUTF16("state"),
string16(),
- ASCIIToUTF16("select-one")));
+ ASCIIToUTF16("select-one"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_FALSE(form_structure->HasAutoFillableValues());
@@ -141,11 +156,13 @@ TEST(FormStructureTest, HasAutoFillableValues) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Dear"),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->HasAutoFillableValues());
@@ -155,11 +172,13 @@ TEST(FormStructureTest, HasAutoFillableValues) {
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Field1"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Field2"),
ASCIIToUTF16("dummy value"),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_FALSE(form_structure->HasAutoFillableValues());
@@ -168,7 +187,8 @@ TEST(FormStructureTest, HasAutoFillableValues) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Full Name"),
ASCIIToUTF16("fullname"),
ASCIIToUTF16("John Dear"),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->HasAutoFillableValues());
}
@@ -182,15 +202,18 @@ TEST(FormStructureTest, IsAutoFillable) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("username"),
ASCIIToUTF16("username"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("password"),
ASCIIToUTF16("password"),
string16(),
- ASCIIToUTF16("password")));
+ ASCIIToUTF16("password"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_FALSE(form_structure->IsAutoFillable());
@@ -198,11 +221,13 @@ TEST(FormStructureTest, IsAutoFillable) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"),
ASCIIToUTF16("firstname"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_FALSE(form_structure->IsAutoFillable());
@@ -210,7 +235,8 @@ TEST(FormStructureTest, IsAutoFillable) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Email"),
ASCIIToUTF16("email"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
@@ -239,39 +265,48 @@ TEST(FormStructureTest, HeuristicsContactInfo) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"),
ASCIIToUTF16("firstname"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("EMail"),
ASCIIToUTF16("email"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Phone"),
ASCIIToUTF16("phone"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Fax"),
ASCIIToUTF16("fax"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
ASCIIToUTF16("address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("City"),
ASCIIToUTF16("city"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Zip code"),
ASCIIToUTF16("zipcode"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
@@ -309,52 +344,62 @@ TEST(FormStructureTest, HeuristicsSample8) {
webkit_glue::FormField(ASCIIToUTF16("Your First Name:"),
ASCIIToUTF16("bill.first"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Your Last Name:"),
ASCIIToUTF16("bill.last"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Street Address Line 1:"),
ASCIIToUTF16("bill.street1"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Street Address Line 2:"),
ASCIIToUTF16("bill.street2"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("City:"),
ASCIIToUTF16("bill.city"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("State (U.S.):"),
ASCIIToUTF16("bill.state"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Zip/Postal Code:"),
ASCIIToUTF16("BillTo.PostalCode"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Country:"),
ASCIIToUTF16("bill.country"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Phone Number:"),
ASCIIToUTF16("BillTo.Phone"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
ASSERT_EQ(10U, form_structure->field_count());
@@ -392,39 +437,46 @@ TEST(FormStructureTest, HeuristicsSample6) {
webkit_glue::FormField(ASCIIToUTF16("E-mail address"),
ASCIIToUTF16("email"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Full name"),
ASCIIToUTF16("name"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Company"),
ASCIIToUTF16("company"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Address"),
ASCIIToUTF16("address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("City"),
ASCIIToUTF16("city"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
// TODO(jhawkins): Add state select control.
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Zip Code"),
ASCIIToUTF16("Home.PostalCode"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
// TODO(jhawkins): Phone number.
form.fields.push_back(
webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
ASCIIToUTF16("continue"),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
ASSERT_EQ(7U, form_structure->field_count());
@@ -457,39 +509,48 @@ TEST(FormStructureTest, HeuristicsLabelsOnly) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("First Name"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("EMail"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Phone"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Fax"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Address"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Zip code"),
string16(),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
ASSERT_EQ(9U, form_structure->field_count());
@@ -524,27 +585,33 @@ TEST(FormStructureTest, HeuristicsCreditCardInfo) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Name on Card"),
ASCIIToUTF16("name on card"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
ASCIIToUTF16("card_number"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Exp Month"),
ASCIIToUTF16("ccmonth"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Exp Year"),
ASCIIToUTF16("ccyear"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Verification"),
ASCIIToUTF16("verification"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
ASSERT_EQ(6U, form_structure->field_count());
@@ -574,33 +641,40 @@ TEST(FormStructureTest, HeuristicsCreditCardInfoWithUnknownCardField) {
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Name on Card"),
ASCIIToUTF16("name on card"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
// This is not a field we know how to process. But we should skip over it
// and process the other fields in the card block.
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Card Type"),
ASCIIToUTF16("card_type"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Card Number"),
ASCIIToUTF16("card_number"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Exp Month"),
ASCIIToUTF16("ccmonth"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Exp Year"),
ASCIIToUTF16("ccyear"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(ASCIIToUTF16("Verification"),
ASCIIToUTF16("verification"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(webkit_glue::FormField(string16(),
ASCIIToUTF16("Submit"),
string16(),
- ASCIIToUTF16("submit")));
+ ASCIIToUTF16("submit"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
ASSERT_EQ(7U, form_structure->field_count());
@@ -633,22 +707,26 @@ TEST(FormStructureTest, ThreeAddressLines) {
webkit_glue::FormField(ASCIIToUTF16("Address Line1"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Address Line2"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Address Line3"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("City"),
ASCIIToUTF16("city"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
ASSERT_EQ(4U, form_structure->field_count());
@@ -673,17 +751,20 @@ TEST(FormStructureTest, HeuristicsStateWithProvince) {
webkit_glue::FormField(ASCIIToUTF16("Address Line1"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("Address Line2"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form.fields.push_back(
webkit_glue::FormField(ASCIIToUTF16("State/Province/Region"),
ASCIIToUTF16("State"),
string16(),
- ASCIIToUTF16("text")));
+ ASCIIToUTF16("text"),
+ 0));
form_structure.reset(new FormStructure(form));
EXPECT_TRUE(form_structure->IsAutoFillable());
ASSERT_EQ(3U, form_structure->field_count());
@@ -697,4 +778,50 @@ TEST(FormStructureTest, HeuristicsStateWithProvince) {
EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(2)->heuristic_type());
}
+TEST(FormStructureTest, ThreePartPhoneNumber) {
+ scoped_ptr<FormStructure> form_structure;
+ FormData form;
+
+ form.method = ASCIIToUTF16("post");
+ form.fields.push_back(
+ webkit_glue::FormField(ASCIIToUTF16("Phone:"),
+ ASCIIToUTF16("dayphone1"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(
+ webkit_glue::FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone2"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(
+ webkit_glue::FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone3"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form.fields.push_back(
+ webkit_glue::FormField(ASCIIToUTF16("ext.:"),
+ ASCIIToUTF16("dayphone4"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0));
+ form_structure.reset(new FormStructure(form));
+ EXPECT_TRUE(form_structure->IsAutoFillable());
+ ASSERT_EQ(4U, form_structure->field_count());
+ ASSERT_EQ(3U, form_structure->autofill_count());
+
+ // Area code.
+ EXPECT_EQ(PHONE_HOME_CITY_CODE, form_structure->field(0)->heuristic_type());
+ // Phone number suffix.
+ EXPECT_EQ(PHONE_HOME_NUMBER,
+ form_structure->field(1)->heuristic_type());
+ // Phone number suffix.
+ EXPECT_EQ(PHONE_HOME_NUMBER,
+ form_structure->field(2)->heuristic_type());
+ // Unknown.
+ EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type());
+}
+
} // namespace
diff --git a/chrome/browser/autofill/name_field_unittest.cc b/chrome/browser/autofill/name_field_unittest.cc
index 438bef3..11e453e 100644
--- a/chrome/browser/autofill/name_field_unittest.cc
+++ b/chrome/browser/autofill/name_field_unittest.cc
@@ -30,19 +30,22 @@ TEST_F(NameFieldTest, FirstMiddleLast) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("First Name"),
ASCIIToUTF16("First"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Middle Name"),
ASCIIToUTF16("Middle"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name2")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
ASCIIToUTF16("Last"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name3")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -65,19 +68,22 @@ TEST_F(NameFieldTest, FirstMiddleLast2) {
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("firstName"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("middleName"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name2")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("lastName"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name3")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -100,13 +106,15 @@ TEST_F(NameFieldTest, FirstLast) {
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("first_name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("last_name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name2")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -126,13 +134,15 @@ TEST_F(NameFieldTest, FirstLast2) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Name"),
ASCIIToUTF16("first_name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Name"),
ASCIIToUTF16("last_name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name2")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -152,19 +162,22 @@ TEST_F(NameFieldTest, FirstLastMiddleWithSpaces) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("First Name"),
ASCIIToUTF16("first name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Middle Name"),
ASCIIToUTF16("middle name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name2")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Last Name"),
ASCIIToUTF16("last name"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("name3")));
list_.push_back(NULL);
iter_ = list_.begin();
diff --git a/chrome/browser/autofill/phone_field.cc b/chrome/browser/autofill/phone_field.cc
index dfecceb..6092fe4 100644
--- a/chrome/browser/autofill/phone_field.cc
+++ b/chrome/browser/autofill/phone_field.cc
@@ -99,9 +99,23 @@ bool PhoneField::GetFieldInfo(FieldTypeMap* field_type_map) const {
ok = Add(field_type_map, area_code_, AutoFillType(PHONE_HOME_CITY_CODE));
DCHECK(ok);
- // NOTE: we ignore the prefix/suffix thing here.
- ok = ok && Add(field_type_map, phone_, AutoFillType(PHONE_HOME_NUMBER));
- DCHECK(ok);
+ if (prefix_ != NULL) {
+ // We tag the prefix as PHONE_HOME_NUMBER, then when filling the form
+ // we fill only the prefix depending on the size of the input field.
+ ok = ok && Add(field_type_map,
+ prefix_,
+ AutoFillType(PHONE_HOME_NUMBER));
+ DCHECK(ok);
+ // We tag the suffix as PHONE_HOME_NUMBER, then when filling the form
+ // we fill only the suffix depending on the size of the input field.
+ ok = ok && Add(field_type_map,
+ phone_,
+ AutoFillType(PHONE_HOME_NUMBER));
+ DCHECK(ok);
+ } else {
+ ok = ok && Add(field_type_map, phone_, AutoFillType(PHONE_HOME_NUMBER));
+ DCHECK(ok);
+ }
} else {
ok = Add(field_type_map, phone_, AutoFillType(PHONE_HOME_WHOLE_NUMBER));
DCHECK(ok);
diff --git a/chrome/browser/autofill/phone_field_unittest.cc b/chrome/browser/autofill/phone_field_unittest.cc
index f2fa01f..bf7d9fb 100644
--- a/chrome/browser/autofill/phone_field_unittest.cc
+++ b/chrome/browser/autofill/phone_field_unittest.cc
@@ -44,7 +44,8 @@ TEST_F(PhoneFieldTest, ParseOneLinePhone) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
ASCIIToUTF16("phone"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("phone1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -61,7 +62,8 @@ TEST_F(PhoneFieldTest, ParseOneLinePhoneEcml) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
kEcmlShipToPhone,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("phone1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -78,13 +80,15 @@ TEST_F(PhoneFieldTest, ParseTwoLinePhone) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Area Code"),
ASCIIToUTF16("area code"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("areacode1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
ASCIIToUTF16("phone"),
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("phone1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -104,13 +108,15 @@ TEST_F(PhoneFieldTest, ParseTwoLinePhoneEcmlShipTo) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Area Code"),
kEcmlShipToPostalCode,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("areacode1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
kEcmlShipToPhone,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("phone1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -130,13 +136,15 @@ TEST_F(PhoneFieldTest, ParseTwoLinePhoneEcmlBillTo) {
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Area Code"),
kEcmlBillToPostalCode,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("areacode1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Phone"),
kEcmlBillToPhone,
string16(),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
ASCIIToUTF16("phone1")));
list_.push_back(NULL);
iter_ = list_.begin();
@@ -151,4 +159,49 @@ TEST_F(PhoneFieldTest, ParseTwoLinePhoneEcmlBillTo) {
EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("phone1")]);
}
+TEST_F(PhoneFieldTest, ThreePartPhoneNumber) {
+ list_.push_back(
+ new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("Phone:"),
+ ASCIIToUTF16("dayphone1"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ ASCIIToUTF16("areacode1")));
+ list_.push_back(
+ new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone2"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ ASCIIToUTF16("prefix1")));
+ list_.push_back(
+ new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone3"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ ASCIIToUTF16("suffix1")));
+ list_.push_back(
+ new AutoFillField(webkit_glue::FormField(ASCIIToUTF16("ext.:"),
+ ASCIIToUTF16("dayphone4"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ ASCIIToUTF16("ext1")));
+ list_.push_back(NULL);
+ iter_ = list_.begin();
+ field_.reset(PhoneField::Parse(&iter_, false));
+ ASSERT_NE(static_cast<PhoneField*>(NULL), field_.get());
+ ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
+ ASSERT_TRUE(
+ field_type_map_.find(ASCIIToUTF16("areacode1")) != field_type_map_.end());
+ EXPECT_EQ(PHONE_HOME_CITY_CODE, field_type_map_[ASCIIToUTF16("areacode1")]);
+ ASSERT_TRUE(
+ field_type_map_.find(ASCIIToUTF16("prefix1")) != field_type_map_.end());
+ EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("prefix1")]);
+ ASSERT_TRUE(
+ field_type_map_.find(ASCIIToUTF16("suffix1")) != field_type_map_.end());
+ EXPECT_EQ(PHONE_HOME_NUMBER, field_type_map_[ASCIIToUTF16("suffix1")]);
+}
+
} // namespace
diff --git a/chrome/browser/webdata/web_data_service_unittest.cc b/chrome/browser/webdata/web_data_service_unittest.cc
index c11d4b7..0dc7df3 100644
--- a/chrome/browser/webdata/web_data_service_unittest.cc
+++ b/chrome/browser/webdata/web_data_service_unittest.cc
@@ -133,7 +133,8 @@ class WebDataServiceAutofillTest : public WebDataServiceTest {
webkit_glue::FormField(string16(),
name,
value,
- string16()));
+ string16(),
+ 0));
}
string16 name1_;
diff --git a/chrome/browser/webdata/web_database_unittest.cc b/chrome/browser/webdata/web_database_unittest.cc
index e1b58c5..6e7e523 100644
--- a/chrome/browser/webdata/web_database_unittest.cc
+++ b/chrome/browser/webdata/web_database_unittest.cc
@@ -479,7 +479,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes));
std::vector<string16> v;
for (int i = 0; i < 5; i++) {
@@ -487,7 +488,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Clark Kent"),
- string16()),
+ string16(),
+ 0),
&changes));
}
for (int i = 0; i < 3; i++) {
@@ -495,7 +497,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Clark Sutter"),
- string16()),
+ string16(),
+ 0),
&changes));
}
for (int i = 0; i < 2; i++) {
@@ -503,7 +506,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Favorite Color"),
ASCIIToUTF16("Green"),
- string16()),
+ string16(),
+ 0),
&changes));
}
@@ -516,7 +520,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Clark Kent"),
- string16()),
+ string16(),
+ 0),
&pair_id, &count));
EXPECT_EQ(5, count);
EXPECT_NE(0, pair_id);
@@ -527,7 +532,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("clark kent"),
- string16()),
+ string16(),
+ 0),
&pair_id, &count));
EXPECT_EQ(0, count);
@@ -535,7 +541,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Favorite Color"),
ASCIIToUTF16("Green"),
- string16()),
+ string16(),
+ 0),
&pair_id, &count));
EXPECT_EQ(2, count);
@@ -599,7 +606,8 @@ TEST_F(WebDatabaseTest, Autofill) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Clark Kent"),
- string16()),
+ string16(),
+ 0),
&pair_id, &count));
EXPECT_EQ(0, count);
@@ -612,22 +620,26 @@ TEST_F(WebDatabaseTest, Autofill) {
EXPECT_TRUE(db.AddFormFieldValue(FormField(string16(),
ASCIIToUTF16("blank"),
string16(),
- string16()),
+ string16(),
+ 0),
&changes));
EXPECT_TRUE(db.AddFormFieldValue(FormField(string16(),
ASCIIToUTF16("blank"),
ASCIIToUTF16(" "),
- string16()),
+ string16(),
+ 0),
&changes));
EXPECT_TRUE(db.AddFormFieldValue(FormField(string16(),
ASCIIToUTF16("blank"),
ASCIIToUTF16(" "),
- string16()),
+ string16(),
+ 0),
&changes));
EXPECT_TRUE(db.AddFormFieldValue(FormField(string16(),
ASCIIToUTF16("blank"),
kValue,
- string16()),
+ string16(),
+ 0),
&changes));
// They should be stored normally as the DB layer does not check for empty
@@ -661,14 +673,16 @@ TEST_F(WebDatabaseTest, Autofill_RemoveBetweenChanges) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes,
t1));
EXPECT_TRUE(db.AddFormFieldValueTime(
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes,
t2));
@@ -702,7 +716,8 @@ TEST_F(WebDatabaseTest, Autofill_AddChanges) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes,
t1));
ASSERT_EQ(1U, changes.size());
@@ -716,7 +731,8 @@ TEST_F(WebDatabaseTest, Autofill_AddChanges) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes,
t2));
ASSERT_EQ(1U, changes.size());
@@ -738,7 +754,8 @@ TEST_F(WebDatabaseTest, Autofill_UpdateOneWithOneTimestamp) {
FormField field(string16(),
ASCIIToUTF16("foo"),
ASCIIToUTF16("bar"),
- string16());
+ string16(),
+ 0);
int64 pair_id;
int count;
ASSERT_TRUE(db.GetIDAndCountOfFormElement(field, &pair_id, &count));
@@ -763,7 +780,8 @@ TEST_F(WebDatabaseTest, Autofill_UpdateOneWithTwoTimestamps) {
FormField field(string16(),
ASCIIToUTF16("foo"),
ASCIIToUTF16("bar"),
- string16());
+ string16(),
+ 0);
int64 pair_id;
int count;
ASSERT_TRUE(db.GetIDAndCountOfFormElement(field, &pair_id, &count));
@@ -808,7 +826,8 @@ TEST_F(WebDatabaseTest, Autofill_UpdateTwo) {
FormField field0(string16(),
ASCIIToUTF16("foo"),
ASCIIToUTF16("bar0"),
- string16());
+ string16(),
+ 0);
int64 pair_id;
int count;
ASSERT_TRUE(db.GetIDAndCountOfFormElement(field0, &pair_id, &count));
@@ -818,7 +837,8 @@ TEST_F(WebDatabaseTest, Autofill_UpdateTwo) {
FormField field1(string16(),
ASCIIToUTF16("foo"),
ASCIIToUTF16("bar1"),
- string16());
+ string16(),
+ 0);
ASSERT_TRUE(db.GetIDAndCountOfFormElement(field1, &pair_id, &count));
EXPECT_LE(0, pair_id);
EXPECT_EQ(2, count);
@@ -834,7 +854,8 @@ TEST_F(WebDatabaseTest, Autofill_UpdateReplace) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes));
AutofillEntry entry(MakeAutofillEntry("Name", "Superman", 1, 2));
@@ -862,7 +883,8 @@ TEST_F(WebDatabaseTest, Autofill_UpdateDontReplace) {
FormField(string16(),
existing.key().name(),
existing.key().value(),
- string16()),
+ string16(),
+ 0),
&changes,
t));
AutofillEntry entry(MakeAutofillEntry("Name", "Clark Kent", 1, 2));
@@ -1231,7 +1253,8 @@ TEST_F(WebDatabaseTest, Autofill_GetAllAutofillEntries_OneResult) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes,
Time::FromTimeT(start)));
timestamps1.push_back(Time::FromTimeT(start));
@@ -1274,7 +1297,8 @@ TEST_F(WebDatabaseTest, Autofill_GetAllAutofillEntries_TwoDistinct) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes,
Time::FromTimeT(start)));
timestamps1.push_back(Time::FromTimeT(start));
@@ -1288,7 +1312,8 @@ TEST_F(WebDatabaseTest, Autofill_GetAllAutofillEntries_TwoDistinct) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Clark Kent"),
- string16()),
+ string16(),
+ 0),
&changes,
Time::FromTimeT(start)));
timestamps2.push_back(Time::FromTimeT(start));
@@ -1335,7 +1360,8 @@ TEST_F(WebDatabaseTest, Autofill_GetAllAutofillEntries_TwoSame) {
FormField(string16(),
ASCIIToUTF16("Name"),
ASCIIToUTF16("Superman"),
- string16()),
+ string16(),
+ 0),
&changes,
Time::FromTimeT(start)));
timestamps.push_back(Time::FromTimeT(start));
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h
index 14fc353..ca7659d 100644
--- a/chrome/common/render_messages.h
+++ b/chrome/common/render_messages.h
@@ -863,13 +863,16 @@ struct ParamTraits<webkit_glue::FormField> {
WriteParam(m, p.name());
WriteParam(m, p.value());
WriteParam(m, p.form_control_type());
+ WriteParam(m, p.size());
}
static bool Read(const Message* m, void** iter, param_type* p) {
string16 label, name, value, form_control_type;
+ int size = 0;
bool result = ReadParam(m, iter, &label);
result = result && ReadParam(m, iter, &name);
result = result && ReadParam(m, iter, &value);
result = result && ReadParam(m, iter, &form_control_type);
+ result = result && ReadParam(m, iter, &size);
if (!result)
return false;
@@ -877,6 +880,7 @@ struct ParamTraits<webkit_glue::FormField> {
p->set_name(name);
p->set_value(value);
p->set_form_control_type(form_control_type);
+ p->set_size(size);
return true;
}
static void Log(const param_type& p, std::wstring* l) {
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc
index ebdccbc..12b6353 100644
--- a/chrome/renderer/form_manager.cc
+++ b/chrome/renderer/form_manager.cc
@@ -102,6 +102,11 @@ void FormManager::WebFormControlElementToFormField(
field->set_name(element.nameForAutofill());
field->set_form_control_type(element.formControlType());
+ if (element.formControlType() == WebString::fromUTF8("text")) {
+ const WebInputElement& input_element = element.toConst<WebInputElement>();
+ field->set_size(input_element.size());
+ }
+
if (!get_value)
return;
@@ -586,6 +591,24 @@ string16 FormManager::InferLabelForElement(
}
}
}
+
+ // Look for text node prior to <img> tag.
+ // Eg. Some Text<img/><input ...>
+ if (inferred_label.empty()) {
+ while (inferred_label.empty() && !previous.isNull()) {
+ if (previous.isTextNode()) {
+ inferred_label = previous.nodeValue();
+ TrimWhitespace(inferred_label, TRIM_ALL, &inferred_label);
+ } else if (previous.isElementNode()) {
+ WebElement element = previous.to<WebElement>();
+ if (!element.hasTagName("img"))
+ break;
+ } else {
+ break;
+ }
+ previous = previous.previousSibling();
+ }
+ }
}
// If we didn't find paragraph, check for table cell case.
diff --git a/chrome/renderer/form_manager_unittest.cc b/chrome/renderer/form_manager_unittest.cc
index 2a5ca77..74d25be 100644
--- a/chrome/renderer/form_manager_unittest.cc
+++ b/chrome/renderer/form_manager_unittest.cc
@@ -55,18 +55,21 @@ TEST_F(FormManagerTest, WebFormElementToFormData) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, ExtractForms) {
@@ -96,18 +99,21 @@ TEST_F(FormManagerTest, ExtractForms) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, ExtractMultipleForms) {
@@ -141,13 +147,15 @@ TEST_F(FormManagerTest, ExtractMultipleForms) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[1]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[1]);
// Second form.
const FormData& form2 = forms[1];
@@ -160,12 +168,14 @@ TEST_F(FormManagerTest, ExtractMultipleForms) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("second"),
ASCIIToUTF16("Submit"),
- ASCIIToUTF16("submit")),
+ ASCIIToUTF16("submit"),
+ 0),
fields2[1]);
}
@@ -221,13 +231,15 @@ TEST_F(FormManagerTest, GetFormsAutocomplete) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[1]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[1]);
}
TEST_F(FormManagerTest, GetFormsElementsEnabled) {
@@ -258,13 +270,15 @@ TEST_F(FormManagerTest, GetFormsElementsEnabled) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("submit"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[1]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[1]);
}
TEST_F(FormManagerTest, FindForm) {
@@ -302,18 +316,21 @@ TEST_F(FormManagerTest, FindForm) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, FillForm) {
@@ -351,18 +368,21 @@ TEST_F(FormManagerTest, FillForm) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Wyatt"));
@@ -382,17 +402,20 @@ TEST_F(FormManagerTest, FillForm) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Wyatt"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Earp"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
+ ASCIIToUTF16("submit"),
+ 0),
fields2[2]);
}
@@ -450,18 +473,21 @@ TEST_F(FormManagerTest, Labels) {
EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, LabelsWithSpans) {
@@ -493,18 +519,21 @@ TEST_F(FormManagerTest, LabelsWithSpans) {
EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
// This test is different from FormManagerTest.Labels in that the label elements
@@ -540,18 +569,21 @@ TEST_F(FormManagerTest, InvalidLabels) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
// This test has three form control elements, only one of which has a label
@@ -588,18 +620,21 @@ TEST_F(FormManagerTest, OneLabelElementFirstControlElementDisabled) {
EXPECT_EQ(FormField(ASCIIToUTF16("Middle name:"),
ASCIIToUTF16("middlename"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, LabelsInferredFromText) {
@@ -631,18 +666,21 @@ TEST_F(FormManagerTest, LabelsInferredFromText) {
EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, LabelsInferredFromParagraph) {
@@ -674,18 +712,21 @@ TEST_F(FormManagerTest, LabelsInferredFromParagraph) {
EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, LabelsInferredFromTableCell) {
@@ -728,18 +769,21 @@ TEST_F(FormManagerTest, LabelsInferredFromTableCell) {
EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
TEST_F(FormManagerTest, LabelsInferredFromTableCellNested) {
@@ -801,21 +845,24 @@ TEST_F(FormManagerTest, LabelsInferredFromTableCellNested) {
EXPECT_EQ(FormField(ASCIIToUTF16("First name:"),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("John"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Smith"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
}
-TEST_F(FormManagerTest, InferredLabelsWithSameName) {
+TEST_F(FormManagerTest, LabelsInferredWithSameName) {
LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
" Address Line 1:"
" <INPUT type=\"text\" name=\"Address\"/>"
@@ -844,18 +891,95 @@ TEST_F(FormManagerTest, InferredLabelsWithSameName) {
EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 1:"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 2:"),
ASCIIToUTF16("Address"),
string16(),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
+}
+
+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,
+ true,
+ &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"),
+ 0),
+ fields[0]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone2"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone3"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[2]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("ext.:"),
+ ASCIIToUTF16("dayphone4"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[3]);
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("dummy"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[4]);
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("reply-send"),
+ ASCIIToUTF16("Send"),
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[5]);
}
TEST_F(FormManagerTest, FillFormMaxLength) {
@@ -893,18 +1017,21 @@ TEST_F(FormManagerTest, FillFormMaxLength) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Brother"));
@@ -925,19 +1052,22 @@ TEST_F(FormManagerTest, FillFormMaxLength) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Broth"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[0]);
EXPECT_EQ(ASCIIToUTF16("Broth"), fields2[0].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Jonat"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[1]);
EXPECT_EQ(ASCIIToUTF16("Jonat"), fields2[1].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
+ ASCIIToUTF16("submit"),
+ 0),
fields2[2]);
}
@@ -979,18 +1109,21 @@ TEST_F(FormManagerTest, FillFormNegativeMaxLength) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Brother"));
@@ -1012,19 +1145,22 @@ TEST_F(FormManagerTest, FillFormNegativeMaxLength) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Brother"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[0]);
EXPECT_EQ(ASCIIToUTF16("Brother"), fields2[0].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Jonathan"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[1]);
EXPECT_EQ(ASCIIToUTF16("Jonathan"), fields2[1].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
+ ASCIIToUTF16("submit"),
+ 0),
fields2[2]);
}
@@ -1063,25 +1199,29 @@ TEST_F(FormManagerTest, FillFormMoreFormDataFields) {
FormField field1(string16(),
ASCIIToUTF16("prefix"),
string16(),
- ASCIIToUTF16("text"));
+ ASCIIToUTF16("text"),
+ 0);
form->fields.insert(form->fields.begin(), field1);
FormField field2(string16(),
ASCIIToUTF16("hidden"),
string16(),
- ASCIIToUTF16("text"));
+ ASCIIToUTF16("text"),
+ 0);
form->fields.insert(form->fields.begin() + 2, field2);
FormField field3(string16(),
ASCIIToUTF16("second"),
string16(),
- ASCIIToUTF16("text"));
+ ASCIIToUTF16("text"),
+ 0);
form->fields.insert(form->fields.begin() + 4, field3);
FormField field4(string16(),
ASCIIToUTF16("postfix"),
string16(),
- ASCIIToUTF16("text"));
+ ASCIIToUTF16("text"),
+ 0);
form->fields.insert(form->fields.begin() + 6, field4);
// Fill the form.
@@ -1113,26 +1253,30 @@ TEST_F(FormManagerTest, FillFormMoreFormDataFields) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Brother"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(ASCIIToUTF16("Brother"), fields[0].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("middlename"),
ASCIIToUTF16("Joseph"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(ASCIIToUTF16("Joseph"), fields[1].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Jonathan"),
- ASCIIToUTF16("text")),
- fields[2]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[2]);
EXPECT_EQ(ASCIIToUTF16("Jonathan"), fields[2].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[3]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[3]);
}
// This test sends a FormData object to FillForm with fewer fields than are in
@@ -1196,50 +1340,58 @@ TEST_F(FormManagerTest, FillFormFewerFormDataFields) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("prefix"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(string16(), fields[0].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Brother"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(ASCIIToUTF16("Brother"), fields[1].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("hidden"),
string16(),
- ASCIIToUTF16("text")),
- fields[2]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[2]);
EXPECT_EQ(string16(), fields[2].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("middlename"),
ASCIIToUTF16("Joseph"),
- ASCIIToUTF16("text")),
- fields[3]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[3]);
EXPECT_EQ(ASCIIToUTF16("Joseph"), fields[3].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("second"),
string16(),
- ASCIIToUTF16("text")),
- fields[4]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[4]);
EXPECT_EQ(string16(), fields[4].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Jonathan"),
- ASCIIToUTF16("text")),
- fields[5]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[5]);
EXPECT_EQ(ASCIIToUTF16("Jonathan"), fields[5].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("postfix"),
string16(),
- ASCIIToUTF16("text")),
- fields[6]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[6]);
EXPECT_EQ(string16(), fields[6].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[7]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[7]);
}
// This test sends a FormData object to FillForm with fewer fields than are in
@@ -1297,32 +1449,37 @@ TEST_F(FormManagerTest, FillFormExtraFieldInCache) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Brother"),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(ASCIIToUTF16("Brother"), fields[0].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("middlename"),
ASCIIToUTF16("Joseph"),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(ASCIIToUTF16("Joseph"), fields[1].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Jonathan"),
- ASCIIToUTF16("text")),
- fields[2]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[2]);
EXPECT_EQ(ASCIIToUTF16("Jonathan"), fields[2].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("postfix"),
string16(),
- ASCIIToUTF16("text")),
- fields[3]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[3]);
EXPECT_EQ(string16(), fields[3].value());
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("reply-send"),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[4]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[4]);
}
TEST_F(FormManagerTest, FillFormEmptyName) {
@@ -1360,18 +1517,21 @@ TEST_F(FormManagerTest, FillFormEmptyName) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
string16(),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
string16(),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Wyatt"));
@@ -1391,17 +1551,20 @@ TEST_F(FormManagerTest, FillFormEmptyName) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("firstname"),
ASCIIToUTF16("Wyatt"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("lastname"),
ASCIIToUTF16("Earp"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[1]);
EXPECT_EQ(FormField(string16(),
string16(),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
+ ASCIIToUTF16("submit"),
+ 0),
fields2[2]);
}
@@ -1446,18 +1609,21 @@ TEST_F(FormManagerTest, FillFormEmptyFormNames) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("apple"),
string16(),
- ASCIIToUTF16("text")),
- fields[0]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("banana"),
string16(),
- ASCIIToUTF16("text")),
- fields[1]);
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
EXPECT_EQ(FormField(string16(),
string16(),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
- fields[2]);
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[2]);
// Fill the form.
form.fields[0].set_value(ASCIIToUTF16("Red"));
@@ -1477,18 +1643,166 @@ TEST_F(FormManagerTest, FillFormEmptyFormNames) {
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("apple"),
ASCIIToUTF16("Red"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[0]);
EXPECT_EQ(FormField(string16(),
ASCIIToUTF16("banana"),
ASCIIToUTF16("Yellow"),
- ASCIIToUTF16("text")),
+ ASCIIToUTF16("text"),
+ 0),
fields2[1]);
EXPECT_EQ(FormField(string16(),
string16(),
ASCIIToUTF16("Send"),
- ASCIIToUTF16("submit")),
+ ASCIIToUTF16("submit"),
+ 0),
fields2[2]);
}
+TEST_F(FormManagerTest, ThreePartPhone) {
+ LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " Phone:"
+ " <input type=\"text\" name=\"dayphone1\">"
+ " -"
+ " <input type=\"text\" name=\"dayphone2\">"
+ " -"
+ " <input type=\"text\" name=\"dayphone3\">"
+ " ext.:"
+ " <input type=\"text\" name=\"dayphone4\">"
+ " <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,
+ true,
+ &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(5U, fields.size());
+ EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"),
+ ASCIIToUTF16("dayphone1"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[0]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone2"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[1]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone3"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[2]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("ext.:"),
+ ASCIIToUTF16("dayphone4"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 0),
+ fields[3]);
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("reply-send"),
+ ASCIIToUTF16("Send"),
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[4]);
+}
+
+
+TEST_F(FormManagerTest, SizeFields) {
+ LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " Phone:"
+ " <input type=\"text\" size=\"3\" name=\"dayphone1\">"
+ " -"
+ " <input type=\"text\" size=\"3\" name=\"dayphone2\">"
+ " -"
+ " <input type=\"text\" size=\"4\" name=\"dayphone3\">"
+ " ext.:"
+ " <input type=\"text\" size=\"5\" name=\"dayphone4\">"
+ " <input type=\"text\" name=\"default1\">"
+ " <input type=\"text\" size=\"-1\" name=\"invalid1\">"
+ " <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,
+ true,
+ &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(7U, fields.size());
+ EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"),
+ ASCIIToUTF16("dayphone1"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 3),
+ fields[0]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone2"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 3),
+ fields[1]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("-"),
+ ASCIIToUTF16("dayphone3"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 4),
+ fields[2]);
+ EXPECT_EQ(FormField(ASCIIToUTF16("ext.:"),
+ ASCIIToUTF16("dayphone4"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 5),
+ fields[3]);
+ // When unspecified |size|, default is 20.
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("default1"),
+ string16(),
+ ASCIIToUTF16("text"),
+ 20),
+ fields[4]);
+ // When invalid |size| same value is returned.
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("invalid1"),
+ string16(),
+ ASCIIToUTF16("text"),
+ -1),
+ fields[5]);
+ EXPECT_EQ(FormField(string16(),
+ ASCIIToUTF16("reply-send"),
+ ASCIIToUTF16("Send"),
+ ASCIIToUTF16("submit"),
+ 0),
+ fields[6]);
+}
+
} // namespace
diff --git a/webkit/glue/form_field.cc b/webkit/glue/form_field.cc
index 069c6c3..250f04a 100644
--- a/webkit/glue/form_field.cc
+++ b/webkit/glue/form_field.cc
@@ -15,12 +15,14 @@ using WebKit::WebSelectElement;
namespace webkit_glue {
-FormField::FormField() {
+FormField::FormField()
+ : size_(0) {
}
// TODO(jhawkins): This constructor should probably be deprecated and the
// functionality moved to FormManager.
-FormField::FormField(WebFormControlElement element) {
+FormField::FormField(WebFormControlElement element)
+ : size_(0) {
name_ = element.nameForAutofill();
// TODO(jhawkins): Extract the field label. For now we just use the field
@@ -31,6 +33,7 @@ FormField::FormField(WebFormControlElement element) {
if (form_control_type_ == ASCIIToUTF16("text")) {
const WebInputElement& input_element = element.toConst<WebInputElement>();
value_ = input_element.value();
+ size_ = input_element.size();
} else if (form_control_type_ == ASCIIToUTF16("select-one")) {
WebSelectElement select_element = element.to<WebSelectElement>();
value_ = select_element.value();
@@ -42,16 +45,18 @@ FormField::FormField(WebFormControlElement element) {
FormField::FormField(const string16& label,
const string16& name,
const string16& value,
- const string16& form_control_type)
+ const string16& form_control_type,
+ int size)
: label_(label),
name_(name),
value_(value),
- form_control_type_(form_control_type) {
+ form_control_type_(form_control_type),
+ size_(size) {
}
bool FormField::operator==(const FormField& field) const {
// A FormField stores a value, but the value is not part of the identity of
- // the field, so we don't want to compare the values.
+ // the field, so we don't want to compare the values. Same goes for |size_|.
return (label_ == field.label_ &&
name_ == field.name_ &&
form_control_type_ == field.form_control_type_);
@@ -69,7 +74,9 @@ std::ostream& operator<<(std::ostream& os, const FormField& field) {
<< " "
<< UTF16ToUTF8(field.value())
<< " "
- << UTF16ToUTF8(field.form_control_type());
+ << UTF16ToUTF8(field.form_control_type())
+ << " "
+ << field.size();
}
} // namespace webkit_glue
diff --git a/webkit/glue/form_field.h b/webkit/glue/form_field.h
index 3ea7de9..b0e9dec 100644
--- a/webkit/glue/form_field.h
+++ b/webkit/glue/form_field.h
@@ -18,12 +18,14 @@ class FormField {
FormField(const string16& label,
const string16& name,
const string16& value,
- const string16& form_control_type);
+ const string16& form_control_type,
+ int size);
const string16& label() const { return label_; }
const string16& name() const { return name_; }
const string16& value() const { return value_; }
const string16& form_control_type() const { return form_control_type_; }
+ int size() const { return size_; }
void set_label(const string16& label) { label_ = label; }
void set_name(const string16& name) { name_ = name; }
@@ -31,6 +33,7 @@ class FormField {
void set_form_control_type(const string16& form_control_type) {
form_control_type_ = form_control_type;
}
+ void set_size(int size) { size_ = size; }
bool operator==(const FormField& field) const;
bool operator!=(const FormField& field) const;
@@ -40,6 +43,7 @@ class FormField {
string16 name_;
string16 value_;
string16 form_control_type_;
+ int size_;
};
// So we can compare FormFields with EXPECT_EQ().
diff --git a/webkit/glue/password_form_dom_manager.cc b/webkit/glue/password_form_dom_manager.cc
index 62f1f46..5db9138 100644
--- a/webkit/glue/password_form_dom_manager.cc
+++ b/webkit/glue/password_form_dom_manager.cc
@@ -37,16 +37,20 @@ void PasswordFormDomManager::InitFillData(
// TODO(jhawkins): Is it right to use an empty string for the form control
// type? I don't think the password autocomplete really cares, but we should
// correct this anyway.
+ // TODO(dhollowa): Similarly, |size| ideally should be set from the form
+ // control itself. But it is currently unused.
result->basic_data.fields.push_back(
FormField(string16(),
form_on_page.username_element,
preferred_match->username_value,
- string16()));
+ string16(),
+ 0));
result->basic_data.fields.push_back(
FormField(string16(),
form_on_page.password_element,
preferred_match->password_value,
- string16()));
+ string16(),
+ 0));
result->wait_for_username = wait_for_username_before_autofill;
// Copy additional username/value pairs.