diff options
author | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-19 03:29:55 +0000 |
---|---|---|
committer | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-19 03:29:55 +0000 |
commit | 8b0a918e40699ea7732ab1da7c5f7a6e2dbad01a (patch) | |
tree | 220452a550381ed1bf80ebb6dbaaf45aaad78dc2 /components | |
parent | b920e7d74733aa20587ca620efedd4088c4bff3d (diff) | |
download | chromium_src-8b0a918e40699ea7732ab1da7c5f7a6e2dbad01a.zip chromium_src-8b0a918e40699ea7732ab1da7c5f7a6e2dbad01a.tar.gz chromium_src-8b0a918e40699ea7732ab1da7c5f7a6e2dbad01a.tar.bz2 |
[Autofill] Split off AutofillDataModel as a subclass of FormData.
BUG=170401, 231029
Review URL: https://chromiumcodereview.appspot.com/14096009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195071 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components')
-rw-r--r-- | components/autofill.gypi | 2 | ||||
-rw-r--r-- | components/autofill/browser/address.h | 1 | ||||
-rw-r--r-- | components/autofill/browser/autofill_data_model.cc | 182 | ||||
-rw-r--r-- | components/autofill/browser/autofill_data_model.h | 55 | ||||
-rw-r--r-- | components/autofill/browser/autofill_manager.cc | 26 | ||||
-rw-r--r-- | components/autofill/browser/autofill_manager.h | 4 | ||||
-rw-r--r-- | components/autofill/browser/autofill_profile.cc | 16 | ||||
-rw-r--r-- | components/autofill/browser/autofill_profile.h | 17 | ||||
-rw-r--r-- | components/autofill/browser/contact_info.h | 1 | ||||
-rw-r--r-- | components/autofill/browser/credit_card.cc | 27 | ||||
-rw-r--r-- | components/autofill/browser/credit_card.h | 18 | ||||
-rw-r--r-- | components/autofill/browser/form_group.cc | 182 | ||||
-rw-r--r-- | components/autofill/browser/form_group.h | 29 | ||||
-rw-r--r-- | components/autofill/browser/personal_data_manager.cc | 1 | ||||
-rw-r--r-- | components/autofill/browser/wallet/wallet_address.cc | 1 | ||||
-rw-r--r-- | components/autofill/browser/webdata/autofill_change.cc | 1 | ||||
-rw-r--r-- | components/autofill/browser/webdata/autofill_table_unittest.cc | 1 |
17 files changed, 288 insertions, 276 deletions
diff --git a/components/autofill.gypi b/components/autofill.gypi index 4268928..f940ab2 100644 --- a/components/autofill.gypi +++ b/components/autofill.gypi @@ -145,6 +145,8 @@ 'autofill/browser/autofill-inl.h', 'autofill/browser/autofill_country.cc', 'autofill/browser/autofill_country.h', + 'autofill/browser/autofill_data_model.cc', + 'autofill/browser/autofill_data_model.h', 'autofill/browser/autofill_download.cc', 'autofill/browser/autofill_download.h', 'autofill/browser/autofill_download_url.cc', diff --git a/components/autofill/browser/address.h b/components/autofill/browser/address.h index ba82124..032a3fe 100644 --- a/components/autofill/browser/address.h +++ b/components/autofill/browser/address.h @@ -8,6 +8,7 @@ #include <string> #include <vector> +#include "base/compiler_specific.h" #include "base/string16.h" #include "components/autofill/browser/autofill_type.h" #include "components/autofill/browser/field_types.h" diff --git a/components/autofill/browser/autofill_data_model.cc b/components/autofill/browser/autofill_data_model.cc new file mode 100644 index 0000000..501184d --- /dev/null +++ b/components/autofill/browser/autofill_data_model.cc @@ -0,0 +1,182 @@ +// Copyright 2013 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. + +#include "components/autofill/browser/autofill_data_model.h" + +#include "base/basictypes.h" +#include "base/logging.h" +#include "base/string_util.h" +#include "base/strings/string_number_conversions.h" +#include "base/utf_string_conversions.h" +#include "components/autofill/browser/autofill_country.h" +#include "components/autofill/browser/autofill_field.h" +#include "components/autofill/browser/state_names.h" +#include "components/autofill/browser/validation.h" +#include "components/autofill/common/form_field_data.h" +#include "grit/generated_resources.h" +#include "ui/base/l10n/l10n_util.h" + +namespace autofill { +namespace { + +const char* const kMonthsAbbreviated[] = { + NULL, // Padding so index 1 = month 1 = January. + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", +}; + +const char* const kMonthsFull[] = { + NULL, // Padding so index 1 = month 1 = January. + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December", +}; + +const char* const kMonthsNumeric[] = { + NULL, // Padding so index 1 = month 1 = January. + "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", +}; + +// Returns true if the value was successfully set, meaning |value| was found in +// the list of select options in |field|. +bool SetSelectControlValue(const base::string16& value, + FormFieldData* field) { + base::string16 value_lowercase = StringToLowerASCII(value); + + DCHECK_EQ(field->option_values.size(), field->option_contents.size()); + for (size_t i = 0; i < field->option_values.size(); ++i) { + if (value_lowercase == StringToLowerASCII(field->option_values[i]) || + value_lowercase == StringToLowerASCII(field->option_contents[i])) { + field->value = field->option_values[i]; + return true; + } + } + + return false; +} + +bool FillStateSelectControl(const base::string16& value, + FormFieldData* field) { + base::string16 abbreviation = value; + base::string16 full = state_names::GetNameForAbbreviation(value); + if (full.empty()) { + abbreviation = state_names::GetAbbreviationForName(value); + full = value; + } + + // Try the abbreviation first. + if (!abbreviation.empty() && SetSelectControlValue(abbreviation, field)) + return true; + + return !full.empty() && SetSelectControlValue(full, field); +} + +bool FillExpirationMonthSelectControl(const base::string16& value, + FormFieldData* field) { + int index = 0; + if (!base::StringToInt(value, &index) || + index <= 0 || + static_cast<size_t>(index) >= arraysize(kMonthsFull)) + return false; + + bool filled = + SetSelectControlValue(ASCIIToUTF16(kMonthsAbbreviated[index]), field) || + SetSelectControlValue(ASCIIToUTF16(kMonthsFull[index]), field) || + SetSelectControlValue(ASCIIToUTF16(kMonthsNumeric[index]), field); + return filled; +} + +// Try to fill a credit card type |value| (Visa, MasterCard, etc.) into the +// given |field|. +bool FillCreditCardTypeSelectControl(const base::string16& value, + FormFieldData* field) { + // Try stripping off spaces. + base::string16 value_stripped; + RemoveChars(StringToLowerASCII(value), kWhitespaceUTF16, &value_stripped); + + for (size_t i = 0; i < field->option_values.size(); ++i) { + base::string16 option_value_lowercase; + RemoveChars(StringToLowerASCII(field->option_values[i]), kWhitespaceUTF16, + &option_value_lowercase); + base::string16 option_contents_lowercase; + RemoveChars(StringToLowerASCII(field->option_contents[i]), kWhitespaceUTF16, + &option_contents_lowercase); + + // Perform a case-insensitive comparison; but fill the form with the + // original text, not the lowercased version. + if (value_stripped == option_value_lowercase || + value_stripped == option_contents_lowercase) { + field->value = field->option_values[i]; + return true; + } + } + + // For American Express, also try filling as "AmEx". + if (value == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX)) + return FillCreditCardTypeSelectControl(ASCIIToUTF16("AmEx"), field); + + return false; +} + +} // namespace + +AutofillDataModel::AutofillDataModel(const std::string& guid) : guid_(guid) {} +AutofillDataModel::~AutofillDataModel() {} + +void AutofillDataModel::FillSelectControl(AutofillFieldType type, + const std::string& app_locale, + FormFieldData* field) const { + DCHECK(field); + DCHECK_EQ("select-one", field->form_control_type); + DCHECK_EQ(field->option_values.size(), field->option_contents.size()); + + base::string16 field_text = GetInfo(type, app_locale); + base::string16 field_text_lower = StringToLowerASCII(field_text); + if (field_text.empty()) + return; + + base::string16 value; + for (size_t i = 0; i < field->option_values.size(); ++i) { + if (field_text == field->option_values[i] || + field_text == field->option_contents[i]) { + // An exact match, use it. + value = field->option_values[i]; + break; + } + + if (field_text_lower == StringToLowerASCII(field->option_values[i]) || + field_text_lower == StringToLowerASCII(field->option_contents[i])) { + // A match, but not in the same case. Save it in case an exact match is + // not found. + value = field->option_values[i]; + } + } + + if (!value.empty()) { + field->value = value; + return; + } + + if (type == ADDRESS_HOME_STATE || type == ADDRESS_BILLING_STATE) { + FillStateSelectControl(field_text, field); + } else if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) { + FillCountrySelectControl(app_locale, field); + } else if (type == CREDIT_CARD_EXP_MONTH) { + FillExpirationMonthSelectControl(field_text, field); + } else if (type == CREDIT_CARD_EXP_4_DIGIT_YEAR) { + // Attempt to fill the year as a 2-digit year. This compensates for the + // fact that our heuristics do not always correctly detect when a website + // requests a 2-digit rather than a 4-digit year. + FillSelectControl(CREDIT_CARD_EXP_2_DIGIT_YEAR, app_locale, field); + } else if (type == CREDIT_CARD_TYPE) { + FillCreditCardTypeSelectControl(field_text, field); + } +} + +bool AutofillDataModel::FillCountrySelectControl( + const std::string& app_locale, + FormFieldData* field_data) const { + return false; +} + +} // namespace autofill diff --git a/components/autofill/browser/autofill_data_model.h b/components/autofill/browser/autofill_data_model.h new file mode 100644 index 0000000..e040cf3 --- /dev/null +++ b/components/autofill/browser/autofill_data_model.h @@ -0,0 +1,55 @@ +// Copyright 2013 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 COMPONENTS_AUTOFILL_BROWSER_AUTOFILL_DATA_MODEL_H_ +#define COMPONENTS_AUTOFILL_BROWSER_AUTOFILL_DATA_MODEL_H_ + +#include <string> + +#include "components/autofill/browser/field_types.h" +#include "components/autofill/browser/form_group.h" + +namespace autofill { + +class AutofillField; +struct FormFieldData; + +// This class is an interface for the primary data models that back Autofill. +// The information in objects of this class is managed by the +// PersonalDataManager. +class AutofillDataModel : public FormGroup { + public: + explicit AutofillDataModel(const std::string& guid); + virtual ~AutofillDataModel(); + + // Set |field_data|'s value based on |field| and contents of |this| (using + // data variant |variant|). + virtual void FillFormField(const AutofillField& field, + size_t variant, + const std::string& app_locale, + FormFieldData* field_data) const = 0; + + // Fills in select control with data matching |type| from |this|. + // Public for testing purposes. + void FillSelectControl(AutofillFieldType type, + const std::string& app_locale, + FormFieldData* field_data) const; + + std::string guid() const { return guid_; } + void set_guid(const std::string& guid) { guid_ = guid; } + + protected: + // Fills in a select control for a country from data in |this|. Returns true + // for success. + virtual bool FillCountrySelectControl(const std::string& app_locale, + FormFieldData* field_data) const; + + private: + // A globally unique ID for this object. + std::string guid_; +}; + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_BROWSER_AUTOFILL_DATA_MODEL_H_ diff --git a/components/autofill/browser/autofill_manager.cc b/components/autofill/browser/autofill_manager.cc index 8331066..3b36e36 100644 --- a/components/autofill/browser/autofill_manager.cc +++ b/components/autofill/browser/autofill_manager.cc @@ -23,6 +23,7 @@ #include "components/autofill/browser/autocheckout/whitelist_manager.h" #include "components/autofill/browser/autocheckout_manager.h" #include "components/autofill/browser/autocomplete_history_manager.h" +#include "components/autofill/browser/autofill_data_model.h" #include "components/autofill/browser/autofill_external_delegate.h" #include "components/autofill/browser/autofill_field.h" #include "components/autofill/browser/autofill_manager_delegate.h" @@ -612,15 +613,15 @@ void AutofillManager::OnFillAutofillFormData(int query_id, const FormFieldData& field, int unique_id) { RenderViewHost* host = NULL; - const FormGroup* form_group = NULL; + const AutofillDataModel* data_model = NULL; size_t variant = 0; FormStructure* form_structure = NULL; AutofillField* autofill_field = NULL; - // NOTE: GetHost may invalidate |form_group| because it causes the + // NOTE: GetHost may invalidate |data_model| because it causes the // PersonalDataManager to reload Mac address book entries. Thus it must // come before GetProfileOrCreditCard. if (!GetHost(&host) || - !GetProfileOrCreditCard(unique_id, &form_group, &variant) || + !GetProfileOrCreditCard(unique_id, &data_model, &variant) || !GetCachedFormAndField(form, field, &form_structure, &autofill_field)) return; @@ -636,7 +637,7 @@ void AutofillManager::OnFillAutofillFormData(int query_id, for (std::vector<FormFieldData>::iterator iter = result.fields.begin(); iter != result.fields.end(); ++iter) { if ((*iter) == field) { - form_group->FillFormField( + data_model->FillFormField( *autofill_field, variant, app_locale_, &(*iter)); // Mark the cached field as autofilled, so that we can detect when a // user edits an autofilled field (for metrics). @@ -674,7 +675,7 @@ void AutofillManager::OnFillAutofillFormData(int query_id, field_group_type == initiating_group_type) { use_variant = variant; } - form_group->FillFormField(*cached_field, + data_model->FillFormField(*cached_field, use_variant, app_locale_, &result.fields[i]); @@ -748,9 +749,9 @@ void AutofillManager::OnShowPasswordGenerationPopup( } void AutofillManager::RemoveAutofillProfileOrCreditCard(int unique_id) { - const FormGroup* form_group = NULL; + const AutofillDataModel* data_model = NULL; size_t variant = 0; - if (!GetProfileOrCreditCard(unique_id, &form_group, &variant)) { + if (!GetProfileOrCreditCard(unique_id, &data_model, &variant)) { NOTREACHED(); return; } @@ -761,7 +762,7 @@ void AutofillManager::RemoveAutofillProfileOrCreditCard(int unique_id) { if (variant != 0) return; - personal_data_->RemoveByGUID(form_group->GetGUID()); + personal_data_->RemoveByGUID(data_model->guid()); } void AutofillManager::RemoveAutocompleteEntry(const base::string16& name, @@ -1065,7 +1066,7 @@ bool AutofillManager::GetHost(RenderViewHost** host) const { bool AutofillManager::GetProfileOrCreditCard( int unique_id, - const FormGroup** form_group, + const AutofillDataModel** data_model, size_t* variant) const { // Unpack the |unique_id| into component parts. GUIDPair credit_card_guid; @@ -1078,15 +1079,14 @@ bool AutofillManager::GetProfileOrCreditCard( // Otherwise find the credit card that matches the |credit_card_guid|, // if specified. if (base::IsValidGUID(profile_guid.first)) { - *form_group = personal_data_->GetProfileByGUID(profile_guid.first); + *data_model = personal_data_->GetProfileByGUID(profile_guid.first); *variant = profile_guid.second; } else if (base::IsValidGUID(credit_card_guid.first)) { - *form_group = - personal_data_->GetCreditCardByGUID(credit_card_guid.first); + *data_model = personal_data_->GetCreditCardByGUID(credit_card_guid.first); *variant = credit_card_guid.second; } - return !!*form_group; + return !!*data_model; } bool AutofillManager::FindCachedForm(const FormData& form, diff --git a/components/autofill/browser/autofill_manager.h b/components/autofill/browser/autofill_manager.h index 4a2bb5f..ea63991 100644 --- a/components/autofill/browser/autofill_manager.h +++ b/components/autofill/browser/autofill_manager.h @@ -58,6 +58,7 @@ class Message; namespace autofill { +class AutofillDataModel; class AutofillExternalDelegate; class AutofillField; class AutofillProfile; @@ -66,7 +67,6 @@ class AutofillManagerTestDelegate; class AutofillMetrics; class CreditCard; class FormStructureBrowserTest; -class FormGroup; class PasswordGenerator; struct FormData; @@ -302,7 +302,7 @@ class AutofillManager : public content::WebContentsObserver, // appropriate data source and variant index. Returns false if the unpacked // id cannot be found. bool GetProfileOrCreditCard(int unique_id, - const FormGroup** form_group, + const AutofillDataModel** data_model, size_t* variant) const WARN_UNUSED_RESULT; // Fills |form_structure| cached element corresponding to |form|. diff --git a/components/autofill/browser/autofill_profile.cc b/components/autofill/browser/autofill_profile.cc index 9b76b4b..7b3f9ff 100644 --- a/components/autofill/browser/autofill_profile.cc +++ b/components/autofill/browser/autofill_profile.cc @@ -223,21 +223,21 @@ struct CaseInsensitiveStringEquals } // namespace AutofillProfile::AutofillProfile(const std::string& guid) - : guid_(guid), + : AutofillDataModel(guid), name_(1), email_(1), home_number_(1, PhoneNumber(this)) { } AutofillProfile::AutofillProfile() - : guid_(base::GenerateGUID()), + : AutofillDataModel(base::GenerateGUID()), name_(1), email_(1), home_number_(1, PhoneNumber(this)) { } AutofillProfile::AutofillProfile(const AutofillProfile& profile) - : FormGroup() { + : AutofillDataModel(std::string()) { operator=(profile); } @@ -248,9 +248,9 @@ AutofillProfile& AutofillProfile::operator=(const AutofillProfile& profile) { if (this == &profile) return *this; - label_ = profile.label_; - guid_ = profile.guid_; + set_guid(profile.guid()); + label_ = profile.label_; name_ = profile.name_; email_ = profile.email_; company_ = profile.company_; @@ -264,10 +264,6 @@ AutofillProfile& AutofillProfile::operator=(const AutofillProfile& profile) { return *this; } -std::string AutofillProfile::GetGUID() const { - return guid(); -} - void AutofillProfile::GetMatchingTypes(const base::string16& text, const std::string& app_locale, FieldTypeSet* matching_types) const { @@ -458,7 +454,7 @@ int AutofillProfile::Compare(const AutofillProfile& profile) const { } bool AutofillProfile::operator==(const AutofillProfile& profile) const { - return guid_ == profile.guid_ && Compare(profile) == 0; + return guid() == profile.guid() && Compare(profile) == 0; } bool AutofillProfile::operator!=(const AutofillProfile& profile) const { diff --git a/components/autofill/browser/autofill_profile.h b/components/autofill/browser/autofill_profile.h index a3127b8..09b5af2 100644 --- a/components/autofill/browser/autofill_profile.h +++ b/components/autofill/browser/autofill_profile.h @@ -12,12 +12,13 @@ #include <string> #include <vector> +#include "base/compiler_specific.h" #include "base/string16.h" #include "components/autofill/browser/address.h" +#include "components/autofill/browser/autofill_data_model.h" #include "components/autofill/browser/autofill_type.h" #include "components/autofill/browser/contact_info.h" #include "components/autofill/browser/field_types.h" -#include "components/autofill/browser/form_group.h" #include "components/autofill/browser/phone_number.h" namespace autofill { @@ -28,7 +29,7 @@ struct FormFieldData; // implements the FormGroup interface so that owners of this object can request // form information from the profile, and the profile will delegate the request // to the requested form group type. -class AutofillProfile : public FormGroup { +class AutofillProfile : public AutofillDataModel { public: explicit AutofillProfile(const std::string& guid); @@ -40,7 +41,6 @@ class AutofillProfile : public FormGroup { AutofillProfile& operator=(const AutofillProfile& profile); // FormGroup: - virtual std::string GetGUID() const OVERRIDE; virtual void GetMatchingTypes(const base::string16& text, const std::string& app_locale, FieldTypeSet* matching_types) const OVERRIDE; @@ -52,6 +52,8 @@ class AutofillProfile : public FormGroup { virtual bool SetInfo(AutofillFieldType type, const base::string16& value, const std::string& app_locale) OVERRIDE; + + // AutofillDataModel: virtual void FillFormField(const AutofillField& field, size_t variant, const std::string& app_locale, @@ -80,12 +82,6 @@ class AutofillProfile : public FormGroup { // profiles. See AdjustInferredLabels() further down for more description. const base::string16 Label() const; - // This guid is the primary identifier for |AutofillProfile| objects. - // TODO(estade): remove this and just use GetGUID(). |guid_| can probably - // be moved to FormGroup. - const std::string guid() const { return guid_; } - void set_guid(const std::string& guid) { guid_ = guid; } - // Returns true if there are no values (field types) set. bool IsEmpty(const std::string& app_locale) const; @@ -198,9 +194,6 @@ class AutofillProfile : public FormGroup { // The label presented to the user when selecting a profile. base::string16 label_; - // The guid of this profile. - std::string guid_; - // Personal information for this profile. std::vector<NameInfo> name_; std::vector<EmailInfo> email_; diff --git a/components/autofill/browser/contact_info.h b/components/autofill/browser/contact_info.h index cfb381f..5fc920a 100644 --- a/components/autofill/browser/contact_info.h +++ b/components/autofill/browser/contact_info.h @@ -7,6 +7,7 @@ #include <vector> +#include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/string16.h" #include "components/autofill/browser/field_types.h" diff --git a/components/autofill/browser/credit_card.cc b/components/autofill/browser/credit_card.cc index 78765d9..21971eb 100644 --- a/components/autofill/browser/credit_card.cc +++ b/components/autofill/browser/credit_card.cc @@ -194,20 +194,21 @@ bool ConvertMonth(const base::string16& month, } // namespace CreditCard::CreditCard(const std::string& guid) - : type_(kGenericCard), + : AutofillDataModel(guid), + type_(kGenericCard), expiration_month_(0), - expiration_year_(0), - guid_(guid) { + expiration_year_(0) { } CreditCard::CreditCard() - : type_(kGenericCard), + : AutofillDataModel(base::GenerateGUID()), + type_(kGenericCard), expiration_month_(0), - expiration_year_(0), - guid_(base::GenerateGUID()) { + expiration_year_(0) { } -CreditCard::CreditCard(const CreditCard& credit_card) : FormGroup() { +CreditCard::CreditCard(const CreditCard& credit_card) + : AutofillDataModel(std::string()) { operator=(credit_card); } @@ -244,10 +245,6 @@ base::string16 CreditCard::TypeForDisplay(const std::string& type) { return base::string16(); } -std::string CreditCard::GetGUID() const { - return guid(); -} - base::string16 CreditCard::GetRawInfo(AutofillFieldType type) const { switch (type) { case CREDIT_CARD_NAME: @@ -488,7 +485,8 @@ void CreditCard::operator=(const CreditCard& credit_card) { type_ = credit_card.type_; expiration_month_ = credit_card.expiration_month_; expiration_year_ = credit_card.expiration_year_; - guid_ = credit_card.guid_; + + set_guid(credit_card.guid()); } bool CreditCard::UpdateFromImportedCard(const CreditCard& imported_card, @@ -554,10 +552,7 @@ int CreditCard::Compare(const CreditCard& credit_card) const { } bool CreditCard::operator==(const CreditCard& credit_card) const { - if (guid_ != credit_card.guid_) - return false; - - return Compare(credit_card) == 0; + return guid() == credit_card.guid() && Compare(credit_card) == 0; } bool CreditCard::operator!=(const CreditCard& credit_card) const { diff --git a/components/autofill/browser/credit_card.h b/components/autofill/browser/credit_card.h index d3c770d..1d9cfbf 100644 --- a/components/autofill/browser/credit_card.h +++ b/components/autofill/browser/credit_card.h @@ -9,16 +9,17 @@ #include <string> #include <vector> +#include "base/compiler_specific.h" #include "base/string16.h" +#include "components/autofill/browser/autofill_data_model.h" #include "components/autofill/browser/field_types.h" -#include "components/autofill/browser/form_group.h" namespace autofill { struct FormFieldData; // A form group that stores credit card information. -class CreditCard : public FormGroup { +class CreditCard : public AutofillDataModel { public: explicit CreditCard(const std::string& guid); @@ -33,8 +34,7 @@ class CreditCard : public FormGroup { // The user-visible type of the card, e.g. 'Mastercard'. static base::string16 TypeForDisplay(const std::string& type); - // FormGroup implementation: - virtual std::string GetGUID() const OVERRIDE; + // FormGroup: virtual void GetMatchingTypes(const base::string16& text, const std::string& app_locale, FieldTypeSet* matching_types) const OVERRIDE; @@ -46,6 +46,8 @@ class CreditCard : public FormGroup { virtual bool SetInfo(AutofillFieldType type, const base::string16& value, const std::string& app_locale) OVERRIDE; + + // AutofillDataModel: virtual void FillFormField(const AutofillField& field, size_t variant, const std::string& app_locale, @@ -73,11 +75,6 @@ class CreditCard : public FormGroup { int expiration_month() const { return expiration_month_; } int expiration_year() const { return expiration_year_; } - // The guid is the primary identifier for |CreditCard| objects. - // TODO(estade): remove this and just use GetGUID(). - const std::string guid() const { return guid_; } - void set_guid(const std::string& guid) { guid_ = guid; } - // For use in STL containers. void operator=(const CreditCard& credit_card); @@ -141,9 +138,6 @@ class CreditCard : public FormGroup { // These members are zero if not present. int expiration_month_; int expiration_year_; - - // The guid of this credit card. - std::string guid_; }; // So we can compare CreditCards with EXPECT_EQ(). diff --git a/components/autofill/browser/form_group.cc b/components/autofill/browser/form_group.cc index 8e583e5..3b33dcb 100644 --- a/components/autofill/browser/form_group.cc +++ b/components/autofill/browser/form_group.cc @@ -4,127 +4,7 @@ #include "components/autofill/browser/form_group.h" -#include <algorithm> -#include <iterator> - -#include "base/basictypes.h" -#include "base/logging.h" -#include "base/strings/string_number_conversions.h" -#include "base/utf_string_conversions.h" -#include "components/autofill/browser/autofill_country.h" -#include "components/autofill/browser/state_names.h" -#include "components/autofill/browser/validation.h" -#include "components/autofill/common/form_field_data.h" -#include "grit/generated_resources.h" -#include "ui/base/l10n/l10n_util.h" - namespace autofill { -namespace { - -const char* const kMonthsAbbreviated[] = { - NULL, // Padding so index 1 = month 1 = January. - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", -}; - -const char* const kMonthsFull[] = { - NULL, // Padding so index 1 = month 1 = January. - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December", -}; - -const char* const kMonthsNumeric[] = { - NULL, // Padding so index 1 = month 1 = January. - "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", -}; - -// Returns true if the value was successfully set, meaning |value| was found in -// the list of select options in |field|. -bool SetSelectControlValue(const base::string16& value, - FormFieldData* field) { - base::string16 value_lowercase = StringToLowerASCII(value); - - DCHECK_EQ(field->option_values.size(), field->option_contents.size()); - for (size_t i = 0; i < field->option_values.size(); ++i) { - if (value_lowercase == StringToLowerASCII(field->option_values[i]) || - value_lowercase == StringToLowerASCII(field->option_contents[i])) { - field->value = field->option_values[i]; - return true; - } - } - - return false; -} - -bool FillStateSelectControl(const base::string16& value, - FormFieldData* field) { - base::string16 abbreviation = value; - base::string16 full = state_names::GetNameForAbbreviation(value); - if (full.empty()) { - abbreviation = state_names::GetAbbreviationForName(value); - full = value; - } - - // Try the abbreviation first. - if (!abbreviation.empty() && SetSelectControlValue(abbreviation, field)) - return true; - - return !full.empty() && SetSelectControlValue(full, field); -} - -bool FillExpirationMonthSelectControl(const base::string16& value, - FormFieldData* field) { - int index = 0; - if (!base::StringToInt(value, &index) || - index <= 0 || - static_cast<size_t>(index) >= arraysize(kMonthsFull)) - return false; - - bool filled = - SetSelectControlValue(ASCIIToUTF16(kMonthsAbbreviated[index]), field) || - SetSelectControlValue(ASCIIToUTF16(kMonthsFull[index]), field) || - SetSelectControlValue(ASCIIToUTF16(kMonthsNumeric[index]), field); - return filled; -} - -// Try to fill a credit card type |value| (Visa, MasterCard, etc.) into the -// given |field|. -bool FillCreditCardTypeSelectControl(const base::string16& value, - FormFieldData* field) { - // Try stripping off spaces. - base::string16 value_stripped; - RemoveChars(StringToLowerASCII(value), kWhitespaceUTF16, &value_stripped); - - for (size_t i = 0; i < field->option_values.size(); ++i) { - base::string16 option_value_lowercase; - RemoveChars(StringToLowerASCII(field->option_values[i]), kWhitespaceUTF16, - &option_value_lowercase); - base::string16 option_contents_lowercase; - RemoveChars(StringToLowerASCII(field->option_contents[i]), kWhitespaceUTF16, - &option_contents_lowercase); - - // Perform a case-insensitive comparison; but fill the form with the - // original text, not the lowercased version. - if (value_stripped == option_value_lowercase || - value_stripped == option_contents_lowercase) { - field->value = field->option_values[i]; - return true; - } - } - - // For American Express, also try filling as "AmEx". - if (value == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX)) - return FillCreditCardTypeSelectControl(ASCIIToUTF16("AmEx"), field); - - return false; -} - -} // namespace - -std::string FormGroup::GetGUID() const { - NOTREACHED(); - return std::string(); -} void FormGroup::GetMatchingTypes(const base::string16& text, const std::string& app_locale, @@ -169,66 +49,4 @@ bool FormGroup::SetInfo(AutofillFieldType type, return true; } -void FormGroup::FillFormField(const AutofillField& field, - size_t variant, - const std::string& app_locale, - FormFieldData* field_data) const { - NOTREACHED(); -} - -void FormGroup::FillSelectControl(AutofillFieldType type, - const std::string& app_locale, - FormFieldData* field) const { - DCHECK(field); - DCHECK_EQ("select-one", field->form_control_type); - DCHECK_EQ(field->option_values.size(), field->option_contents.size()); - - base::string16 field_text = GetInfo(type, app_locale); - base::string16 field_text_lower = StringToLowerASCII(field_text); - if (field_text.empty()) - return; - - base::string16 value; - for (size_t i = 0; i < field->option_values.size(); ++i) { - if (field_text == field->option_values[i] || - field_text == field->option_contents[i]) { - // An exact match, use it. - value = field->option_values[i]; - break; - } - - if (field_text_lower == StringToLowerASCII(field->option_values[i]) || - field_text_lower == StringToLowerASCII(field->option_contents[i])) { - // A match, but not in the same case. Save it in case an exact match is - // not found. - value = field->option_values[i]; - } - } - - if (!value.empty()) { - field->value = value; - return; - } - - if (type == ADDRESS_HOME_STATE || type == ADDRESS_BILLING_STATE) { - FillStateSelectControl(field_text, field); - } else if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) { - FillCountrySelectControl(app_locale, field); - } else if (type == CREDIT_CARD_EXP_MONTH) { - FillExpirationMonthSelectControl(field_text, field); - } else if (type == CREDIT_CARD_EXP_4_DIGIT_YEAR) { - // Attempt to fill the year as a 2-digit year. This compensates for the - // fact that our heuristics do not always correctly detect when a website - // requests a 2-digit rather than a 4-digit year. - FillSelectControl(CREDIT_CARD_EXP_2_DIGIT_YEAR, app_locale, field); - } else if (type == CREDIT_CARD_TYPE) { - FillCreditCardTypeSelectControl(field_text, field); - } -} - -bool FormGroup::FillCountrySelectControl(const std::string& app_locale, - FormFieldData* field_data) const { - return false; -} - } // namespace autofill diff --git a/components/autofill/browser/form_group.h b/components/autofill/browser/form_group.h index 9450758..90ff87a 100644 --- a/components/autofill/browser/form_group.h +++ b/components/autofill/browser/form_group.h @@ -6,28 +6,17 @@ #define COMPONENTS_AUTOFILL_BROWSER_FORM_GROUP_H_ #include <string> -#include <vector> #include "base/string16.h" -#include "base/string_util.h" #include "components/autofill/browser/field_types.h" namespace autofill { -class AutofillField; -struct FormFieldData; - // This class is an interface for collections of form fields, grouped by type. -// The information in objects of this class is managed by the -// PersonalDataManager. class FormGroup { public: virtual ~FormGroup() {} - // Returns a globally unique ID for this object. It is an error to call the - // default implementation. - virtual std::string GetGUID() const; - // Used to determine the type of a field based on the text that a user enters // into the field, interpreted in the given |app_locale| if appropriate. The // field types can then be reported back to the server. This method is @@ -62,19 +51,6 @@ class FormGroup { const base::string16& value, const std::string& app_locale); - // Set |field_data|'s value based on |field| and contents of |this| (using - // data variant |variant|). It is an error to call the default implementation. - virtual void FillFormField(const AutofillField& field, - size_t variant, - const std::string& app_locale, - FormFieldData* field_data) const; - - // Fills in select control with data matching |type| from |this|. - // Public for testing purposes. - void FillSelectControl(AutofillFieldType type, - const std::string& app_locale, - FormFieldData* field_data) const; - protected: // AutofillProfile needs to call into GetSupportedTypes() for objects of // non-AutofillProfile type, for which mere inheritance is insufficient. @@ -83,11 +59,6 @@ class FormGroup { // Returns a set of AutofillFieldTypes for which this FormGroup can store // data. This method is additive on |supported_types|. virtual void GetSupportedTypes(FieldTypeSet* supported_types) const = 0; - - // Fills in a select control for a country from data in |this|. Returns true - // for success. - virtual bool FillCountrySelectControl(const std::string& app_locale, - FormFieldData* field_data) const; }; } // namespace autofill diff --git a/components/autofill/browser/personal_data_manager.cc b/components/autofill/browser/personal_data_manager.cc index 481ca24..1e4d30c 100644 --- a/components/autofill/browser/personal_data_manager.cc +++ b/components/autofill/browser/personal_data_manager.cc @@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/prefs/pref_service.h" +#include "base/string_util.h" #include "base/strings/string_number_conversions.h" #include "base/utf_string_conversions.h" #include "components/autofill/browser/autofill-inl.h" diff --git a/components/autofill/browser/wallet/wallet_address.cc b/components/autofill/browser/wallet/wallet_address.cc index 209330d..196b078 100644 --- a/components/autofill/browser/wallet/wallet_address.cc +++ b/components/autofill/browser/wallet/wallet_address.cc @@ -5,6 +5,7 @@ #include "components/autofill/browser/wallet/wallet_address.h" #include "base/logging.h" +#include "base/string_util.h" #include "base/utf_string_conversions.h" #include "base/values.h" #include "components/autofill/browser/autofill_country.h" diff --git a/components/autofill/browser/webdata/autofill_change.cc b/components/autofill/browser/webdata/autofill_change.cc index 6de7986..7136c97 100644 --- a/components/autofill/browser/webdata/autofill_change.cc +++ b/components/autofill/browser/webdata/autofill_change.cc @@ -4,6 +4,7 @@ #include "components/autofill/browser/webdata/autofill_change.h" +#include "base/logging.h" #include "components/autofill/browser/autofill_profile.h" #include "components/autofill/browser/credit_card.h" diff --git a/components/autofill/browser/webdata/autofill_table_unittest.cc b/components/autofill/browser/webdata/autofill_table_unittest.cc index e4d5138..b4f3264 100644 --- a/components/autofill/browser/webdata/autofill_table_unittest.cc +++ b/components/autofill/browser/webdata/autofill_table_unittest.cc @@ -8,6 +8,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/guid.h" #include "base/path_service.h" +#include "base/string_util.h" #include "base/strings/string_number_conversions.h" #include "base/time.h" #include "base/utf_string_conversions.h" |