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"
16 using base::ASCIIToUTF16
;
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
{
26 TestAutofillMetrics() {}
27 virtual ~TestAutofillMetrics() {}
30 } // anonymous namespace
35 std::ostream
& operator<<(std::ostream
& os
, const FormData
& form
) {
36 os
<< base::UTF16ToUTF8(form
.name
)
43 for (std::vector
<FormFieldData
>::const_iterator iter
=
45 iter
!= form
.fields
.end(); ++iter
) {
53 } // namespace content
55 class FormStructureTest
{
57 static std::string
Hash64Bit(const std::string
& str
) {
58 return FormStructure::Hash64Bit(str
);
62 TEST(FormStructureTest
, FieldCount
) {
63 scoped_ptr
<FormStructure
> form_structure
;
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
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
;
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
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
) {
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
;
149 // We need at least three text fields to be auto-fillable.
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
;
213 // We need at least three text fields to be parseable.
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
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
;
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());
339 EXPECT_EQ(NAME_FIRST
, form_structure
->field(0)->heuristic_type());
341 EXPECT_EQ(NAME_LAST
, form_structure
->field(1)->heuristic_type());
343 EXPECT_EQ(EMAIL_ADDRESS
, form_structure
->field(2)->heuristic_type());
345 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER
,
346 form_structure
->field(3)->heuristic_type());
348 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(4)->heuristic_type());
350 EXPECT_EQ(ADDRESS_HOME_CITY
, form_structure
->field(5)->heuristic_type());
352 EXPECT_EQ(ADDRESS_HOME_ZIP
, form_structure
->field(6)->heuristic_type());
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
;
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
;
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
;
444 // Start with a regular contact form.
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|
489 TEST(FormStructureTest
, HeuristicsAutocompleteAttributeWithSections
) {
493 field
.form_control_type
= "text";
495 // Some fields will have no section specified. These fall into the default
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
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
) {
556 field
.form_control_type
= "text";
558 // Some fields will have no section specified. These fall into the default
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
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
) {
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
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
624 TEST(FormStructureTest
, HeuristicsDontOverrideAutocompleteAttributeSections
) {
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
;
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());
714 EXPECT_EQ(NAME_FIRST
, form_structure
->field(0)->heuristic_type());
716 EXPECT_EQ(NAME_LAST
, form_structure
->field(1)->heuristic_type());
718 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(2)->heuristic_type());
720 EXPECT_EQ(ADDRESS_HOME_LINE2
, form_structure
->field(3)->heuristic_type());
722 EXPECT_EQ(ADDRESS_HOME_CITY
, form_structure
->field(4)->heuristic_type());
724 EXPECT_EQ(ADDRESS_HOME_STATE
, form_structure
->field(5)->heuristic_type());
726 EXPECT_EQ(ADDRESS_HOME_ZIP
, form_structure
->field(6)->heuristic_type());
728 EXPECT_EQ(ADDRESS_HOME_COUNTRY
, form_structure
->field(7)->heuristic_type());
730 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER
,
731 form_structure
->field(8)->heuristic_type());
733 EXPECT_EQ(UNKNOWN_TYPE
, form_structure
->field(9)->heuristic_type());
736 TEST(FormStructureTest
, HeuristicsSample6
) {
737 scoped_ptr
<FormStructure
> form_structure
;
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());
780 EXPECT_EQ(EMAIL_ADDRESS
, form_structure
->field(0)->heuristic_type());
782 EXPECT_EQ(NAME_FULL
, form_structure
->field(1)->heuristic_type());
784 EXPECT_EQ(COMPANY_NAME
, form_structure
->field(2)->heuristic_type());
786 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(3)->heuristic_type());
788 EXPECT_EQ(ADDRESS_HOME_CITY
, form_structure
->field(4)->heuristic_type());
790 EXPECT_EQ(ADDRESS_HOME_ZIP
, form_structure
->field(5)->heuristic_type());
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
;
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());
845 EXPECT_EQ(NAME_FIRST
, form_structure
->field(0)->heuristic_type());
847 EXPECT_EQ(NAME_LAST
, form_structure
->field(1)->heuristic_type());
849 EXPECT_EQ(EMAIL_ADDRESS
, form_structure
->field(2)->heuristic_type());
851 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER
,
852 form_structure
->field(3)->heuristic_type());
854 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(4)->heuristic_type());
856 EXPECT_EQ(ADDRESS_HOME_LINE2
, form_structure
->field(5)->heuristic_type());
858 EXPECT_EQ(ADDRESS_HOME_ZIP
, form_structure
->field(6)->heuristic_type());
860 EXPECT_EQ(UNKNOWN_TYPE
, form_structure
->field(7)->heuristic_type());
863 TEST(FormStructureTest
, HeuristicsCreditCardInfo
) {
864 scoped_ptr
<FormStructure
> form_structure
;
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());
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());
911 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE
,
912 form_structure
->field(4)->heuristic_type());
914 EXPECT_EQ(UNKNOWN_TYPE
, form_structure
->field(5)->heuristic_type());
917 TEST(FormStructureTest
, HeuristicsCreditCardInfoWithUnknownCardField
) {
918 scoped_ptr
<FormStructure
> form_structure
;
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());
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());
973 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE
,
974 form_structure
->field(5)->heuristic_type());
976 EXPECT_EQ(UNKNOWN_TYPE
, form_structure
->field(6)->heuristic_type());
979 TEST(FormStructureTest
, ThreeAddressLines
) {
980 scoped_ptr
<FormStructure
> form_structure
;
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());
1009 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(0)->heuristic_type());
1011 EXPECT_EQ(ADDRESS_HOME_LINE2
, form_structure
->field(1)->heuristic_type());
1013 EXPECT_EQ(UNKNOWN_TYPE
, form_structure
->field(2)->heuristic_type());
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
;
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());
1048 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(0)->heuristic_type());
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
1061 // See http://crbug.com/48197 for details.
1062 TEST(FormStructureTest
, ThreeAddressLinesExpedia
) {
1063 scoped_ptr
<FormStructure
> form_structure
;
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());
1092 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(0)->heuristic_type());
1094 EXPECT_EQ(ADDRESS_HOME_LINE2
, form_structure
->field(1)->heuristic_type());
1096 EXPECT_EQ(UNKNOWN_TYPE
, form_structure
->field(2)->heuristic_type());
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
;
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());
1130 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(0)->heuristic_type());
1132 EXPECT_EQ(ADDRESS_HOME_LINE2
, form_structure
->field(1)->heuristic_type());
1134 EXPECT_EQ(ADDRESS_HOME_CITY
, form_structure
->field(2)->heuristic_type());
1137 TEST(FormStructureTest
, HeuristicsStateWithProvince
) {
1138 scoped_ptr
<FormStructure
> form_structure
;
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());
1163 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(0)->heuristic_type());
1165 EXPECT_EQ(ADDRESS_HOME_LINE2
, form_structure
->field(1)->heuristic_type());
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
;
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
;
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());
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());
1286 EXPECT_EQ(UNKNOWN_TYPE
, form_structure
->field(3)->heuristic_type());
1289 TEST(FormStructureTest
, HeuristicsInfernoCC
) {
1290 scoped_ptr
<FormStructure
> form_structure
;
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());
1325 EXPECT_EQ(CREDIT_CARD_NAME
, form_structure
->field(0)->heuristic_type());
1327 EXPECT_EQ(ADDRESS_HOME_LINE1
, form_structure
->field(1)->heuristic_type());
1329 EXPECT_EQ(CREDIT_CARD_NUMBER
, form_structure
->field(2)->heuristic_type());
1331 EXPECT_EQ(CREDIT_CARD_EXP_MONTH
, form_structure
->field(3)->heuristic_type());
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
;
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());
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());
1383 EXPECT_EQ(CREDIT_CARD_EXP_MONTH
, form_structure
->field(3)->heuristic_type());
1385 EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR
,
1386 form_structure
->field(4)->heuristic_type());
1388 EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE
,
1389 form_structure
->field(5)->heuristic_type());
1392 TEST(FormStructureTest
, EncodeQueryRequest
) {
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\"/>"
1441 ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms
.get(),
1442 &encoded_signatures
,
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
,
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
,
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\"/>"
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\"/>"
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
,
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
,
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
;
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,
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>",
1608 EXPECT_TRUE(form_structure
->EncodeUploadRequest(available_field_types
, true,
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>",
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,
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>",
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,
1682 TEST(FormStructureTest
, EncodeFieldAssignments
) {
1683 scoped_ptr
<FormStructure
> form_structure
;
1684 std::vector
<ServerFieldTypeSet
> possible_field_types
;
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
));
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>",
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
));
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>",
1807 // Check that we compute the "datapresent" string correctly for the given
1808 // |available_types|.
1809 TEST(FormStructureTest
, CheckDataPresence
) {
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,
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>",
1852 // Only a few types available.
1853 // datapresent should be "1540000240" == trimmmed(0x1540000240000000) ==
1854 // 0b0001010101000000000000000000001001000000000000000000000000000000
1855 // The set bits are:
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,
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>",
1882 // All supported non-credit card types available.
1883 // datapresent should be "1f7e000378000008" == trimmmed(0x1f7e000378000008) ==
1884 // 0b0001111101111110000000000000001101111000000000000000000000001000
1885 // The set bits are:
1889 // 6 == NAME_MIDDLE_INITIAL
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,
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>",
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,
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>",
1968 // All supported types available.
1969 // datapresent should be "1f7e000378001fc8" == trimmmed(0x1f7e000378001fc8) ==
1970 // 0b0001111101111110000000000000001101111000000000000001111111001000
1971 // The set bits are:
1975 // 6 == NAME_MIDDLE_INITIAL
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,
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>",
2037 TEST(FormStructureTest
, CheckMultipleTypes
) {
2038 // Throughout this test, datapresent should be
2039 // 0x1440000360000008 ==
2040 // 0b0001010001000000000000000000001101100000000000000000000000001000
2041 // The set bits are:
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
;
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,
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>",
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,
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>",
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,
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>",
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,
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>",
2165 TEST(FormStructureTest
, CheckFormSignature
) {
2166 // Check that form signature is created correctly.
2167 scoped_ptr
<FormStructure
> form_structure
;
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
) {
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
) {
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\"/>"
2302 ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms
.get(),
2303 &encoded_signatures
,
2305 ASSERT_EQ(1U, encoded_signatures
.size());
2306 EXPECT_EQ(kSignature
, encoded_signatures
[0]);
2307 EXPECT_EQ(kResponse
, encoded_xml
);
2310 TEST(FormStructureTest
, PossibleValues
) {
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
);
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