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/form_structure.h" | 5 #include "components/autofill/core/browser/form_structure.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "components/autofill/core/browser/autofill_metrics.h" | 10 #include "components/autofill/core/browser/autofill_metrics.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 }; | 28 }; |
29 | 29 |
30 } // anonymous namespace | 30 } // anonymous namespace |
31 | 31 |
32 | 32 |
33 namespace content { | 33 namespace content { |
34 | 34 |
35 std::ostream& operator<<(std::ostream& os, const FormData& form) { | 35 std::ostream& operator<<(std::ostream& os, const FormData& form) { |
36 os << base::UTF16ToUTF8(form.name) | 36 os << base::UTF16ToUTF8(form.name) |
37 << " " | 37 << " " |
38 << base::UTF16ToUTF8(form.method) | |
39 << " " | |
40 << form.origin.spec() | 38 << form.origin.spec() |
41 << " " | 39 << " " |
42 << form.action.spec() | 40 << form.action.spec() |
43 << " "; | 41 << " "; |
44 | 42 |
45 for (std::vector<FormFieldData>::const_iterator iter = | 43 for (std::vector<FormFieldData>::const_iterator iter = |
46 form.fields.begin(); | 44 form.fields.begin(); |
47 iter != form.fields.end(); ++iter) { | 45 iter != form.fields.end(); ++iter) { |
48 os << *iter | 46 os << *iter |
49 << " "; | 47 << " "; |
50 } | 48 } |
51 | 49 |
52 return os; | 50 return os; |
53 } | 51 } |
54 | 52 |
55 } // namespace content | 53 } // namespace content |
56 | 54 |
57 class FormStructureTest { | 55 class FormStructureTest { |
58 public: | 56 public: |
59 static std::string Hash64Bit(const std::string& str) { | 57 static std::string Hash64Bit(const std::string& str) { |
60 return FormStructure::Hash64Bit(str); | 58 return FormStructure::Hash64Bit(str); |
61 } | 59 } |
62 }; | 60 }; |
63 | 61 |
64 TEST(FormStructureTest, FieldCount) { | 62 TEST(FormStructureTest, FieldCount) { |
65 scoped_ptr<FormStructure> form_structure; | 63 scoped_ptr<FormStructure> form_structure; |
66 FormData form; | 64 FormData form; |
67 form.method = ASCIIToUTF16("post"); | |
68 | 65 |
69 FormFieldData field; | 66 FormFieldData field; |
70 field.label = ASCIIToUTF16("username"); | 67 field.label = ASCIIToUTF16("username"); |
71 field.name = ASCIIToUTF16("username"); | 68 field.name = ASCIIToUTF16("username"); |
72 field.form_control_type = "text"; | 69 field.form_control_type = "text"; |
73 form.fields.push_back(field); | 70 form.fields.push_back(field); |
74 | 71 |
75 field.label = ASCIIToUTF16("password"); | 72 field.label = ASCIIToUTF16("password"); |
76 field.name = ASCIIToUTF16("password"); | 73 field.name = ASCIIToUTF16("password"); |
77 field.form_control_type = "password"; | 74 field.form_control_type = "password"; |
(...skipping 12 matching lines...) Expand all Loading... |
90 | 87 |
91 // The render process sends all fields to browser including fields with | 88 // The render process sends all fields to browser including fields with |
92 // autocomplete=off | 89 // autocomplete=off |
93 form_structure.reset(new FormStructure(form)); | 90 form_structure.reset(new FormStructure(form)); |
94 EXPECT_EQ(4U, form_structure->field_count()); | 91 EXPECT_EQ(4U, form_structure->field_count()); |
95 } | 92 } |
96 | 93 |
97 TEST(FormStructureTest, AutofillCount) { | 94 TEST(FormStructureTest, AutofillCount) { |
98 scoped_ptr<FormStructure> form_structure; | 95 scoped_ptr<FormStructure> form_structure; |
99 FormData form; | 96 FormData form; |
100 form.method = ASCIIToUTF16("post"); | |
101 | 97 |
102 FormFieldData field; | 98 FormFieldData field; |
103 field.label = ASCIIToUTF16("username"); | 99 field.label = ASCIIToUTF16("username"); |
104 field.name = ASCIIToUTF16("username"); | 100 field.name = ASCIIToUTF16("username"); |
105 field.form_control_type = "text"; | 101 field.form_control_type = "text"; |
106 form.fields.push_back(field); | 102 form.fields.push_back(field); |
107 | 103 |
108 field.label = ASCIIToUTF16("password"); | 104 field.label = ASCIIToUTF16("password"); |
109 field.name = ASCIIToUTF16("password"); | 105 field.name = ASCIIToUTF16("password"); |
110 field.form_control_type = "password"; | 106 field.form_control_type = "password"; |
(...skipping 23 matching lines...) Expand all Loading... |
134 form.fields.push_back(field); | 130 form.fields.push_back(field); |
135 | 131 |
136 form_structure.reset(new FormStructure(form)); | 132 form_structure.reset(new FormStructure(form)); |
137 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 133 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
138 EXPECT_EQ(1U, form_structure->autofill_count()); | 134 EXPECT_EQ(1U, form_structure->autofill_count()); |
139 } | 135 } |
140 | 136 |
141 TEST(FormStructureTest, SourceURL) { | 137 TEST(FormStructureTest, SourceURL) { |
142 FormData form; | 138 FormData form; |
143 form.origin = GURL("http://www.foo.com/"); | 139 form.origin = GURL("http://www.foo.com/"); |
144 form.method = ASCIIToUTF16("post"); | |
145 FormStructure form_structure(form); | 140 FormStructure form_structure(form); |
146 | 141 |
147 EXPECT_EQ(form.origin, form_structure.source_url()); | 142 EXPECT_EQ(form.origin, form_structure.source_url()); |
148 } | 143 } |
149 | 144 |
150 TEST(FormStructureTest, IsAutofillable) { | 145 TEST(FormStructureTest, IsAutofillable) { |
151 scoped_ptr<FormStructure> form_structure; | 146 scoped_ptr<FormStructure> form_structure; |
152 FormData form; | 147 FormData form; |
153 | 148 |
154 // We need at least three text fields to be auto-fillable. | 149 // We need at least three text fields to be auto-fillable. |
155 form.method = ASCIIToUTF16("post"); | |
156 | |
157 FormFieldData field; | 150 FormFieldData field; |
158 | 151 |
159 field.label = ASCIIToUTF16("username"); | 152 field.label = ASCIIToUTF16("username"); |
160 field.name = ASCIIToUTF16("username"); | 153 field.name = ASCIIToUTF16("username"); |
161 field.form_control_type = "text"; | 154 field.form_control_type = "text"; |
162 form.fields.push_back(field); | 155 form.fields.push_back(field); |
163 | 156 |
164 field.label = ASCIIToUTF16("password"); | 157 field.label = ASCIIToUTF16("password"); |
165 field.name = ASCIIToUTF16("password"); | 158 field.name = ASCIIToUTF16("password"); |
166 field.form_control_type = "password"; | 159 field.form_control_type = "password"; |
167 form.fields.push_back(field); | 160 form.fields.push_back(field); |
168 | 161 |
169 field.label = base::string16(); | 162 field.label = base::string16(); |
170 field.name = ASCIIToUTF16("Submit"); | 163 field.name = ASCIIToUTF16("Submit"); |
171 field.form_control_type = "submit"; | 164 field.form_control_type = "submit"; |
172 form.fields.push_back(field); | 165 form.fields.push_back(field); |
173 | 166 |
174 form_structure.reset(new FormStructure(form)); | 167 form_structure.reset(new FormStructure(form)); |
175 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 168 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
176 EXPECT_FALSE(form_structure->IsAutofillable(true)); | 169 EXPECT_FALSE(form_structure->IsAutofillable()); |
177 | 170 |
178 // We now have three text fields, but only two auto-fillable fields. | 171 // We now have three text fields, but only two auto-fillable fields. |
179 field.label = ASCIIToUTF16("First Name"); | 172 field.label = ASCIIToUTF16("First Name"); |
180 field.name = ASCIIToUTF16("firstname"); | 173 field.name = ASCIIToUTF16("firstname"); |
181 field.form_control_type = "text"; | 174 field.form_control_type = "text"; |
182 form.fields.push_back(field); | 175 form.fields.push_back(field); |
183 | 176 |
184 field.label = ASCIIToUTF16("Last Name"); | 177 field.label = ASCIIToUTF16("Last Name"); |
185 field.name = ASCIIToUTF16("lastname"); | 178 field.name = ASCIIToUTF16("lastname"); |
186 field.form_control_type = "text"; | 179 field.form_control_type = "text"; |
187 form.fields.push_back(field); | 180 form.fields.push_back(field); |
188 | 181 |
189 form_structure.reset(new FormStructure(form)); | 182 form_structure.reset(new FormStructure(form)); |
190 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 183 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
191 EXPECT_FALSE(form_structure->IsAutofillable(true)); | 184 EXPECT_FALSE(form_structure->IsAutofillable()); |
192 | 185 |
193 // We now have three auto-fillable fields. | 186 // We now have three auto-fillable fields. |
194 field.label = ASCIIToUTF16("Email"); | 187 field.label = ASCIIToUTF16("Email"); |
195 field.name = ASCIIToUTF16("email"); | 188 field.name = ASCIIToUTF16("email"); |
196 field.form_control_type = "email"; | 189 field.form_control_type = "email"; |
197 form.fields.push_back(field); | 190 form.fields.push_back(field); |
198 | 191 |
199 form_structure.reset(new FormStructure(form)); | 192 form_structure.reset(new FormStructure(form)); |
200 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 193 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
201 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 194 EXPECT_TRUE(form_structure->IsAutofillable()); |
202 | |
203 // The method must be 'post', though we can intentionally ignore this | |
204 // criterion for the sake of providing a helpful warning message to the user. | |
205 form.method = ASCIIToUTF16("get"); | |
206 form_structure.reset(new FormStructure(form)); | |
207 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | |
208 EXPECT_FALSE(form_structure->IsAutofillable(true)); | |
209 EXPECT_TRUE(form_structure->IsAutofillable(false)); | |
210 | 195 |
211 // The target cannot include http(s)://*/search... | 196 // The target cannot include http(s)://*/search... |
212 form.method = ASCIIToUTF16("post"); | |
213 form.action = GURL("http://google.com/search?q=hello"); | 197 form.action = GURL("http://google.com/search?q=hello"); |
214 form_structure.reset(new FormStructure(form)); | 198 form_structure.reset(new FormStructure(form)); |
215 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 199 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
216 EXPECT_FALSE(form_structure->IsAutofillable(true)); | 200 EXPECT_FALSE(form_structure->IsAutofillable()); |
217 | 201 |
218 // But search can be in the URL. | 202 // But search can be in the URL. |
219 form.action = GURL("http://search.com/?q=hello"); | 203 form.action = GURL("http://search.com/?q=hello"); |
220 form_structure.reset(new FormStructure(form)); | 204 form_structure.reset(new FormStructure(form)); |
221 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 205 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
222 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 206 EXPECT_TRUE(form_structure->IsAutofillable()); |
223 } | 207 } |
224 | 208 |
225 TEST(FormStructureTest, ShouldBeParsed) { | 209 TEST(FormStructureTest, ShouldBeParsed) { |
226 scoped_ptr<FormStructure> form_structure; | 210 scoped_ptr<FormStructure> form_structure; |
227 FormData form; | 211 FormData form; |
228 | 212 |
229 // We need at least three text fields to be parseable. | 213 // We need at least three text fields to be parseable. |
230 form.method = ASCIIToUTF16("post"); | |
231 | |
232 FormFieldData field; | 214 FormFieldData field; |
233 field.label = ASCIIToUTF16("username"); | 215 field.label = ASCIIToUTF16("username"); |
234 field.name = ASCIIToUTF16("username"); | 216 field.name = ASCIIToUTF16("username"); |
235 field.form_control_type = "text"; | 217 field.form_control_type = "text"; |
236 form.fields.push_back(field); | 218 form.fields.push_back(field); |
237 | 219 |
238 FormFieldData checkable_field; | 220 FormFieldData checkable_field; |
239 checkable_field.is_checkable = true; | 221 checkable_field.is_checkable = true; |
240 checkable_field.name = ASCIIToUTF16("radiobtn"); | 222 checkable_field.name = ASCIIToUTF16("radiobtn"); |
241 checkable_field.form_control_type = "radio"; | 223 checkable_field.form_control_type = "radio"; |
242 form.fields.push_back(checkable_field); | 224 form.fields.push_back(checkable_field); |
243 | 225 |
244 checkable_field.name = ASCIIToUTF16("checkbox"); | 226 checkable_field.name = ASCIIToUTF16("checkbox"); |
245 checkable_field.form_control_type = "checkbox"; | 227 checkable_field.form_control_type = "checkbox"; |
246 form.fields.push_back(checkable_field); | 228 form.fields.push_back(checkable_field); |
247 | 229 |
248 // We have only one text field, should not be parsed. | 230 // We have only one text field, should not be parsed. |
249 form_structure.reset(new FormStructure(form)); | 231 form_structure.reset(new FormStructure(form)); |
250 EXPECT_FALSE(form_structure->ShouldBeParsed(true)); | 232 EXPECT_FALSE(form_structure->ShouldBeParsed()); |
251 | 233 |
252 // We now have three text fields, though only two are auto-fillable. | 234 // We now have three text fields, though only two are auto-fillable. |
253 field.label = ASCIIToUTF16("First Name"); | 235 field.label = ASCIIToUTF16("First Name"); |
254 field.name = ASCIIToUTF16("firstname"); | 236 field.name = ASCIIToUTF16("firstname"); |
255 field.form_control_type = "text"; | 237 field.form_control_type = "text"; |
256 form.fields.push_back(field); | 238 form.fields.push_back(field); |
257 | 239 |
258 field.label = ASCIIToUTF16("Last Name"); | 240 field.label = ASCIIToUTF16("Last Name"); |
259 field.name = ASCIIToUTF16("lastname"); | 241 field.name = ASCIIToUTF16("lastname"); |
260 field.form_control_type = "text"; | 242 field.form_control_type = "text"; |
261 form.fields.push_back(field); | 243 form.fields.push_back(field); |
262 | 244 |
263 form_structure.reset(new FormStructure(form)); | 245 form_structure.reset(new FormStructure(form)); |
264 EXPECT_TRUE(form_structure->ShouldBeParsed(true)); | 246 EXPECT_TRUE(form_structure->ShouldBeParsed()); |
265 | 247 |
266 // The method must be 'post', though we can intentionally ignore this | |
267 // criterion for the sake of providing a helpful warning message to the user. | |
268 form.method = ASCIIToUTF16("get"); | |
269 form_structure.reset(new FormStructure(form)); | 248 form_structure.reset(new FormStructure(form)); |
270 EXPECT_FALSE(form_structure->IsAutofillable(true)); | 249 EXPECT_FALSE(form_structure->IsAutofillable()); |
271 EXPECT_TRUE(form_structure->ShouldBeParsed(false)); | 250 EXPECT_TRUE(form_structure->ShouldBeParsed()); |
272 | 251 |
273 // The target cannot include http(s)://*/search... | 252 // The target cannot include http(s)://*/search... |
274 form.method = ASCIIToUTF16("post"); | |
275 form.action = GURL("http://google.com/search?q=hello"); | 253 form.action = GURL("http://google.com/search?q=hello"); |
276 form_structure.reset(new FormStructure(form)); | 254 form_structure.reset(new FormStructure(form)); |
277 EXPECT_FALSE(form_structure->ShouldBeParsed(true)); | 255 EXPECT_FALSE(form_structure->ShouldBeParsed()); |
278 | 256 |
279 // But search can be in the URL. | 257 // But search can be in the URL. |
280 form.action = GURL("http://search.com/?q=hello"); | 258 form.action = GURL("http://search.com/?q=hello"); |
281 form_structure.reset(new FormStructure(form)); | 259 form_structure.reset(new FormStructure(form)); |
282 EXPECT_TRUE(form_structure->ShouldBeParsed(true)); | 260 EXPECT_TRUE(form_structure->ShouldBeParsed()); |
283 | 261 |
284 // The form need only have three fields, but at least one must be a text | 262 // The form need only have three fields, but at least one must be a text |
285 // field. | 263 // field. |
286 form.fields.clear(); | 264 form.fields.clear(); |
287 | 265 |
288 field.label = ASCIIToUTF16("Email"); | 266 field.label = ASCIIToUTF16("Email"); |
289 field.name = ASCIIToUTF16("email"); | 267 field.name = ASCIIToUTF16("email"); |
290 field.form_control_type = "email"; | 268 field.form_control_type = "email"; |
291 form.fields.push_back(field); | 269 form.fields.push_back(field); |
292 | 270 |
293 field.label = ASCIIToUTF16("State"); | 271 field.label = ASCIIToUTF16("State"); |
294 field.name = ASCIIToUTF16("state"); | 272 field.name = ASCIIToUTF16("state"); |
295 field.form_control_type = "select-one"; | 273 field.form_control_type = "select-one"; |
296 form.fields.push_back(field); | 274 form.fields.push_back(field); |
297 | 275 |
298 field.label = ASCIIToUTF16("Country"); | 276 field.label = ASCIIToUTF16("Country"); |
299 field.name = ASCIIToUTF16("country"); | 277 field.name = ASCIIToUTF16("country"); |
300 field.form_control_type = "select-one"; | 278 field.form_control_type = "select-one"; |
301 form.fields.push_back(field); | 279 form.fields.push_back(field); |
302 | 280 |
303 form_structure.reset(new FormStructure(form)); | 281 form_structure.reset(new FormStructure(form)); |
304 EXPECT_TRUE(form_structure->ShouldBeParsed(true)); | 282 EXPECT_TRUE(form_structure->ShouldBeParsed()); |
305 | 283 |
306 form.fields[0].form_control_type = "select-one"; | 284 form.fields[0].form_control_type = "select-one"; |
307 // Now, no text fields. | 285 // Now, no text fields. |
308 form_structure.reset(new FormStructure(form)); | 286 form_structure.reset(new FormStructure(form)); |
309 EXPECT_FALSE(form_structure->ShouldBeParsed(true)); | 287 EXPECT_FALSE(form_structure->ShouldBeParsed()); |
310 } | 288 } |
311 | 289 |
312 TEST(FormStructureTest, HeuristicsContactInfo) { | 290 TEST(FormStructureTest, HeuristicsContactInfo) { |
313 scoped_ptr<FormStructure> form_structure; | 291 scoped_ptr<FormStructure> form_structure; |
314 FormData form; | 292 FormData form; |
315 form.method = ASCIIToUTF16("post"); | |
316 | 293 |
317 FormFieldData field; | 294 FormFieldData field; |
318 field.form_control_type = "text"; | 295 field.form_control_type = "text"; |
319 | 296 |
320 field.label = ASCIIToUTF16("First Name"); | 297 field.label = ASCIIToUTF16("First Name"); |
321 field.name = ASCIIToUTF16("firstname"); | 298 field.name = ASCIIToUTF16("firstname"); |
322 form.fields.push_back(field); | 299 form.fields.push_back(field); |
323 | 300 |
324 field.label = ASCIIToUTF16("Last Name"); | 301 field.label = ASCIIToUTF16("Last Name"); |
325 field.name = ASCIIToUTF16("lastname"); | 302 field.name = ASCIIToUTF16("lastname"); |
(...skipping 19 matching lines...) Expand all Loading... |
345 field.name = ASCIIToUTF16("zipcode"); | 322 field.name = ASCIIToUTF16("zipcode"); |
346 form.fields.push_back(field); | 323 form.fields.push_back(field); |
347 | 324 |
348 field.label = base::string16(); | 325 field.label = base::string16(); |
349 field.name = ASCIIToUTF16("Submit"); | 326 field.name = ASCIIToUTF16("Submit"); |
350 field.form_control_type = "submit"; | 327 field.form_control_type = "submit"; |
351 form.fields.push_back(field); | 328 form.fields.push_back(field); |
352 | 329 |
353 form_structure.reset(new FormStructure(form)); | 330 form_structure.reset(new FormStructure(form)); |
354 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 331 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
355 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 332 EXPECT_TRUE(form_structure->IsAutofillable()); |
356 | 333 |
357 // Expect the correct number of fields. | 334 // Expect the correct number of fields. |
358 ASSERT_EQ(8U, form_structure->field_count()); | 335 ASSERT_EQ(8U, form_structure->field_count()); |
359 ASSERT_EQ(7U, form_structure->autofill_count()); | 336 ASSERT_EQ(7U, form_structure->autofill_count()); |
360 | 337 |
361 // First name. | 338 // First name. |
362 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 339 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
363 // Last name. | 340 // Last name. |
364 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); | 341 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); |
365 // Email. | 342 // Email. |
366 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); | 343 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); |
367 // Phone. | 344 // Phone. |
368 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, | 345 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
369 form_structure->field(3)->heuristic_type()); | 346 form_structure->field(3)->heuristic_type()); |
370 // Address. | 347 // Address. |
371 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type()); | 348 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type()); |
372 // City. | 349 // City. |
373 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type()); | 350 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type()); |
374 // Zip. | 351 // Zip. |
375 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); | 352 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); |
376 // Submit. | 353 // Submit. |
377 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type()); | 354 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type()); |
378 } | 355 } |
379 | 356 |
380 // Verify that we can correctly process the |autocomplete| attribute. | 357 // Verify that we can correctly process the |autocomplete| attribute. |
381 TEST(FormStructureTest, HeuristicsAutocompleteAttribute) { | 358 TEST(FormStructureTest, HeuristicsAutocompleteAttribute) { |
382 scoped_ptr<FormStructure> form_structure; | 359 scoped_ptr<FormStructure> form_structure; |
383 FormData form; | 360 FormData form; |
384 form.method = ASCIIToUTF16("post"); | |
385 | 361 |
386 FormFieldData field; | 362 FormFieldData field; |
387 field.form_control_type = "text"; | 363 field.form_control_type = "text"; |
388 | 364 |
389 field.label = base::string16(); | 365 field.label = base::string16(); |
390 field.name = ASCIIToUTF16("field1"); | 366 field.name = ASCIIToUTF16("field1"); |
391 field.autocomplete_attribute = "given-name"; | 367 field.autocomplete_attribute = "given-name"; |
392 form.fields.push_back(field); | 368 form.fields.push_back(field); |
393 | 369 |
394 field.label = base::string16(); | 370 field.label = base::string16(); |
395 field.name = ASCIIToUTF16("field2"); | 371 field.name = ASCIIToUTF16("field2"); |
396 field.autocomplete_attribute = "family-name"; | 372 field.autocomplete_attribute = "family-name"; |
397 form.fields.push_back(field); | 373 form.fields.push_back(field); |
398 | 374 |
399 field.label = base::string16(); | 375 field.label = base::string16(); |
400 field.name = ASCIIToUTF16("field3"); | 376 field.name = ASCIIToUTF16("field3"); |
401 field.autocomplete_attribute = "email"; | 377 field.autocomplete_attribute = "email"; |
402 form.fields.push_back(field); | 378 form.fields.push_back(field); |
403 | 379 |
404 form_structure.reset(new FormStructure(form)); | 380 form_structure.reset(new FormStructure(form)); |
405 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 381 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
406 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 382 EXPECT_TRUE(form_structure->IsAutofillable()); |
407 | 383 |
408 // Expect the correct number of fields. | 384 // Expect the correct number of fields. |
409 ASSERT_EQ(3U, form_structure->field_count()); | 385 ASSERT_EQ(3U, form_structure->field_count()); |
410 ASSERT_EQ(3U, form_structure->autofill_count()); | 386 ASSERT_EQ(3U, form_structure->autofill_count()); |
411 | 387 |
412 EXPECT_EQ(HTML_TYPE_GIVEN_NAME, form_structure->field(0)->html_type()); | 388 EXPECT_EQ(HTML_TYPE_GIVEN_NAME, form_structure->field(0)->html_type()); |
413 EXPECT_EQ(HTML_TYPE_FAMILY_NAME, form_structure->field(1)->html_type()); | 389 EXPECT_EQ(HTML_TYPE_FAMILY_NAME, form_structure->field(1)->html_type()); |
414 EXPECT_EQ(HTML_TYPE_EMAIL, form_structure->field(2)->html_type()); | 390 EXPECT_EQ(HTML_TYPE_EMAIL, form_structure->field(2)->html_type()); |
415 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); | 391 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); |
416 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); | 392 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); |
417 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); | 393 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); |
418 } | 394 } |
419 | 395 |
420 // Verify that we can correctly process the 'autocomplete' attribute for phone | 396 // Verify that we can correctly process the 'autocomplete' attribute for phone |
421 // number types (especially phone prefixes and suffixes). | 397 // number types (especially phone prefixes and suffixes). |
422 TEST(FormStructureTest, HeuristicsAutocompleteAttributePhoneTypes) { | 398 TEST(FormStructureTest, HeuristicsAutocompleteAttributePhoneTypes) { |
423 scoped_ptr<FormStructure> form_structure; | 399 scoped_ptr<FormStructure> form_structure; |
424 FormData form; | 400 FormData form; |
425 form.method = ASCIIToUTF16("post"); | |
426 | 401 |
427 FormFieldData field; | 402 FormFieldData field; |
428 field.form_control_type = "text"; | 403 field.form_control_type = "text"; |
429 | 404 |
430 field.label = base::string16(); | 405 field.label = base::string16(); |
431 field.name = ASCIIToUTF16("field1"); | 406 field.name = ASCIIToUTF16("field1"); |
432 field.autocomplete_attribute = "tel-local"; | 407 field.autocomplete_attribute = "tel-local"; |
433 form.fields.push_back(field); | 408 form.fields.push_back(field); |
434 | 409 |
435 field.label = base::string16(); | 410 field.label = base::string16(); |
436 field.name = ASCIIToUTF16("field2"); | 411 field.name = ASCIIToUTF16("field2"); |
437 field.autocomplete_attribute = "tel-local-prefix"; | 412 field.autocomplete_attribute = "tel-local-prefix"; |
438 form.fields.push_back(field); | 413 form.fields.push_back(field); |
439 | 414 |
440 field.label = base::string16(); | 415 field.label = base::string16(); |
441 field.name = ASCIIToUTF16("field3"); | 416 field.name = ASCIIToUTF16("field3"); |
442 field.autocomplete_attribute = "tel-local-suffix"; | 417 field.autocomplete_attribute = "tel-local-suffix"; |
443 form.fields.push_back(field); | 418 form.fields.push_back(field); |
444 | 419 |
445 form_structure.reset(new FormStructure(form)); | 420 form_structure.reset(new FormStructure(form)); |
446 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 421 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
447 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 422 EXPECT_TRUE(form_structure->IsAutofillable()); |
448 | 423 |
449 // Expect the correct number of fields. | 424 // Expect the correct number of fields. |
450 ASSERT_EQ(3U, form_structure->field_count()); | 425 ASSERT_EQ(3U, form_structure->field_count()); |
451 EXPECT_EQ(3U, form_structure->autofill_count()); | 426 EXPECT_EQ(3U, form_structure->autofill_count()); |
452 | 427 |
453 EXPECT_EQ(HTML_TYPE_TEL_LOCAL, form_structure->field(0)->html_type()); | 428 EXPECT_EQ(HTML_TYPE_TEL_LOCAL, form_structure->field(0)->html_type()); |
454 EXPECT_EQ(AutofillField::IGNORED, form_structure->field(0)->phone_part()); | 429 EXPECT_EQ(AutofillField::IGNORED, form_structure->field(0)->phone_part()); |
455 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_PREFIX, form_structure->field(1)->html_type()); | 430 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_PREFIX, form_structure->field(1)->html_type()); |
456 EXPECT_EQ(AutofillField::PHONE_PREFIX, | 431 EXPECT_EQ(AutofillField::PHONE_PREFIX, |
457 form_structure->field(1)->phone_part()); | 432 form_structure->field(1)->phone_part()); |
458 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_SUFFIX, form_structure->field(2)->html_type()); | 433 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_SUFFIX, form_structure->field(2)->html_type()); |
459 EXPECT_EQ(AutofillField::PHONE_SUFFIX, | 434 EXPECT_EQ(AutofillField::PHONE_SUFFIX, |
460 form_structure->field(2)->phone_part()); | 435 form_structure->field(2)->phone_part()); |
461 } | 436 } |
462 | 437 |
463 // If at least one field includes type hints in the 'autocomplete' attribute, we | 438 // If at least one field includes type hints in the 'autocomplete' attribute, we |
464 // should not try to apply any other heuristics. | 439 // should not try to apply any other heuristics. |
465 TEST(FormStructureTest, AutocompleteAttributeOverridesOtherHeuristics) { | 440 TEST(FormStructureTest, AutocompleteAttributeOverridesOtherHeuristics) { |
466 scoped_ptr<FormStructure> form_structure; | 441 scoped_ptr<FormStructure> form_structure; |
467 FormData form; | 442 FormData form; |
468 form.method = ASCIIToUTF16("post"); | |
469 | 443 |
470 // Start with a regular contact form. | 444 // Start with a regular contact form. |
471 FormFieldData field; | 445 FormFieldData field; |
472 field.form_control_type = "text"; | 446 field.form_control_type = "text"; |
473 | 447 |
474 field.label = ASCIIToUTF16("First Name"); | 448 field.label = ASCIIToUTF16("First Name"); |
475 field.name = ASCIIToUTF16("firstname"); | 449 field.name = ASCIIToUTF16("firstname"); |
476 form.fields.push_back(field); | 450 form.fields.push_back(field); |
477 | 451 |
478 field.label = ASCIIToUTF16("Last Name"); | 452 field.label = ASCIIToUTF16("Last Name"); |
479 field.name = ASCIIToUTF16("lastname"); | 453 field.name = ASCIIToUTF16("lastname"); |
480 form.fields.push_back(field); | 454 form.fields.push_back(field); |
481 | 455 |
482 field.label = ASCIIToUTF16("Email"); | 456 field.label = ASCIIToUTF16("Email"); |
483 field.name = ASCIIToUTF16("email"); | 457 field.name = ASCIIToUTF16("email"); |
484 form.fields.push_back(field); | 458 form.fields.push_back(field); |
485 | 459 |
486 form_structure.reset(new FormStructure(form)); | 460 form_structure.reset(new FormStructure(form)); |
487 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 461 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
488 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 462 EXPECT_TRUE(form_structure->IsAutofillable()); |
489 EXPECT_TRUE(form_structure->ShouldBeCrowdsourced()); | 463 EXPECT_TRUE(form_structure->ShouldBeCrowdsourced()); |
490 | 464 |
491 ASSERT_EQ(3U, form_structure->field_count()); | 465 ASSERT_EQ(3U, form_structure->field_count()); |
492 ASSERT_EQ(3U, form_structure->autofill_count()); | 466 ASSERT_EQ(3U, form_structure->autofill_count()); |
493 | 467 |
494 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 468 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
495 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); | 469 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); |
496 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); | 470 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); |
497 | 471 |
498 // Now update the first form field to include an 'autocomplete' attribute. | 472 // Now update the first form field to include an 'autocomplete' attribute. |
499 form.fields.front().autocomplete_attribute = "x-other"; | 473 form.fields.front().autocomplete_attribute = "x-other"; |
500 form_structure.reset(new FormStructure(form)); | 474 form_structure.reset(new FormStructure(form)); |
501 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 475 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
502 EXPECT_FALSE(form_structure->IsAutofillable(true)); | 476 EXPECT_FALSE(form_structure->IsAutofillable()); |
503 EXPECT_FALSE(form_structure->ShouldBeCrowdsourced()); | 477 EXPECT_FALSE(form_structure->ShouldBeCrowdsourced()); |
504 | 478 |
505 ASSERT_EQ(3U, form_structure->field_count()); | 479 ASSERT_EQ(3U, form_structure->field_count()); |
506 ASSERT_EQ(0U, form_structure->autofill_count()); | 480 ASSERT_EQ(0U, form_structure->autofill_count()); |
507 | 481 |
508 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); | 482 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type()); |
509 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); | 483 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); |
510 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); | 484 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); |
511 } | 485 } |
512 | 486 |
513 // Verify that we can correctly process sections listed in the |autocomplete| | 487 // Verify that we can correctly process sections listed in the |autocomplete| |
514 // attribute. | 488 // attribute. |
515 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSections) { | 489 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSections) { |
516 FormData form; | 490 FormData form; |
517 form.method = ASCIIToUTF16("post"); | |
518 | 491 |
519 FormFieldData field; | 492 FormFieldData field; |
520 field.form_control_type = "text"; | 493 field.form_control_type = "text"; |
521 | 494 |
522 // Some fields will have no section specified. These fall into the default | 495 // Some fields will have no section specified. These fall into the default |
523 // section. | 496 // section. |
524 field.autocomplete_attribute = "email"; | 497 field.autocomplete_attribute = "email"; |
525 form.fields.push_back(field); | 498 form.fields.push_back(field); |
526 | 499 |
527 // We allow arbitrary section names. | 500 // We allow arbitrary section names. |
(...skipping 24 matching lines...) Expand all Loading... |
552 // the implementation for more details. | 525 // the implementation for more details. |
553 field.autocomplete_attribute = "section--shipping email"; | 526 field.autocomplete_attribute = "section--shipping email"; |
554 form.fields.push_back(field); | 527 form.fields.push_back(field); |
555 | 528 |
556 // Credit card fields are implicitly in a separate section from other fields. | 529 // Credit card fields are implicitly in a separate section from other fields. |
557 field.autocomplete_attribute = "section-foo cc-number"; | 530 field.autocomplete_attribute = "section-foo cc-number"; |
558 form.fields.push_back(field); | 531 form.fields.push_back(field); |
559 | 532 |
560 FormStructure form_structure(form); | 533 FormStructure form_structure(form); |
561 form_structure.DetermineHeuristicTypes(TestAutofillMetrics()); | 534 form_structure.DetermineHeuristicTypes(TestAutofillMetrics()); |
562 EXPECT_TRUE(form_structure.IsAutofillable(true)); | 535 EXPECT_TRUE(form_structure.IsAutofillable()); |
563 | 536 |
564 // Expect the correct number of fields. | 537 // Expect the correct number of fields. |
565 ASSERT_EQ(9U, form_structure.field_count()); | 538 ASSERT_EQ(9U, form_structure.field_count()); |
566 EXPECT_EQ(9U, form_structure.autofill_count()); | 539 EXPECT_EQ(9U, form_structure.autofill_count()); |
567 | 540 |
568 // All of the fields in this form should be parsed as belonging to different | 541 // All of the fields in this form should be parsed as belonging to different |
569 // sections. | 542 // sections. |
570 std::set<std::string> section_names; | 543 std::set<std::string> section_names; |
571 for (size_t i = 0; i < 9; ++i) { | 544 for (size_t i = 0; i < 9; ++i) { |
572 section_names.insert(form_structure.field(i)->section()); | 545 section_names.insert(form_structure.field(i)->section()); |
573 } | 546 } |
574 EXPECT_EQ(9U, section_names.size()); | 547 EXPECT_EQ(9U, section_names.size()); |
575 } | 548 } |
576 | 549 |
577 // Verify that we can correctly process a degenerate section listed in the | 550 // Verify that we can correctly process a degenerate section listed in the |
578 // |autocomplete| attribute. | 551 // |autocomplete| attribute. |
579 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsDegenerate) { | 552 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsDegenerate) { |
580 FormData form; | 553 FormData form; |
581 form.method = ASCIIToUTF16("post"); | |
582 | 554 |
583 FormFieldData field; | 555 FormFieldData field; |
584 field.form_control_type = "text"; | 556 field.form_control_type = "text"; |
585 | 557 |
586 // Some fields will have no section specified. These fall into the default | 558 // Some fields will have no section specified. These fall into the default |
587 // section. | 559 // section. |
588 field.autocomplete_attribute = "email"; | 560 field.autocomplete_attribute = "email"; |
589 form.fields.push_back(field); | 561 form.fields.push_back(field); |
590 | 562 |
591 // Specifying "section-" is equivalent to not specifying a section. | 563 // Specifying "section-" is equivalent to not specifying a section. |
(...skipping 23 matching lines...) Expand all Loading... |
615 for (size_t i = 0; i < 6; ++i) { | 587 for (size_t i = 0; i < 6; ++i) { |
616 section_names.insert(form_structure.field(i)->section()); | 588 section_names.insert(form_structure.field(i)->section()); |
617 } | 589 } |
618 EXPECT_EQ(1U, section_names.size()); | 590 EXPECT_EQ(1U, section_names.size()); |
619 } | 591 } |
620 | 592 |
621 // Verify that we can correctly process repeated sections listed in the | 593 // Verify that we can correctly process repeated sections listed in the |
622 // |autocomplete| attribute. | 594 // |autocomplete| attribute. |
623 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsRepeated) { | 595 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsRepeated) { |
624 FormData form; | 596 FormData form; |
625 form.method = ASCIIToUTF16("post"); | |
626 | 597 |
627 FormFieldData field; | 598 FormFieldData field; |
628 field.form_control_type = "text"; | 599 field.form_control_type = "text"; |
629 | 600 |
630 field.autocomplete_attribute = "section-foo email"; | 601 field.autocomplete_attribute = "section-foo email"; |
631 form.fields.push_back(field); | 602 form.fields.push_back(field); |
632 field.autocomplete_attribute = "section-foo address-line1"; | 603 field.autocomplete_attribute = "section-foo address-line1"; |
633 form.fields.push_back(field); | 604 form.fields.push_back(field); |
634 | 605 |
635 FormStructure form_structure(form); | 606 FormStructure form_structure(form); |
636 form_structure.DetermineHeuristicTypes(TestAutofillMetrics()); | 607 form_structure.DetermineHeuristicTypes(TestAutofillMetrics()); |
637 | 608 |
638 // Expect the correct number of fields. | 609 // Expect the correct number of fields. |
639 ASSERT_EQ(2U, form_structure.field_count()); | 610 ASSERT_EQ(2U, form_structure.field_count()); |
640 EXPECT_EQ(2U, form_structure.autofill_count()); | 611 EXPECT_EQ(2U, form_structure.autofill_count()); |
641 | 612 |
642 // All of the fields in this form should be parsed as belonging to the same | 613 // All of the fields in this form should be parsed as belonging to the same |
643 // section. | 614 // section. |
644 std::set<std::string> section_names; | 615 std::set<std::string> section_names; |
645 for (size_t i = 0; i < 2; ++i) { | 616 for (size_t i = 0; i < 2; ++i) { |
646 section_names.insert(form_structure.field(i)->section()); | 617 section_names.insert(form_structure.field(i)->section()); |
647 } | 618 } |
648 EXPECT_EQ(1U, section_names.size()); | 619 EXPECT_EQ(1U, section_names.size()); |
649 } | 620 } |
650 | 621 |
651 // Verify that we do not override the author-specified sections from a form with | 622 // Verify that we do not override the author-specified sections from a form with |
652 // local heuristics. | 623 // local heuristics. |
653 TEST(FormStructureTest, HeuristicsDontOverrideAutocompleteAttributeSections) { | 624 TEST(FormStructureTest, HeuristicsDontOverrideAutocompleteAttributeSections) { |
654 FormData form; | 625 FormData form; |
655 form.method = ASCIIToUTF16("post"); | |
656 | 626 |
657 FormFieldData field; | 627 FormFieldData field; |
658 field.form_control_type = "text"; | 628 field.form_control_type = "text"; |
659 | 629 |
660 field.name = ASCIIToUTF16("one"); | 630 field.name = ASCIIToUTF16("one"); |
661 field.autocomplete_attribute = "address-line1"; | 631 field.autocomplete_attribute = "address-line1"; |
662 form.fields.push_back(field); | 632 form.fields.push_back(field); |
663 field.name = base::string16(); | 633 field.name = base::string16(); |
664 field.autocomplete_attribute = "section-foo email"; | 634 field.autocomplete_attribute = "section-foo email"; |
665 form.fields.push_back(field); | 635 form.fields.push_back(field); |
(...skipping 16 matching lines...) Expand all Loading... |
682 // form, we do not apply these usual heuristics. | 652 // form, we do not apply these usual heuristics. |
683 EXPECT_EQ(ASCIIToUTF16("one"), form_structure.field(0)->name); | 653 EXPECT_EQ(ASCIIToUTF16("one"), form_structure.field(0)->name); |
684 EXPECT_EQ(ASCIIToUTF16("two"), form_structure.field(3)->name); | 654 EXPECT_EQ(ASCIIToUTF16("two"), form_structure.field(3)->name); |
685 EXPECT_EQ(form_structure.field(0)->section(), | 655 EXPECT_EQ(form_structure.field(0)->section(), |
686 form_structure.field(3)->section()); | 656 form_structure.field(3)->section()); |
687 } | 657 } |
688 | 658 |
689 TEST(FormStructureTest, HeuristicsSample8) { | 659 TEST(FormStructureTest, HeuristicsSample8) { |
690 scoped_ptr<FormStructure> form_structure; | 660 scoped_ptr<FormStructure> form_structure; |
691 FormData form; | 661 FormData form; |
692 form.method = ASCIIToUTF16("post"); | |
693 | 662 |
694 FormFieldData field; | 663 FormFieldData field; |
695 field.form_control_type = "text"; | 664 field.form_control_type = "text"; |
696 | 665 |
697 field.label = ASCIIToUTF16("Your First Name:"); | 666 field.label = ASCIIToUTF16("Your First Name:"); |
698 field.name = ASCIIToUTF16("bill.first"); | 667 field.name = ASCIIToUTF16("bill.first"); |
699 form.fields.push_back(field); | 668 form.fields.push_back(field); |
700 | 669 |
701 field.label = ASCIIToUTF16("Your Last Name:"); | 670 field.label = ASCIIToUTF16("Your Last Name:"); |
702 field.name = ASCIIToUTF16("bill.last"); | 671 field.name = ASCIIToUTF16("bill.last"); |
(...skipping 27 matching lines...) Expand all Loading... |
730 field.name = ASCIIToUTF16("BillTo.Phone"); | 699 field.name = ASCIIToUTF16("BillTo.Phone"); |
731 form.fields.push_back(field); | 700 form.fields.push_back(field); |
732 | 701 |
733 field.label = base::string16(); | 702 field.label = base::string16(); |
734 field.name = ASCIIToUTF16("Submit"); | 703 field.name = ASCIIToUTF16("Submit"); |
735 field.form_control_type = "submit"; | 704 field.form_control_type = "submit"; |
736 form.fields.push_back(field); | 705 form.fields.push_back(field); |
737 | 706 |
738 form_structure.reset(new FormStructure(form)); | 707 form_structure.reset(new FormStructure(form)); |
739 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 708 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
740 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 709 EXPECT_TRUE(form_structure->IsAutofillable()); |
741 ASSERT_EQ(10U, form_structure->field_count()); | 710 ASSERT_EQ(10U, form_structure->field_count()); |
742 ASSERT_EQ(9U, form_structure->autofill_count()); | 711 ASSERT_EQ(9U, form_structure->autofill_count()); |
743 | 712 |
744 // First name. | 713 // First name. |
745 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 714 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
746 // Last name. | 715 // Last name. |
747 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); | 716 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); |
748 // Address. | 717 // Address. |
749 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(2)->heuristic_type()); | 718 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(2)->heuristic_type()); |
750 // Address. | 719 // Address. |
751 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(3)->heuristic_type()); | 720 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(3)->heuristic_type()); |
752 // City. | 721 // City. |
753 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type()); | 722 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type()); |
754 // State. | 723 // State. |
755 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(5)->heuristic_type()); | 724 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(5)->heuristic_type()); |
756 // Zip. | 725 // Zip. |
757 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); | 726 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); |
758 // Country. | 727 // Country. |
759 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); | 728 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); |
760 // Phone. | 729 // Phone. |
761 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, | 730 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
762 form_structure->field(8)->heuristic_type()); | 731 form_structure->field(8)->heuristic_type()); |
763 // Submit. | 732 // Submit. |
764 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(9)->heuristic_type()); | 733 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(9)->heuristic_type()); |
765 } | 734 } |
766 | 735 |
767 TEST(FormStructureTest, HeuristicsSample6) { | 736 TEST(FormStructureTest, HeuristicsSample6) { |
768 scoped_ptr<FormStructure> form_structure; | 737 scoped_ptr<FormStructure> form_structure; |
769 FormData form; | 738 FormData form; |
770 form.method = ASCIIToUTF16("post"); | |
771 | 739 |
772 FormFieldData field; | 740 FormFieldData field; |
773 field.form_control_type = "text"; | 741 field.form_control_type = "text"; |
774 | 742 |
775 field.label = ASCIIToUTF16("E-mail address"); | 743 field.label = ASCIIToUTF16("E-mail address"); |
776 field.name = ASCIIToUTF16("email"); | 744 field.name = ASCIIToUTF16("email"); |
777 form.fields.push_back(field); | 745 form.fields.push_back(field); |
778 | 746 |
779 field.label = ASCIIToUTF16("Full name"); | 747 field.label = ASCIIToUTF16("Full name"); |
780 field.name = ASCIIToUTF16("name"); | 748 field.name = ASCIIToUTF16("name"); |
(...skipping 16 matching lines...) Expand all Loading... |
797 form.fields.push_back(field); | 765 form.fields.push_back(field); |
798 | 766 |
799 field.label = base::string16(); | 767 field.label = base::string16(); |
800 field.name = ASCIIToUTF16("Submit"); | 768 field.name = ASCIIToUTF16("Submit"); |
801 field.value = ASCIIToUTF16("continue"); | 769 field.value = ASCIIToUTF16("continue"); |
802 field.form_control_type = "submit"; | 770 field.form_control_type = "submit"; |
803 form.fields.push_back(field); | 771 form.fields.push_back(field); |
804 | 772 |
805 form_structure.reset(new FormStructure(form)); | 773 form_structure.reset(new FormStructure(form)); |
806 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 774 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
807 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 775 EXPECT_TRUE(form_structure->IsAutofillable()); |
808 ASSERT_EQ(7U, form_structure->field_count()); | 776 ASSERT_EQ(7U, form_structure->field_count()); |
809 ASSERT_EQ(6U, form_structure->autofill_count()); | 777 ASSERT_EQ(6U, form_structure->autofill_count()); |
810 | 778 |
811 // Email. | 779 // Email. |
812 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(0)->heuristic_type()); | 780 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(0)->heuristic_type()); |
813 // Full name. | 781 // Full name. |
814 EXPECT_EQ(NAME_FULL, form_structure->field(1)->heuristic_type()); | 782 EXPECT_EQ(NAME_FULL, form_structure->field(1)->heuristic_type()); |
815 // Company | 783 // Company |
816 EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type()); | 784 EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type()); |
817 // Address. | 785 // Address. |
818 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type()); | 786 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type()); |
819 // City. | 787 // City. |
820 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type()); | 788 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type()); |
821 // Zip. | 789 // Zip. |
822 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(5)->heuristic_type()); | 790 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(5)->heuristic_type()); |
823 // Submit. | 791 // Submit. |
824 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); | 792 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); |
825 } | 793 } |
826 | 794 |
827 // Tests a sequence of FormFields where only labels are supplied to heuristics | 795 // Tests a sequence of FormFields where only labels are supplied to heuristics |
828 // for matching. This works because FormFieldData labels are matched in the | 796 // for matching. This works because FormFieldData labels are matched in the |
829 // case that input element ids (or |name| fields) are missing. | 797 // case that input element ids (or |name| fields) are missing. |
830 TEST(FormStructureTest, HeuristicsLabelsOnly) { | 798 TEST(FormStructureTest, HeuristicsLabelsOnly) { |
831 scoped_ptr<FormStructure> form_structure; | 799 scoped_ptr<FormStructure> form_structure; |
832 FormData form; | 800 FormData form; |
833 form.method = ASCIIToUTF16("post"); | |
834 | 801 |
835 FormFieldData field; | 802 FormFieldData field; |
836 field.form_control_type = "text"; | 803 field.form_control_type = "text"; |
837 | 804 |
838 field.label = ASCIIToUTF16("First Name"); | 805 field.label = ASCIIToUTF16("First Name"); |
839 field.name = base::string16(); | 806 field.name = base::string16(); |
840 form.fields.push_back(field); | 807 form.fields.push_back(field); |
841 | 808 |
842 field.label = ASCIIToUTF16("Last Name"); | 809 field.label = ASCIIToUTF16("Last Name"); |
843 field.name = base::string16(); | 810 field.name = base::string16(); |
(...skipping 19 matching lines...) Expand all Loading... |
863 field.name = base::string16(); | 830 field.name = base::string16(); |
864 form.fields.push_back(field); | 831 form.fields.push_back(field); |
865 | 832 |
866 field.label = base::string16(); | 833 field.label = base::string16(); |
867 field.name = ASCIIToUTF16("Submit"); | 834 field.name = ASCIIToUTF16("Submit"); |
868 field.form_control_type = "submit"; | 835 field.form_control_type = "submit"; |
869 form.fields.push_back(field); | 836 form.fields.push_back(field); |
870 | 837 |
871 form_structure.reset(new FormStructure(form)); | 838 form_structure.reset(new FormStructure(form)); |
872 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 839 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
873 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 840 EXPECT_TRUE(form_structure->IsAutofillable()); |
874 ASSERT_EQ(8U, form_structure->field_count()); | 841 ASSERT_EQ(8U, form_structure->field_count()); |
875 ASSERT_EQ(7U, form_structure->autofill_count()); | 842 ASSERT_EQ(7U, form_structure->autofill_count()); |
876 | 843 |
877 // First name. | 844 // First name. |
878 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 845 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
879 // Last name. | 846 // Last name. |
880 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); | 847 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); |
881 // Email. | 848 // Email. |
882 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); | 849 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type()); |
883 // Phone. | 850 // Phone. |
884 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, | 851 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
885 form_structure->field(3)->heuristic_type()); | 852 form_structure->field(3)->heuristic_type()); |
886 // Address. | 853 // Address. |
887 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type()); | 854 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type()); |
888 // Address Line 2. | 855 // Address Line 2. |
889 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(5)->heuristic_type()); | 856 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(5)->heuristic_type()); |
890 // Zip. | 857 // Zip. |
891 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); | 858 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type()); |
892 // Submit. | 859 // Submit. |
893 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type()); | 860 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type()); |
894 } | 861 } |
895 | 862 |
896 TEST(FormStructureTest, HeuristicsCreditCardInfo) { | 863 TEST(FormStructureTest, HeuristicsCreditCardInfo) { |
897 scoped_ptr<FormStructure> form_structure; | 864 scoped_ptr<FormStructure> form_structure; |
898 FormData form; | 865 FormData form; |
899 form.method = ASCIIToUTF16("post"); | |
900 | 866 |
901 FormFieldData field; | 867 FormFieldData field; |
902 field.form_control_type = "text"; | 868 field.form_control_type = "text"; |
903 | 869 |
904 field.label = ASCIIToUTF16("Name on Card"); | 870 field.label = ASCIIToUTF16("Name on Card"); |
905 field.name = ASCIIToUTF16("name_on_card"); | 871 field.name = ASCIIToUTF16("name_on_card"); |
906 form.fields.push_back(field); | 872 form.fields.push_back(field); |
907 | 873 |
908 field.label = ASCIIToUTF16("Card Number"); | 874 field.label = ASCIIToUTF16("Card Number"); |
909 field.name = ASCIIToUTF16("card_number"); | 875 field.name = ASCIIToUTF16("card_number"); |
(...skipping 11 matching lines...) Expand all Loading... |
921 field.name = ASCIIToUTF16("verification"); | 887 field.name = ASCIIToUTF16("verification"); |
922 form.fields.push_back(field); | 888 form.fields.push_back(field); |
923 | 889 |
924 field.label = base::string16(); | 890 field.label = base::string16(); |
925 field.name = ASCIIToUTF16("Submit"); | 891 field.name = ASCIIToUTF16("Submit"); |
926 field.form_control_type = "submit"; | 892 field.form_control_type = "submit"; |
927 form.fields.push_back(field); | 893 form.fields.push_back(field); |
928 | 894 |
929 form_structure.reset(new FormStructure(form)); | 895 form_structure.reset(new FormStructure(form)); |
930 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 896 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
931 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 897 EXPECT_TRUE(form_structure->IsAutofillable()); |
932 ASSERT_EQ(6U, form_structure->field_count()); | 898 ASSERT_EQ(6U, form_structure->field_count()); |
933 ASSERT_EQ(5U, form_structure->autofill_count()); | 899 ASSERT_EQ(5U, form_structure->autofill_count()); |
934 | 900 |
935 // Credit card name. | 901 // Credit card name. |
936 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type()); | 902 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type()); |
937 // Credit card number. | 903 // Credit card number. |
938 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(1)->heuristic_type()); | 904 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(1)->heuristic_type()); |
939 // Credit card expiration month. | 905 // Credit card expiration month. |
940 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(2)->heuristic_type()); | 906 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(2)->heuristic_type()); |
941 // Credit card expiration year. | 907 // Credit card expiration year. |
942 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 908 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
943 form_structure->field(3)->heuristic_type()); | 909 form_structure->field(3)->heuristic_type()); |
944 // CVV. | 910 // CVV. |
945 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, | 911 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, |
946 form_structure->field(4)->heuristic_type()); | 912 form_structure->field(4)->heuristic_type()); |
947 // Submit. | 913 // Submit. |
948 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(5)->heuristic_type()); | 914 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(5)->heuristic_type()); |
949 } | 915 } |
950 | 916 |
951 TEST(FormStructureTest, HeuristicsCreditCardInfoWithUnknownCardField) { | 917 TEST(FormStructureTest, HeuristicsCreditCardInfoWithUnknownCardField) { |
952 scoped_ptr<FormStructure> form_structure; | 918 scoped_ptr<FormStructure> form_structure; |
953 FormData form; | 919 FormData form; |
954 form.method = ASCIIToUTF16("post"); | |
955 | 920 |
956 FormFieldData field; | 921 FormFieldData field; |
957 field.form_control_type = "text"; | 922 field.form_control_type = "text"; |
958 | 923 |
959 field.label = ASCIIToUTF16("Name on Card"); | 924 field.label = ASCIIToUTF16("Name on Card"); |
960 field.name = ASCIIToUTF16("name_on_card"); | 925 field.name = ASCIIToUTF16("name_on_card"); |
961 form.fields.push_back(field); | 926 form.fields.push_back(field); |
962 | 927 |
963 // This is not a field we know how to process. But we should skip over it | 928 // This is not a field we know how to process. But we should skip over it |
964 // and process the other fields in the card block. | 929 // and process the other fields in the card block. |
(...skipping 17 matching lines...) Expand all Loading... |
982 field.name = ASCIIToUTF16("verification"); | 947 field.name = ASCIIToUTF16("verification"); |
983 form.fields.push_back(field); | 948 form.fields.push_back(field); |
984 | 949 |
985 field.label = base::string16(); | 950 field.label = base::string16(); |
986 field.name = ASCIIToUTF16("Submit"); | 951 field.name = ASCIIToUTF16("Submit"); |
987 field.form_control_type = "submit"; | 952 field.form_control_type = "submit"; |
988 form.fields.push_back(field); | 953 form.fields.push_back(field); |
989 | 954 |
990 form_structure.reset(new FormStructure(form)); | 955 form_structure.reset(new FormStructure(form)); |
991 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 956 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
992 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 957 EXPECT_TRUE(form_structure->IsAutofillable()); |
993 ASSERT_EQ(7U, form_structure->field_count()); | 958 ASSERT_EQ(7U, form_structure->field_count()); |
994 ASSERT_EQ(5U, form_structure->autofill_count()); | 959 ASSERT_EQ(5U, form_structure->autofill_count()); |
995 | 960 |
996 // Credit card name. | 961 // Credit card name. |
997 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type()); | 962 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type()); |
998 // Credit card type. This is an unknown type but related to the credit card. | 963 // Credit card type. This is an unknown type but related to the credit card. |
999 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); | 964 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type()); |
1000 // Credit card number. | 965 // Credit card number. |
1001 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type()); | 966 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type()); |
1002 // Credit card expiration month. | 967 // Credit card expiration month. |
1003 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); | 968 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); |
1004 // Credit card expiration year. | 969 // Credit card expiration year. |
1005 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 970 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
1006 form_structure->field(4)->heuristic_type()); | 971 form_structure->field(4)->heuristic_type()); |
1007 // CVV. | 972 // CVV. |
1008 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, | 973 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, |
1009 form_structure->field(5)->heuristic_type()); | 974 form_structure->field(5)->heuristic_type()); |
1010 // Submit. | 975 // Submit. |
1011 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); | 976 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type()); |
1012 } | 977 } |
1013 | 978 |
1014 TEST(FormStructureTest, ThreeAddressLines) { | 979 TEST(FormStructureTest, ThreeAddressLines) { |
1015 scoped_ptr<FormStructure> form_structure; | 980 scoped_ptr<FormStructure> form_structure; |
1016 FormData form; | 981 FormData form; |
1017 form.method = ASCIIToUTF16("post"); | |
1018 | 982 |
1019 FormFieldData field; | 983 FormFieldData field; |
1020 field.form_control_type = "text"; | 984 field.form_control_type = "text"; |
1021 | 985 |
1022 field.label = ASCIIToUTF16("Address Line1"); | 986 field.label = ASCIIToUTF16("Address Line1"); |
1023 field.name = ASCIIToUTF16("Address"); | 987 field.name = ASCIIToUTF16("Address"); |
1024 form.fields.push_back(field); | 988 form.fields.push_back(field); |
1025 | 989 |
1026 field.label = ASCIIToUTF16("Address Line2"); | 990 field.label = ASCIIToUTF16("Address Line2"); |
1027 field.name = ASCIIToUTF16("Address"); | 991 field.name = ASCIIToUTF16("Address"); |
1028 form.fields.push_back(field); | 992 form.fields.push_back(field); |
1029 | 993 |
1030 field.label = ASCIIToUTF16("Address Line3"); | 994 field.label = ASCIIToUTF16("Address Line3"); |
1031 field.name = ASCIIToUTF16("Address"); | 995 field.name = ASCIIToUTF16("Address"); |
1032 form.fields.push_back(field); | 996 form.fields.push_back(field); |
1033 | 997 |
1034 field.label = ASCIIToUTF16("City"); | 998 field.label = ASCIIToUTF16("City"); |
1035 field.name = ASCIIToUTF16("city"); | 999 field.name = ASCIIToUTF16("city"); |
1036 form.fields.push_back(field); | 1000 form.fields.push_back(field); |
1037 | 1001 |
1038 form_structure.reset(new FormStructure(form)); | 1002 form_structure.reset(new FormStructure(form)); |
1039 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1003 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1040 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1004 EXPECT_TRUE(form_structure->IsAutofillable()); |
1041 ASSERT_EQ(4U, form_structure->field_count()); | 1005 ASSERT_EQ(4U, form_structure->field_count()); |
1042 ASSERT_EQ(3U, form_structure->autofill_count()); | 1006 ASSERT_EQ(3U, form_structure->autofill_count()); |
1043 | 1007 |
1044 // Address Line 1. | 1008 // Address Line 1. |
1045 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); | 1009 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); |
1046 // Address Line 2. | 1010 // Address Line 2. |
1047 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 1011 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
1048 // Address Line 3. | 1012 // Address Line 3. |
1049 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); | 1013 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); |
1050 // City. | 1014 // City. |
1051 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); | 1015 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); |
1052 } | 1016 } |
1053 | 1017 |
1054 // Numbered address lines after line two are ignored. | 1018 // Numbered address lines after line two are ignored. |
1055 TEST(FormStructureTest, SurplusAddressLinesIgnored) { | 1019 TEST(FormStructureTest, SurplusAddressLinesIgnored) { |
1056 scoped_ptr<FormStructure> form_structure; | 1020 scoped_ptr<FormStructure> form_structure; |
1057 FormData form; | 1021 FormData form; |
1058 form.method = ASCIIToUTF16("post"); | |
1059 | 1022 |
1060 FormFieldData field; | 1023 FormFieldData field; |
1061 field.form_control_type = "text"; | 1024 field.form_control_type = "text"; |
1062 | 1025 |
1063 field.label = ASCIIToUTF16("Address Line1"); | 1026 field.label = ASCIIToUTF16("Address Line1"); |
1064 field.name = ASCIIToUTF16("shipping.address.addressLine1"); | 1027 field.name = ASCIIToUTF16("shipping.address.addressLine1"); |
1065 form.fields.push_back(field); | 1028 form.fields.push_back(field); |
1066 | 1029 |
1067 field.label = ASCIIToUTF16("Address Line2"); | 1030 field.label = ASCIIToUTF16("Address Line2"); |
1068 field.name = ASCIIToUTF16("shipping.address.addressLine2"); | 1031 field.name = ASCIIToUTF16("shipping.address.addressLine2"); |
(...skipping 23 matching lines...) Expand all Loading... |
1092 } | 1055 } |
1093 | 1056 |
1094 // This example comes from expedia.com where they use a "Suite" label to | 1057 // This example comes from expedia.com where they use a "Suite" label to |
1095 // indicate a suite or apartment number. We interpret this as address line 2. | 1058 // indicate a suite or apartment number. We interpret this as address line 2. |
1096 // And the following "Street address second line" we interpret as address line | 1059 // And the following "Street address second line" we interpret as address line |
1097 // 3 and discard. | 1060 // 3 and discard. |
1098 // See http://crbug.com/48197 for details. | 1061 // See http://crbug.com/48197 for details. |
1099 TEST(FormStructureTest, ThreeAddressLinesExpedia) { | 1062 TEST(FormStructureTest, ThreeAddressLinesExpedia) { |
1100 scoped_ptr<FormStructure> form_structure; | 1063 scoped_ptr<FormStructure> form_structure; |
1101 FormData form; | 1064 FormData form; |
1102 form.method = ASCIIToUTF16("post"); | |
1103 | 1065 |
1104 FormFieldData field; | 1066 FormFieldData field; |
1105 field.form_control_type = "text"; | 1067 field.form_control_type = "text"; |
1106 | 1068 |
1107 field.label = ASCIIToUTF16("Street:"); | 1069 field.label = ASCIIToUTF16("Street:"); |
1108 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads1"); | 1070 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads1"); |
1109 form.fields.push_back(field); | 1071 form.fields.push_back(field); |
1110 | 1072 |
1111 field.label = ASCIIToUTF16("Suite or Apt:"); | 1073 field.label = ASCIIToUTF16("Suite or Apt:"); |
1112 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adap"); | 1074 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adap"); |
1113 form.fields.push_back(field); | 1075 form.fields.push_back(field); |
1114 | 1076 |
1115 field.label = ASCIIToUTF16("Street address second line"); | 1077 field.label = ASCIIToUTF16("Street address second line"); |
1116 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads2"); | 1078 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads2"); |
1117 form.fields.push_back(field); | 1079 form.fields.push_back(field); |
1118 | 1080 |
1119 field.label = ASCIIToUTF16("City:"); | 1081 field.label = ASCIIToUTF16("City:"); |
1120 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adct"); | 1082 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adct"); |
1121 form.fields.push_back(field); | 1083 form.fields.push_back(field); |
1122 | 1084 |
1123 form_structure.reset(new FormStructure(form)); | 1085 form_structure.reset(new FormStructure(form)); |
1124 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1086 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1125 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1087 EXPECT_TRUE(form_structure->IsAutofillable()); |
1126 ASSERT_EQ(4U, form_structure->field_count()); | 1088 ASSERT_EQ(4U, form_structure->field_count()); |
1127 EXPECT_EQ(3U, form_structure->autofill_count()); | 1089 EXPECT_EQ(3U, form_structure->autofill_count()); |
1128 | 1090 |
1129 // Address Line 1. | 1091 // Address Line 1. |
1130 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); | 1092 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); |
1131 // Suite / Apt. | 1093 // Suite / Apt. |
1132 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 1094 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
1133 // Address Line 3. | 1095 // Address Line 3. |
1134 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); | 1096 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); |
1135 // City. | 1097 // City. |
1136 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); | 1098 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type()); |
1137 } | 1099 } |
1138 | 1100 |
1139 // This example comes from ebay.com where the word "suite" appears in the label | 1101 // This example comes from ebay.com where the word "suite" appears in the label |
1140 // and the name "address2" clearly indicates that this is the address line 2. | 1102 // and the name "address2" clearly indicates that this is the address line 2. |
1141 // See http://crbug.com/48197 for details. | 1103 // See http://crbug.com/48197 for details. |
1142 TEST(FormStructureTest, TwoAddressLinesEbay) { | 1104 TEST(FormStructureTest, TwoAddressLinesEbay) { |
1143 scoped_ptr<FormStructure> form_structure; | 1105 scoped_ptr<FormStructure> form_structure; |
1144 FormData form; | 1106 FormData form; |
1145 form.method = ASCIIToUTF16("post"); | |
1146 | 1107 |
1147 FormFieldData field; | 1108 FormFieldData field; |
1148 field.form_control_type = "text"; | 1109 field.form_control_type = "text"; |
1149 | 1110 |
1150 field.label = ASCIIToUTF16("Address Line1"); | 1111 field.label = ASCIIToUTF16("Address Line1"); |
1151 field.name = ASCIIToUTF16("address1"); | 1112 field.name = ASCIIToUTF16("address1"); |
1152 form.fields.push_back(field); | 1113 form.fields.push_back(field); |
1153 | 1114 |
1154 field.label = ASCIIToUTF16("Floor number, suite number, etc"); | 1115 field.label = ASCIIToUTF16("Floor number, suite number, etc"); |
1155 field.name = ASCIIToUTF16("address2"); | 1116 field.name = ASCIIToUTF16("address2"); |
1156 form.fields.push_back(field); | 1117 form.fields.push_back(field); |
1157 | 1118 |
1158 field.label = ASCIIToUTF16("City:"); | 1119 field.label = ASCIIToUTF16("City:"); |
1159 field.name = ASCIIToUTF16("city"); | 1120 field.name = ASCIIToUTF16("city"); |
1160 form.fields.push_back(field); | 1121 form.fields.push_back(field); |
1161 | 1122 |
1162 form_structure.reset(new FormStructure(form)); | 1123 form_structure.reset(new FormStructure(form)); |
1163 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1124 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1164 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1125 EXPECT_TRUE(form_structure->IsAutofillable()); |
1165 ASSERT_EQ(3U, form_structure->field_count()); | 1126 ASSERT_EQ(3U, form_structure->field_count()); |
1166 ASSERT_EQ(3U, form_structure->autofill_count()); | 1127 ASSERT_EQ(3U, form_structure->autofill_count()); |
1167 | 1128 |
1168 // Address Line 1. | 1129 // Address Line 1. |
1169 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); | 1130 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); |
1170 // Address Line 2. | 1131 // Address Line 2. |
1171 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 1132 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
1172 // City. | 1133 // City. |
1173 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(2)->heuristic_type()); | 1134 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(2)->heuristic_type()); |
1174 } | 1135 } |
1175 | 1136 |
1176 TEST(FormStructureTest, HeuristicsStateWithProvince) { | 1137 TEST(FormStructureTest, HeuristicsStateWithProvince) { |
1177 scoped_ptr<FormStructure> form_structure; | 1138 scoped_ptr<FormStructure> form_structure; |
1178 FormData form; | 1139 FormData form; |
1179 form.method = ASCIIToUTF16("post"); | |
1180 | 1140 |
1181 FormFieldData field; | 1141 FormFieldData field; |
1182 field.form_control_type = "text"; | 1142 field.form_control_type = "text"; |
1183 | 1143 |
1184 field.label = ASCIIToUTF16("Address Line1"); | 1144 field.label = ASCIIToUTF16("Address Line1"); |
1185 field.name = ASCIIToUTF16("Address"); | 1145 field.name = ASCIIToUTF16("Address"); |
1186 form.fields.push_back(field); | 1146 form.fields.push_back(field); |
1187 | 1147 |
1188 field.label = ASCIIToUTF16("Address Line2"); | 1148 field.label = ASCIIToUTF16("Address Line2"); |
1189 field.name = ASCIIToUTF16("Address"); | 1149 field.name = ASCIIToUTF16("Address"); |
1190 form.fields.push_back(field); | 1150 form.fields.push_back(field); |
1191 | 1151 |
1192 field.label = ASCIIToUTF16("State/Province/Region"); | 1152 field.label = ASCIIToUTF16("State/Province/Region"); |
1193 field.name = ASCIIToUTF16("State"); | 1153 field.name = ASCIIToUTF16("State"); |
1194 form.fields.push_back(field); | 1154 form.fields.push_back(field); |
1195 | 1155 |
1196 form_structure.reset(new FormStructure(form)); | 1156 form_structure.reset(new FormStructure(form)); |
1197 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1157 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1198 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1158 EXPECT_TRUE(form_structure->IsAutofillable()); |
1199 ASSERT_EQ(3U, form_structure->field_count()); | 1159 ASSERT_EQ(3U, form_structure->field_count()); |
1200 ASSERT_EQ(3U, form_structure->autofill_count()); | 1160 ASSERT_EQ(3U, form_structure->autofill_count()); |
1201 | 1161 |
1202 // Address Line 1. | 1162 // Address Line 1. |
1203 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); | 1163 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type()); |
1204 // Address Line 2. | 1164 // Address Line 2. |
1205 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); | 1165 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type()); |
1206 // State. | 1166 // State. |
1207 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(2)->heuristic_type()); | 1167 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(2)->heuristic_type()); |
1208 } | 1168 } |
1209 | 1169 |
1210 // This example comes from lego.com's checkout page. | 1170 // This example comes from lego.com's checkout page. |
1211 TEST(FormStructureTest, HeuristicsWithBilling) { | 1171 TEST(FormStructureTest, HeuristicsWithBilling) { |
1212 scoped_ptr<FormStructure> form_structure; | 1172 scoped_ptr<FormStructure> form_structure; |
1213 FormData form; | 1173 FormData form; |
1214 form.method = ASCIIToUTF16("post"); | |
1215 | 1174 |
1216 FormFieldData field; | 1175 FormFieldData field; |
1217 field.form_control_type = "text"; | 1176 field.form_control_type = "text"; |
1218 | 1177 |
1219 field.label = ASCIIToUTF16("First Name*:"); | 1178 field.label = ASCIIToUTF16("First Name*:"); |
1220 field.name = ASCIIToUTF16("editBillingAddress$firstNameBox"); | 1179 field.name = ASCIIToUTF16("editBillingAddress$firstNameBox"); |
1221 form.fields.push_back(field); | 1180 form.fields.push_back(field); |
1222 | 1181 |
1223 field.label = ASCIIToUTF16("Last Name*:"); | 1182 field.label = ASCIIToUTF16("Last Name*:"); |
1224 field.name = ASCIIToUTF16("editBillingAddress$lastNameBox"); | 1183 field.name = ASCIIToUTF16("editBillingAddress$lastNameBox"); |
(...skipping 30 matching lines...) Expand all Loading... |
1255 field.label = ASCIIToUTF16("Phone*:"); | 1214 field.label = ASCIIToUTF16("Phone*:"); |
1256 field.name = ASCIIToUTF16("editBillingAddress$phoneBox"); | 1215 field.name = ASCIIToUTF16("editBillingAddress$phoneBox"); |
1257 form.fields.push_back(field); | 1216 form.fields.push_back(field); |
1258 | 1217 |
1259 field.label = ASCIIToUTF16("Email Address*:"); | 1218 field.label = ASCIIToUTF16("Email Address*:"); |
1260 field.name = ASCIIToUTF16("email$emailBox"); | 1219 field.name = ASCIIToUTF16("email$emailBox"); |
1261 form.fields.push_back(field); | 1220 form.fields.push_back(field); |
1262 | 1221 |
1263 form_structure.reset(new FormStructure(form)); | 1222 form_structure.reset(new FormStructure(form)); |
1264 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1223 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1265 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1224 EXPECT_TRUE(form_structure->IsAutofillable()); |
1266 ASSERT_EQ(11U, form_structure->field_count()); | 1225 ASSERT_EQ(11U, form_structure->field_count()); |
1267 ASSERT_EQ(11U, form_structure->autofill_count()); | 1226 ASSERT_EQ(11U, form_structure->autofill_count()); |
1268 | 1227 |
1269 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); | 1228 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type()); |
1270 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); | 1229 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type()); |
1271 EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type()); | 1230 EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type()); |
1272 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type()); | 1231 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type()); |
1273 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(4)->heuristic_type()); | 1232 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(4)->heuristic_type()); |
1274 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type()); | 1233 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type()); |
1275 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(6)->heuristic_type()); | 1234 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(6)->heuristic_type()); |
1276 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); | 1235 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type()); |
1277 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(8)->heuristic_type()); | 1236 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(8)->heuristic_type()); |
1278 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, | 1237 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
1279 form_structure->field(9)->heuristic_type()); | 1238 form_structure->field(9)->heuristic_type()); |
1280 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(10)->heuristic_type()); | 1239 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(10)->heuristic_type()); |
1281 } | 1240 } |
1282 | 1241 |
1283 TEST(FormStructureTest, ThreePartPhoneNumber) { | 1242 TEST(FormStructureTest, ThreePartPhoneNumber) { |
1284 scoped_ptr<FormStructure> form_structure; | 1243 scoped_ptr<FormStructure> form_structure; |
1285 FormData form; | 1244 FormData form; |
1286 form.method = ASCIIToUTF16("post"); | |
1287 | 1245 |
1288 FormFieldData field; | 1246 FormFieldData field; |
1289 field.form_control_type = "text"; | 1247 field.form_control_type = "text"; |
1290 | 1248 |
1291 field.label = ASCIIToUTF16("Phone:"); | 1249 field.label = ASCIIToUTF16("Phone:"); |
1292 field.name = ASCIIToUTF16("dayphone1"); | 1250 field.name = ASCIIToUTF16("dayphone1"); |
1293 field.max_length = 0; | 1251 field.max_length = 0; |
1294 form.fields.push_back(field); | 1252 form.fields.push_back(field); |
1295 | 1253 |
1296 field.label = ASCIIToUTF16("-"); | 1254 field.label = ASCIIToUTF16("-"); |
1297 field.name = ASCIIToUTF16("dayphone2"); | 1255 field.name = ASCIIToUTF16("dayphone2"); |
1298 field.max_length = 3; // Size of prefix is 3. | 1256 field.max_length = 3; // Size of prefix is 3. |
1299 form.fields.push_back(field); | 1257 form.fields.push_back(field); |
1300 | 1258 |
1301 field.label = ASCIIToUTF16("-"); | 1259 field.label = ASCIIToUTF16("-"); |
1302 field.name = ASCIIToUTF16("dayphone3"); | 1260 field.name = ASCIIToUTF16("dayphone3"); |
1303 field.max_length = 4; // Size of suffix is 4. If unlimited size is | 1261 field.max_length = 4; // Size of suffix is 4. If unlimited size is |
1304 // passed, phone will be parsed as | 1262 // passed, phone will be parsed as |
1305 // <country code> - <area code> - <phone>. | 1263 // <country code> - <area code> - <phone>. |
1306 form.fields.push_back(field); | 1264 form.fields.push_back(field); |
1307 | 1265 |
1308 field.label = ASCIIToUTF16("ext.:"); | 1266 field.label = ASCIIToUTF16("ext.:"); |
1309 field.name = ASCIIToUTF16("dayphone4"); | 1267 field.name = ASCIIToUTF16("dayphone4"); |
1310 field.max_length = 0; | 1268 field.max_length = 0; |
1311 form.fields.push_back(field); | 1269 form.fields.push_back(field); |
1312 | 1270 |
1313 form_structure.reset(new FormStructure(form)); | 1271 form_structure.reset(new FormStructure(form)); |
1314 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1272 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1315 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1273 EXPECT_TRUE(form_structure->IsAutofillable()); |
1316 ASSERT_EQ(4U, form_structure->field_count()); | 1274 ASSERT_EQ(4U, form_structure->field_count()); |
1317 ASSERT_EQ(3U, form_structure->autofill_count()); | 1275 ASSERT_EQ(3U, form_structure->autofill_count()); |
1318 | 1276 |
1319 // Area code. | 1277 // Area code. |
1320 EXPECT_EQ(PHONE_HOME_CITY_CODE, form_structure->field(0)->heuristic_type()); | 1278 EXPECT_EQ(PHONE_HOME_CITY_CODE, form_structure->field(0)->heuristic_type()); |
1321 // Phone number suffix. | 1279 // Phone number suffix. |
1322 EXPECT_EQ(PHONE_HOME_NUMBER, | 1280 EXPECT_EQ(PHONE_HOME_NUMBER, |
1323 form_structure->field(1)->heuristic_type()); | 1281 form_structure->field(1)->heuristic_type()); |
1324 // Phone number suffix. | 1282 // Phone number suffix. |
1325 EXPECT_EQ(PHONE_HOME_NUMBER, | 1283 EXPECT_EQ(PHONE_HOME_NUMBER, |
1326 form_structure->field(2)->heuristic_type()); | 1284 form_structure->field(2)->heuristic_type()); |
1327 // Unknown. | 1285 // Unknown. |
1328 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type()); | 1286 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type()); |
1329 } | 1287 } |
1330 | 1288 |
1331 TEST(FormStructureTest, HeuristicsInfernoCC) { | 1289 TEST(FormStructureTest, HeuristicsInfernoCC) { |
1332 scoped_ptr<FormStructure> form_structure; | 1290 scoped_ptr<FormStructure> form_structure; |
1333 FormData form; | 1291 FormData form; |
1334 form.method = ASCIIToUTF16("post"); | |
1335 | 1292 |
1336 FormFieldData field; | 1293 FormFieldData field; |
1337 field.form_control_type = "text"; | 1294 field.form_control_type = "text"; |
1338 | 1295 |
1339 field.label = ASCIIToUTF16("Name on Card"); | 1296 field.label = ASCIIToUTF16("Name on Card"); |
1340 field.name = ASCIIToUTF16("name_on_card"); | 1297 field.name = ASCIIToUTF16("name_on_card"); |
1341 form.fields.push_back(field); | 1298 form.fields.push_back(field); |
1342 | 1299 |
1343 field.label = ASCIIToUTF16("Address"); | 1300 field.label = ASCIIToUTF16("Address"); |
1344 field.name = ASCIIToUTF16("billing_address"); | 1301 field.name = ASCIIToUTF16("billing_address"); |
1345 form.fields.push_back(field); | 1302 form.fields.push_back(field); |
1346 | 1303 |
1347 field.label = ASCIIToUTF16("Card Number"); | 1304 field.label = ASCIIToUTF16("Card Number"); |
1348 field.name = ASCIIToUTF16("card_number"); | 1305 field.name = ASCIIToUTF16("card_number"); |
1349 form.fields.push_back(field); | 1306 form.fields.push_back(field); |
1350 | 1307 |
1351 field.label = ASCIIToUTF16("Expiration Date"); | 1308 field.label = ASCIIToUTF16("Expiration Date"); |
1352 field.name = ASCIIToUTF16("expiration_month"); | 1309 field.name = ASCIIToUTF16("expiration_month"); |
1353 form.fields.push_back(field); | 1310 form.fields.push_back(field); |
1354 | 1311 |
1355 field.label = ASCIIToUTF16("Expiration Year"); | 1312 field.label = ASCIIToUTF16("Expiration Year"); |
1356 field.name = ASCIIToUTF16("expiration_year"); | 1313 field.name = ASCIIToUTF16("expiration_year"); |
1357 form.fields.push_back(field); | 1314 form.fields.push_back(field); |
1358 | 1315 |
1359 form_structure.reset(new FormStructure(form)); | 1316 form_structure.reset(new FormStructure(form)); |
1360 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1317 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1361 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1318 EXPECT_TRUE(form_structure->IsAutofillable()); |
1362 | 1319 |
1363 // Expect the correct number of fields. | 1320 // Expect the correct number of fields. |
1364 ASSERT_EQ(5U, form_structure->field_count()); | 1321 ASSERT_EQ(5U, form_structure->field_count()); |
1365 EXPECT_EQ(5U, form_structure->autofill_count()); | 1322 EXPECT_EQ(5U, form_structure->autofill_count()); |
1366 | 1323 |
1367 // Name on Card. | 1324 // Name on Card. |
1368 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type()); | 1325 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type()); |
1369 // Address. | 1326 // Address. |
1370 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(1)->heuristic_type()); | 1327 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(1)->heuristic_type()); |
1371 // Card Number. | 1328 // Card Number. |
1372 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type()); | 1329 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type()); |
1373 // Expiration Date. | 1330 // Expiration Date. |
1374 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); | 1331 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); |
1375 // Expiration Year. | 1332 // Expiration Year. |
1376 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 1333 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
1377 form_structure->field(4)->heuristic_type()); | 1334 form_structure->field(4)->heuristic_type()); |
1378 } | 1335 } |
1379 | 1336 |
1380 TEST(FormStructureTest, CVCCodeClash) { | 1337 TEST(FormStructureTest, CVCCodeClash) { |
1381 scoped_ptr<FormStructure> form_structure; | 1338 scoped_ptr<FormStructure> form_structure; |
1382 FormData form; | 1339 FormData form; |
1383 form.method = ASCIIToUTF16("post"); | |
1384 | 1340 |
1385 FormFieldData field; | 1341 FormFieldData field; |
1386 field.form_control_type = "text"; | 1342 field.form_control_type = "text"; |
1387 | 1343 |
1388 field.label = ASCIIToUTF16("Card number"); | 1344 field.label = ASCIIToUTF16("Card number"); |
1389 field.name = ASCIIToUTF16("ccnumber"); | 1345 field.name = ASCIIToUTF16("ccnumber"); |
1390 form.fields.push_back(field); | 1346 form.fields.push_back(field); |
1391 | 1347 |
1392 field.label = ASCIIToUTF16("First name"); | 1348 field.label = ASCIIToUTF16("First name"); |
1393 field.name = ASCIIToUTF16("first_name"); | 1349 field.name = ASCIIToUTF16("first_name"); |
(...skipping 10 matching lines...) Expand all Loading... |
1404 field.label = base::string16(); | 1360 field.label = base::string16(); |
1405 field.name = ASCIIToUTF16("ccexpiresyear"); | 1361 field.name = ASCIIToUTF16("ccexpiresyear"); |
1406 form.fields.push_back(field); | 1362 form.fields.push_back(field); |
1407 | 1363 |
1408 field.label = ASCIIToUTF16("cvc number"); | 1364 field.label = ASCIIToUTF16("cvc number"); |
1409 field.name = ASCIIToUTF16("csc"); | 1365 field.name = ASCIIToUTF16("csc"); |
1410 form.fields.push_back(field); | 1366 form.fields.push_back(field); |
1411 | 1367 |
1412 form_structure.reset(new FormStructure(form)); | 1368 form_structure.reset(new FormStructure(form)); |
1413 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1369 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1414 EXPECT_TRUE(form_structure->IsAutofillable(true)); | 1370 EXPECT_TRUE(form_structure->IsAutofillable()); |
1415 | 1371 |
1416 // Expect the correct number of fields. | 1372 // Expect the correct number of fields. |
1417 ASSERT_EQ(6U, form_structure->field_count()); | 1373 ASSERT_EQ(6U, form_structure->field_count()); |
1418 ASSERT_EQ(5U, form_structure->autofill_count()); | 1374 ASSERT_EQ(5U, form_structure->autofill_count()); |
1419 | 1375 |
1420 // Card Number. | 1376 // Card Number. |
1421 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(0)->heuristic_type()); | 1377 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(0)->heuristic_type()); |
1422 // First name, taken as name on card. | 1378 // First name, taken as name on card. |
1423 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(1)->heuristic_type()); | 1379 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(1)->heuristic_type()); |
1424 // Last name is not merged. | 1380 // Last name is not merged. |
1425 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); | 1381 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); |
1426 // Expiration Date. | 1382 // Expiration Date. |
1427 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); | 1383 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); |
1428 // Expiration Year. | 1384 // Expiration Year. |
1429 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 1385 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
1430 form_structure->field(4)->heuristic_type()); | 1386 form_structure->field(4)->heuristic_type()); |
1431 // CVC code. | 1387 // CVC code. |
1432 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, | 1388 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE, |
1433 form_structure->field(5)->heuristic_type()); | 1389 form_structure->field(5)->heuristic_type()); |
1434 } | 1390 } |
1435 | 1391 |
1436 TEST(FormStructureTest, EncodeQueryRequest) { | 1392 TEST(FormStructureTest, EncodeQueryRequest) { |
1437 FormData form; | 1393 FormData form; |
1438 form.method = ASCIIToUTF16("post"); | |
1439 | 1394 |
1440 FormFieldData field; | 1395 FormFieldData field; |
1441 field.form_control_type = "text"; | 1396 field.form_control_type = "text"; |
1442 | 1397 |
1443 field.label = ASCIIToUTF16("Name on Card"); | 1398 field.label = ASCIIToUTF16("Name on Card"); |
1444 field.name = ASCIIToUTF16("name_on_card"); | 1399 field.name = ASCIIToUTF16("name_on_card"); |
1445 form.fields.push_back(field); | 1400 form.fields.push_back(field); |
1446 | 1401 |
1447 field.label = ASCIIToUTF16("Address"); | 1402 field.label = ASCIIToUTF16("Address"); |
1448 field.name = ASCIIToUTF16("billing_address"); | 1403 field.name = ASCIIToUTF16("billing_address"); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1564 &encoded_signatures, | 1519 &encoded_signatures, |
1565 &encoded_xml)); | 1520 &encoded_xml)); |
1566 EXPECT_EQ(0U, encoded_signatures.size()); | 1521 EXPECT_EQ(0U, encoded_signatures.size()); |
1567 EXPECT_EQ("", encoded_xml); | 1522 EXPECT_EQ("", encoded_xml); |
1568 } | 1523 } |
1569 | 1524 |
1570 TEST(FormStructureTest, EncodeUploadRequest) { | 1525 TEST(FormStructureTest, EncodeUploadRequest) { |
1571 scoped_ptr<FormStructure> form_structure; | 1526 scoped_ptr<FormStructure> form_structure; |
1572 std::vector<ServerFieldTypeSet> possible_field_types; | 1527 std::vector<ServerFieldTypeSet> possible_field_types; |
1573 FormData form; | 1528 FormData form; |
1574 form.method = ASCIIToUTF16("post"); | |
1575 form_structure.reset(new FormStructure(form)); | 1529 form_structure.reset(new FormStructure(form)); |
1576 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1530 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1577 | 1531 |
1578 FormFieldData field; | 1532 FormFieldData field; |
1579 field.form_control_type = "text"; | 1533 field.form_control_type = "text"; |
1580 | 1534 |
1581 field.label = ASCIIToUTF16("First Name"); | 1535 field.label = ASCIIToUTF16("First Name"); |
1582 field.name = ASCIIToUTF16("firstname"); | 1536 field.name = ASCIIToUTF16("firstname"); |
1583 form.fields.push_back(field); | 1537 form.fields.push_back(field); |
1584 possible_field_types.push_back(ServerFieldTypeSet()); | 1538 possible_field_types.push_back(ServerFieldTypeSet()); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1722 for (size_t i = 0; i < form_structure->field_count(); ++i) | 1676 for (size_t i = 0; i < form_structure->field_count(); ++i) |
1723 form_structure->field(i)->set_possible_types(possible_field_types[i]); | 1677 form_structure->field(i)->set_possible_types(possible_field_types[i]); |
1724 EXPECT_FALSE(form_structure->EncodeUploadRequest(available_field_types, false, | 1678 EXPECT_FALSE(form_structure->EncodeUploadRequest(available_field_types, false, |
1725 &encoded_xml)); | 1679 &encoded_xml)); |
1726 } | 1680 } |
1727 | 1681 |
1728 TEST(FormStructureTest, EncodeFieldAssignments) { | 1682 TEST(FormStructureTest, EncodeFieldAssignments) { |
1729 scoped_ptr<FormStructure> form_structure; | 1683 scoped_ptr<FormStructure> form_structure; |
1730 std::vector<ServerFieldTypeSet> possible_field_types; | 1684 std::vector<ServerFieldTypeSet> possible_field_types; |
1731 FormData form; | 1685 FormData form; |
1732 form.method = ASCIIToUTF16("post"); | |
1733 form_structure.reset(new FormStructure(form)); | 1686 form_structure.reset(new FormStructure(form)); |
1734 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); | 1687 form_structure->DetermineHeuristicTypes(TestAutofillMetrics()); |
1735 | 1688 |
1736 FormFieldData field; | 1689 FormFieldData field; |
1737 field.form_control_type = "text"; | 1690 field.form_control_type = "text"; |
1738 | 1691 |
1739 field.label = ASCIIToUTF16("First Name"); | 1692 field.label = ASCIIToUTF16("First Name"); |
1740 field.name = ASCIIToUTF16("firstname"); | 1693 field.name = ASCIIToUTF16("firstname"); |
1741 form.fields.push_back(field); | 1694 form.fields.push_back(field); |
1742 possible_field_types.push_back(ServerFieldTypeSet()); | 1695 possible_field_types.push_back(ServerFieldTypeSet()); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1848 "<fields fieldid=\"509334676\" fieldtype=\"37\" name=\"address\"/>" | 1801 "<fields fieldid=\"509334676\" fieldtype=\"37\" name=\"address\"/>" |
1849 "<fields fieldid=\"509334676\" fieldtype=\"38\" name=\"address\"/>" | 1802 "<fields fieldid=\"509334676\" fieldtype=\"38\" name=\"address\"/>" |
1850 "</fieldassignments>", | 1803 "</fieldassignments>", |
1851 encoded_xml); | 1804 encoded_xml); |
1852 } | 1805 } |
1853 | 1806 |
1854 // Check that we compute the "datapresent" string correctly for the given | 1807 // Check that we compute the "datapresent" string correctly for the given |
1855 // |available_types|. | 1808 // |available_types|. |
1856 TEST(FormStructureTest, CheckDataPresence) { | 1809 TEST(FormStructureTest, CheckDataPresence) { |
1857 FormData form; | 1810 FormData form; |
1858 form.method = ASCIIToUTF16("post"); | |
1859 | 1811 |
1860 FormFieldData field; | 1812 FormFieldData field; |
1861 field.form_control_type = "text"; | 1813 field.form_control_type = "text"; |
1862 | 1814 |
1863 field.label = ASCIIToUTF16("First Name"); | 1815 field.label = ASCIIToUTF16("First Name"); |
1864 field.name = ASCIIToUTF16("first"); | 1816 field.name = ASCIIToUTF16("first"); |
1865 form.fields.push_back(field); | 1817 form.fields.push_back(field); |
1866 | 1818 |
1867 field.label = ASCIIToUTF16("Last Name"); | 1819 field.label = ASCIIToUTF16("Last Name"); |
1868 field.name = ASCIIToUTF16("last"); | 1820 field.name = ASCIIToUTF16("last"); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2102 available_field_types.insert(ADDRESS_HOME_LINE1); | 2054 available_field_types.insert(ADDRESS_HOME_LINE1); |
2103 available_field_types.insert(ADDRESS_HOME_LINE2); | 2055 available_field_types.insert(ADDRESS_HOME_LINE2); |
2104 available_field_types.insert(ADDRESS_HOME_CITY); | 2056 available_field_types.insert(ADDRESS_HOME_CITY); |
2105 available_field_types.insert(ADDRESS_HOME_STATE); | 2057 available_field_types.insert(ADDRESS_HOME_STATE); |
2106 available_field_types.insert(COMPANY_NAME); | 2058 available_field_types.insert(COMPANY_NAME); |
2107 | 2059 |
2108 // Check that multiple types for the field are processed correctly. | 2060 // Check that multiple types for the field are processed correctly. |
2109 scoped_ptr<FormStructure> form_structure; | 2061 scoped_ptr<FormStructure> form_structure; |
2110 std::vector<ServerFieldTypeSet> possible_field_types; | 2062 std::vector<ServerFieldTypeSet> possible_field_types; |
2111 FormData form; | 2063 FormData form; |
2112 form.method = ASCIIToUTF16("post"); | |
2113 | 2064 |
2114 FormFieldData field; | 2065 FormFieldData field; |
2115 field.form_control_type = "text"; | 2066 field.form_control_type = "text"; |
2116 | 2067 |
2117 field.label = ASCIIToUTF16("email"); | 2068 field.label = ASCIIToUTF16("email"); |
2118 field.name = ASCIIToUTF16("email"); | 2069 field.name = ASCIIToUTF16("email"); |
2119 form.fields.push_back(field); | 2070 form.fields.push_back(field); |
2120 possible_field_types.push_back(ServerFieldTypeSet()); | 2071 possible_field_types.push_back(ServerFieldTypeSet()); |
2121 possible_field_types.back().insert(EMAIL_ADDRESS); | 2072 possible_field_types.back().insert(EMAIL_ADDRESS); |
2122 | 2073 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2208 "<field signature=\"509334676\" autofilltype=\"30\"/>" | 2159 "<field signature=\"509334676\" autofilltype=\"30\"/>" |
2209 "<field signature=\"509334676\" autofilltype=\"60\"/>" | 2160 "<field signature=\"509334676\" autofilltype=\"60\"/>" |
2210 "</autofillupload>", | 2161 "</autofillupload>", |
2211 encoded_xml); | 2162 encoded_xml); |
2212 } | 2163 } |
2213 | 2164 |
2214 TEST(FormStructureTest, CheckFormSignature) { | 2165 TEST(FormStructureTest, CheckFormSignature) { |
2215 // Check that form signature is created correctly. | 2166 // Check that form signature is created correctly. |
2216 scoped_ptr<FormStructure> form_structure; | 2167 scoped_ptr<FormStructure> form_structure; |
2217 FormData form; | 2168 FormData form; |
2218 form.method = ASCIIToUTF16("post"); | |
2219 | 2169 |
2220 FormFieldData field; | 2170 FormFieldData field; |
2221 field.form_control_type = "text"; | 2171 field.form_control_type = "text"; |
2222 | 2172 |
2223 field.label = ASCIIToUTF16("email"); | 2173 field.label = ASCIIToUTF16("email"); |
2224 field.name = ASCIIToUTF16("email"); | 2174 field.name = ASCIIToUTF16("email"); |
2225 form.fields.push_back(field); | 2175 form.fields.push_back(field); |
2226 | 2176 |
2227 field.label = ASCIIToUTF16("First Name"); | 2177 field.label = ASCIIToUTF16("First Name"); |
2228 field.name = ASCIIToUTF16("first"); | 2178 field.name = ASCIIToUTF16("first"); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2277 EXPECT_EQ(FormStructureTest::Hash64Bit( | 2227 EXPECT_EQ(FormStructureTest::Hash64Bit( |
2278 std::string("https://login.facebook.com&login_form&email&first&" | 2228 std::string("https://login.facebook.com&login_form&email&first&" |
2279 "random1234&random&1random&random")), | 2229 "random1234&random&1random&random")), |
2280 form_structure->FormSignature()); | 2230 form_structure->FormSignature()); |
2281 | 2231 |
2282 } | 2232 } |
2283 | 2233 |
2284 TEST(FormStructureTest, ToFormData) { | 2234 TEST(FormStructureTest, ToFormData) { |
2285 FormData form; | 2235 FormData form; |
2286 form.name = ASCIIToUTF16("the-name"); | 2236 form.name = ASCIIToUTF16("the-name"); |
2287 form.method = ASCIIToUTF16("POST"); | |
2288 form.origin = GURL("http://cool.com"); | 2237 form.origin = GURL("http://cool.com"); |
2289 form.action = form.origin.Resolve("/login"); | 2238 form.action = form.origin.Resolve("/login"); |
2290 | 2239 |
2291 FormFieldData field; | 2240 FormFieldData field; |
2292 field.label = ASCIIToUTF16("username"); | 2241 field.label = ASCIIToUTF16("username"); |
2293 field.name = ASCIIToUTF16("username"); | 2242 field.name = ASCIIToUTF16("username"); |
2294 field.form_control_type = "text"; | 2243 field.form_control_type = "text"; |
2295 form.fields.push_back(field); | 2244 form.fields.push_back(field); |
2296 | 2245 |
2297 field.label = ASCIIToUTF16("password"); | 2246 field.label = ASCIIToUTF16("password"); |
(...skipping 10 matching lines...) Expand all Loading... |
2308 | 2257 |
2309 // Currently |FormStructure(form_data)ToFormData().user_submitted| is always | 2258 // Currently |FormStructure(form_data)ToFormData().user_submitted| is always |
2310 // false. This forces a future author that changes this to update this test. | 2259 // false. This forces a future author that changes this to update this test. |
2311 form.user_submitted = true; | 2260 form.user_submitted = true; |
2312 EXPECT_NE(form, FormStructure(form).ToFormData()); | 2261 EXPECT_NE(form, FormStructure(form).ToFormData()); |
2313 } | 2262 } |
2314 | 2263 |
2315 TEST(FormStructureTest, SkipFieldTest) { | 2264 TEST(FormStructureTest, SkipFieldTest) { |
2316 FormData form; | 2265 FormData form; |
2317 form.name = ASCIIToUTF16("the-name"); | 2266 form.name = ASCIIToUTF16("the-name"); |
2318 form.method = ASCIIToUTF16("POST"); | |
2319 form.origin = GURL("http://cool.com"); | 2267 form.origin = GURL("http://cool.com"); |
2320 form.action = form.origin.Resolve("/login"); | 2268 form.action = form.origin.Resolve("/login"); |
2321 | 2269 |
2322 FormFieldData field; | 2270 FormFieldData field; |
2323 field.label = ASCIIToUTF16("username"); | 2271 field.label = ASCIIToUTF16("username"); |
2324 field.name = ASCIIToUTF16("username"); | 2272 field.name = ASCIIToUTF16("username"); |
2325 field.form_control_type = "text"; | 2273 field.form_control_type = "text"; |
2326 form.fields.push_back(field); | 2274 form.fields.push_back(field); |
2327 | 2275 |
2328 field.label = ASCIIToUTF16("select"); | 2276 field.label = ASCIIToUTF16("select"); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2393 // A freeform input (<input>) allows any value (overriding other <select>s). | 2341 // A freeform input (<input>) allows any value (overriding other <select>s). |
2394 FormFieldData freeform_field; | 2342 FormFieldData freeform_field; |
2395 freeform_field.autocomplete_attribute = "billing country"; | 2343 freeform_field.autocomplete_attribute = "billing country"; |
2396 form_data.fields.push_back(freeform_field); | 2344 form_data.fields.push_back(freeform_field); |
2397 FormStructure form_structure2(form_data); | 2345 FormStructure form_structure2(form_data); |
2398 form_structure2.ParseFieldTypesFromAutocompleteAttributes(&unused, &unused); | 2346 form_structure2.ParseFieldTypesFromAutocompleteAttributes(&unused, &unused); |
2399 EXPECT_EQ(0U, form_structure2.PossibleValues(ADDRESS_BILLING_COUNTRY).size()); | 2347 EXPECT_EQ(0U, form_structure2.PossibleValues(ADDRESS_BILLING_COUNTRY).size()); |
2400 } | 2348 } |
2401 | 2349 |
2402 } // namespace autofill | 2350 } // namespace autofill |
OLD | NEW |