| // 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_ |