1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_structure.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_metrics.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unlike the base AutofillMetrics, exposes copy and assignment constructors,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which are handy for briefer test code.  The AutofillMetrics class is
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// stateless, so this is safe.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestAutofillMetrics : public AutofillMetrics {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAutofillMetrics() {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestAutofillMetrics() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& os, const FormData& form) {
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << base::UTF16ToUTF8(form.name)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     << " "
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     << form.origin.spec()
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     << " "
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     << form.action.spec()
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     << " ";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<FormFieldData>::const_iterator iter =
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           form.fields.begin();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != form.fields.end(); ++iter) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os << *iter
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       << " ";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return os;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FormStructureTest {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string Hash64Bit(const std::string& str) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FormStructure::Hash64Bit(str);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, FieldCount) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("username");
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("username");
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("password");
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("password");
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "password";
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.label = ASCIIToUTF16("address1");
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.name = ASCIIToUTF16("address1");
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "text";
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.should_autocomplete = false;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(field);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The render process sends all fields to browser including fields with
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // autocomplete=off
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4U, form_structure->field_count());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, AutofillCount) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("username");
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("username");
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("password");
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("password");
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "password";
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("state");
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("state");
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "select-one";
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only text and select fields that are heuristically matched are counted.
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, form_structure->autofill_count());
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add a field with should_autocomplete=false. This should not be considered a
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // fillable field.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.label = ASCIIToUTF16("address1");
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.name = ASCIIToUTF16("address1");
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "text";
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.should_autocomplete = false;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(field);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, form_structure->autofill_count());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, SourceURL) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.origin = GURL("http://www.foo.com/");
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FormStructure form_structure(form);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(form.origin, form_structure.source_url());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, IsAutofillable) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need at least three text fields to be auto-fillable.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("username");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("username");
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("password");
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("password");
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "password";
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->IsAutofillable());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We now have three text fields, but only two auto-fillable fields.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->IsAutofillable());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We now have three auto-fillable fields.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email");
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "email";
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The target cannot include http(s)://*/search...
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL("http://google.com/search?q=hello");
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->IsAutofillable());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But search can be in the URL.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL("http://search.com/?q=hello");
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, ShouldBeParsed) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need at least three text fields to be parseable.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("username");
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("username");
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData checkable_field;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.is_checkable = true;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.name = ASCIIToUTF16("radiobtn");
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.form_control_type = "radio";
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(checkable_field);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.name = ASCIIToUTF16("checkbox");
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.form_control_type = "checkbox";
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(checkable_field);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We have only one text field, should not be parsed.
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->ShouldBeParsed());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We now have three text fields, though only two are auto-fillable.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->ShouldBeParsed());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->IsAutofillable());
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->ShouldBeParsed());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The target cannot include http(s)://*/search...
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL("http://google.com/search?q=hello");
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->ShouldBeParsed());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But search can be in the URL.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL("http://search.com/?q=hello");
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->ShouldBeParsed());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The form need only have three fields, but at least one must be a text
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // field.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.clear();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email");
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "email";
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("State");
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("state");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "select-one";
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Country");
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("country");
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "select-one";
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->ShouldBeParsed());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields[0].form_control_type = "select-one";
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now, no text fields.
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->ShouldBeParsed());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsContactInfo) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email");
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Phone");
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("phone");
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address");
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("address");
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("City");
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("city");
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Zip code");
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("zipcode");
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(8U, form_structure->field_count());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(7U, form_structure->autofill_count());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First name.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last name.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Email.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Phone.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_structure->field(3)->heuristic_type());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // City.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Zip.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Submit.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type());
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can correctly process the |autocomplete| attribute.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsAutocompleteAttribute) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("field1");
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "given-name";
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("field2");
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "family-name";
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("field3");
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "email";
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->field_count());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->autofill_count());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
388bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(HTML_TYPE_GIVEN_NAME, form_structure->field(0)->html_type());
389bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(HTML_TYPE_FAMILY_NAME, form_structure->field(1)->html_type());
390bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(HTML_TYPE_EMAIL, form_structure->field(2)->html_type());
391bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type());
392bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type());
393bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can correctly process the 'autocomplete' attribute for phone
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number types (especially phone prefixes and suffixes).
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsAutocompleteAttributePhoneTypes) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("field1");
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "tel-local";
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("field2");
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "tel-local-prefix";
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("field3");
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "tel-local-suffix";
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->field_count());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, form_structure->autofill_count());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
428bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(HTML_TYPE_TEL_LOCAL, form_structure->field(0)->html_type());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutofillField::IGNORED, form_structure->field(0)->phone_part());
430bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(HTML_TYPE_TEL_LOCAL_PREFIX, form_structure->field(1)->html_type());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutofillField::PHONE_PREFIX,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(1)->phone_part());
433bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EXPECT_EQ(HTML_TYPE_TEL_LOCAL_SUFFIX, form_structure->field(2)->html_type());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutofillField::PHONE_SUFFIX,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(2)->phone_part());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If at least one field includes type hints in the 'autocomplete' attribute, we
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should not try to apply any other heuristics.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, AutocompleteAttributeOverridesOtherHeuristics) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with a regular contact form.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email");
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->ShouldBeCrowdsourced());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->field_count());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->autofill_count());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now update the first form field to include an 'autocomplete' attribute.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.front().autocomplete_attribute = "x-other";
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(form_structure->IsAutofillable());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(form_structure->ShouldBeCrowdsourced());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->field_count());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, form_structure->autofill_count());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(0)->heuristic_type());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type());
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can correctly process sections listed in the |autocomplete|
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// attribute.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSections) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some fields will have no section specified.  These fall into the default
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // section.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "email";
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We allow arbitrary section names.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-foo email";
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "shipping" and "billing" are special section tokens that don't require the
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "section-" prefix.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "shipping email";
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "billing email";
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "shipping" and "billing" can be combined with other section names.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-foo shipping email";
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-foo billing email";
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't do anything clever to try to coalesce sections; it's up to site
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // authors to avoid typos.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section--foo email";
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "shipping email" and "section--shipping" email should be parsed as
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different sections.  This is only an interesting test due to how we
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implement implicit section names from attributes like "shipping email"; see
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the implementation for more details.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section--shipping email";
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card fields are implicitly in a separate section from other fields.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-foo cc-number";
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FormStructure form_structure(form);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure.IsAutofillable());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(9U, form_structure.field_count());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, form_structure.autofill_count());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All of the fields in this form should be parsed as belonging to different
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sections.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> section_names;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < 9; ++i) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    section_names.insert(form_structure.field(i)->section());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(9U, section_names.size());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can correctly process a degenerate section listed in the
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |autocomplete| attribute.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsDegenerate) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some fields will have no section specified.  These fall into the default
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // section.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "email";
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifying "section-" is equivalent to not specifying a section.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section- email";
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalid tokens should prevent us from setting a section name.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "garbage section-foo email";
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "garbage section-bar email";
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "garbage shipping email";
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "garbage billing email";
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FormStructure form_structure(form);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(6U, form_structure.field_count());
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, form_structure.autofill_count());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All of the fields in this form should be parsed as belonging to the same
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // section.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> section_names;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < 6; ++i) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    section_names.insert(form_structure.field(i)->section());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, section_names.size());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can correctly process repeated sections listed in the
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |autocomplete| attribute.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsAutocompleteAttributeWithSectionsRepeated) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-foo email";
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
603a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  field.autocomplete_attribute = "section-foo address-line1";
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FormStructure form_structure(form);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, form_structure.field_count());
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, form_structure.autofill_count());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All of the fields in this form should be parsed as belonging to the same
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // section.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> section_names;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    section_names.insert(form_structure.field(i)->section());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, section_names.size());
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we do not override the author-specified sections from a form with
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// local heuristics.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsDontOverrideAutocompleteAttributeSections) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("one");
631a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  field.autocomplete_attribute = "address-line1";
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "section-foo email";
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.autocomplete_attribute = "name";
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("two");
640a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  field.autocomplete_attribute = "address-line1";
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FormStructure form_structure(form);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure.DetermineHeuristicTypes(TestAutofillMetrics());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, form_structure.field_count());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, form_structure.autofill_count());
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normally, the two separate address fields would cause us to detect two
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // separate sections; but because there is an author-specified section in this
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // form, we do not apply these usual heuristics.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("one"), form_structure.field(0)->name);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("two"), form_structure.field(3)->name);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(form_structure.field(0)->section(),
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure.field(3)->section());
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsSample8) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Your First Name:");
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("bill.first");
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Your Last Name:");
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("bill.last");
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Street Address Line 1:");
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("bill.street1");
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Street Address Line 2:");
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("bill.street2");
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("City");
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("bill.city");
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("State (U.S.):");
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("bill.state");
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Zip/Postal Code:");
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("BillTo.PostalCode");
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Country:");
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("bill.country");
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Phone Number:");
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("BillTo.Phone");
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(10U, form_structure->field_count());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(9U, form_structure->autofill_count());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First name.
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last name.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address.
718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(2)->heuristic_type());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address.
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(3)->heuristic_type());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // City.
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type());
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State.
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(5)->heuristic_type());
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Zip.
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Country.
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type());
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Phone.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_structure->field(8)->heuristic_type());
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Submit.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(9)->heuristic_type());
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsSample6) {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("E-mail address");
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Full name");
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("name");
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Company");
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("company");
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address");
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("address");
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("City");
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("city");
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Zip Code");
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Home.PostalCode");
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("continue");
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(7U, form_structure->field_count());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(6U, form_structure->autofill_count());
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Email.
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(0)->heuristic_type());
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Full name.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_FULL, form_structure->field(1)->heuristic_type());
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Company
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type());
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type());
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // City.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(4)->heuristic_type());
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Zip.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(5)->heuristic_type());
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Submit.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type());
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests a sequence of FormFields where only labels are supplied to heuristics
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for matching.  This works because FormFieldData labels are matched in the
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case that input element ids (or |name| fields) are missing.
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsLabelsOnly) {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email");
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Phone");
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address");
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address");
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Zip code");
830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = base::string16();
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(8U, form_structure->field_count());
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(7U, form_structure->autofill_count());
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First name.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last name.
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Email.
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(2)->heuristic_type());
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Phone.
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_structure->field(3)->heuristic_type());
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address.
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(4)->heuristic_type());
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 2.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(5)->heuristic_type());
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Zip.
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(6)->heuristic_type());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Submit.
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(7)->heuristic_type());
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsCreditCardInfo) {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Name on Card");
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("name_on_card");
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Card Number");
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("card_number");
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Exp Month");
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("ccmonth");
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Exp Year");
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("ccyear");
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Verification");
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("verification");
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
897116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(6U, form_structure->field_count());
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5U, form_structure->autofill_count());
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card name.
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type());
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card number.
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(1)->heuristic_type());
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card expiration month.
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(2)->heuristic_type());
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card expiration year.
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(3)->heuristic_type());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CVV.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(4)->heuristic_type());
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Submit.
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(5)->heuristic_type());
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsCreditCardInfoWithUnknownCardField) {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Name on Card");
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("name_on_card");
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is not a field we know how to process.  But we should skip over it
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and process the other fields in the card block.
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Card image");
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("card_image");
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Card Number");
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("card_number");
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Exp Month");
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("ccmonth");
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Exp Year");
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("ccyear");
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Verification");
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("verification");
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "submit";
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
957116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(7U, form_structure->field_count());
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5U, form_structure->autofill_count());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card name.
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type());
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card type.  This is an unknown type but related to the credit card.
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(1)->heuristic_type());
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card number.
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card expiration month.
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Credit card expiration year.
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(4)->heuristic_type());
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CVV.
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(5)->heuristic_type());
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Submit.
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(6)->heuristic_type());
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, ThreeAddressLines) {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address Line1");
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Address");
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address Line2");
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Address");
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address Line3");
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Address");
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("City");
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("city");
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, form_structure->field_count());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->autofill_count());
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 1.
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 2.
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 3.
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // City.
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type());
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Numbered address lines after line two are ignored.
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(FormStructureTest, SurplusAddressLinesIgnored) {
1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FormData form;
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FormFieldData field;
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.form_control_type = "text";
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Address Line1");
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("shipping.address.addressLine1");
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Address Line2");
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("shipping.address.addressLine2");
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Address Line3");
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("billing.address.addressLine3");
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Address Line4");
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("billing.address.addressLine4");
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(4U, form_structure->field_count());
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2U, form_structure->autofill_count());
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Address Line 1.
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Address Line 2.
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Address Line 3 (ignored).
1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Address Line 4 (ignored).
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type());
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This example comes from expedia.com where they use a "Suite" label to
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicate a suite or apartment number.  We interpret this as address line 2.
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// And the following "Street address second line" we interpret as address line
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3 and discard.
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/48197 for details.
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, ThreeAddressLinesExpedia) {
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Street:");
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads1");
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Suite or Apt:");
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adap");
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Street address second line");
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_ads2");
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("City:");
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("FOPIH_RgWebCC_0_IHAddress_adct");
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, form_structure->field_count());
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, form_structure->autofill_count());
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 1.
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Suite / Apt.
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 3.
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // City.
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(3)->heuristic_type());
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This example comes from ebay.com where the word "suite" appears in the label
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and the name "address2" clearly indicates that this is the address line 2.
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/48197 for details.
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, TwoAddressLinesEbay) {
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address Line1");
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("address1");
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Floor number, suite number, etc");
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("address2");
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("City:");
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("city");
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->field_count());
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->autofill_count());
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 1.
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 2.
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // City.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(2)->heuristic_type());
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsStateWithProvince) {
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address Line1");
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Address");
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address Line2");
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Address");
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("State/Province/Region");
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("State");
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->field_count());
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->autofill_count());
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 1.
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(0)->heuristic_type());
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address Line 2.
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(1)->heuristic_type());
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State.
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(2)->heuristic_type());
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This example comes from lego.com's checkout page.
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsWithBilling) {
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name*:");
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$firstNameBox");
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name*:");
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$lastNameBox");
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Company Name:");
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$companyBox");
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address*:");
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$addressLine1Box");
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Apt/Suite :");
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$addressLine2Box");
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("City*:");
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$cityBox");
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("State/Province*:");
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$stateDropDown");
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Country*:");
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$countryDropDown");
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Postal Code*:");
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$zipCodeBox");
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Phone*:");
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("editBillingAddress$phoneBox");
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email Address*:");
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email$emailBox");
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(11U, form_structure->field_count());
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(11U, form_structure->autofill_count());
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_FIRST, form_structure->field(0)->heuristic_type());
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NAME_LAST, form_structure->field(1)->heuristic_type());
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(COMPANY_NAME, form_structure->field(2)->heuristic_type());
1231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(3)->heuristic_type());
1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE2, form_structure->field(4)->heuristic_type());
1233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_CITY, form_structure->field(5)->heuristic_type());
1234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_STATE, form_structure->field(6)->heuristic_type());
1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_COUNTRY, form_structure->field(7)->heuristic_type());
1236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_ZIP, form_structure->field(8)->heuristic_type());
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(9)->heuristic_type());
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EMAIL_ADDRESS, form_structure->field(10)->heuristic_type());
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, ThreePartPhoneNumber) {
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Phone:");
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("dayphone1");
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.max_length = 0;
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("-");
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("dayphone2");
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.max_length = 3;  // Size of prefix is 3.
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("-");
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("dayphone3");
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.max_length = 4;  // Size of suffix is 4.  If unlimited size is
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         // passed, phone will be parsed as
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         // <country code> - <area code> - <phone>.
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("ext.:");
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("dayphone4");
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.max_length = 0;
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, form_structure->field_count());
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, form_structure->autofill_count());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Area code.
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PHONE_HOME_CITY_CODE, form_structure->field(0)->heuristic_type());
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Phone number suffix.
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PHONE_HOME_NUMBER,
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(1)->heuristic_type());
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Phone number suffix.
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PHONE_HOME_NUMBER,
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(2)->heuristic_type());
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unknown.
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(3)->heuristic_type());
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, HeuristicsInfernoCC) {
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Name on Card");
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("name_on_card");
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address");
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("billing_address");
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Card Number");
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("card_number");
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Expiration Date");
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("expiration_month");
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Expiration Year");
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("expiration_year");
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5U, form_structure->field_count());
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, form_structure->autofill_count());
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Name on Card.
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(0)->heuristic_type());
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Address.
1327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ADDRESS_HOME_LINE1, form_structure->field(1)->heuristic_type());
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Card Number.
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(2)->heuristic_type());
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expiration Date.
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type());
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expiration Year.
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(4)->heuristic_type());
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, CVCCodeClash) {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Card number");
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("ccnumber");
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First name");
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("first_name");
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last name");
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("last_name");
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Expiration date");
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("ccexpiresmonth");
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("ccexpiresyear");
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("cvc number");
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("csc");
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(form_structure->IsAutofillable());
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect the correct number of fields.
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(6U, form_structure->field_count());
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5U, form_structure->autofill_count());
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Card Number.
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(0)->heuristic_type());
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First name, taken as name on card.
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(1)->heuristic_type());
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last name is not merged.
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type());
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expiration Date.
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type());
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expiration Year.
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_EXP_4_DIGIT_YEAR,
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(4)->heuristic_type());
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CVC code.
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDIT_CARD_VERIFICATION_CODE,
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            form_structure->field(5)->heuristic_type());
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, EncodeQueryRequest) {
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Name on Card");
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("name_on_card");
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address");
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("billing_address");
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Card Number");
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("card_number");
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Expiration Date");
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("expiration_month");
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Expiration Year");
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("expiration_year");
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add checkable field.
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData checkable_field;
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.is_checkable = true;
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.label = ASCIIToUTF16("Checkable1");
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.name = ASCIIToUTF16("Checkable1");
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(checkable_field);
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<FormStructure> forms;
142658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  forms.push_back(new FormStructure(form));
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> encoded_signatures;
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string encoded_xml;
1429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const char kSignature1[] = "11337937696949187602";
1430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const char kResponse1[] =
1431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<autofillquery clientversion=\"6.1.1715.1442/en (GGLL)\">"
1433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<form signature=\"11337937696949187602\">"
1434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"412125936\"/>"
1435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"1917667676\"/>"
1436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"2226358947\"/>"
1437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"747221617\"/>"
1438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"4108155786\"/>"
1439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "</form>"
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</autofillquery>";
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_signatures,
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_xml));
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, encoded_signatures.size());
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSignature1, encoded_signatures[0]);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResponse1, encoded_xml);
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the same form, only one will be encoded, so EncodeQueryRequest() should
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return the same data.
145058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  forms.push_back(new FormStructure(form));
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_signatures,
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_xml));
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, encoded_signatures.size());
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSignature1, encoded_signatures[0]);
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResponse1, encoded_xml);
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 5 address fields - this should be still a valid form.
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < 5; ++i) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.label = ASCIIToUTF16("Address");
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.name = ASCIIToUTF16("address");
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form.fields.push_back(field);
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  forms.push_back(new FormStructure(form));
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_signatures,
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_xml));
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, encoded_signatures.size());
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSignature1, encoded_signatures[0]);
1470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const char kSignature2[] = "8308881815906226214";
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSignature2, encoded_signatures[1]);
1472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const char kResponse2[] =
1473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
1474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<autofillquery clientversion=\"6.1.1715.1442/en (GGLL)\">"
1475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<form signature=\"11337937696949187602\">"
1476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"412125936\"/>"
1477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"1917667676\"/>"
1478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"2226358947\"/>"
1479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"747221617\"/>"
1480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"4108155786\"/>"
1481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "</form>"
1482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<form signature=\"8308881815906226214\">"
1483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"412125936\"/>"
1484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"1917667676\"/>"
1485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"2226358947\"/>"
1486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"747221617\"/>"
1487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"4108155786\"/>"
1488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"509334676\"/>"
1489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"509334676\"/>"
1490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"509334676\"/>"
1491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"509334676\"/>"
1492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"509334676\"/>"
1493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "</form>"
1494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "</autofillquery>";
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResponse2, encoded_xml);
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormData malformed_form(form);
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 50 address fields - the form is not valid anymore, but previous ones
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are. The result should be the same as in previous test.
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < 50; ++i) {
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.label = ASCIIToUTF16("Address");
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.name = ASCIIToUTF16("address");
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    malformed_form.fields.push_back(field);
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  forms.push_back(new FormStructure(malformed_form));
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_signatures,
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                &encoded_xml));
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, encoded_signatures.size());
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSignature1, encoded_signatures[0]);
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSignature2, encoded_signatures[1]);
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResponse2, encoded_xml);
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we fail if there are only bad form(s).
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<FormStructure> bad_forms;
151758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bad_forms.push_back(new FormStructure(malformed_form));
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FormStructure::EncodeQueryRequest(bad_forms.get(),
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &encoded_signatures,
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &encoded_xml));
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, encoded_signatures.size());
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", encoded_xml);
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, EncodeUploadRequest) {
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
15273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::vector<ServerFieldTypeSet> possible_field_types;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
152958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
15383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(NAME_FIRST);
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
15443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(NAME_LAST);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email");
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "email";
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
15513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(EMAIL_ADDRESS);
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Phone");
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("phone");
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "number";
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
15583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(PHONE_HOME_WHOLE_NUMBER);
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Country");
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("country");
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "select-one";
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
15653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add checkable field.
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData checkable_field;
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.is_checkable = true;
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.label = ASCIIToUTF16("Checkable1");
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checkable_field.name = ASCIIToUTF16("Checkable1");
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(checkable_field);
15743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
157758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < form_structure->field_count(); ++i)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_structure->field(i)->set_possible_types(possible_field_types[i]);
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldTypeSet available_field_types;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FIRST);
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_LAST);
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE1);
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE2);
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_COUNTRY);
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_BILLING_LINE1);
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_BILLING_LINE2);
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(EMAIL_ADDRESS);
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string encoded_xml;
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &encoded_xml));
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "formsignature=\"8736493185895608956\" autofillused=\"false\" "
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "datapresent=\"144200030e\">"
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"3763331450\" autofilltype=\"3\"/>"
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"3494530716\" autofilltype=\"5\"/>"
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1029417091\" autofilltype=\"9\"/>"
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"466116101\" autofilltype=\"14\"/>"
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2799270304\" autofilltype=\"36\"/>"
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, true,
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &encoded_xml));
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "formsignature=\"8736493185895608956\" autofillused=\"true\" "
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "datapresent=\"144200030e\">"
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"3763331450\" autofilltype=\"3\"/>"
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"3494530716\" autofilltype=\"5\"/>"
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1029417091\" autofilltype=\"9\"/>"
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"466116101\" autofilltype=\"14\"/>"
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2799270304\" autofilltype=\"36\"/>"
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 2 address fields - this should be still a valid form.
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.label = ASCIIToUTF16("Address");
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.name = ASCIIToUTF16("address");
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.form_control_type = "text";
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form.fields.push_back(field);
16283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    possible_field_types.push_back(ServerFieldTypeSet());
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_HOME_LINE1);
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_HOME_LINE2);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_BILLING_LINE1);
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_BILLING_LINE2);
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < form_structure->field_count(); ++i)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_structure->field(i)->set_possible_types(possible_field_types[i]);
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &encoded_xml));
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\" "
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "formsignature=\"7816485729218079147\" autofillused=\"false\" "
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "datapresent=\"144200030e\">"
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"3763331450\" autofilltype=\"3\"/>"
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"3494530716\" autofilltype=\"5\"/>"
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1029417091\" autofilltype=\"9\"/>"
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"466116101\" autofilltype=\"14\"/>"
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2799270304\" autofilltype=\"36\"/>"
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"30\"/>"
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"31\"/>"
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"37\"/>"
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"38\"/>"
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"30\"/>"
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"31\"/>"
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"37\"/>"
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"38\"/>"
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 50 address fields - now the form is invalid, as it has too many fields.
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < 50; ++i) {
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.label = ASCIIToUTF16("Address");
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.name = ASCIIToUTF16("address");
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.form_control_type = "text";
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form.fields.push_back(field);
16683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    possible_field_types.push_back(ServerFieldTypeSet());
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_HOME_LINE1);
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_HOME_LINE2);
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_BILLING_LINE1);
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    possible_field_types.back().insert(ADDRESS_BILLING_LINE2);
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
167458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < form_structure->field_count(); ++i)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_structure->field(i)->set_possible_types(possible_field_types[i]);
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(form_structure->EncodeUploadRequest(available_field_types, false,
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &encoded_xml));
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(FormStructureTest, EncodeFieldAssignments) {
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
16843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::vector<ServerFieldTypeSet> possible_field_types;
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FormData form;
168658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form_structure->DetermineHeuristicTypes(TestAutofillMetrics());
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FormFieldData field;
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.form_control_type = "text";
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
16953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  possible_field_types.back().insert(NAME_FIRST);
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
17013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  possible_field_types.back().insert(NAME_LAST);
1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Email");
1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("email");
1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.form_control_type = "email";
1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
17083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  possible_field_types.back().insert(EMAIL_ADDRESS);
1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Phone");
1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("phone");
1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.form_control_type = "number";
1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
17153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  possible_field_types.back().insert(PHONE_HOME_WHOLE_NUMBER);
1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = ASCIIToUTF16("Country");
1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.name = ASCIIToUTF16("country");
1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.form_control_type = "select-one";
1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(field);
17223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add checkable field.
1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FormFieldData checkable_field;
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  checkable_field.is_checkable = true;
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  checkable_field.label = ASCIIToUTF16("Checkable1");
1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  checkable_field.name = ASCIIToUTF16("Checkable1");
1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  form.fields.push_back(checkable_field);
17313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  possible_field_types.back().insert(ADDRESS_HOME_COUNTRY);
1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < form_structure->field_count(); ++i)
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    form_structure->field(i)->set_possible_types(possible_field_types[i]);
1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldTypeSet available_field_types;
1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(NAME_FIRST);
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(NAME_LAST);
1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE1);
1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE2);
1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_COUNTRY);
1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(ADDRESS_BILLING_LINE1);
1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(ADDRESS_BILLING_LINE2);
1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(EMAIL_ADDRESS);
1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string encoded_xml;
1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeFieldAssignments(
1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      available_field_types, &encoded_xml));
1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fieldassignments formsignature=\"8736493185895608956\">"
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"3763331450\" fieldtype=\"3\" name=\"firstname\"/>"
1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"3494530716\" fieldtype=\"5\" name=\"lastname\"/>"
1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"1029417091\" fieldtype=\"9\" name=\"email\"/>"
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"466116101\" fieldtype=\"14\" name=\"phone\"/>"
1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"2799270304\" fieldtype=\"36\" name=\"country\"/>"
1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"3410250678\" fieldtype=\"36\" name=\"Checkable1\"/>"
1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "</fieldassignments>",
1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      encoded_xml);
1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add 2 address fields - this should be still a valid form.
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    field.label = ASCIIToUTF16("Address");
1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    field.name = ASCIIToUTF16("address");
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    field.form_control_type = "text";
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    form.fields.push_back(field);
17723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    possible_field_types.push_back(ServerFieldTypeSet());
1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    possible_field_types.back().insert(ADDRESS_HOME_LINE1);
1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    possible_field_types.back().insert(ADDRESS_HOME_LINE2);
1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    possible_field_types.back().insert(ADDRESS_BILLING_LINE1);
1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    possible_field_types.back().insert(ADDRESS_BILLING_LINE2);
1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(form_structure->field_count(), possible_field_types.size());
1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < form_structure->field_count(); ++i)
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    form_structure->field(i)->set_possible_types(possible_field_types[i]);
1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeFieldAssignments(
1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      available_field_types, &encoded_xml));
1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fieldassignments formsignature=\"7816485729218079147\">"
1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"3763331450\" fieldtype=\"3\" name=\"firstname\"/>"
1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"3494530716\" fieldtype=\"5\" name=\"lastname\"/>"
1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"1029417091\" fieldtype=\"9\" name=\"email\"/>"
1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"466116101\" fieldtype=\"14\" name=\"phone\"/>"
1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"2799270304\" fieldtype=\"36\" name=\"country\"/>"
1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"3410250678\" fieldtype=\"36\" name=\"Checkable1\"/>"
1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"30\" name=\"address\"/>"
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"31\" name=\"address\"/>"
1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"37\" name=\"address\"/>"
1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"38\" name=\"address\"/>"
1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"30\" name=\"address\"/>"
1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"31\" name=\"address\"/>"
1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"37\" name=\"address\"/>"
1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "<fields fieldid=\"509334676\" fieldtype=\"38\" name=\"address\"/>"
1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "</fieldassignments>",
1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      encoded_xml);
1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that we compute the "datapresent" string correctly for the given
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |available_types|.
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, CheckDataPresence) {
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("first");
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("last");
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Email");
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FormStructure form_structure(form);
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldTypeSet unknown_type;
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unknown_type.insert(UNKNOWN_TYPE);
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < form_structure.field_count(); ++i)
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_structure.field(i)->set_possible_types(unknown_type);
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No available types.
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // datapresent should be "" == trimmmed(0x0000000000000000) ==
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     0b0000000000000000000000000000000000000000000000000000000000000000
18373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldTypeSet available_field_types;
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string encoded_xml;
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &encoded_xml));
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"6402244543831589061\" autofillused=\"false\""
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"\">"
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"1\"/>"
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"1\"/>"
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"1\"/>"
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only a few types available.
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // datapresent should be "1540000240" == trimmmed(0x1540000240000000) ==
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     0b0001010101000000000000000000001001000000000000000000000000000000
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set bits are:
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  3 == NAME_FIRST
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  5 == NAME_LAST
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  7 == NAME_FULL
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  9 == EMAIL_ADDRESS
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 30 == ADDRESS_HOME_LINE1
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 33 == ADDRESS_HOME_CITY
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.clear();
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FIRST);
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_LAST);
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FULL);
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(EMAIL_ADDRESS);
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE1);
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_CITY);
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &encoded_xml));
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"6402244543831589061\" autofillused=\"false\""
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"1540000240\">"
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"1\"/>"
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"1\"/>"
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"1\"/>"
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All supported non-credit card types available.
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // datapresent should be "1f7e000378000008" == trimmmed(0x1f7e000378000008) ==
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     0b0001111101111110000000000000001101111000000000000000000000001000
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set bits are:
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  3 == NAME_FIRST
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  4 == NAME_MIDDLE
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  5 == NAME_LAST
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  6 == NAME_MIDDLE_INITIAL
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  7 == NAME_FULL
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  9 == EMAIL_ADDRESS
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 10 == PHONE_HOME_NUMBER,
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 11 == PHONE_HOME_CITY_CODE,
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 12 == PHONE_HOME_COUNTRY_CODE,
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 13 == PHONE_HOME_CITY_AND_NUMBER,
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 14 == PHONE_HOME_WHOLE_NUMBER,
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 30 == ADDRESS_HOME_LINE1
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 31 == ADDRESS_HOME_LINE2
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 33 == ADDRESS_HOME_CITY
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 34 == ADDRESS_HOME_STATE
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 35 == ADDRESS_HOME_ZIP
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 36 == ADDRESS_HOME_COUNTRY
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 60 == COMPANY_NAME
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.clear();
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FIRST);
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_MIDDLE);
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_LAST);
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_MIDDLE_INITIAL);
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FULL);
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(EMAIL_ADDRESS);
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_NUMBER);
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_CITY_CODE);
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_COUNTRY_CODE);
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_CITY_AND_NUMBER);
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE1);
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE2);
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_CITY);
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_STATE);
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_ZIP);
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_COUNTRY);
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(COMPANY_NAME);
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &encoded_xml));
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"6402244543831589061\" autofillused=\"false\""
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"1f7e000378000008\">"
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"1\"/>"
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"1\"/>"
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"1\"/>"
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All supported credit card types available.
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // datapresent should be "0000000000001fc0" == trimmmed(0x0000000000001fc0) ==
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     0b0000000000000000000000000000000000000000000000000001111111000000
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set bits are:
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 51 == CREDIT_CARD_NAME
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 52 == CREDIT_CARD_NUMBER
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 53 == CREDIT_CARD_EXP_MONTH
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 54 == CREDIT_CARD_EXP_2_DIGIT_YEAR
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 55 == CREDIT_CARD_EXP_4_DIGIT_YEAR
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 56 == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 57 == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.clear();
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_NAME);
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_NUMBER);
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_MONTH);
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_2_DIGIT_YEAR);
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_4_DIGIT_YEAR);
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR);
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &encoded_xml));
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"6402244543831589061\" autofillused=\"false\""
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"0000000000001fc0\">"
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"1\"/>"
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"1\"/>"
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"1\"/>"
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All supported types available.
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // datapresent should be "1f7e000378001fc8" == trimmmed(0x1f7e000378001fc8) ==
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     0b0001111101111110000000000000001101111000000000000001111111001000
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set bits are:
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  3 == NAME_FIRST
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  4 == NAME_MIDDLE
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  5 == NAME_LAST
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  6 == NAME_MIDDLE_INITIAL
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  7 == NAME_FULL
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  9 == EMAIL_ADDRESS
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 10 == PHONE_HOME_NUMBER,
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 11 == PHONE_HOME_CITY_CODE,
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 12 == PHONE_HOME_COUNTRY_CODE,
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 13 == PHONE_HOME_CITY_AND_NUMBER,
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 14 == PHONE_HOME_WHOLE_NUMBER,
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 30 == ADDRESS_HOME_LINE1
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 31 == ADDRESS_HOME_LINE2
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 33 == ADDRESS_HOME_CITY
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 34 == ADDRESS_HOME_STATE
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 35 == ADDRESS_HOME_ZIP
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 36 == ADDRESS_HOME_COUNTRY
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 51 == CREDIT_CARD_NAME
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 52 == CREDIT_CARD_NUMBER
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 53 == CREDIT_CARD_EXP_MONTH
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 54 == CREDIT_CARD_EXP_2_DIGIT_YEAR
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 55 == CREDIT_CARD_EXP_4_DIGIT_YEAR
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 56 == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 57 == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 60 == COMPANY_NAME
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.clear();
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FIRST);
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_MIDDLE);
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_LAST);
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_MIDDLE_INITIAL);
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FULL);
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(EMAIL_ADDRESS);
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_NUMBER);
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_CITY_CODE);
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_COUNTRY_CODE);
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_CITY_AND_NUMBER);
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE1);
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE2);
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_CITY);
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_STATE);
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_ZIP);
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_COUNTRY);
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_NAME);
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_NUMBER);
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_MONTH);
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_2_DIGIT_YEAR);
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_4_DIGIT_YEAR);
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR);
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(COMPANY_NAME);
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure.EncodeUploadRequest(available_field_types, false,
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 &encoded_xml));
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"6402244543831589061\" autofillused=\"false\""
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"1f7e000378001fc8\">"
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"1\"/>"
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"1\"/>"
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"1\"/>"
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, CheckMultipleTypes) {
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Throughout this test, datapresent should be
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0x1440000360000008 ==
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     0b0001010001000000000000000000001101100000000000000000000000001000
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set bits are:
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  3 == NAME_FIRST
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  5 == NAME_LAST
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  9 == EMAIL_ADDRESS
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 30 == ADDRESS_HOME_LINE1
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 31 == ADDRESS_HOME_LINE2
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 33 == ADDRESS_HOME_CITY
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 34 == ADDRESS_HOME_STATE
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 60 == COMPANY_NAME
20503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldTypeSet available_field_types;
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_FIRST);
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(NAME_LAST);
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(EMAIL_ADDRESS);
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE1);
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_LINE2);
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_CITY);
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(ADDRESS_HOME_STATE);
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  available_field_types.insert(COMPANY_NAME);
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that multiple types for the field are processed correctly.
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
20623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::vector<ServerFieldTypeSet> possible_field_types;
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("email");
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
20713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(EMAIL_ADDRESS);
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("first");
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
20773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(NAME_FIRST);
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Last Name");
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("last");
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
20833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(NAME_LAST);
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("Address");
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("address");
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
20893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  possible_field_types.push_back(ServerFieldTypeSet());
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types.back().insert(ADDRESS_HOME_LINE1);
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < form_structure->field_count(); ++i)
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    form_structure->field(i)->set_possible_types(possible_field_types[i]);
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string encoded_xml;
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we matched both fields singularly.
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &encoded_xml));
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"18062476096658145866\" autofillused=\"false\""
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"1440000360000008\">"
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"9\"/>"
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"3\"/>"
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"5\"/>"
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"30\"/>"
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Match third field as both first and last.
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types[2].insert(NAME_FIRST);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->field(2)->set_possible_types(possible_field_types[2]);
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &encoded_xml));
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"18062476096658145866\" autofillused=\"false\""
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"1440000360000008\">"
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"9\"/>"
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"3\"/>"
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"3\"/>"
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"5\"/>"
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"30\"/>"
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types[3].insert(ADDRESS_HOME_LINE2);
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->field(form_structure->field_count() - 1)->set_possible_types(
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      possible_field_types[form_structure->field_count() - 1]);
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &encoded_xml));
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"18062476096658145866\" autofillused=\"false\""
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"1440000360000008\">"
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"9\"/>"
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"3\"/>"
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"3\"/>"
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"5\"/>"
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"30\"/>"
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"31\"/>"
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types[3].clear();
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types[3].insert(ADDRESS_HOME_LINE1);
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  possible_field_types[3].insert(COMPANY_NAME);
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form_structure->field(form_structure->field_count() - 1)->set_possible_types(
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      possible_field_types[form_structure->field_count() - 1]);
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(form_structure->EncodeUploadRequest(available_field_types, false,
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &encoded_xml));
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>"
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<autofillupload clientversion=\"6.1.1715.1442/en (GGLL)\""
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " formsignature=\"18062476096658145866\" autofillused=\"false\""
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            " datapresent=\"1440000360000008\">"
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"420638584\" autofilltype=\"9\"/>"
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"1089846351\" autofilltype=\"3\"/>"
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"3\"/>"
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"2404144663\" autofilltype=\"5\"/>"
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"30\"/>"
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<field signature=\"509334676\" autofilltype=\"60\"/>"
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "</autofillupload>",
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            encoded_xml);
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormStructureTest, CheckFormSignature) {
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that form signature is created correctly.
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FormStructure> form_structure;
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormData form;
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.form_control_type = "text";
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("email");
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("email");
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.label = ASCIIToUTF16("First Name");
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("first");
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.fields.push_back(field);
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checkable fields shouldn't affect the signature.
218258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.label = ASCIIToUTF16("Select");
218358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.name = ASCIIToUTF16("Select");
218458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.form_control_type = "checkbox";
218558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.is_checkable = true;
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(field);
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
218858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(FormStructureTest::Hash64Bit(
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("://&&email&first")),
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_structure->FormSignature());
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.origin = GURL(std::string("http://www.facebook.com"));
219558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(FormStructureTest::Hash64Bit(
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("http://www.facebook.com&&email&first")),
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_structure->FormSignature());
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.action = GURL(std::string("https://login.facebook.com/path"));
220158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(FormStructureTest::Hash64Bit(
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("https://login.facebook.com&&email&first")),
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_structure->FormSignature());
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  form.name = ASCIIToUTF16("login_form");
220758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(FormStructureTest::Hash64Bit(
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("https://login.facebook.com&login_form&email&first")),
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      form_structure->FormSignature());
2211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
221258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.is_checkable = false;
2213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.label = ASCIIToUTF16("Random Field label");
2214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.name = ASCIIToUTF16("random1234");
2215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.form_control_type = "text";
2216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  form.fields.push_back(field);
2217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.label = ASCIIToUTF16("Random Field label2");
2218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.name = ASCIIToUTF16("random12345");
2219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  form.fields.push_back(field);
2220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.label = ASCIIToUTF16("Random Field label3");
2221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.name = ASCIIToUTF16("1random12345678");
2222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  form.fields.push_back(field);
2223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.label = ASCIIToUTF16("Random Field label3");
2224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  field.name = ASCIIToUTF16("12345random");
2225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  form.fields.push_back(field);
222658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  form_structure.reset(new FormStructure(form));
2227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(FormStructureTest::Hash64Bit(
2228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      std::string("https://login.facebook.com&login_form&email&first&"
2229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                  "random1234&random&1random&random")),
2230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      form_structure->FormSignature());
2231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(FormStructureTest, ToFormData) {
22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormData form;
22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.name = ASCIIToUTF16("the-name");
22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.origin = GURL("http://cool.com");
22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.action = form.origin.Resolve("/login");
22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FormFieldData field;
22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.label = ASCIIToUTF16("username");
22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.name = ASCIIToUTF16("username");
22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "text";
22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(field);
22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.label = ASCIIToUTF16("password");
22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.name = ASCIIToUTF16("password");
22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "password";
22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(field);
22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.label = base::string16();
22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.name = ASCIIToUTF16("Submit");
22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  field.form_control_type = "submit";
22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.fields.push_back(field);
22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
225658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(form, FormStructure(form).ToFormData());
22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Currently |FormStructure(form_data)ToFormData().user_submitted| is always
22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // false. This forces a future author that changes this to update this test.
22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  form.user_submitted = true;
226158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(form, FormStructure(form).ToFormData());
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(FormStructureTest, SkipFieldTest) {
226590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FormData form;
226690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  form.name = ASCIIToUTF16("the-name");
226790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  form.origin = GURL("http://cool.com");
226890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  form.action = form.origin.Resolve("/login");
226990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
227090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FormFieldData field;
227190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  field.label = ASCIIToUTF16("username");
227290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  field.name = ASCIIToUTF16("username");
227390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  field.form_control_type = "text";
227490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  form.fields.push_back(field);
227590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
227658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.label = ASCIIToUTF16("select");
227758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.name = ASCIIToUTF16("select");
227858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.form_control_type = "checkbox";
227958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.is_checkable = true;
228090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  form.fields.push_back(field);
228190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
228290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  field.label = base::string16();
228390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  field.name = ASCIIToUTF16("email");
228490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  field.form_control_type = "text";
228558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  field.is_checkable = false;
228690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  form.fields.push_back(field);
228790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
228890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedVector<FormStructure> forms;
228958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  forms.push_back(new FormStructure(form));
229090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<std::string> encoded_signatures;
229190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string encoded_xml;
229290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const char kSignature[] = "18006745212084723782";
2294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const char kResponse[] =
2295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<\?xml version=\"1.0\" encoding=\"UTF-8\"?>"
2296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<autofillquery clientversion=\"6.1.1715.1442/en (GGLL)\">"
2297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<form signature=\"18006745212084723782\">"
2298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"239111655\"/>"
2299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "<field signature=\"420638584\"/>"
2300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "</form>"
2301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "</autofillquery>";
230290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(FormStructure::EncodeQueryRequest(forms.get(),
230390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                &encoded_signatures,
230490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                &encoded_xml));
230590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(1U, encoded_signatures.size());
230690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kSignature, encoded_signatures[0]);
230790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kResponse, encoded_xml);
230890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
230990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(FormStructureTest, PossibleValues) {
2311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormData form_data;
2312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormFieldData field;
2313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.autocomplete_attribute = "billing country";
2314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.option_contents.push_back(ASCIIToUTF16("Down Under"));
2315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.option_values.push_back(ASCIIToUTF16("AU"));
2316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.option_contents.push_back(ASCIIToUTF16("Fr"));
2317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.option_values.push_back(ASCIIToUTF16(""));
2318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.option_contents.push_back(ASCIIToUTF16("Germany"));
2319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.option_values.push_back(ASCIIToUTF16("GRMNY"));
2320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  form_data.fields.push_back(field);
2321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormStructure form_structure(form_data);
2322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool unused;
2324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  form_structure.ParseFieldTypesFromAutocompleteAttributes(&unused, &unused);
2325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // All values in <option> value= or contents are returned, set to upper case.
2327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::set<base::string16> possible_values =
2328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      form_structure.PossibleValues(ADDRESS_BILLING_COUNTRY);
2329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5U, possible_values.size());
2330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("AU")));
2331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("FR")));
2332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("DOWN UNDER")));
2333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("GERMANY")));
2334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1U, possible_values.count(ASCIIToUTF16("GRMNY")));
2335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, possible_values.count(ASCIIToUTF16("Fr")));
2336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, possible_values.count(ASCIIToUTF16("DE")));
2337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // No field for the given type; empty value set.
2339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, form_structure.PossibleValues(ADDRESS_HOME_COUNTRY).size());
2340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A freeform input (<input>) allows any value (overriding other <select>s).
2342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormFieldData freeform_field;
2343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  freeform_field.autocomplete_attribute = "billing country";
2344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  form_data.fields.push_back(freeform_field);
2345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormStructure form_structure2(form_data);
2346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  form_structure2.ParseFieldTypesFromAutocompleteAttributes(&unused, &unused);
2347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0U, form_structure2.PossibleValues(ADDRESS_BILLING_COUNTRY).size());
2348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
2351