Updating trunk VERSION from 2139.0 to 2140.0
[chromium-blink-merge.git] / components / autofill / core / browser / form_structure_unittest.cc
blob6a872f1ec19e1547059affd5fe69a7fa69e5d7c8
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
3 // found in the LICENSE file.
5 #include "components/autofill/core/browser/form_structure.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "components/autofill/core/browser/autofill_metrics.h"
11 #include "components/autofill/core/common/form_data.h"
12 #include "components/autofill/core/common/form_field_data.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "url/gurl.h"
16 using base::ASCIIToUTF16;
18 namespace autofill {
19 namespace {
21 // Unlike the base AutofillMetrics, exposes copy and assignment constructors,
22 // which are handy for briefer test code. The AutofillMetrics class is
23 // stateless, so this is safe.
24 class TestAutofillMetrics : public AutofillMetrics {
25 public:
26 TestAutofillMetrics() {}
27 virtual ~TestAutofillMetrics() {}
30 } // anonymous namespace
33 namespace content {
35 std::ostream& operator<<(std::ostream& os, const FormData& form) {
36 os << base::UTF16ToUTF8(form.name)
37 << " "
38 << form.origin.spec()
39 << " "
40 << form.action.spec()
41 << " ";
43 for (std::vector<FormFieldData>::const_iterator iter =
44 form.fields.begin();
45 iter != form.fields.end(); ++iter) {
46 os << *iter
47 << " ";
50 return os;
53 } // namespace content
55 class FormStructureTest {
56 public:
57 static std::string Hash64Bit(const std::string& str) {
58 return FormStructure::Hash64Bit(str);
62 TEST(FormStructureTest, FieldCount) {
63 scoped_ptr<FormStructure> form_structure;
64 FormData form;
66 FormFieldData field;
67 field.label = ASCIIToUTF16("username");
68 field.name = ASCIIToUTF16("username");
69 field.form_control_type = "text";
70 form.fields.push_back(field);
72 field.label = ASCIIToUTF16("password");
73 field.name = ASCIIToUTF16("password");
74 field.form_control_type = "password";
75 form.fields.push_back(field);
77 field.label = base::string16();
78 field.name = ASCIIToUTF16("Submit");
79 field.form_control_type = "submit";
80 form.fields.push_back(field);
82 field.label = ASCIIToUTF16("address1");
83 field.name = ASCIIToUTF16("address1");
84 field.form_control_type = "text";
85 field.should_autocomplete = false;
86 form.fields.push_back(field);
88 // The render process sends all fields to browser including fields with
89 // autocomplete=off
90 form_structure.reset(new FormStructure(form));
91 EXPECT_EQ(4U, form_structure->field_count());
94 TEST(FormStructureTest, AutofillCount) {
95 scoped_ptr<FormStructure> form_structure;
96 FormData form;
98 FormFieldData field;
99 field.label = ASCIIToUTF16("username");
100 field.name = ASCIIToUTF16("username");
101 field.form_control_type = "text";
102 form.fields.push_back(field);
104 field.label = ASCIIToUTF16("password");
105 field.name = ASCIIToUTF16("password");
106 field.form_control_type = "password";
107 form.fields.push_back(field);
109 field.label = ASCIIToUTF16("state");
110 field.name = ASCIIToUTF16("state");
111 field.form_control_type = "select-one";
112 form.fields.push_back(field);
114 field.label = base::string16();
115 field.name = ASCIIToUTF16("Submit");
116 field.form_control_type = "submit";
117 form.fields.push_back(field);
119 // Only text and select fields that are heuristically matched are counted.
120 form_structure.reset(new FormStructure(form));
121 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
122 EXPECT_EQ(1U, form_structure->autofill_count());
124 // Add a field with should_autocomplete=false. This should not be considered a
125 // fillable field.
126 field.label = ASCIIToUTF16("address1");
127 field.name = ASCIIToUTF16("address1");
128 field.form_control_type = "text";
129 field.should_autocomplete = false;
130 form.fields.push_back(field);
132 form_structure.reset(new FormStructure(form));
133 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
134 EXPECT_EQ(1U, form_structure->autofill_count());
137 TEST(FormStructureTest, SourceURL) {
138 FormData form;
139 form.origin = GURL("http://www.foo.com/");
140 FormStructure form_structure(form);
142 EXPECT_EQ(form.origin, form_structure.source_url());
145 TEST(FormStructureTest, IsAutofillable) {
146 scoped_ptr<FormStructure> form_structure;
147 FormData form;
149 // We need at least three text fields to be auto-fillable.
150 FormFieldData field;
152 field.label = ASCIIToUTF16("username");
153 field.name = ASCIIToUTF16("username");
154 field.form_control_type = "text";
155 form.fields.push_back(field);
157 field.label = ASCIIToUTF16("password");
158 field.name = ASCIIToUTF16("password");
159 field.form_control_type = "password";
160 form.fields.push_back(field);
162 field.label = base::string16();
163 field.name = ASCIIToUTF16("Submit");
164 field.form_control_type = "submit";
165 form.fields.push_back(field);
167 form_structure.reset(new FormStructure(form));
168 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
169 EXPECT_FALSE(form_structure->IsAutofillable());
171 // We now have three text fields, but only two auto-fillable fields.
172 field.label = ASCIIToUTF16("First Name");
173 field.name = ASCIIToUTF16("firstname");
174 field.form_control_type = "text";
175 form.fields.push_back(field);
177 field.label = ASCIIToUTF16("Last Name");
178 field.name = ASCIIToUTF16("lastname");
179 field.form_control_type = "text";
180 form.fields.push_back(field);
182 form_structure.reset(new FormStructure(form));
183 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
184 EXPECT_FALSE(form_structure->IsAutofillable());
186 // We now have three auto-fillable fields.
187 field.label = ASCIIToUTF16("Email");
188 field.name = ASCIIToUTF16("email");
189 field.form_control_type = "email";
190 form.fields.push_back(field);
192 form_structure.reset(new FormStructure(form));
193 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
194 EXPECT_TRUE(form_structure->IsAutofillable());
196 // The target cannot include http(s)://*/search...
197 form.action = GURL("http://google.com/search?q=hello");
198 form_structure.reset(new FormStructure(form));
199 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
200 EXPECT_FALSE(form_structure->IsAutofillable());
202 // But search can be in the URL.
203 form.action = GURL("http://search.com/?q=hello");
204 form_structure.reset(new FormStructure(form));
205 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
206 EXPECT_TRUE(form_structure->IsAutofillable());
209 TEST(FormStructureTest, ShouldBeParsed) {
210 scoped_ptr<FormStructure> form_structure;
211 FormData form;
213 // We need at least three text fields to be parseable.
214 FormFieldData field;
215 field.label = ASCIIToUTF16("username");
216 field.name = ASCIIToUTF16("username");
217 field.form_control_type = "text";
218 form.fields.push_back(field);
220 FormFieldData checkable_field;
221 checkable_field.is_checkable = true;
222 checkable_field.name = ASCIIToUTF16("radiobtn");
223 checkable_field.form_control_type = "radio";
224 form.fields.push_back(checkable_field);
226 checkable_field.name = ASCIIToUTF16("checkbox");
227 checkable_field.form_control_type = "checkbox";
228 form.fields.push_back(checkable_field);
230 // We have only one text field, should not be parsed.
231 form_structure.reset(new FormStructure(form));
232 EXPECT_FALSE(form_structure->ShouldBeParsed());
234 // We now have three text fields, though only two are auto-fillable.
235 field.label = ASCIIToUTF16("First Name");
236 field.name = ASCIIToUTF16("firstname");
237 field.form_control_type = "text";
238 form.fields.push_back(field);
240 field.label = ASCIIToUTF16("Last Name");
241 field.name = ASCIIToUTF16("lastname");
242 field.form_control_type = "text";
243 form.fields.push_back(field);
245 form_structure.reset(new FormStructure(form));
246 EXPECT_TRUE(form_structure->ShouldBeParsed());
248 form_structure.reset(new FormStructure(form));
249 EXPECT_FALSE(form_structure->IsAutofillable());
250 EXPECT_TRUE(form_structure->ShouldBeParsed());
252 // The target cannot include http(s)://*/search...
253 form.action = GURL("http://google.com/search?q=hello");
254 form_structure.reset(new FormStructure(form));
255 EXPECT_FALSE(form_structure->ShouldBeParsed());
257 // But search can be in the URL.
258 form.action = GURL("http://search.com/?q=hello");
259 form_structure.reset(new FormStructure(form));
260 EXPECT_TRUE(form_structure->ShouldBeParsed());
262 // The form need only have three fields, but at least one must be a text
263 // field.
264 form.fields.clear();
266 field.label = ASCIIToUTF16("Email");
267 field.name = ASCIIToUTF16("email");
268 field.form_control_type = "email";
269 form.fields.push_back(field);
271 field.label = ASCIIToUTF16("State");
272 field.name = ASCIIToUTF16("state");
273 field.form_control_type = "select-one";
274 form.fields.push_back(field);
276 field.label = ASCIIToUTF16("Country");
277 field.name = ASCIIToUTF16("country");
278 field.form_control_type = "select-one";
279 form.fields.push_back(field);
281 form_structure.reset(new FormStructure(form));
282 EXPECT_TRUE(form_structure->ShouldBeParsed());
284 form.fields[0].form_control_type = "select-one";
285 // Now, no text fields.
286 form_structure.reset(new FormStructure(form));
287 EXPECT_FALSE(form_structure->ShouldBeParsed());
290 TEST(FormStructureTest, HeuristicsContactInfo) {
291 scoped_ptr<FormStructure> form_structure;
292 FormData form;
294 FormFieldData field;
295 field.form_control_type = "text";
297 field.label = ASCIIToUTF16("First Name");
298 field.name = ASCIIToUTF16("firstname");
299 form.fields.push_back(field);
301 field.label = ASCIIToUTF16("Last Name");
302 field.name = ASCIIToUTF16("lastname");
303 form.fields.push_back(field);
305 field.label = ASCIIToUTF16("Email");
306 field.name = ASCIIToUTF16("email");
307 form.fields.push_back(field);
309 field.label = ASCIIToUTF16("Phone");
310 field.name = ASCIIToUTF16("phone");
311 form.fields.push_back(field);
313 field.label = ASCIIToUTF16("Address");
314 field.name = ASCIIToUTF16("address");
315 form.fields.push_back(field);
317 field.label = ASCIIToUTF16("City");
318 field.name = ASCIIToUTF16("city");
319 form.fields.push_back(field);
321 field.label = ASCIIToUTF16("Zip code");
322 field.name = ASCIIToUTF16("zipcode");
323 form.fields.push_back(field);
325 field.label = base::string16();
326 field.name = ASCIIToUTF16("Submit");
327 field.form_control_type = "submit";
328 form.fields.push_back(field);
330 form_structure.reset(new FormStructure(form));
331 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
332 EXPECT_TRUE(form_structure->IsAutofillable());
334 // Expect the correct number of fields.
335 ASSERT_EQ(8U, form_structure->field_count());
336 ASSERT_EQ(7U, form_structure->autofill_count());
338 // First name.
339 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
340 // Last name.
341 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
342 // Email.
343 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
344 // Phone.
345 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
346 form_structure->field(3)->heuristic_type());
347 // Address.
348 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type());
349 // City.
350 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type());
351 // Zip.
352 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type());
353 // Submit.
354 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type());
357 // Verify that we can correctly process the |autocomplete| attribute.
358 TEST(FormStructureTest, HeuristicsAutocompleteAttribute) {
359 scoped_ptr<FormStructure> form_structure;
360 FormData form;
362 FormFieldData field;
363 field.form_control_type = "text";
365 field.label = base::string16();
366 field.name = ASCIIToUTF16("field1");
367 field.autocomplete_attribute = "given-name";
368 form.fields.push_back(field);
370 field.label = base::string16();
371 field.name = ASCIIToUTF16("field2");
372 field.autocomplete_attribute = "family-name";
373 form.fields.push_back(field);
375 field.label = base::string16();
376 field.name = ASCIIToUTF16("field3");
377 field.autocomplete_attribute = "email";
378 form.fields.push_back(field);
380 form_structure.reset(new FormStructure(form));
381 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
382 EXPECT_TRUE(form_structure->IsAutofillable());
384 // Expect the correct number of fields.
385 ASSERT_EQ(3U, form_structure->field_count());
386 ASSERT_EQ(3U, form_structure->autofill_count());
388 EXPECT_EQ(HTML_TYPE_GIVEN_NAME, form_structure->field(0)->html_type());
389 EXPECT_EQ(HTML_TYPE_FAMILY_NAME, form_structure->field(1)->html_type());
390 EXPECT_EQ(HTML_TYPE_EMAIL, form_structure->field(2)->html_type());
391 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type());
392 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type());
393 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
396 // Verify that we can correctly process the 'autocomplete' attribute for phone
397 // number types (especially phone prefixes and suffixes).
398 TEST(FormStructureTest, HeuristicsAutocompleteAttributePhoneTypes) {
399 scoped_ptr<FormStructure> form_structure;
400 FormData form;
402 FormFieldData field;
403 field.form_control_type = "text";
405 field.label = base::string16();
406 field.name = ASCIIToUTF16("field1");
407 field.autocomplete_attribute = "tel-local";
408 form.fields.push_back(field);
410 field.label = base::string16();
411 field.name = ASCIIToUTF16("field2");
412 field.autocomplete_attribute = "tel-local-prefix";
413 form.fields.push_back(field);
415 field.label = base::string16();
416 field.name = ASCIIToUTF16("field3");
417 field.autocomplete_attribute = "tel-local-suffix";
418 form.fields.push_back(field);
420 form_structure.reset(new FormStructure(form));
421 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
422 EXPECT_TRUE(form_structure->IsAutofillable());
424 // Expect the correct number of fields.
425 ASSERT_EQ(3U, form_structure->field_count());
426 EXPECT_EQ(3U, form_structure->autofill_count());
428 EXPECT_EQ(HTML_TYPE_TEL_LOCAL, form_structure->field(0)->html_type());
429 EXPECT_EQ(AutofillField::IGNORED, form_structure->field(0)->phone_part());
430 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_PREFIX, form_structure->field(1)->html_type());
431 EXPECT_EQ(AutofillField::PHONE_PREFIX,
432 form_structure->field(1)->phone_part());
433 EXPECT_EQ(HTML_TYPE_TEL_LOCAL_SUFFIX, form_structure->field(2)->html_type());
434 EXPECT_EQ(AutofillField::PHONE_SUFFIX,
435 form_structure->field(2)->phone_part());
438 // If at least one field includes type hints in the 'autocomplete' attribute, we
439 // should not try to apply any other heuristics.
440 TEST(FormStructureTest, AutocompleteAttributeOverridesOtherHeuristics) {
441 scoped_ptr<FormStructure> form_structure;
442 FormData form;
444 // Start with a regular contact form.
445 FormFieldData field;
446 field.form_control_type = "text";
448 field.label = ASCIIToUTF16("First Name");
449 field.name = ASCIIToUTF16("firstname");
450 form.fields.push_back(field);
452 field.label = ASCIIToUTF16("Last Name");
453 field.name = ASCIIToUTF16("lastname");
454 form.fields.push_back(field);
456 field.label = ASCIIToUTF16("Email");
457 field.name = ASCIIToUTF16("email");
458 form.fields.push_back(field);
460 form_structure.reset(new FormStructure(form));
461 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
462 EXPECT_TRUE(form_structure->IsAutofillable());
463 EXPECT_TRUE(form_structure->ShouldBeCrowdsourced());
465 ASSERT_EQ(3U, form_structure->field_count());
466 ASSERT_EQ(3U, form_structure->autofill_count());
468 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
469 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
470 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
472 // Now update the first form field to include an 'autocomplete' attribute.
473 form.fields.front().autocomplete_attribute = "x-other";
474 form_structure.reset(new FormStructure(form));
475 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
476 EXPECT_FALSE(form_structure->IsAutofillable());
477 EXPECT_FALSE(form_structure->ShouldBeCrowdsourced());
479 ASSERT_EQ(3U, form_structure->field_count());
480 ASSERT_EQ(0U, form_structure->autofill_count());
482 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type());
483 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type());
484 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
487 // Verify that we can correctly process sections listed in the |autocomplete|
488 // attribute.
489 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSections) {
490 FormData form;
492 FormFieldData field;
493 field.form_control_type = "text";
495 // Some fields will have no section specified. These fall into the default
496 // section.
497 field.autocomplete_attribute = "email";
498 form.fields.push_back(field);
500 // We allow arbitrary section names.
501 field.autocomplete_attribute = "section-foo email";
502 form.fields.push_back(field);
504 // "shipping" and "billing" are special section tokens that don't require the
505 // "section-" prefix.
506 field.autocomplete_attribute = "shipping email";
507 form.fields.push_back(field);
508 field.autocomplete_attribute = "billing email";
509 form.fields.push_back(field);
511 // "shipping" and "billing" can be combined with other section names.
512 field.autocomplete_attribute = "section-foo shipping email";
513 form.fields.push_back(field);
514 field.autocomplete_attribute = "section-foo billing email";
515 form.fields.push_back(field);
517 // We don't do anything clever to try to coalesce sections; it's up to site
518 // authors to avoid typos.
519 field.autocomplete_attribute = "section--foo email";
520 form.fields.push_back(field);
522 // "shipping email" and "section--shipping" email should be parsed as
523 // different sections. This is only an interesting test due to how we
524 // implement implicit section names from attributes like "shipping email"; see
525 // the implementation for more details.
526 field.autocomplete_attribute = "section--shipping email";
527 form.fields.push_back(field);
529 // Credit card fields are implicitly in a separate section from other fields.
530 field.autocomplete_attribute = "section-foo cc-number";
531 form.fields.push_back(field);
533 FormStructure form_structure(form);
534 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
535 EXPECT_TRUE(form_structure.IsAutofillable());
537 // Expect the correct number of fields.
538 ASSERT_EQ(9U, form_structure.field_count());
539 EXPECT_EQ(9U, form_structure.autofill_count());
541 // All of the fields in this form should be parsed as belonging to different
542 // sections.
543 std::set<std::string> section_names;
544 for (size_t i = 0; i < 9; ++i) {
545 section_names.insert(form_structure.field(i)->section());
547 EXPECT_EQ(9U, section_names.size());
550 // Verify that we can correctly process a degenerate section listed in the
551 // |autocomplete| attribute.
552 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsDegenerate) {
553 FormData form;
555 FormFieldData field;
556 field.form_control_type = "text";
558 // Some fields will have no section specified. These fall into the default
559 // section.
560 field.autocomplete_attribute = "email";
561 form.fields.push_back(field);
563 // Specifying "section-" is equivalent to not specifying a section.
564 field.autocomplete_attribute = "section- email";
565 form.fields.push_back(field);
567 // Invalid tokens should prevent us from setting a section name.
568 field.autocomplete_attribute = "garbage section-foo email";
569 form.fields.push_back(field);
570 field.autocomplete_attribute = "garbage section-bar email";
571 form.fields.push_back(field);
572 field.autocomplete_attribute = "garbage shipping email";
573 form.fields.push_back(field);
574 field.autocomplete_attribute = "garbage billing email";
575 form.fields.push_back(field);
577 FormStructure form_structure(form);
578 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
580 // Expect the correct number of fields.
581 ASSERT_EQ(6U, form_structure.field_count());
582 EXPECT_EQ(2U, form_structure.autofill_count());
584 // All of the fields in this form should be parsed as belonging to the same
585 // section.
586 std::set<std::string> section_names;
587 for (size_t i = 0; i < 6; ++i) {
588 section_names.insert(form_structure.field(i)->section());
590 EXPECT_EQ(1U, section_names.size());
593 // Verify that we can correctly process repeated sections listed in the
594 // |autocomplete| attribute.
595 TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsRepeated) {
596 FormData form;
598 FormFieldData field;
599 field.form_control_type = "text";
601 field.autocomplete_attribute = "section-foo email";
602 form.fields.push_back(field);
603 field.autocomplete_attribute = "section-foo address-line1";
604 form.fields.push_back(field);
606 FormStructure form_structure(form);
607 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
609 // Expect the correct number of fields.
610 ASSERT_EQ(2U, form_structure.field_count());
611 EXPECT_EQ(2U, form_structure.autofill_count());
613 // All of the fields in this form should be parsed as belonging to the same
614 // section.
615 std::set<std::string> section_names;
616 for (size_t i = 0; i < 2; ++i) {
617 section_names.insert(form_structure.field(i)->section());
619 EXPECT_EQ(1U, section_names.size());
622 // Verify that we do not override the author-specified sections from a form with
623 // local heuristics.
624 TEST(FormStructureTest, HeuristicsDontOverrideAutocompleteAttributeSections) {
625 FormData form;
627 FormFieldData field;
628 field.form_control_type = "text";
630 field.name = ASCIIToUTF16("one");
631 field.autocomplete_attribute = "address-line1";
632 form.fields.push_back(field);
633 field.name = base::string16();
634 field.autocomplete_attribute = "section-foo email";
635 form.fields.push_back(field);
636 field.name = base::string16();
637 field.autocomplete_attribute = "name";
638 form.fields.push_back(field);
639 field.name = ASCIIToUTF16("two");
640 field.autocomplete_attribute = "address-line1";
641 form.fields.push_back(field);
643 FormStructure form_structure(form);
644 form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
646 // Expect the correct number of fields.
647 ASSERT_EQ(4U, form_structure.field_count());
648 EXPECT_EQ(4U, form_structure.autofill_count());
650 // Normally, the two separate address fields would cause us to detect two
651 // separate sections; but because there is an author-specified section in this
652 // form, we do not apply these usual heuristics.
653 EXPECT_EQ(ASCIIToUTF16("one"), form_structure.field(0)->name);
654 EXPECT_EQ(ASCIIToUTF16("two"), form_structure.field(3)->name);
655 EXPECT_EQ(form_structure.field(0)->section(),
656 form_structure.field(3)->section());
659 TEST(FormStructureTest, HeuristicsSample8) {
660 scoped_ptr<FormStructure> form_structure;
661 FormData form;
663 FormFieldData field;
664 field.form_control_type = "text";
666 field.label = ASCIIToUTF16("Your First Name:");
667 field.name = ASCIIToUTF16("bill.first");
668 form.fields.push_back(field);
670 field.label = ASCIIToUTF16("Your Last Name:");
671 field.name = ASCIIToUTF16("bill.last");
672 form.fields.push_back(field);
674 field.label = ASCIIToUTF16("Street Address Line 1:");
675 field.name = ASCIIToUTF16("bill.street1");
676 form.fields.push_back(field);
678 field.label = ASCIIToUTF16("Street Address Line 2:");
679 field.name = ASCIIToUTF16("bill.street2");
680 form.fields.push_back(field);
682 field.label = ASCIIToUTF16("City");
683 field.name = ASCIIToUTF16("bill.city");
684 form.fields.push_back(field);
686 field.label = ASCIIToUTF16("State (U.S.):");
687 field.name = ASCIIToUTF16("bill.state");
688 form.fields.push_back(field);
690 field.label = ASCIIToUTF16("Zip/Postal Code:");
691 field.name = ASCIIToUTF16("BillTo.PostalCode");
692 form.fields.push_back(field);
694 field.label = ASCIIToUTF16("Country:");
695 field.name = ASCIIToUTF16("bill.country");
696 form.fields.push_back(field);
698 field.label = ASCIIToUTF16("Phone Number:");
699 field.name = ASCIIToUTF16("BillTo.Phone");
700 form.fields.push_back(field);
702 field.label = base::string16();
703 field.name = ASCIIToUTF16("Submit");
704 field.form_control_type = "submit";
705 form.fields.push_back(field);
707 form_structure.reset(new FormStructure(form));
708 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
709 EXPECT_TRUE(form_structure->IsAutofillable());
710 ASSERT_EQ(10U, form_structure->field_count());
711 ASSERT_EQ(9U, form_structure->autofill_count());
713 // First name.
714 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
715 // Last name.
716 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
717 // Address.
718 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(2)->heuristic_type());
719 // Address.
720 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(3)->heuristic_type());
721 // City.
722 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type());
723 // State.
724 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(5)->heuristic_type());
725 // Zip.
726 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type());
727 // Country.
728 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type());
729 // Phone.
730 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
731 form_structure->field(8)->heuristic_type());
732 // Submit.
733 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(9)->heuristic_type());
736 TEST(FormStructureTest, HeuristicsSample6) {
737 scoped_ptr<FormStructure> form_structure;
738 FormData form;
740 FormFieldData field;
741 field.form_control_type = "text";
743 field.label = ASCIIToUTF16("E-mail address");
744 field.name = ASCIIToUTF16("email");
745 form.fields.push_back(field);
747 field.label = ASCIIToUTF16("Full name");
748 field.name = ASCIIToUTF16("name");
749 form.fields.push_back(field);
751 field.label = ASCIIToUTF16("Company");
752 field.name = ASCIIToUTF16("company");
753 form.fields.push_back(field);
755 field.label = ASCIIToUTF16("Address");
756 field.name = ASCIIToUTF16("address");
757 form.fields.push_back(field);
759 field.label = ASCIIToUTF16("City");
760 field.name = ASCIIToUTF16("city");
761 form.fields.push_back(field);
763 field.label = ASCIIToUTF16("Zip Code");
764 field.name = ASCIIToUTF16("Home.PostalCode");
765 form.fields.push_back(field);
767 field.label = base::string16();
768 field.name = ASCIIToUTF16("Submit");
769 field.value = ASCIIToUTF16("continue");
770 field.form_control_type = "submit";
771 form.fields.push_back(field);
773 form_structure.reset(new FormStructure(form));
774 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
775 EXPECT_TRUE(form_structure->IsAutofillable());
776 ASSERT_EQ(7U, form_structure->field_count());
777 ASSERT_EQ(6U, form_structure->autofill_count());
779 // Email.
780 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(0)->heuristic_type());
781 // Full name.
782 EXPECT_EQ(NAME_FULL, form_structure->field(1)->heuristic_type());
783 // Company
784 EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type());
785 // Address.
786 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type());
787 // City.
788 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type());
789 // Zip.
790 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(5)->heuristic_type());
791 // Submit.
792 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type());
795 // Tests a sequence of FormFields where only labels are supplied to heuristics
796 // for matching. This works because FormFieldData labels are matched in the
797 // case that input element ids (or |name| fields) are missing.
798 TEST(FormStructureTest, HeuristicsLabelsOnly) {
799 scoped_ptr<FormStructure> form_structure;
800 FormData form;
802 FormFieldData field;
803 field.form_control_type = "text";
805 field.label = ASCIIToUTF16("First Name");
806 field.name = base::string16();
807 form.fields.push_back(field);
809 field.label = ASCIIToUTF16("Last Name");
810 field.name = base::string16();
811 form.fields.push_back(field);
813 field.label = ASCIIToUTF16("Email");
814 field.name = base::string16();
815 form.fields.push_back(field);
817 field.label = ASCIIToUTF16("Phone");
818 field.name = base::string16();
819 form.fields.push_back(field);
821 field.label = ASCIIToUTF16("Address");
822 field.name = base::string16();
823 form.fields.push_back(field);
825 field.label = ASCIIToUTF16("Address");
826 field.name = base::string16();
827 form.fields.push_back(field);
829 field.label = ASCIIToUTF16("Zip code");
830 field.name = base::string16();
831 form.fields.push_back(field);
833 field.label = base::string16();
834 field.name = ASCIIToUTF16("Submit");
835 field.form_control_type = "submit";
836 form.fields.push_back(field);
838 form_structure.reset(new FormStructure(form));
839 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
840 EXPECT_TRUE(form_structure->IsAutofillable());
841 ASSERT_EQ(8U, form_structure->field_count());
842 ASSERT_EQ(7U, form_structure->autofill_count());
844 // First name.
845 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
846 // Last name.
847 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
848 // Email.
849 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
850 // Phone.
851 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
852 form_structure->field(3)->heuristic_type());
853 // Address.
854 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type());
855 // Address Line 2.
856 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(5)->heuristic_type());
857 // Zip.
858 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type());
859 // Submit.
860 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type());
863 TEST(FormStructureTest, HeuristicsCreditCardInfo) {
864 scoped_ptr<FormStructure> form_structure;
865 FormData form;
867 FormFieldData field;
868 field.form_control_type = "text";
870 field.label = ASCIIToUTF16("Name on Card");
871 field.name = ASCIIToUTF16("name_on_card");
872 form.fields.push_back(field);
874 field.label = ASCIIToUTF16("Card Number");
875 field.name = ASCIIToUTF16("card_number");
876 form.fields.push_back(field);
878 field.label = ASCIIToUTF16("Exp Month");
879 field.name = ASCIIToUTF16("ccmonth");
880 form.fields.push_back(field);
882 field.label = ASCIIToUTF16("Exp Year");
883 field.name = ASCIIToUTF16("ccyear");
884 form.fields.push_back(field);
886 field.label = ASCIIToUTF16("Verification");
887 field.name = ASCIIToUTF16("verification");
888 form.fields.push_back(field);
890 field.label = base::string16();
891 field.name = ASCIIToUTF16("Submit");
892 field.form_control_type = "submit";
893 form.fields.push_back(field);
895 form_structure.reset(new FormStructure(form));
896 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
897 EXPECT_TRUE(form_structure->IsAutofillable());
898 ASSERT_EQ(6U, form_structure->field_count());
899 ASSERT_EQ(5U, form_structure->autofill_count());
901 // Credit card name.
902 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type());
903 // Credit card number.
904 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(1)->heuristic_type());
905 // Credit card expiration month.
906 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(2)->heuristic_type());
907 // Credit card expiration year.
908 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
909 form_structure->field(3)->heuristic_type());
910 // CVV.
911 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
912 form_structure->field(4)->heuristic_type());
913 // Submit.
914 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(5)->heuristic_type());
917 TEST(FormStructureTest, HeuristicsCreditCardInfoWithUnknownCardField) {
918 scoped_ptr<FormStructure> form_structure;
919 FormData form;
921 FormFieldData field;
922 field.form_control_type = "text";
924 field.label = ASCIIToUTF16("Name on Card");
925 field.name = ASCIIToUTF16("name_on_card");
926 form.fields.push_back(field);
928 // This is not a field we know how to process. But we should skip over it
929 // and process the other fields in the card block.
930 field.label = ASCIIToUTF16("Card image");
931 field.name = ASCIIToUTF16("card_image");
932 form.fields.push_back(field);
934 field.label = ASCIIToUTF16("Card Number");
935 field.name = ASCIIToUTF16("card_number");
936 form.fields.push_back(field);
938 field.label = ASCIIToUTF16("Exp Month");
939 field.name = ASCIIToUTF16("ccmonth");
940 form.fields.push_back(field);
942 field.label = ASCIIToUTF16("Exp Year");
943 field.name = ASCIIToUTF16("ccyear");
944 form.fields.push_back(field);
946 field.label = ASCIIToUTF16("Verification");
947 field.name = ASCIIToUTF16("verification");
948 form.fields.push_back(field);
950 field.label = base::string16();
951 field.name = ASCIIToUTF16("Submit");
952 field.form_control_type = "submit";
953 form.fields.push_back(field);
955 form_structure.reset(new FormStructure(form));
956 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
957 EXPECT_TRUE(form_structure->IsAutofillable());
958 ASSERT_EQ(7U, form_structure->field_count());
959 ASSERT_EQ(5U, form_structure->autofill_count());
961 // Credit card name.
962 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type());
963 // Credit card type. This is an unknown type but related to the credit card.
964 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type());
965 // Credit card number.
966 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type());
967 // Credit card expiration month.
968 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type());
969 // Credit card expiration year.
970 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
971 form_structure->field(4)->heuristic_type());
972 // CVV.
973 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
974 form_structure->field(5)->heuristic_type());
975 // Submit.
976 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type());
979 TEST(FormStructureTest, ThreeAddressLines) {
980 scoped_ptr<FormStructure> form_structure;
981 FormData form;
983 FormFieldData field;
984 field.form_control_type = "text";
986 field.label = ASCIIToUTF16("Address Line1");
987 field.name = ASCIIToUTF16("Address");
988 form.fields.push_back(field);
990 field.label = ASCIIToUTF16("Address Line2");
991 field.name = ASCIIToUTF16("Address");
992 form.fields.push_back(field);
994 field.label = ASCIIToUTF16("Address Line3");
995 field.name = ASCIIToUTF16("Address");
996 form.fields.push_back(field);
998 field.label = ASCIIToUTF16("City");
999 field.name = ASCIIToUTF16("city");
1000 form.fields.push_back(field);
1002 form_structure.reset(new FormStructure(form));
1003 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1004 EXPECT_TRUE(form_structure->IsAutofillable());
1005 ASSERT_EQ(4U, form_structure->field_count());
1006 ASSERT_EQ(3U, form_structure->autofill_count());
1008 // Address Line 1.
1009 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
1010 // Address Line 2.
1011 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
1012 // Address Line 3.
1013 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
1014 // City.
1015 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type());
1018 // Numbered address lines after line two are ignored.
1019 TEST(FormStructureTest, SurplusAddressLinesIgnored) {
1020 scoped_ptr<FormStructure> form_structure;
1021 FormData form;
1023 FormFieldData field;
1024 field.form_control_type = "text";
1026 field.label = ASCIIToUTF16("Address Line1");
1027 field.name = ASCIIToUTF16("shipping.address.addressLine1");
1028 form.fields.push_back(field);
1030 field.label = ASCIIToUTF16("Address Line2");
1031 field.name = ASCIIToUTF16("shipping.address.addressLine2");
1032 form.fields.push_back(field);
1034 field.label = ASCIIToUTF16("Address Line3");
1035 field.name = ASCIIToUTF16("billing.address.addressLine3");
1036 form.fields.push_back(field);
1038 field.label = ASCIIToUTF16("Address Line4");
1039 field.name = ASCIIToUTF16("billing.address.addressLine4");
1040 form.fields.push_back(field);
1042 form_structure.reset(new FormStructure(form));
1043 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1044 ASSERT_EQ(4U, form_structure->field_count());
1045 ASSERT_EQ(2U, form_structure->autofill_count());
1047 // Address Line 1.
1048 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
1049 // Address Line 2.
1050 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
1051 // Address Line 3 (ignored).
1052 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
1053 // Address Line 4 (ignored).
1054 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type());
1057 // This example comes from expedia.com where they use a "Suite" label to
1058 // indicate a suite or apartment number. We interpret this as address line 2.
1059 // And the following "Street address second line" we interpret as address line
1060 // 3 and discard.
1061 // See http://crbug.com/48197 for details.
1062 TEST(FormStructureTest, ThreeAddressLinesExpedia) {
1063 scoped_ptr<FormStructure> form_structure;
1064 FormData form;
1066 FormFieldData field;
1067 field.form_control_type = "text";
1069 field.label = ASCIIToUTF16("Street:");
1070 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads1");
1071 form.fields.push_back(field);
1073 field.label = ASCIIToUTF16("Suite or Apt:");
1074 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adap");
1075 form.fields.push_back(field);
1077 field.label = ASCIIToUTF16("Street address second line");
1078 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads2");
1079 form.fields.push_back(field);
1081 field.label = ASCIIToUTF16("City:");
1082 field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adct");
1083 form.fields.push_back(field);
1085 form_structure.reset(new FormStructure(form));
1086 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1087 EXPECT_TRUE(form_structure->IsAutofillable());
1088 ASSERT_EQ(4U, form_structure->field_count());
1089 EXPECT_EQ(3U, form_structure->autofill_count());
1091 // Address Line 1.
1092 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
1093 // Suite / Apt.
1094 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
1095 // Address Line 3.
1096 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
1097 // City.
1098 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type());
1101 // This example comes from ebay.com where the word "suite" appears in the label
1102 // and the name "address2" clearly indicates that this is the address line 2.
1103 // See http://crbug.com/48197 for details.
1104 TEST(FormStructureTest, TwoAddressLinesEbay) {
1105 scoped_ptr<FormStructure> form_structure;
1106 FormData form;
1108 FormFieldData field;
1109 field.form_control_type = "text";
1111 field.label = ASCIIToUTF16("Address Line1");
1112 field.name = ASCIIToUTF16("address1");
1113 form.fields.push_back(field);
1115 field.label = ASCIIToUTF16("Floor number, suite number, etc");
1116 field.name = ASCIIToUTF16("address2");
1117 form.fields.push_back(field);
1119 field.label = ASCIIToUTF16("City:");
1120 field.name = ASCIIToUTF16("city");
1121 form.fields.push_back(field);
1123 form_structure.reset(new FormStructure(form));
1124 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1125 EXPECT_TRUE(form_structure->IsAutofillable());
1126 ASSERT_EQ(3U, form_structure->field_count());
1127 ASSERT_EQ(3U, form_structure->autofill_count());
1129 // Address Line 1.
1130 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
1131 // Address Line 2.
1132 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
1133 // City.
1134 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(2)->heuristic_type());
1137 TEST(FormStructureTest, HeuristicsStateWithProvince) {
1138 scoped_ptr<FormStructure> form_structure;
1139 FormData form;
1141 FormFieldData field;
1142 field.form_control_type = "text";
1144 field.label = ASCIIToUTF16("Address Line1");
1145 field.name = ASCIIToUTF16("Address");
1146 form.fields.push_back(field);
1148 field.label = ASCIIToUTF16("Address Line2");
1149 field.name = ASCIIToUTF16("Address");
1150 form.fields.push_back(field);
1152 field.label = ASCIIToUTF16("State/Province/Region");
1153 field.name = ASCIIToUTF16("State");
1154 form.fields.push_back(field);
1156 form_structure.reset(new FormStructure(form));
1157 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1158 EXPECT_TRUE(form_structure->IsAutofillable());
1159 ASSERT_EQ(3U, form_structure->field_count());
1160 ASSERT_EQ(3U, form_structure->autofill_count());
1162 // Address Line 1.
1163 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
1164 // Address Line 2.
1165 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
1166 // State.
1167 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(2)->heuristic_type());
1170 // This example comes from lego.com's checkout page.
1171 TEST(FormStructureTest, HeuristicsWithBilling) {
1172 scoped_ptr<FormStructure> form_structure;
1173 FormData form;
1175 FormFieldData field;
1176 field.form_control_type = "text";
1178 field.label = ASCIIToUTF16("First Name*:");
1179 field.name = ASCIIToUTF16("editBillingAddress$firstNameBox");
1180 form.fields.push_back(field);
1182 field.label = ASCIIToUTF16("Last Name*:");
1183 field.name = ASCIIToUTF16("editBillingAddress$lastNameBox");
1184 form.fields.push_back(field);
1186 field.label = ASCIIToUTF16("Company Name:");
1187 field.name = ASCIIToUTF16("editBillingAddress$companyBox");
1188 form.fields.push_back(field);
1190 field.label = ASCIIToUTF16("Address*:");
1191 field.name = ASCIIToUTF16("editBillingAddress$addressLine1Box");
1192 form.fields.push_back(field);
1194 field.label = ASCIIToUTF16("Apt/Suite :");
1195 field.name = ASCIIToUTF16("editBillingAddress$addressLine2Box");
1196 form.fields.push_back(field);
1198 field.label = ASCIIToUTF16("City*:");
1199 field.name = ASCIIToUTF16("editBillingAddress$cityBox");
1200 form.fields.push_back(field);
1202 field.label = ASCIIToUTF16("State/Province*:");
1203 field.name = ASCIIToUTF16("editBillingAddress$stateDropDown");
1204 form.fields.push_back(field);
1206 field.label = ASCIIToUTF16("Country*:");
1207 field.name = ASCIIToUTF16("editBillingAddress$countryDropDown");
1208 form.fields.push_back(field);
1210 field.label = ASCIIToUTF16("Postal Code*:");
1211 field.name = ASCIIToUTF16("editBillingAddress$zipCodeBox");
1212 form.fields.push_back(field);
1214 field.label = ASCIIToUTF16("Phone*:");
1215 field.name = ASCIIToUTF16("editBillingAddress$phoneBox");
1216 form.fields.push_back(field);
1218 field.label = ASCIIToUTF16("Email Address*:");
1219 field.name = ASCIIToUTF16("email$emailBox");
1220 form.fields.push_back(field);
1222 form_structure.reset(new FormStructure(form));
1223 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1224 EXPECT_TRUE(form_structure->IsAutofillable());
1225 ASSERT_EQ(11U, form_structure->field_count());
1226 ASSERT_EQ(11U, form_structure->autofill_count());
1228 EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
1229 EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
1230 EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type());
1231 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type());
1232 EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(4)->heuristic_type());
1233 EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type());
1234 EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(6)->heuristic_type());
1235 EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type());
1236 EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(8)->heuristic_type());
1237 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
1238 form_structure->field(9)->heuristic_type());
1239 EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(10)->heuristic_type());
1242 TEST(FormStructureTest, ThreePartPhoneNumber) {
1243 scoped_ptr<FormStructure> form_structure;
1244 FormData form;
1246 FormFieldData field;
1247 field.form_control_type = "text";
1249 field.label = ASCIIToUTF16("Phone:");
1250 field.name = ASCIIToUTF16("dayphone1");
1251 field.max_length = 0;
1252 form.fields.push_back(field);
1254 field.label = ASCIIToUTF16("-");
1255 field.name = ASCIIToUTF16("dayphone2");
1256 field.max_length = 3; // Size of prefix is 3.
1257 form.fields.push_back(field);
1259 field.label = ASCIIToUTF16("-");
1260 field.name = ASCIIToUTF16("dayphone3");
1261 field.max_length = 4; // Size of suffix is 4. If unlimited size is
1262 // passed, phone will be parsed as
1263 // <country code> - <area code> - <phone>.
1264 form.fields.push_back(field);
1266 field.label = ASCIIToUTF16("ext.:");
1267 field.name = ASCIIToUTF16("dayphone4");
1268 field.max_length = 0;
1269 form.fields.push_back(field);
1271 form_structure.reset(new FormStructure(form));
1272 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1273 EXPECT_TRUE(form_structure->IsAutofillable());
1274 ASSERT_EQ(4U, form_structure->field_count());
1275 ASSERT_EQ(3U, form_structure->autofill_count());
1277 // Area code.
1278 EXPECT_EQ(PHONE_HOME_CITY_CODE, form_structure->field(0)->heuristic_type());
1279 // Phone number suffix.
1280 EXPECT_EQ(PHONE_HOME_NUMBER,
1281 form_structure->field(1)->heuristic_type());
1282 // Phone number suffix.
1283 EXPECT_EQ(PHONE_HOME_NUMBER,
1284 form_structure->field(2)->heuristic_type());
1285 // Unknown.
1286 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type());
1289 TEST(FormStructureTest, HeuristicsInfernoCC) {
1290 scoped_ptr<FormStructure> form_structure;
1291 FormData form;
1293 FormFieldData field;
1294 field.form_control_type = "text";
1296 field.label = ASCIIToUTF16("Name on Card");
1297 field.name = ASCIIToUTF16("name_on_card");
1298 form.fields.push_back(field);
1300 field.label = ASCIIToUTF16("Address");
1301 field.name = ASCIIToUTF16("billing_address");
1302 form.fields.push_back(field);
1304 field.label = ASCIIToUTF16("Card Number");
1305 field.name = ASCIIToUTF16("card_number");
1306 form.fields.push_back(field);
1308 field.label = ASCIIToUTF16("Expiration Date");
1309 field.name = ASCIIToUTF16("expiration_month");
1310 form.fields.push_back(field);
1312 field.label = ASCIIToUTF16("Expiration Year");
1313 field.name = ASCIIToUTF16("expiration_year");
1314 form.fields.push_back(field);
1316 form_structure.reset(new FormStructure(form));
1317 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1318 EXPECT_TRUE(form_structure->IsAutofillable());
1320 // Expect the correct number of fields.
1321 ASSERT_EQ(5U, form_structure->field_count());
1322 EXPECT_EQ(5U, form_structure->autofill_count());
1324 // Name on Card.
1325 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type());
1326 // Address.
1327 EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(1)->heuristic_type());
1328 // Card Number.
1329 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type());
1330 // Expiration Date.
1331 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type());
1332 // Expiration Year.
1333 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
1334 form_structure->field(4)->heuristic_type());
1337 TEST(FormStructureTest, CVCCodeClash) {
1338 scoped_ptr<FormStructure> form_structure;
1339 FormData form;
1341 FormFieldData field;
1342 field.form_control_type = "text";
1344 field.label = ASCIIToUTF16("Card number");
1345 field.name = ASCIIToUTF16("ccnumber");
1346 form.fields.push_back(field);
1348 field.label = ASCIIToUTF16("First name");
1349 field.name = ASCIIToUTF16("first_name");
1350 form.fields.push_back(field);
1352 field.label = ASCIIToUTF16("Last name");
1353 field.name = ASCIIToUTF16("last_name");
1354 form.fields.push_back(field);
1356 field.label = ASCIIToUTF16("Expiration date");
1357 field.name = ASCIIToUTF16("ccexpiresmonth");
1358 form.fields.push_back(field);
1360 field.label = base::string16();
1361 field.name = ASCIIToUTF16("ccexpiresyear");
1362 form.fields.push_back(field);
1364 field.label = ASCIIToUTF16("cvc number");
1365 field.name = ASCIIToUTF16("csc");
1366 form.fields.push_back(field);
1368 form_structure.reset(new FormStructure(form));
1369 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1370 EXPECT_TRUE(form_structure->IsAutofillable());
1372 // Expect the correct number of fields.
1373 ASSERT_EQ(6U, form_structure->field_count());
1374 ASSERT_EQ(5U, form_structure->autofill_count());
1376 // Card Number.
1377 EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(0)->heuristic_type());
1378 // First name, taken as name on card.
1379 EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(1)->heuristic_type());
1380 // Last name is not merged.
1381 EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
1382 // Expiration Date.
1383 EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type());
1384 // Expiration Year.
1385 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
1386 form_structure->field(4)->heuristic_type());
1387 // CVC code.
1388 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
1389 form_structure->field(5)->heuristic_type());
1392 TEST(FormStructureTest, EncodeQueryRequest) {
1393 FormData form;
1395 FormFieldData field;
1396 field.form_control_type = "text";
1398 field.label = ASCIIToUTF16("Name on Card");
1399 field.name = ASCIIToUTF16("name_on_card");
1400 form.fields.push_back(field);
1402 field.label = ASCIIToUTF16("Address");
1403 field.name = ASCIIToUTF16("billing_address");
1404 form.fields.push_back(field);
1406 field.label = ASCIIToUTF16("Card Number");
1407 field.name = ASCIIToUTF16("card_number");
1408 form.fields.push_back(field);
1410 field.label = ASCIIToUTF16("Expiration Date");
1411 field.name = ASCIIToUTF16("expiration_month");
1412 form.fields.push_back(field);
1414 field.label = ASCIIToUTF16("Expiration Year");
1415 field.name = ASCIIToUTF16("expiration_year");
1416 form.fields.push_back(field);
1418 // Add checkable field.
1419 FormFieldData checkable_field;
1420 checkable_field.is_checkable = true;
1421 checkable_field.label = ASCIIToUTF16("Checkable1");
1422 checkable_field.name = ASCIIToUTF16("Checkable1");
1423 form.fields.push_back(checkable_field);
1425 ScopedVector<FormStructure> forms;
1426 forms.push_back(new FormStructure(form));
1427 std::vector<std::string> encoded_signatures;
1428 std::string encoded_xml;
1429 const char kSignature1[] = "11337937696949187602";
1430 const char kResponse1[] =
1431 "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1432 "<autofillquery clientversion=\"6.1.1715.1442/en (GGLL)\">"
1433 "<form signature=\"11337937696949187602\">"
1434 "<field signature=\"412125936\"/>"
1435 "<field signature=\"1917667676\"/>"
1436 "<field signature=\"2226358947\"/>"
1437 "<field signature=\"747221617\"/>"
1438 "<field signature=\"4108155786\"/>"
1439 "</form>"
1440 "</autofillquery>";
1441 ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
1442 &encoded_signatures,
1443 &encoded_xml));
1444 ASSERT_EQ(1U, encoded_signatures.size());
1445 EXPECT_EQ(kSignature1, encoded_signatures[0]);
1446 EXPECT_EQ(kResponse1, encoded_xml);
1448 // Add the same form, only one will be encoded, so EncodeQueryRequest() should
1449 // return the same data.
1450 forms.push_back(new FormStructure(form));
1451 ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
1452 &encoded_signatures,
1453 &encoded_xml));
1454 ASSERT_EQ(1U, encoded_signatures.size());
1455 EXPECT_EQ(kSignature1, encoded_signatures[0]);
1456 EXPECT_EQ(kResponse1, encoded_xml);
1457 // Add 5 address fields - this should be still a valid form.
1458 for (size_t i = 0; i < 5; ++i) {
1459 field.label = ASCIIToUTF16("Address");
1460 field.name = ASCIIToUTF16("address");
1461 form.fields.push_back(field);
1464 forms.push_back(new FormStructure(form));
1465 ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
1466 &encoded_signatures,
1467 &encoded_xml));
1468 ASSERT_EQ(2U, encoded_signatures.size());
1469 EXPECT_EQ(kSignature1, encoded_signatures[0]);
1470 const char kSignature2[] = "8308881815906226214";
1471 EXPECT_EQ(kSignature2, encoded_signatures[1]);
1472 const char kResponse2[] =
1473 "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1474 "<autofillquery clientversion=\"6.1.1715.1442/en (GGLL)\">"
1475 "<form signature=\"11337937696949187602\">"
1476 "<field signature=\"412125936\"/>"
1477 "<field signature=\"1917667676\"/>"
1478 "<field signature=\"2226358947\"/>"
1479 "<field signature=\"747221617\"/>"
1480 "<field signature=\"4108155786\"/>"
1481 "</form>"
1482 "<form signature=\"8308881815906226214\">"
1483 "<field signature=\"412125936\"/>"
1484 "<field signature=\"1917667676\"/>"
1485 "<field signature=\"2226358947\"/>"
1486 "<field signature=\"747221617\"/>"
1487 "<field signature=\"4108155786\"/>"
1488 "<field signature=\"509334676\"/>"
1489 "<field signature=\"509334676\"/>"
1490 "<field signature=\"509334676\"/>"
1491 "<field signature=\"509334676\"/>"
1492 "<field signature=\"509334676\"/>"
1493 "</form>"
1494 "</autofillquery>";
1495 EXPECT_EQ(kResponse2, encoded_xml);
1497 FormData malformed_form(form);
1498 // Add 50 address fields - the form is not valid anymore, but previous ones
1499 // are. The result should be the same as in previous test.
1500 for (size_t i = 0; i < 50; ++i) {
1501 field.label = ASCIIToUTF16("Address");
1502 field.name = ASCIIToUTF16("address");
1503 malformed_form.fields.push_back(field);
1506 forms.push_back(new FormStructure(malformed_form));
1507 ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
1508 &encoded_signatures,
1509 &encoded_xml));
1510 ASSERT_EQ(2U, encoded_signatures.size());
1511 EXPECT_EQ(kSignature1, encoded_signatures[0]);
1512 EXPECT_EQ(kSignature2, encoded_signatures[1]);
1513 EXPECT_EQ(kResponse2, encoded_xml);
1515 // Check that we fail if there are only bad form(s).
1516 ScopedVector<FormStructure> bad_forms;
1517 bad_forms.push_back(new FormStructure(malformed_form));
1518 EXPECT_FALSE(FormStructure::EncodeQueryRequest(bad_forms.get(),
1519 &encoded_signatures,
1520 &encoded_xml));
1521 EXPECT_EQ(0U, encoded_signatures.size());
1522 EXPECT_EQ("", encoded_xml);
1525 TEST(FormStructureTest, EncodeUploadRequest) {
1526 scoped_ptr<FormStructure> form_structure;
1527 std::vector<ServerFieldTypeSet> possible_field_types;
1528 FormData form;
1529 form_structure.reset(new FormStructure(form));
1530 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1532 FormFieldData field;
1533 field.form_control_type = "text";
1535 field.label = ASCIIToUTF16("First Name");
1536 field.name = ASCIIToUTF16("firstname");
1537 form.fields.push_back(field);
1538 possible_field_types.push_back(ServerFieldTypeSet());
1539 possible_field_types.back().insert(NAME_FIRST);
1541 field.label = ASCIIToUTF16("Last Name");
1542 field.name = ASCIIToUTF16("lastname");
1543 form.fields.push_back(field);
1544 possible_field_types.push_back(ServerFieldTypeSet());
1545 possible_field_types.back().insert(NAME_LAST);
1547 field.label = ASCIIToUTF16("Email");
1548 field.name = ASCIIToUTF16("email");
1549 field.form_control_type = "email";
1550 form.fields.push_back(field);
1551 possible_field_types.push_back(ServerFieldTypeSet());
1552 possible_field_types.back().insert(EMAIL_ADDRESS);
1554 field.label = ASCIIToUTF16("Phone");
1555 field.name = ASCIIToUTF16("phone");
1556 field.form_control_type = "number";
1557 form.fields.push_back(field);
1558 possible_field_types.push_back(ServerFieldTypeSet());
1559 possible_field_types.back().insert(PHONE_HOME_WHOLE_NUMBER);
1561 field.label = ASCIIToUTF16("Country");
1562 field.name = ASCIIToUTF16("country");
1563 field.form_control_type = "select-one";
1564 form.fields.push_back(field);
1565 possible_field_types.push_back(ServerFieldTypeSet());
1566 possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
1568 // Add checkable field.
1569 FormFieldData checkable_field;
1570 checkable_field.is_checkable = true;
1571 checkable_field.label = ASCIIToUTF16("Checkable1");
1572 checkable_field.name = ASCIIToUTF16("Checkable1");
1573 form.fields.push_back(checkable_field);
1574 possible_field_types.push_back(ServerFieldTypeSet());
1575 possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
1577 form_structure.reset(new FormStructure(form));
1579 ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
1580 for (size_t i = 0; i < form_structure->field_count(); ++i)
1581 form_structure->field(i)->set_possible_types(possible_field_types[i]);
1583 ServerFieldTypeSet available_field_types;
1584 available_field_types.insert(NAME_FIRST);
1585 available_field_types.insert(NAME_LAST);
1586 available_field_types.insert(ADDRESS_HOME_LINE1);
1587 available_field_types.insert(ADDRESS_HOME_LINE2);
1588 available_field_types.insert(ADDRESS_HOME_COUNTRY);
1589 available_field_types.insert(ADDRESS_BILLING_LINE1);
1590 available_field_types.insert(ADDRESS_BILLING_LINE2);
1591 available_field_types.insert(EMAIL_ADDRESS);
1592 available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
1594 std::string encoded_xml;
1595 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
1596 &encoded_xml));
1597 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1598 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
1599 "formsignature=\"8736493185895608956\" autofillused=\"false\" "
1600 "datapresent=\"144200030e\">"
1601 "<field signature=\"3763331450\" autofilltype=\"3\"/>"
1602 "<field signature=\"3494530716\" autofilltype=\"5\"/>"
1603 "<field signature=\"1029417091\" autofilltype=\"9\"/>"
1604 "<field signature=\"466116101\" autofilltype=\"14\"/>"
1605 "<field signature=\"2799270304\" autofilltype=\"36\"/>"
1606 "</autofillupload>",
1607 encoded_xml);
1608 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, true,
1609 &encoded_xml));
1610 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1611 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
1612 "formsignature=\"8736493185895608956\" autofillused=\"true\" "
1613 "datapresent=\"144200030e\">"
1614 "<field signature=\"3763331450\" autofilltype=\"3\"/>"
1615 "<field signature=\"3494530716\" autofilltype=\"5\"/>"
1616 "<field signature=\"1029417091\" autofilltype=\"9\"/>"
1617 "<field signature=\"466116101\" autofilltype=\"14\"/>"
1618 "<field signature=\"2799270304\" autofilltype=\"36\"/>"
1619 "</autofillupload>",
1620 encoded_xml);
1622 // Add 2 address fields - this should be still a valid form.
1623 for (size_t i = 0; i < 2; ++i) {
1624 field.label = ASCIIToUTF16("Address");
1625 field.name = ASCIIToUTF16("address");
1626 field.form_control_type = "text";
1627 form.fields.push_back(field);
1628 possible_field_types.push_back(ServerFieldTypeSet());
1629 possible_field_types.back().insert(ADDRESS_HOME_LINE1);
1630 possible_field_types.back().insert(ADDRESS_HOME_LINE2);
1631 possible_field_types.back().insert(ADDRESS_BILLING_LINE1);
1632 possible_field_types.back().insert(ADDRESS_BILLING_LINE2);
1635 form_structure.reset(new FormStructure(form));
1636 ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
1637 for (size_t i = 0; i < form_structure->field_count(); ++i)
1638 form_structure->field(i)->set_possible_types(possible_field_types[i]);
1640 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
1641 &encoded_xml));
1642 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1643 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
1644 "formsignature=\"7816485729218079147\" autofillused=\"false\" "
1645 "datapresent=\"144200030e\">"
1646 "<field signature=\"3763331450\" autofilltype=\"3\"/>"
1647 "<field signature=\"3494530716\" autofilltype=\"5\"/>"
1648 "<field signature=\"1029417091\" autofilltype=\"9\"/>"
1649 "<field signature=\"466116101\" autofilltype=\"14\"/>"
1650 "<field signature=\"2799270304\" autofilltype=\"36\"/>"
1651 "<field signature=\"509334676\" autofilltype=\"30\"/>"
1652 "<field signature=\"509334676\" autofilltype=\"31\"/>"
1653 "<field signature=\"509334676\" autofilltype=\"37\"/>"
1654 "<field signature=\"509334676\" autofilltype=\"38\"/>"
1655 "<field signature=\"509334676\" autofilltype=\"30\"/>"
1656 "<field signature=\"509334676\" autofilltype=\"31\"/>"
1657 "<field signature=\"509334676\" autofilltype=\"37\"/>"
1658 "<field signature=\"509334676\" autofilltype=\"38\"/>"
1659 "</autofillupload>",
1660 encoded_xml);
1662 // Add 50 address fields - now the form is invalid, as it has too many fields.
1663 for (size_t i = 0; i < 50; ++i) {
1664 field.label = ASCIIToUTF16("Address");
1665 field.name = ASCIIToUTF16("address");
1666 field.form_control_type = "text";
1667 form.fields.push_back(field);
1668 possible_field_types.push_back(ServerFieldTypeSet());
1669 possible_field_types.back().insert(ADDRESS_HOME_LINE1);
1670 possible_field_types.back().insert(ADDRESS_HOME_LINE2);
1671 possible_field_types.back().insert(ADDRESS_BILLING_LINE1);
1672 possible_field_types.back().insert(ADDRESS_BILLING_LINE2);
1674 form_structure.reset(new FormStructure(form));
1675 ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
1676 for (size_t i = 0; i < form_structure->field_count(); ++i)
1677 form_structure->field(i)->set_possible_types(possible_field_types[i]);
1678 EXPECT_FALSE(form_structure->EncodeUploadRequest(available_field_types, false,
1679 &encoded_xml));
1682 TEST(FormStructureTest, EncodeFieldAssignments) {
1683 scoped_ptr<FormStructure> form_structure;
1684 std::vector<ServerFieldTypeSet> possible_field_types;
1685 FormData form;
1686 form_structure.reset(new FormStructure(form));
1687 form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1689 FormFieldData field;
1690 field.form_control_type = "text";
1692 field.label = ASCIIToUTF16("First Name");
1693 field.name = ASCIIToUTF16("firstname");
1694 form.fields.push_back(field);
1695 possible_field_types.push_back(ServerFieldTypeSet());
1696 possible_field_types.back().insert(NAME_FIRST);
1698 field.label = ASCIIToUTF16("Last Name");
1699 field.name = ASCIIToUTF16("lastname");
1700 form.fields.push_back(field);
1701 possible_field_types.push_back(ServerFieldTypeSet());
1702 possible_field_types.back().insert(NAME_LAST);
1704 field.label = ASCIIToUTF16("Email");
1705 field.name = ASCIIToUTF16("email");
1706 field.form_control_type = "email";
1707 form.fields.push_back(field);
1708 possible_field_types.push_back(ServerFieldTypeSet());
1709 possible_field_types.back().insert(EMAIL_ADDRESS);
1711 field.label = ASCIIToUTF16("Phone");
1712 field.name = ASCIIToUTF16("phone");
1713 field.form_control_type = "number";
1714 form.fields.push_back(field);
1715 possible_field_types.push_back(ServerFieldTypeSet());
1716 possible_field_types.back().insert(PHONE_HOME_WHOLE_NUMBER);
1718 field.label = ASCIIToUTF16("Country");
1719 field.name = ASCIIToUTF16("country");
1720 field.form_control_type = "select-one";
1721 form.fields.push_back(field);
1722 possible_field_types.push_back(ServerFieldTypeSet());
1723 possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
1725 // Add checkable field.
1726 FormFieldData checkable_field;
1727 checkable_field.is_checkable = true;
1728 checkable_field.label = ASCIIToUTF16("Checkable1");
1729 checkable_field.name = ASCIIToUTF16("Checkable1");
1730 form.fields.push_back(checkable_field);
1731 possible_field_types.push_back(ServerFieldTypeSet());
1732 possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
1734 form_structure.reset(new FormStructure(form));
1736 ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
1737 for (size_t i = 0; i < form_structure->field_count(); ++i)
1738 form_structure->field(i)->set_possible_types(possible_field_types[i]);
1740 ServerFieldTypeSet available_field_types;
1741 available_field_types.insert(NAME_FIRST);
1742 available_field_types.insert(NAME_LAST);
1743 available_field_types.insert(ADDRESS_HOME_LINE1);
1744 available_field_types.insert(ADDRESS_HOME_LINE2);
1745 available_field_types.insert(ADDRESS_HOME_COUNTRY);
1746 available_field_types.insert(ADDRESS_BILLING_LINE1);
1747 available_field_types.insert(ADDRESS_BILLING_LINE2);
1748 available_field_types.insert(EMAIL_ADDRESS);
1749 available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
1751 std::string encoded_xml;
1752 EXPECT_TRUE(form_structure->EncodeFieldAssignments(
1753 available_field_types, &encoded_xml));
1754 EXPECT_EQ(
1755 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
1756 "<fieldassignments formsignature=\"8736493185895608956\">"
1757 "<fields fieldid=\"3763331450\" fieldtype=\"3\" name=\"firstname\"/>"
1758 "<fields fieldid=\"3494530716\" fieldtype=\"5\" name=\"lastname\"/>"
1759 "<fields fieldid=\"1029417091\" fieldtype=\"9\" name=\"email\"/>"
1760 "<fields fieldid=\"466116101\" fieldtype=\"14\" name=\"phone\"/>"
1761 "<fields fieldid=\"2799270304\" fieldtype=\"36\" name=\"country\"/>"
1762 "<fields fieldid=\"3410250678\" fieldtype=\"36\" name=\"Checkable1\"/>"
1763 "</fieldassignments>",
1764 encoded_xml);
1766 // Add 2 address fields - this should be still a valid form.
1767 for (size_t i = 0; i < 2; ++i) {
1768 field.label = ASCIIToUTF16("Address");
1769 field.name = ASCIIToUTF16("address");
1770 field.form_control_type = "text";
1771 form.fields.push_back(field);
1772 possible_field_types.push_back(ServerFieldTypeSet());
1773 possible_field_types.back().insert(ADDRESS_HOME_LINE1);
1774 possible_field_types.back().insert(ADDRESS_HOME_LINE2);
1775 possible_field_types.back().insert(ADDRESS_BILLING_LINE1);
1776 possible_field_types.back().insert(ADDRESS_BILLING_LINE2);
1779 form_structure.reset(new FormStructure(form));
1780 ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
1781 for (size_t i = 0; i < form_structure->field_count(); ++i)
1782 form_structure->field(i)->set_possible_types(possible_field_types[i]);
1784 EXPECT_TRUE(form_structure->EncodeFieldAssignments(
1785 available_field_types, &encoded_xml));
1786 EXPECT_EQ(
1787 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
1788 "<fieldassignments formsignature=\"7816485729218079147\">"
1789 "<fields fieldid=\"3763331450\" fieldtype=\"3\" name=\"firstname\"/>"
1790 "<fields fieldid=\"3494530716\" fieldtype=\"5\" name=\"lastname\"/>"
1791 "<fields fieldid=\"1029417091\" fieldtype=\"9\" name=\"email\"/>"
1792 "<fields fieldid=\"466116101\" fieldtype=\"14\" name=\"phone\"/>"
1793 "<fields fieldid=\"2799270304\" fieldtype=\"36\" name=\"country\"/>"
1794 "<fields fieldid=\"3410250678\" fieldtype=\"36\" name=\"Checkable1\"/>"
1795 "<fields fieldid=\"509334676\" fieldtype=\"30\" name=\"address\"/>"
1796 "<fields fieldid=\"509334676\" fieldtype=\"31\" name=\"address\"/>"
1797 "<fields fieldid=\"509334676\" fieldtype=\"37\" name=\"address\"/>"
1798 "<fields fieldid=\"509334676\" fieldtype=\"38\" name=\"address\"/>"
1799 "<fields fieldid=\"509334676\" fieldtype=\"30\" name=\"address\"/>"
1800 "<fields fieldid=\"509334676\" fieldtype=\"31\" name=\"address\"/>"
1801 "<fields fieldid=\"509334676\" fieldtype=\"37\" name=\"address\"/>"
1802 "<fields fieldid=\"509334676\" fieldtype=\"38\" name=\"address\"/>"
1803 "</fieldassignments>",
1804 encoded_xml);
1807 // Check that we compute the "datapresent" string correctly for the given
1808 // |available_types|.
1809 TEST(FormStructureTest, CheckDataPresence) {
1810 FormData form;
1812 FormFieldData field;
1813 field.form_control_type = "text";
1815 field.label = ASCIIToUTF16("First Name");
1816 field.name = ASCIIToUTF16("first");
1817 form.fields.push_back(field);
1819 field.label = ASCIIToUTF16("Last Name");
1820 field.name = ASCIIToUTF16("last");
1821 form.fields.push_back(field);
1823 field.label = ASCIIToUTF16("Email");
1824 field.name = ASCIIToUTF16("email");
1825 form.fields.push_back(field);
1827 FormStructure form_structure(form);
1829 ServerFieldTypeSet unknown_type;
1830 unknown_type.insert(UNKNOWN_TYPE);
1831 for (size_t i = 0; i < form_structure.field_count(); ++i)
1832 form_structure.field(i)->set_possible_types(unknown_type);
1834 // No available types.
1835 // datapresent should be "" == trimmmed(0x0000000000000000) ==
1836 // 0b0000000000000000000000000000000000000000000000000000000000000000
1837 ServerFieldTypeSet available_field_types;
1839 std::string encoded_xml;
1840 EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
1841 &encoded_xml));
1842 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1843 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
1844 " formsignature=\"6402244543831589061\" autofillused=\"false\""
1845 " datapresent=\"\">"
1846 "<field signature=\"1089846351\" autofilltype=\"1\"/>"
1847 "<field signature=\"2404144663\" autofilltype=\"1\"/>"
1848 "<field signature=\"420638584\" autofilltype=\"1\"/>"
1849 "</autofillupload>",
1850 encoded_xml);
1852 // Only a few types available.
1853 // datapresent should be "1540000240" == trimmmed(0x1540000240000000) ==
1854 // 0b0001010101000000000000000000001001000000000000000000000000000000
1855 // The set bits are:
1856 // 3 == NAME_FIRST
1857 // 5 == NAME_LAST
1858 // 7 == NAME_FULL
1859 // 9 == EMAIL_ADDRESS
1860 // 30 == ADDRESS_HOME_LINE1
1861 // 33 == ADDRESS_HOME_CITY
1862 available_field_types.clear();
1863 available_field_types.insert(NAME_FIRST);
1864 available_field_types.insert(NAME_LAST);
1865 available_field_types.insert(NAME_FULL);
1866 available_field_types.insert(EMAIL_ADDRESS);
1867 available_field_types.insert(ADDRESS_HOME_LINE1);
1868 available_field_types.insert(ADDRESS_HOME_CITY);
1870 EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
1871 &encoded_xml));
1872 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1873 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
1874 " formsignature=\"6402244543831589061\" autofillused=\"false\""
1875 " datapresent=\"1540000240\">"
1876 "<field signature=\"1089846351\" autofilltype=\"1\"/>"
1877 "<field signature=\"2404144663\" autofilltype=\"1\"/>"
1878 "<field signature=\"420638584\" autofilltype=\"1\"/>"
1879 "</autofillupload>",
1880 encoded_xml);
1882 // All supported non-credit card types available.
1883 // datapresent should be "1f7e000378000008" == trimmmed(0x1f7e000378000008) ==
1884 // 0b0001111101111110000000000000001101111000000000000000000000001000
1885 // The set bits are:
1886 // 3 == NAME_FIRST
1887 // 4 == NAME_MIDDLE
1888 // 5 == NAME_LAST
1889 // 6 == NAME_MIDDLE_INITIAL
1890 // 7 == NAME_FULL
1891 // 9 == EMAIL_ADDRESS
1892 // 10 == PHONE_HOME_NUMBER,
1893 // 11 == PHONE_HOME_CITY_CODE,
1894 // 12 == PHONE_HOME_COUNTRY_CODE,
1895 // 13 == PHONE_HOME_CITY_AND_NUMBER,
1896 // 14 == PHONE_HOME_WHOLE_NUMBER,
1897 // 30 == ADDRESS_HOME_LINE1
1898 // 31 == ADDRESS_HOME_LINE2
1899 // 33 == ADDRESS_HOME_CITY
1900 // 34 == ADDRESS_HOME_STATE
1901 // 35 == ADDRESS_HOME_ZIP
1902 // 36 == ADDRESS_HOME_COUNTRY
1903 // 60 == COMPANY_NAME
1904 available_field_types.clear();
1905 available_field_types.insert(NAME_FIRST);
1906 available_field_types.insert(NAME_MIDDLE);
1907 available_field_types.insert(NAME_LAST);
1908 available_field_types.insert(NAME_MIDDLE_INITIAL);
1909 available_field_types.insert(NAME_FULL);
1910 available_field_types.insert(EMAIL_ADDRESS);
1911 available_field_types.insert(PHONE_HOME_NUMBER);
1912 available_field_types.insert(PHONE_HOME_CITY_CODE);
1913 available_field_types.insert(PHONE_HOME_COUNTRY_CODE);
1914 available_field_types.insert(PHONE_HOME_CITY_AND_NUMBER);
1915 available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
1916 available_field_types.insert(ADDRESS_HOME_LINE1);
1917 available_field_types.insert(ADDRESS_HOME_LINE2);
1918 available_field_types.insert(ADDRESS_HOME_CITY);
1919 available_field_types.insert(ADDRESS_HOME_STATE);
1920 available_field_types.insert(ADDRESS_HOME_ZIP);
1921 available_field_types.insert(ADDRESS_HOME_COUNTRY);
1922 available_field_types.insert(COMPANY_NAME);
1924 EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
1925 &encoded_xml));
1926 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1927 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
1928 " formsignature=\"6402244543831589061\" autofillused=\"false\""
1929 " datapresent=\"1f7e000378000008\">"
1930 "<field signature=\"1089846351\" autofilltype=\"1\"/>"
1931 "<field signature=\"2404144663\" autofilltype=\"1\"/>"
1932 "<field signature=\"420638584\" autofilltype=\"1\"/>"
1933 "</autofillupload>",
1934 encoded_xml);
1936 // All supported credit card types available.
1937 // datapresent should be "0000000000001fc0" == trimmmed(0x0000000000001fc0) ==
1938 // 0b0000000000000000000000000000000000000000000000000001111111000000
1939 // The set bits are:
1940 // 51 == CREDIT_CARD_NAME
1941 // 52 == CREDIT_CARD_NUMBER
1942 // 53 == CREDIT_CARD_EXP_MONTH
1943 // 54 == CREDIT_CARD_EXP_2_DIGIT_YEAR
1944 // 55 == CREDIT_CARD_EXP_4_DIGIT_YEAR
1945 // 56 == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
1946 // 57 == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR
1947 available_field_types.clear();
1948 available_field_types.insert(CREDIT_CARD_NAME);
1949 available_field_types.insert(CREDIT_CARD_NUMBER);
1950 available_field_types.insert(CREDIT_CARD_EXP_MONTH);
1951 available_field_types.insert(CREDIT_CARD_EXP_2_DIGIT_YEAR);
1952 available_field_types.insert(CREDIT_CARD_EXP_4_DIGIT_YEAR);
1953 available_field_types.insert(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR);
1954 available_field_types.insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
1956 EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
1957 &encoded_xml));
1958 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1959 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
1960 " formsignature=\"6402244543831589061\" autofillused=\"false\""
1961 " datapresent=\"0000000000001fc0\">"
1962 "<field signature=\"1089846351\" autofilltype=\"1\"/>"
1963 "<field signature=\"2404144663\" autofilltype=\"1\"/>"
1964 "<field signature=\"420638584\" autofilltype=\"1\"/>"
1965 "</autofillupload>",
1966 encoded_xml);
1968 // All supported types available.
1969 // datapresent should be "1f7e000378001fc8" == trimmmed(0x1f7e000378001fc8) ==
1970 // 0b0001111101111110000000000000001101111000000000000001111111001000
1971 // The set bits are:
1972 // 3 == NAME_FIRST
1973 // 4 == NAME_MIDDLE
1974 // 5 == NAME_LAST
1975 // 6 == NAME_MIDDLE_INITIAL
1976 // 7 == NAME_FULL
1977 // 9 == EMAIL_ADDRESS
1978 // 10 == PHONE_HOME_NUMBER,
1979 // 11 == PHONE_HOME_CITY_CODE,
1980 // 12 == PHONE_HOME_COUNTRY_CODE,
1981 // 13 == PHONE_HOME_CITY_AND_NUMBER,
1982 // 14 == PHONE_HOME_WHOLE_NUMBER,
1983 // 30 == ADDRESS_HOME_LINE1
1984 // 31 == ADDRESS_HOME_LINE2
1985 // 33 == ADDRESS_HOME_CITY
1986 // 34 == ADDRESS_HOME_STATE
1987 // 35 == ADDRESS_HOME_ZIP
1988 // 36 == ADDRESS_HOME_COUNTRY
1989 // 51 == CREDIT_CARD_NAME
1990 // 52 == CREDIT_CARD_NUMBER
1991 // 53 == CREDIT_CARD_EXP_MONTH
1992 // 54 == CREDIT_CARD_EXP_2_DIGIT_YEAR
1993 // 55 == CREDIT_CARD_EXP_4_DIGIT_YEAR
1994 // 56 == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
1995 // 57 == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR
1996 // 60 == COMPANY_NAME
1997 available_field_types.clear();
1998 available_field_types.insert(NAME_FIRST);
1999 available_field_types.insert(NAME_MIDDLE);
2000 available_field_types.insert(NAME_LAST);
2001 available_field_types.insert(NAME_MIDDLE_INITIAL);
2002 available_field_types.insert(NAME_FULL);
2003 available_field_types.insert(EMAIL_ADDRESS);
2004 available_field_types.insert(PHONE_HOME_NUMBER);
2005 available_field_types.insert(PHONE_HOME_CITY_CODE);
2006 available_field_types.insert(PHONE_HOME_COUNTRY_CODE);
2007 available_field_types.insert(PHONE_HOME_CITY_AND_NUMBER);
2008 available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
2009 available_field_types.insert(ADDRESS_HOME_LINE1);
2010 available_field_types.insert(ADDRESS_HOME_LINE2);
2011 available_field_types.insert(ADDRESS_HOME_CITY);
2012 available_field_types.insert(ADDRESS_HOME_STATE);
2013 available_field_types.insert(ADDRESS_HOME_ZIP);
2014 available_field_types.insert(ADDRESS_HOME_COUNTRY);
2015 available_field_types.insert(CREDIT_CARD_NAME);
2016 available_field_types.insert(CREDIT_CARD_NUMBER);
2017 available_field_types.insert(CREDIT_CARD_EXP_MONTH);
2018 available_field_types.insert(CREDIT_CARD_EXP_2_DIGIT_YEAR);
2019 available_field_types.insert(CREDIT_CARD_EXP_4_DIGIT_YEAR);
2020 available_field_types.insert(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR);
2021 available_field_types.insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
2022 available_field_types.insert(COMPANY_NAME);
2024 EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
2025 &encoded_xml));
2026 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
2027 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
2028 " formsignature=\"6402244543831589061\" autofillused=\"false\""
2029 " datapresent=\"1f7e000378001fc8\">"
2030 "<field signature=\"1089846351\" autofilltype=\"1\"/>"
2031 "<field signature=\"2404144663\" autofilltype=\"1\"/>"
2032 "<field signature=\"420638584\" autofilltype=\"1\"/>"
2033 "</autofillupload>",
2034 encoded_xml);
2037 TEST(FormStructureTest, CheckMultipleTypes) {
2038 // Throughout this test, datapresent should be
2039 // 0x1440000360000008 ==
2040 // 0b0001010001000000000000000000001101100000000000000000000000001000
2041 // The set bits are:
2042 // 3 == NAME_FIRST
2043 // 5 == NAME_LAST
2044 // 9 == EMAIL_ADDRESS
2045 // 30 == ADDRESS_HOME_LINE1
2046 // 31 == ADDRESS_HOME_LINE2
2047 // 33 == ADDRESS_HOME_CITY
2048 // 34 == ADDRESS_HOME_STATE
2049 // 60 == COMPANY_NAME
2050 ServerFieldTypeSet available_field_types;
2051 available_field_types.insert(NAME_FIRST);
2052 available_field_types.insert(NAME_LAST);
2053 available_field_types.insert(EMAIL_ADDRESS);
2054 available_field_types.insert(ADDRESS_HOME_LINE1);
2055 available_field_types.insert(ADDRESS_HOME_LINE2);
2056 available_field_types.insert(ADDRESS_HOME_CITY);
2057 available_field_types.insert(ADDRESS_HOME_STATE);
2058 available_field_types.insert(COMPANY_NAME);
2060 // Check that multiple types for the field are processed correctly.
2061 scoped_ptr<FormStructure> form_structure;
2062 std::vector<ServerFieldTypeSet> possible_field_types;
2063 FormData form;
2065 FormFieldData field;
2066 field.form_control_type = "text";
2068 field.label = ASCIIToUTF16("email");
2069 field.name = ASCIIToUTF16("email");
2070 form.fields.push_back(field);
2071 possible_field_types.push_back(ServerFieldTypeSet());
2072 possible_field_types.back().insert(EMAIL_ADDRESS);
2074 field.label = ASCIIToUTF16("First Name");
2075 field.name = ASCIIToUTF16("first");
2076 form.fields.push_back(field);
2077 possible_field_types.push_back(ServerFieldTypeSet());
2078 possible_field_types.back().insert(NAME_FIRST);
2080 field.label = ASCIIToUTF16("Last Name");
2081 field.name = ASCIIToUTF16("last");
2082 form.fields.push_back(field);
2083 possible_field_types.push_back(ServerFieldTypeSet());
2084 possible_field_types.back().insert(NAME_LAST);
2086 field.label = ASCIIToUTF16("Address");
2087 field.name = ASCIIToUTF16("address");
2088 form.fields.push_back(field);
2089 possible_field_types.push_back(ServerFieldTypeSet());
2090 possible_field_types.back().insert(ADDRESS_HOME_LINE1);
2092 form_structure.reset(new FormStructure(form));
2094 for (size_t i = 0; i < form_structure->field_count(); ++i)
2095 form_structure->field(i)->set_possible_types(possible_field_types[i]);
2096 std::string encoded_xml;
2098 // Now we matched both fields singularly.
2099 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
2100 &encoded_xml));
2101 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
2102 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
2103 " formsignature=\"18062476096658145866\" autofillused=\"false\""
2104 " datapresent=\"1440000360000008\">"
2105 "<field signature=\"420638584\" autofilltype=\"9\"/>"
2106 "<field signature=\"1089846351\" autofilltype=\"3\"/>"
2107 "<field signature=\"2404144663\" autofilltype=\"5\"/>"
2108 "<field signature=\"509334676\" autofilltype=\"30\"/>"
2109 "</autofillupload>",
2110 encoded_xml);
2111 // Match third field as both first and last.
2112 possible_field_types[2].insert(NAME_FIRST);
2113 form_structure->field(2)->set_possible_types(possible_field_types[2]);
2114 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
2115 &encoded_xml));
2116 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
2117 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
2118 " formsignature=\"18062476096658145866\" autofillused=\"false\""
2119 " datapresent=\"1440000360000008\">"
2120 "<field signature=\"420638584\" autofilltype=\"9\"/>"
2121 "<field signature=\"1089846351\" autofilltype=\"3\"/>"
2122 "<field signature=\"2404144663\" autofilltype=\"3\"/>"
2123 "<field signature=\"2404144663\" autofilltype=\"5\"/>"
2124 "<field signature=\"509334676\" autofilltype=\"30\"/>"
2125 "</autofillupload>",
2126 encoded_xml);
2127 possible_field_types[3].insert(ADDRESS_HOME_LINE2);
2128 form_structure->field(form_structure->field_count() - 1)->set_possible_types(
2129 possible_field_types[form_structure->field_count() - 1]);
2130 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
2131 &encoded_xml));
2132 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
2133 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
2134 " formsignature=\"18062476096658145866\" autofillused=\"false\""
2135 " datapresent=\"1440000360000008\">"
2136 "<field signature=\"420638584\" autofilltype=\"9\"/>"
2137 "<field signature=\"1089846351\" autofilltype=\"3\"/>"
2138 "<field signature=\"2404144663\" autofilltype=\"3\"/>"
2139 "<field signature=\"2404144663\" autofilltype=\"5\"/>"
2140 "<field signature=\"509334676\" autofilltype=\"30\"/>"
2141 "<field signature=\"509334676\" autofilltype=\"31\"/>"
2142 "</autofillupload>",
2143 encoded_xml);
2144 possible_field_types[3].clear();
2145 possible_field_types[3].insert(ADDRESS_HOME_LINE1);
2146 possible_field_types[3].insert(COMPANY_NAME);
2147 form_structure->field(form_structure->field_count() - 1)->set_possible_types(
2148 possible_field_types[form_structure->field_count() - 1]);
2149 EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
2150 &encoded_xml));
2151 EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
2152 "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
2153 " formsignature=\"18062476096658145866\" autofillused=\"false\""
2154 " datapresent=\"1440000360000008\">"
2155 "<field signature=\"420638584\" autofilltype=\"9\"/>"
2156 "<field signature=\"1089846351\" autofilltype=\"3\"/>"
2157 "<field signature=\"2404144663\" autofilltype=\"3\"/>"
2158 "<field signature=\"2404144663\" autofilltype=\"5\"/>"
2159 "<field signature=\"509334676\" autofilltype=\"30\"/>"
2160 "<field signature=\"509334676\" autofilltype=\"60\"/>"
2161 "</autofillupload>",
2162 encoded_xml);
2165 TEST(FormStructureTest, CheckFormSignature) {
2166 // Check that form signature is created correctly.
2167 scoped_ptr<FormStructure> form_structure;
2168 FormData form;
2170 FormFieldData field;
2171 field.form_control_type = "text";
2173 field.label = ASCIIToUTF16("email");
2174 field.name = ASCIIToUTF16("email");
2175 form.fields.push_back(field);
2177 field.label = ASCIIToUTF16("First Name");
2178 field.name = ASCIIToUTF16("first");
2179 form.fields.push_back(field);
2181 // Checkable fields shouldn't affect the signature.
2182 field.label = ASCIIToUTF16("Select");
2183 field.name = ASCIIToUTF16("Select");
2184 field.form_control_type = "checkbox";
2185 field.is_checkable = true;
2186 form.fields.push_back(field);
2188 form_structure.reset(new FormStructure(form));
2190 EXPECT_EQ(FormStructureTest::Hash64Bit(
2191 std::string("://&&email&first")),
2192 form_structure->FormSignature());
2194 form.origin = GURL(std::string("http://www.facebook.com"));
2195 form_structure.reset(new FormStructure(form));
2196 EXPECT_EQ(FormStructureTest::Hash64Bit(
2197 std::string("http://www.facebook.com&&email&first")),
2198 form_structure->FormSignature());
2200 form.action = GURL(std::string("https://login.facebook.com/path"));
2201 form_structure.reset(new FormStructure(form));
2202 EXPECT_EQ(FormStructureTest::Hash64Bit(
2203 std::string("https://login.facebook.com&&email&first")),
2204 form_structure->FormSignature());
2206 form.name = ASCIIToUTF16("login_form");
2207 form_structure.reset(new FormStructure(form));
2208 EXPECT_EQ(FormStructureTest::Hash64Bit(
2209 std::string("https://login.facebook.com&login_form&email&first")),
2210 form_structure->FormSignature());
2212 field.is_checkable = false;
2213 field.label = ASCIIToUTF16("Random Field label");
2214 field.name = ASCIIToUTF16("random1234");
2215 field.form_control_type = "text";
2216 form.fields.push_back(field);
2217 field.label = ASCIIToUTF16("Random Field label2");
2218 field.name = ASCIIToUTF16("random12345");
2219 form.fields.push_back(field);
2220 field.label = ASCIIToUTF16("Random Field label3");
2221 field.name = ASCIIToUTF16("1random12345678");
2222 form.fields.push_back(field);
2223 field.label = ASCIIToUTF16("Random Field label3");
2224 field.name = ASCIIToUTF16("12345random");
2225 form.fields.push_back(field);
2226 form_structure.reset(new FormStructure(form));
2227 EXPECT_EQ(FormStructureTest::Hash64Bit(
2228 std::string("https://login.facebook.com&login_form&email&first&"
2229 "random1234&random&1random&random")),
2230 form_structure->FormSignature());
2234 TEST(FormStructureTest, ToFormData) {
2235 FormData form;
2236 form.name = ASCIIToUTF16("the-name");
2237 form.origin = GURL("http://cool.com");
2238 form.action = form.origin.Resolve("/login");
2240 FormFieldData field;
2241 field.label = ASCIIToUTF16("username");
2242 field.name = ASCIIToUTF16("username");
2243 field.form_control_type = "text";
2244 form.fields.push_back(field);
2246 field.label = ASCIIToUTF16("password");
2247 field.name = ASCIIToUTF16("password");
2248 field.form_control_type = "password";
2249 form.fields.push_back(field);
2251 field.label = base::string16();
2252 field.name = ASCIIToUTF16("Submit");
2253 field.form_control_type = "submit";
2254 form.fields.push_back(field);
2256 EXPECT_EQ(form, FormStructure(form).ToFormData());
2258 // Currently |FormStructure(form_data)ToFormData().user_submitted| is always
2259 // false. This forces a future author that changes this to update this test.
2260 form.user_submitted = true;
2261 EXPECT_NE(form, FormStructure(form).ToFormData());
2264 TEST(FormStructureTest, SkipFieldTest) {
2265 FormData form;
2266 form.name = ASCIIToUTF16("the-name");
2267 form.origin = GURL("http://cool.com");
2268 form.action = form.origin.Resolve("/login");
2270 FormFieldData field;
2271 field.label = ASCIIToUTF16("username");
2272 field.name = ASCIIToUTF16("username");
2273 field.form_control_type = "text";
2274 form.fields.push_back(field);
2276 field.label = ASCIIToUTF16("select");
2277 field.name = ASCIIToUTF16("select");
2278 field.form_control_type = "checkbox";
2279 field.is_checkable = true;
2280 form.fields.push_back(field);
2282 field.label = base::string16();
2283 field.name = ASCIIToUTF16("email");
2284 field.form_control_type = "text";
2285 field.is_checkable = false;
2286 form.fields.push_back(field);
2288 ScopedVector<FormStructure> forms;
2289 forms.push_back(new FormStructure(form));
2290 std::vector<std::string> encoded_signatures;
2291 std::string encoded_xml;
2293 const char kSignature[] = "18006745212084723782";
2294 const char kResponse[] =
2295 "<\?xml version=\"1.0\" encoding=\"UTF-8\"?>"
2296 "<autofillquery clientversion=\"6.1.1715.1442/en (GGLL)\">"
2297 "<form signature=\"18006745212084723782\">"
2298 "<field signature=\"239111655\"/>"
2299 "<field signature=\"420638584\"/>"
2300 "</form>"
2301 "</autofillquery>";
2302 ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
2303 &encoded_signatures,
2304 &encoded_xml));
2305 ASSERT_EQ(1U, encoded_signatures.size());
2306 EXPECT_EQ(kSignature, encoded_signatures[0]);
2307 EXPECT_EQ(kResponse, encoded_xml);
2310 TEST(FormStructureTest, PossibleValues) {
2311 FormData form_data;
2312 FormFieldData field;
2313 field.autocomplete_attribute = "billing country";
2314 field.option_contents.push_back(ASCIIToUTF16("Down Under"));
2315 field.option_values.push_back(ASCIIToUTF16("AU"));
2316 field.option_contents.push_back(ASCIIToUTF16("Fr"));
2317 field.option_values.push_back(ASCIIToUTF16(""));
2318 field.option_contents.push_back(ASCIIToUTF16("Germany"));
2319 field.option_values.push_back(ASCIIToUTF16("GRMNY"));
2320 form_data.fields.push_back(field);
2321 FormStructure form_structure(form_data);
2323 bool unused;
2324 form_structure.ParseFieldTypesFromAutocompleteAttributes(&unused, &unused);
2326 // All values in <option> value= or contents are returned, set to upper case.
2327 std::set<base::string16> possible_values =
2328 form_structure.PossibleValues(ADDRESS_BILLING_COUNTRY);
2329 EXPECT_EQ(5U, possible_values.size());
2330 EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("AU")));
2331 EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("FR")));
2332 EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("DOWN UNDER")));
2333 EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("GERMANY")));
2334 EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("GRMNY")));
2335 EXPECT_EQ(0U, possible_values.count(ASCIIToUTF16("Fr")));
2336 EXPECT_EQ(0U, possible_values.count(ASCIIToUTF16("DE")));
2338 // No field for the given type; empty value set.
2339 EXPECT_EQ(0U, form_structure.PossibleValues(ADDRESS_HOME_COUNTRY).size());
2341 // A freeform input (<input>) allows any value (overriding other <select>s).
2342 FormFieldData freeform_field;
2343 freeform_field.autocomplete_attribute = "billing country";
2344 form_data.fields.push_back(freeform_field);
2345 FormStructure form_structure2(form_data);
2346 form_structure2.ParseFieldTypesFromAutocompleteAttributes(&unused, &unused);
2347 EXPECT_EQ(0U, form_structure2.PossibleValues(ADDRESS_BILLING_COUNTRY).size());
2350 } // namespace autofill