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