• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_AUTOFILL_FORM_FIELD_H_
6 #define CHROME_BROWSER_AUTOFILL_FORM_FIELD_H_
7 #pragma once
8 
9 #include <vector>
10 
11 #include "base/basictypes.h"
12 #include "base/string16.h"
13 #include "chrome/browser/autofill/autofill_type.h"
14 
15 class AutofillField;
16 class FormStructure;
17 
18 extern const char kEcmlShipToTitle[];
19 extern const char kEcmlShipToFirstName[];
20 extern const char kEcmlShipToMiddleName[];
21 extern const char kEcmlShipToLastName[];
22 extern const char kEcmlShipToNameSuffix[];
23 extern const char kEcmlShipToCompanyName[];
24 extern const char kEcmlShipToAddress1[];
25 extern const char kEcmlShipToAddress2[];
26 extern const char kEcmlShipToAddress3[];
27 extern const char kEcmlShipToCity[];
28 extern const char kEcmlShipToStateProv[];
29 extern const char kEcmlShipToPostalCode[];
30 extern const char kEcmlShipToCountry[];
31 extern const char kEcmlShipToPhone[];
32 extern const char kEcmlShipToEmail[];
33 
34 // billing name/address fields
35 extern const char kEcmlBillToTitle[];
36 extern const char kEcmlBillToFirstName[];
37 extern const char kEcmlBillToMiddleName[];
38 extern const char kEcmlBillToLastName[];
39 extern const char kEcmlBillToNameSuffix[];
40 extern const char kEcmlBillToCompanyName[];
41 extern const char kEcmlBillToAddress1[];
42 extern const char kEcmlBillToAddress2[];
43 extern const char kEcmlBillToAddress3[];
44 extern const char kEcmlBillToCity[];
45 extern const char kEcmlBillToStateProv[];
46 extern const char kEcmlBillToPostalCode[];
47 extern const char kEcmlBillToCountry[];
48 extern const char kEcmlBillToPhone[];
49 extern const char kEcmlBillToEmail[];
50 
51 // credit card fields
52 extern const char kEcmlCardHolder[];
53 extern const char kEcmlCardType[];
54 extern const char kEcmlCardNumber[];
55 extern const char kEcmlCardVerification[];
56 extern const char kEcmlCardExpireDay[];
57 extern const char kEcmlCardExpireMonth[];
58 extern const char kEcmlCardExpireYear[];
59 
60 enum FormFieldType {
61   kAddressType,
62   kCreditCardType,
63   kOtherFieldType
64 };
65 
66 // Represents a logical form field in a web form.  Classes that implement this
67 // interface can identify themselves as a particular type of form field, e.g.
68 // name, phone number, or address field.
69 class FormField {
70  public:
~FormField()71   virtual ~FormField() {}
72 
73   // Associates the available AutofillTypes of a FormField into
74   // |field_type_map|.
75   virtual bool GetFieldInfo(FieldTypeMap* field_type_map) const = 0;
76 
77   // Returns the type of form field of the class implementing this interface.
78   virtual FormFieldType GetFormFieldType() const;
79 
80   // Returns true if |field| contains the regexp |pattern| in the name or label.
81   // If |match_label_only| is true, then only the field's label is considered.
82   static bool Match(AutofillField* field,
83                     const string16& pattern,
84                     bool match_label_only);
85 
86   // Parses a field using the different field views we know about.  |is_ecml|
87   // should be true when the field conforms to the ECML specification.
88   static FormField* ParseFormField(
89       std::vector<AutofillField*>::const_iterator* field,
90       bool is_ecml);
91 
92   // Attempts to parse a text field with the given pattern; returns true on
93   // success, but doesn't return the actual text field itself.
94   static bool ParseText(std::vector<AutofillField*>::const_iterator* iter,
95                         const string16& pattern);
96 
97   // Attempts to parse a text field with the given pattern.  Returns true on
98   // success and fills |dest| with a pointer to the field.
99   static bool ParseText(std::vector<AutofillField*>::const_iterator* iter,
100                         const string16& pattern,
101                         AutofillField** dest);
102 
103   // Attempts to parse a text field with an empty name or label.  Returns true
104   // on success and fills |dest| with a pointer to the field.
105   static bool ParseEmptyText(std::vector<AutofillField*>::const_iterator* iter,
106                              AutofillField** dest);
107 
108   // Attempts to parse a text field label with the given pattern.  Returns true
109   // on success and fills |dest| with a pointer to the field.
110   static bool ParseLabelText(std::vector<AutofillField*>::const_iterator* iter,
111                              const string16& pattern,
112                              AutofillField** dest);
113 
114   // Attempts to parse a control with an empty label.
115   static bool ParseEmpty(std::vector<AutofillField*>::const_iterator* iter);
116 
117   // Adds an association between a field and a type to |field_type_map|.
118   static bool Add(FieldTypeMap* field_type_map, AutofillField* field,
119                   const AutofillType& type);
120 
121  protected:
122   // Only derived classes may instantiate.
FormField()123   FormField() {}
124 
125   // Note: ECML compliance checking has been modified to accommodate Google
126   // Checkout field name limitation. All ECML compliant web forms will be
127   // recognized correctly as such however the restrictions on having exactly
128   // ECML compliant names have been loosened to only require that field names
129   // be prefixed with an ECML compliant name in order to accommodate checkout.
130   // Additionally we allow the use of '.' as a word delimiter in addition to the
131   // ECML standard '_' (see FormField::FormField for details).
132   static string16 GetEcmlPattern(const char* ecml_name);
133   static string16 GetEcmlPattern(const char* ecml_name1,
134                                  const char* ecml_name2,
135                                  char pattern_operator);
136 
137  private:
138   static bool ParseText(std::vector<AutofillField*>::const_iterator* iter,
139                         const string16& pattern,
140                         AutofillField** dest,
141                         bool match_label_only);
142 
143   // For empty strings we need to test that both label and name are empty.
144   static bool ParseLabelAndName(
145       std::vector<AutofillField*>::const_iterator* iter,
146       const string16& pattern,
147       AutofillField** dest);
148 
149   DISALLOW_COPY_AND_ASSIGN(FormField);
150 };
151 
152 class FormFieldSet : public std::vector<FormField*> {
153  public:
154   explicit FormFieldSet(FormStructure* form);
155 
~FormFieldSet()156   ~FormFieldSet() {
157     for (iterator i = begin(); i != end(); ++i)
158       delete *i;
159   }
160 
161  private:
162   // Checks if any of the labels are named according to the ECML standard.
163   // Returns true if at least one ECML named element is found.
164   bool CheckECML(FormStructure* fields);
165 
166   DISALLOW_COPY_AND_ASSIGN(FormFieldSet);
167 };
168 
169 // Parsing utilities.
170 namespace autofill {
171 
172 // Case-insensitive regular expression matching.
173 // Returns true if |pattern| is found in |input|.
174 bool MatchString(const string16& input, const string16& pattern);
175 
176 }  // namespace autofill
177 
178 #endif  // CHROME_BROWSER_AUTOFILL_FORM_FIELD_H_
179