| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/autofill/core/browser/autofill_field.h" | |
| 6 | |
| 7 #include "base/format_macros.h" | 5 #include "base/format_macros.h" |
| 8 #include "base/strings/string_util.h" | 6 #include "base/strings/string_util.h" |
| 9 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "components/autofill/core/browser/autofill_field.h" |
| 11 #include "components/autofill/core/browser/autofill_type.h" | 10 #include "components/autofill/core/browser/autofill_type.h" |
| 12 #include "components/autofill/core/browser/field_types.h" | 11 #include "components/autofill/core/browser/field_types.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 13 |
| 15 using base::ASCIIToUTF16; | 14 using base::ASCIIToUTF16; |
| 16 using base::UTF8ToUTF16; | |
| 17 | 15 |
| 18 namespace autofill { | 16 namespace autofill { |
| 19 namespace { | 17 namespace { |
| 20 | 18 |
| 21 // Returns a FormFieldData object corresponding to a <select> field populated | 19 // Returns a FormFieldData object corresponding to a <select> field populated |
| 22 // with the given |options|. | 20 // with the given |options|. |
| 23 FormFieldData GenerateSelectFieldWithOptions(const char* const* options, | 21 FormFieldData GenerateSelectFieldWithOptions(const char* const* options, |
| 24 size_t options_size) { | 22 size_t options_size) { |
| 25 std::vector<base::string16> options16(options_size); | 23 std::vector<base::string16> options16(options_size); |
| 26 for (size_t i = 0; i < options_size; ++i) { | 24 for (size_t i = 0; i < options_size; ++i) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // Field has autocomplete="off" set. | 117 // Field has autocomplete="off" set. |
| 120 field.should_autocomplete = false; | 118 field.should_autocomplete = false; |
| 121 EXPECT_FALSE(field.IsFieldFillable()); | 119 EXPECT_FALSE(field.IsFieldFillable()); |
| 122 } | 120 } |
| 123 | 121 |
| 124 TEST(AutofillFieldTest, FillPhoneNumber) { | 122 TEST(AutofillFieldTest, FillPhoneNumber) { |
| 125 AutofillField field; | 123 AutofillField field; |
| 126 field.SetHtmlType(HTML_TYPE_TEL_LOCAL_PREFIX, HtmlFieldMode()); | 124 field.SetHtmlType(HTML_TYPE_TEL_LOCAL_PREFIX, HtmlFieldMode()); |
| 127 | 125 |
| 128 // Fill with a non-phone number; should fill normally. | 126 // Fill with a non-phone number; should fill normally. |
| 129 AutofillField::FillFormField( | 127 AutofillField::FillFormField(field, ASCIIToUTF16("Oh hai"), "en-US", &field); |
| 130 field, ASCIIToUTF16("Oh hai"), "en-US", "en-US", &field); | |
| 131 EXPECT_EQ(ASCIIToUTF16("Oh hai"), field.value); | 128 EXPECT_EQ(ASCIIToUTF16("Oh hai"), field.value); |
| 132 | 129 |
| 133 // Fill with a phone number; should fill just the prefix. | 130 // Fill with a phone number; should fill just the prefix. |
| 134 AutofillField::FillFormField( | 131 AutofillField::FillFormField(field, ASCIIToUTF16("5551234"), "en-US", &field); |
| 135 field, ASCIIToUTF16("5551234"), "en-US", "en-US", &field); | |
| 136 EXPECT_EQ(ASCIIToUTF16("555"), field.value); | 132 EXPECT_EQ(ASCIIToUTF16("555"), field.value); |
| 137 | 133 |
| 138 // Now reset the type, and set a max-length instead. | 134 // Now reset the type, and set a max-length instead. |
| 139 field.SetHtmlType(HTML_TYPE_UNKNOWN, HtmlFieldMode()); | 135 field.SetHtmlType(HTML_TYPE_UNKNOWN, HtmlFieldMode()); |
| 140 field.set_heuristic_type(PHONE_HOME_NUMBER); | 136 field.set_heuristic_type(PHONE_HOME_NUMBER); |
| 141 field.max_length = 4; | 137 field.max_length = 4; |
| 142 | 138 |
| 143 // Fill with a phone-number; should fill just the suffix. | 139 // Fill with a phone-number; should fill just the suffix. |
| 144 AutofillField::FillFormField( | 140 AutofillField::FillFormField(field, ASCIIToUTF16("5551234"), "en-US", &field); |
| 145 field, ASCIIToUTF16("5551234"), "en-US", "en-US", &field); | |
| 146 EXPECT_EQ(ASCIIToUTF16("1234"), field.value); | 141 EXPECT_EQ(ASCIIToUTF16("1234"), field.value); |
| 147 } | 142 } |
| 148 | 143 |
| 149 TEST(AutofillFieldTest, FillSelectControlByValue) { | 144 TEST(AutofillFieldTest, FillSelectControlByValue) { |
| 150 const char* const kOptions[] = { | 145 const char* const kOptions[] = { |
| 151 "Eenie", "Meenie", "Miney", "Mo", | 146 "Eenie", "Meenie", "Miney", "Mo", |
| 152 }; | 147 }; |
| 153 AutofillField field( | 148 AutofillField field( |
| 154 GenerateSelectFieldWithOptions(kOptions, arraysize(kOptions)), | 149 GenerateSelectFieldWithOptions(kOptions, arraysize(kOptions)), |
| 155 base::string16()); | 150 base::string16()); |
| 156 | 151 |
| 157 // Set semantically empty contents for each option, so that only the values | 152 // Set semantically empty contents for each option, so that only the values |
| 158 // can be used for matching. | 153 // can be used for matching. |
| 159 for (size_t i = 0; i < field.option_contents.size(); ++i) { | 154 for (size_t i = 0; i < field.option_contents.size(); ++i) { |
| 160 field.option_contents[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i)); | 155 field.option_contents[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i)); |
| 161 } | 156 } |
| 162 | 157 |
| 163 AutofillField::FillFormField( | 158 AutofillField::FillFormField(field, ASCIIToUTF16("Meenie"), "en-US", |
| 164 field, ASCIIToUTF16("Meenie"), "en-US", "en-US", &field); | 159 &field); |
| 165 EXPECT_EQ(ASCIIToUTF16("Meenie"), field.value); | 160 EXPECT_EQ(ASCIIToUTF16("Meenie"), field.value); |
| 166 } | 161 } |
| 167 | 162 |
| 168 TEST(AutofillFieldTest, FillSelectControlByContents) { | 163 TEST(AutofillFieldTest, FillSelectControlByContents) { |
| 169 const char* const kOptions[] = { | 164 const char* const kOptions[] = { |
| 170 "Eenie", "Meenie", "Miney", "Mo", | 165 "Eenie", "Meenie", "Miney", "Mo", |
| 171 }; | 166 }; |
| 172 AutofillField field( | 167 AutofillField field( |
| 173 GenerateSelectFieldWithOptions(kOptions, arraysize(kOptions)), | 168 GenerateSelectFieldWithOptions(kOptions, arraysize(kOptions)), |
| 174 base::string16()); | 169 base::string16()); |
| 175 | 170 |
| 176 // Set semantically empty values for each option, so that only the contents | 171 // Set semantically empty values for each option, so that only the contents |
| 177 // can be used for matching. | 172 // can be used for matching. |
| 178 for (size_t i = 0; i < field.option_values.size(); ++i) { | 173 for (size_t i = 0; i < field.option_values.size(); ++i) { |
| 179 field.option_values[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i)); | 174 field.option_values[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i)); |
| 180 } | 175 } |
| 181 | 176 |
| 182 AutofillField::FillFormField( | 177 AutofillField::FillFormField(field, ASCIIToUTF16("Miney"), "en-US", |
| 183 field, ASCIIToUTF16("Miney"), "en-US", "en-US", &field); | 178 &field); |
| 184 EXPECT_EQ(ASCIIToUTF16("2"), field.value); // Corresponds to "Miney". | 179 EXPECT_EQ(ASCIIToUTF16("2"), field.value); // Corresponds to "Miney". |
| 185 } | 180 } |
| 186 | 181 |
| 187 TEST(AutofillFieldTest, FillSelectControlWithFullCountryNames) { | 182 TEST(AutofillFieldTest, FillSelectControlWithFullCountryNames) { |
| 188 const char* const kCountries[] = { | 183 const char* const kCountries[] = { |
| 189 "Albania", "Canada" | 184 "Albania", "Canada" |
| 190 }; | 185 }; |
| 191 AutofillField field( | 186 AutofillField field( |
| 192 GenerateSelectFieldWithOptions(kCountries, arraysize(kCountries)), | 187 GenerateSelectFieldWithOptions(kCountries, arraysize(kCountries)), |
| 193 base::string16()); | 188 base::string16()); |
| 194 field.set_heuristic_type(ADDRESS_HOME_COUNTRY); | 189 field.set_heuristic_type(ADDRESS_HOME_COUNTRY); |
| 195 | 190 |
| 196 AutofillField::FillFormField( | 191 AutofillField::FillFormField(field, ASCIIToUTF16("CA"), "en-US", &field); |
| 197 field, ASCIIToUTF16("CA"), "en-US", "en-US", &field); | |
| 198 EXPECT_EQ(ASCIIToUTF16("Canada"), field.value); | 192 EXPECT_EQ(ASCIIToUTF16("Canada"), field.value); |
| 199 } | 193 } |
| 200 | 194 |
| 201 TEST(AutofillFieldTest, FillSelectControlWithAbbreviatedCountryNames) { | 195 TEST(AutofillFieldTest, FillSelectControlWithAbbreviatedCountryNames) { |
| 202 const char* const kCountries[] = { | 196 const char* const kCountries[] = { |
| 203 "AL", "CA" | 197 "AL", "CA" |
| 204 }; | 198 }; |
| 205 AutofillField field( | 199 AutofillField field( |
| 206 GenerateSelectFieldWithOptions(kCountries, arraysize(kCountries)), | 200 GenerateSelectFieldWithOptions(kCountries, arraysize(kCountries)), |
| 207 base::string16()); | 201 base::string16()); |
| 208 field.set_heuristic_type(ADDRESS_HOME_COUNTRY); | 202 field.set_heuristic_type(ADDRESS_HOME_COUNTRY); |
| 209 | 203 |
| 210 AutofillField::FillFormField( | 204 AutofillField::FillFormField(field, ASCIIToUTF16("Canada"), "en-US", &field); |
| 211 field, ASCIIToUTF16("Canada"), "en-US", "en-US", &field); | |
| 212 EXPECT_EQ(ASCIIToUTF16("CA"), field.value); | 205 EXPECT_EQ(ASCIIToUTF16("CA"), field.value); |
| 213 } | 206 } |
| 214 | 207 |
| 215 TEST(AutofillFieldTest, FillSelectControlWithFullStateNames) { | 208 TEST(AutofillFieldTest, FillSelectControlWithFullStateNames) { |
| 216 const char* const kStates[] = { | 209 const char* const kStates[] = { |
| 217 "Alabama", "California" | 210 "Alabama", "California" |
| 218 }; | 211 }; |
| 219 AutofillField field( | 212 AutofillField field( |
| 220 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), | 213 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), |
| 221 base::string16()); | 214 base::string16()); |
| 222 field.set_heuristic_type(ADDRESS_HOME_STATE); | 215 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 223 | 216 |
| 224 AutofillField::FillFormField( | 217 AutofillField::FillFormField(field, ASCIIToUTF16("CA"), "en-US", &field); |
| 225 field, ASCIIToUTF16("CA"), "en-US", "en-US", &field); | |
| 226 EXPECT_EQ(ASCIIToUTF16("California"), field.value); | 218 EXPECT_EQ(ASCIIToUTF16("California"), field.value); |
| 227 } | 219 } |
| 228 | 220 |
| 229 TEST(AutofillFieldTest, FillSelectControlWithAbbreviateStateNames) { | 221 TEST(AutofillFieldTest, FillSelectControlWithAbbreviateStateNames) { |
| 230 const char* const kStates[] = { | 222 const char* const kStates[] = { |
| 231 "AL", "CA" | 223 "AL", "CA" |
| 232 }; | 224 }; |
| 233 AutofillField field( | 225 AutofillField field( |
| 234 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), | 226 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), |
| 235 base::string16()); | 227 base::string16()); |
| 236 field.set_heuristic_type(ADDRESS_HOME_STATE); | 228 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 237 | 229 |
| 238 AutofillField::FillFormField( | 230 AutofillField::FillFormField(field, ASCIIToUTF16("California"), "en-US", |
| 239 field, ASCIIToUTF16("California"), "en-US", "en-US", &field); | 231 &field); |
| 240 EXPECT_EQ(ASCIIToUTF16("CA"), field.value); | 232 EXPECT_EQ(ASCIIToUTF16("CA"), field.value); |
| 241 } | 233 } |
| 242 | 234 |
| 243 TEST(AutofillFieldTest, FillSelectControlWithInexactFullStateNames) { | 235 TEST(AutofillFieldTest, FillSelectControlWithInexactFullStateNames) { |
| 244 { | 236 { |
| 245 const char* const kStates[] = { | 237 const char* const kStates[] = { |
| 246 "SC - South Carolina", "CA - California", "NC - North Carolina", | 238 "SC - South Carolina", "CA - California", "NC - North Carolina", |
| 247 }; | 239 }; |
| 248 AutofillField field( | 240 AutofillField field( |
| 249 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), | 241 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), |
| 250 base::string16()); | 242 base::string16()); |
| 251 field.set_heuristic_type(ADDRESS_HOME_STATE); | 243 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 252 | 244 |
| 253 AutofillField::FillFormField( | 245 AutofillField::FillFormField(field, ASCIIToUTF16("California"), "en-US", |
| 254 field, ASCIIToUTF16("California"), "en-US", "en-US", &field); | 246 &field); |
| 255 EXPECT_EQ(ASCIIToUTF16("CA - California"), field.value); | 247 EXPECT_EQ(ASCIIToUTF16("CA - California"), field.value); |
| 256 } | 248 } |
| 257 | 249 |
| 258 // Don't accidentally match "Virginia" to "West Virginia". | 250 // Don't accidentally match "Virginia" to "West Virginia". |
| 259 { | 251 { |
| 260 const char* const kStates[] = { | 252 const char* const kStates[] = { |
| 261 "WV - West Virginia", "VA - Virginia", "NV - North Virginia", | 253 "WV - West Virginia", "VA - Virginia", "NV - North Virginia", |
| 262 }; | 254 }; |
| 263 AutofillField field( | 255 AutofillField field( |
| 264 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), | 256 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), |
| 265 base::string16()); | 257 base::string16()); |
| 266 field.set_heuristic_type(ADDRESS_HOME_STATE); | 258 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 267 | 259 |
| 268 AutofillField::FillFormField( | 260 AutofillField::FillFormField(field, ASCIIToUTF16("Virginia"), "en-US", |
| 269 field, ASCIIToUTF16("Virginia"), "en-US", "en-US", &field); | 261 &field); |
| 270 EXPECT_EQ(ASCIIToUTF16("VA - Virginia"), field.value); | 262 EXPECT_EQ(ASCIIToUTF16("VA - Virginia"), field.value); |
| 271 } | 263 } |
| 272 | 264 |
| 273 // Do accidentally match "Virginia" to "West Virginia". NB: Ideally, Chrome | 265 // Do accidentally match "Virginia" to "West Virginia". NB: Ideally, Chrome |
| 274 // would fail this test. It's here to document behavior rather than enforce | 266 // would fail this test. It's here to document behavior rather than enforce |
| 275 // it. | 267 // it. |
| 276 { | 268 { |
| 277 const char* const kStates[] = { | 269 const char* const kStates[] = { |
| 278 "WV - West Virginia", "TX - Texas", | 270 "WV - West Virginia", "TX - Texas", |
| 279 }; | 271 }; |
| 280 AutofillField field( | 272 AutofillField field( |
| 281 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), | 273 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), |
| 282 base::string16()); | 274 base::string16()); |
| 283 field.set_heuristic_type(ADDRESS_HOME_STATE); | 275 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 284 | 276 |
| 285 AutofillField::FillFormField( | 277 AutofillField::FillFormField(field, ASCIIToUTF16("Virginia"), "en-US", |
| 286 field, ASCIIToUTF16("Virginia"), "en-US", "en-US", &field); | 278 &field); |
| 287 EXPECT_EQ(ASCIIToUTF16("WV - West Virginia"), field.value); | 279 EXPECT_EQ(ASCIIToUTF16("WV - West Virginia"), field.value); |
| 288 } | 280 } |
| 289 | 281 |
| 290 // Tests that substring matches work for full state names (a full token | 282 // Tests that substring matches work for full state names (a full token |
| 291 // match isn't required). Also tests that matches work for states with | 283 // match isn't required). Also tests that matches work for states with |
| 292 // whitespace in the middle. | 284 // whitespace in the middle. |
| 293 { | 285 { |
| 294 const char* const kStates[] = { | 286 const char* const kStates[] = { |
| 295 "California.", "North Carolina.", | 287 "California.", "North Carolina.", |
| 296 }; | 288 }; |
| 297 AutofillField field( | 289 AutofillField field( |
| 298 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), | 290 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), |
| 299 base::string16()); | 291 base::string16()); |
| 300 field.set_heuristic_type(ADDRESS_HOME_STATE); | 292 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 301 | 293 |
| 302 AutofillField::FillFormField( | 294 AutofillField::FillFormField(field, ASCIIToUTF16("North Carolina"), "en-US", |
| 303 field, ASCIIToUTF16("North Carolina"), "en-US", "en-US", &field); | 295 &field); |
| 304 EXPECT_EQ(ASCIIToUTF16("North Carolina."), field.value); | 296 EXPECT_EQ(ASCIIToUTF16("North Carolina."), field.value); |
| 305 } | 297 } |
| 306 } | 298 } |
| 307 | 299 |
| 308 TEST(AutofillFieldTest, FillSelectControlWithInexactAbbreviations) { | 300 TEST(AutofillFieldTest, FillSelectControlWithInexactAbbreviations) { |
| 309 { | 301 { |
| 310 const char* const kStates[] = { | 302 const char* const kStates[] = { |
| 311 "NC - North Carolina", "CA - California", | 303 "NC - North Carolina", "CA - California", |
| 312 }; | 304 }; |
| 313 AutofillField field( | 305 AutofillField field( |
| 314 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), | 306 GenerateSelectFieldWithOptions(kStates, arraysize(kStates)), |
| 315 base::string16()); | 307 base::string16()); |
| 316 field.set_heuristic_type(ADDRESS_HOME_STATE); | 308 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 317 | 309 |
| 318 AutofillField::FillFormField( | 310 AutofillField::FillFormField(field, ASCIIToUTF16("CA"), "en-US", |
| 319 field, ASCIIToUTF16("CA"), "en-US", "en-US", &field); | 311 &field); |
| 320 EXPECT_EQ(ASCIIToUTF16("CA - California"), field.value); | 312 EXPECT_EQ(ASCIIToUTF16("CA - California"), field.value); |
| 321 } | 313 } |
| 322 | 314 |
| 323 { | 315 { |
| 324 const char* const kNotStates[] = { | 316 const char* const kNotStates[] = { |
| 325 "NCNCA", "SCNCA", | 317 "NCNCA", "SCNCA", |
| 326 }; | 318 }; |
| 327 AutofillField field( | 319 AutofillField field( |
| 328 GenerateSelectFieldWithOptions(kNotStates, arraysize(kNotStates)), | 320 GenerateSelectFieldWithOptions(kNotStates, arraysize(kNotStates)), |
| 329 base::string16()); | 321 base::string16()); |
| 330 field.set_heuristic_type(ADDRESS_HOME_STATE); | 322 field.set_heuristic_type(ADDRESS_HOME_STATE); |
| 331 | 323 |
| 332 AutofillField::FillFormField( | 324 AutofillField::FillFormField(field, ASCIIToUTF16("NC"), "en-US", |
| 333 field, ASCIIToUTF16("NC"), "en-US", "en-US", &field); | 325 &field); |
| 334 EXPECT_EQ(base::string16(), field.value); | 326 EXPECT_EQ(base::string16(), field.value); |
| 335 } | 327 } |
| 336 } | 328 } |
| 337 | 329 |
| 338 TEST(AutofillFieldTest, FillSelectControlWithNumericMonth) { | 330 TEST(AutofillFieldTest, FillSelectControlWithNumericMonth) { |
| 339 const char* const kMonthsNumeric[] = { | 331 const char* const kMonthsNumeric[] = { |
| 340 "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", | 332 "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", |
| 341 }; | 333 }; |
| 342 AutofillField field( | 334 AutofillField field( |
| 343 GenerateSelectFieldWithOptions(kMonthsNumeric, arraysize(kMonthsNumeric)), | 335 GenerateSelectFieldWithOptions(kMonthsNumeric, arraysize(kMonthsNumeric)), |
| 344 base::string16()); | 336 base::string16()); |
| 345 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); | 337 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); |
| 346 | 338 |
| 347 // Try with a leading zero. | 339 // Try with a leading zero. |
| 348 AutofillField::FillFormField( | 340 AutofillField::FillFormField(field, ASCIIToUTF16("03"), "en-US", &field); |
| 349 field, ASCIIToUTF16("03"), "en-US", "en-US", &field); | |
| 350 EXPECT_EQ(ASCIIToUTF16("03"), field.value); | 341 EXPECT_EQ(ASCIIToUTF16("03"), field.value); |
| 351 | 342 |
| 352 // Try without a leading zero. | 343 // Try without a leading zero. |
| 353 AutofillField::FillFormField( | 344 AutofillField::FillFormField(field, ASCIIToUTF16("4"), "en-US", &field); |
| 354 field, ASCIIToUTF16("4"), "en-US", "en-US", &field); | |
| 355 EXPECT_EQ(ASCIIToUTF16("04"), field.value); | 345 EXPECT_EQ(ASCIIToUTF16("04"), field.value); |
| 356 | 346 |
| 357 // Try a two-digit month. | 347 // Try a two-digit month. |
| 358 AutofillField::FillFormField( | 348 AutofillField::FillFormField(field, ASCIIToUTF16("11"), "en-US", &field); |
| 359 field, ASCIIToUTF16("11"), "en-US", "en-US", &field); | |
| 360 EXPECT_EQ(ASCIIToUTF16("11"), field.value); | 349 EXPECT_EQ(ASCIIToUTF16("11"), field.value); |
| 361 } | 350 } |
| 362 | 351 |
| 363 TEST(AutofillFieldTest, FillSelectControlWithAbbreviatedMonthName) { | 352 TEST(AutofillFieldTest, FillSelectControlWithAbbreviatedMonthName) { |
| 364 const char* const kMonthsAbbreviated[] = { | 353 const char* const kMonthsAbbreviated[] = { |
| 365 "Jan", "Feb", "Mar", "Apr", "May", "Jun", | 354 "Jan", "Feb", "Mar", "Apr", "May", "Jun", |
| 366 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", | 355 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", |
| 367 }; | 356 }; |
| 368 AutofillField field( | 357 AutofillField field( |
| 369 GenerateSelectFieldWithOptions( | 358 GenerateSelectFieldWithOptions( |
| 370 kMonthsAbbreviated, arraysize(kMonthsAbbreviated)), | 359 kMonthsAbbreviated, arraysize(kMonthsAbbreviated)), |
| 371 base::string16()); | 360 base::string16()); |
| 372 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); | 361 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); |
| 373 | 362 |
| 374 AutofillField::FillFormField( | 363 AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field); |
| 375 field, ASCIIToUTF16("04"), "en-US", "en-US", &field); | |
| 376 EXPECT_EQ(ASCIIToUTF16("Apr"), field.value); | 364 EXPECT_EQ(ASCIIToUTF16("Apr"), field.value); |
| 377 } | 365 } |
| 378 | 366 |
| 379 TEST(AutofillFieldTest, FillSelectControlWithFullMonthName) { | 367 TEST(AutofillFieldTest, FillSelectControlWithFullMonthName) { |
| 380 const char* const kMonthsFull[] = { | 368 const char* const kMonthsFull[] = { |
| 381 "January","February", "March", "April", "May", "June", | 369 "January", "February", "March", "April", "May", "June", |
| 382 "July", "August", "September", "October", "November", "December", | 370 "July", "August", "September", "October", "November", "December", |
| 383 }; | 371 }; |
| 384 AutofillField field( | 372 AutofillField field( |
| 385 GenerateSelectFieldWithOptions(kMonthsFull, arraysize(kMonthsFull)), | 373 GenerateSelectFieldWithOptions(kMonthsFull, arraysize(kMonthsFull)), |
| 386 base::string16()); | 374 base::string16()); |
| 387 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); | 375 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); |
| 388 | 376 |
| 389 AutofillField::FillFormField( | 377 AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field); |
| 390 field, ASCIIToUTF16("04"), "en-US", "en-US", &field); | |
| 391 EXPECT_EQ(ASCIIToUTF16("April"), field.value); | 378 EXPECT_EQ(ASCIIToUTF16("April"), field.value); |
| 392 } | 379 } |
| 393 | 380 |
| 394 TEST(AutofillFieldTest, FillSelectControlWithNumericMonthSansLeadingZero) { | 381 TEST(AutofillFieldTest, FillSelectControlWithNumericMonthSansLeadingZero) { |
| 395 const char* const kMonthsNumeric[] = { | 382 const char* const kMonthsNumeric[] = { |
| 396 "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", | 383 "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", |
| 397 }; | 384 }; |
| 398 AutofillField field( | 385 AutofillField field( |
| 399 GenerateSelectFieldWithOptions(kMonthsNumeric, arraysize(kMonthsNumeric)), | 386 GenerateSelectFieldWithOptions(kMonthsNumeric, arraysize(kMonthsNumeric)), |
| 400 base::string16()); | 387 base::string16()); |
| 401 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); | 388 field.set_heuristic_type(CREDIT_CARD_EXP_MONTH); |
| 402 | 389 |
| 403 AutofillField::FillFormField( | 390 AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field); |
| 404 field, ASCIIToUTF16("04"), "en-US", "en-US", &field); | |
| 405 EXPECT_EQ(ASCIIToUTF16("4"), field.value); | 391 EXPECT_EQ(ASCIIToUTF16("4"), field.value); |
| 406 } | 392 } |
| 407 | 393 |
| 408 TEST(AutofillFieldTest, FillSelectControlWithTwoDigitCreditCardYear) { | 394 TEST(AutofillFieldTest, FillSelectControlWithTwoDigitCreditCardYear) { |
| 409 const char* const kYears[] = { | 395 const char* const kYears[] = { |
| 410 "12", "13", "14", "15", "16", "17", "18", "19" | 396 "12", "13", "14", "15", "16", "17", "18", "19" |
| 411 }; | 397 }; |
| 412 AutofillField field(GenerateSelectFieldWithOptions(kYears, arraysize(kYears)), | 398 AutofillField field(GenerateSelectFieldWithOptions(kYears, arraysize(kYears)), |
| 413 base::string16()); | 399 base::string16()); |
| 414 field.set_heuristic_type(CREDIT_CARD_EXP_2_DIGIT_YEAR); | 400 field.set_heuristic_type(CREDIT_CARD_EXP_2_DIGIT_YEAR); |
| 415 | 401 |
| 416 AutofillField::FillFormField( | 402 AutofillField::FillFormField(field, ASCIIToUTF16("2017"), "en-US", &field); |
| 417 field, ASCIIToUTF16("2017"), "en-US", "en-US", &field); | |
| 418 EXPECT_EQ(ASCIIToUTF16("17"), field.value); | 403 EXPECT_EQ(ASCIIToUTF16("17"), field.value); |
| 419 } | 404 } |
| 420 | 405 |
| 421 TEST(AutofillFieldTest, FillSelectControlWithCreditCardType) { | 406 TEST(AutofillFieldTest, FillSelectControlWithCreditCardType) { |
| 422 const char* const kCreditCardTypes[] = { | 407 const char* const kCreditCardTypes[] = { |
| 423 "Visa", "Master Card", "AmEx", "discover" | 408 "Visa", "Master Card", "AmEx", "discover" |
| 424 }; | 409 }; |
| 425 AutofillField field( | 410 AutofillField field( |
| 426 GenerateSelectFieldWithOptions( | 411 GenerateSelectFieldWithOptions( |
| 427 kCreditCardTypes, arraysize(kCreditCardTypes)), | 412 kCreditCardTypes, arraysize(kCreditCardTypes)), |
| 428 base::string16()); | 413 base::string16()); |
| 429 field.set_heuristic_type(CREDIT_CARD_TYPE); | 414 field.set_heuristic_type(CREDIT_CARD_TYPE); |
| 430 | 415 |
| 431 // Normal case: | 416 // Normal case: |
| 432 AutofillField::FillFormField( | 417 AutofillField::FillFormField(field, ASCIIToUTF16("Visa"), "en-US", &field); |
| 433 field, ASCIIToUTF16("Visa"), "en-US", "en-US", &field); | |
| 434 EXPECT_EQ(ASCIIToUTF16("Visa"), field.value); | 418 EXPECT_EQ(ASCIIToUTF16("Visa"), field.value); |
| 435 | 419 |
| 436 // Filling should be able to handle intervening whitespace: | 420 // Filling should be able to handle intervening whitespace: |
| 437 AutofillField::FillFormField( | 421 AutofillField::FillFormField(field, ASCIIToUTF16("MasterCard"), "en-US", |
| 438 field, ASCIIToUTF16("MasterCard"), "en-US", "en-US", &field); | 422 &field); |
| 439 EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value); | 423 EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value); |
| 440 | 424 |
| 441 // American Express is sometimes abbreviated as AmEx: | 425 // American Express is sometimes abbreviated as AmEx: |
| 442 AutofillField::FillFormField( | 426 AutofillField::FillFormField(field, ASCIIToUTF16("American Express"), "en-US", |
| 443 field, ASCIIToUTF16("American Express"), "en-US", "en-US", &field); | 427 &field); |
| 444 EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value); | 428 EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value); |
| 445 | 429 |
| 446 // Case insensitivity: | 430 // Case insensitivity: |
| 447 AutofillField::FillFormField( | 431 AutofillField::FillFormField(field, ASCIIToUTF16("Discover"), "en-US", |
| 448 field, ASCIIToUTF16("Discover"), "en-US", "en-US", &field); | 432 &field); |
| 449 EXPECT_EQ(ASCIIToUTF16("discover"), field.value); | 433 EXPECT_EQ(ASCIIToUTF16("discover"), field.value); |
| 450 } | 434 } |
| 451 | 435 |
| 452 TEST(AutofillFieldTest, FillMonthControl) { | 436 TEST(AutofillFieldTest, FillMonthControl) { |
| 453 AutofillField field; | 437 AutofillField field; |
| 454 field.form_control_type = "month"; | 438 field.form_control_type = "month"; |
| 455 | 439 |
| 456 // Try a month with two digits. | 440 // Try a month with two digits. |
| 457 AutofillField::FillFormField( | 441 AutofillField::FillFormField(field, ASCIIToUTF16("12/2017"), "en-US", &field); |
| 458 field, ASCIIToUTF16("12/2017"), "en-US", "en-US", &field); | |
| 459 EXPECT_EQ(ASCIIToUTF16("2017-12"), field.value); | 442 EXPECT_EQ(ASCIIToUTF16("2017-12"), field.value); |
| 460 | 443 |
| 461 // Try a month with a leading zero. | 444 // Try a month with a leading zero. |
| 462 AutofillField::FillFormField( | 445 AutofillField::FillFormField(field, ASCIIToUTF16("03/2019"), "en-US", &field); |
| 463 field, ASCIIToUTF16("03/2019"), "en-US", "en-US", &field); | |
| 464 EXPECT_EQ(ASCIIToUTF16("2019-03"), field.value); | 446 EXPECT_EQ(ASCIIToUTF16("2019-03"), field.value); |
| 465 | 447 |
| 466 // Try a month without a leading zero. | 448 // Try a month without a leading zero. |
| 467 AutofillField::FillFormField( | 449 AutofillField::FillFormField(field, ASCIIToUTF16("4/2018"), "en-US", &field); |
| 468 field, ASCIIToUTF16("4/2018"), "en-US", "en-US", &field); | |
| 469 EXPECT_EQ(ASCIIToUTF16("2018-04"), field.value); | 450 EXPECT_EQ(ASCIIToUTF16("2018-04"), field.value); |
| 470 } | 451 } |
| 471 | 452 |
| 472 TEST(AutofillFieldTest, FillStreetAddressTextArea) { | 453 TEST(AutofillFieldTest, FillStreetAddressTextArea) { |
| 473 AutofillField field; | 454 AutofillField field; |
| 474 field.form_control_type = "textarea"; | 455 field.form_control_type = "textarea"; |
| 475 | 456 |
| 476 base::string16 value = ASCIIToUTF16("123 Fake St.\n" | 457 base::string16 value = ASCIIToUTF16("123 Fake St.\n" |
| 477 "Apt. 42"); | 458 "Apt. 42"); |
| 478 AutofillField::FillFormField(field, value, "en-US", "en-US", &field); | 459 AutofillField::FillFormField(field, value, "en-US", &field); |
| 479 EXPECT_EQ(value, field.value); | 460 EXPECT_EQ(value, field.value); |
| 480 | |
| 481 base::string16 ja_value = UTF8ToUTF16("桜丘町26-1\n" | |
| 482 "セルリアンタワー6階"); | |
| 483 AutofillField::FillFormField(field, ja_value, "ja-JP", "en-US", &field); | |
| 484 EXPECT_EQ(ja_value, field.value); | |
| 485 } | 461 } |
| 486 | 462 |
| 487 TEST(AutofillFieldTest, FillStreetAddressTextField) { | 463 TEST(AutofillFieldTest, FillStreetAddressTextField) { |
| 488 AutofillField field; | 464 AutofillField field; |
| 489 field.form_control_type = "text"; | 465 field.form_control_type = "text"; |
| 490 field.set_server_type(ADDRESS_HOME_STREET_ADDRESS); | 466 field.set_server_type(ADDRESS_HOME_STREET_ADDRESS); |
| 491 | 467 |
| 492 base::string16 value = ASCIIToUTF16("123 Fake St.\n" | 468 base::string16 value = ASCIIToUTF16("123 Fake St.\n" |
| 493 "Apt. 42"); | 469 "Apt. 42"); |
| 494 AutofillField::FillFormField(field, value, "en-US", "en-US", &field); | 470 AutofillField::FillFormField(field, value, "en-US", &field); |
| 495 EXPECT_EQ(ASCIIToUTF16("123 Fake St., Apt. 42"), field.value); | 471 EXPECT_EQ(ASCIIToUTF16("123 Fake St., Apt. 42"), field.value); |
| 496 | |
| 497 AutofillField::FillFormField(field, | |
| 498 UTF8ToUTF16("桜丘町26-1\n" | |
| 499 "セルリアンタワー6階"), | |
| 500 "ja-JP", | |
| 501 "en-US", | |
| 502 &field); | |
| 503 EXPECT_EQ(UTF8ToUTF16("桜丘町26-1セルリアンタワー6階"), field.value); | |
| 504 } | 472 } |
| 505 | 473 |
| 506 } // namespace | 474 } // namespace |
| 507 } // namespace autofill | 475 } // namespace autofill |
| OLD | NEW |