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 | |
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
22 files changed, 321 insertions, 307 deletions
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc index 44edb79..b5b01f7 100644 --- a/chrome/browser/autofill/android/personal_data_manager_android.cc +++ b/chrome/browser/autofill/android/personal_data_manager_android.cc @@ -32,7 +32,7 @@ ScopedJavaLocalRef<jobject> CreateJavaProfileFromNative( const AutofillProfile& profile) { return Java_AutofillProfile_create( env, - ConvertUTF8ToJavaString(env, profile.GetGUID()).obj(), + ConvertUTF8ToJavaString(env, profile.guid()).obj(), ConvertUTF16ToJavaString(env, profile.GetRawInfo(NAME_FULL)).obj(), ConvertUTF16ToJavaString(env, profile.GetRawInfo(COMPANY_NAME)).obj(), ConvertUTF16ToJavaString( @@ -112,7 +112,7 @@ ScopedJavaLocalRef<jobject> CreateJavaCreditCardFromNative( const CreditCard& card) { return Java_CreditCard_create( env, - ConvertUTF8ToJavaString(env, card.GetGUID()).obj(), + ConvertUTF8ToJavaString(env, card.guid()).obj(), ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NAME)).obj(), ConvertUTF16ToJavaString(env, card.GetRawInfo(CREDIT_CARD_NUMBER)).obj(), ConvertUTF16ToJavaString(env, card.ObfuscatedNumber()).obj(), @@ -203,7 +203,7 @@ ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetProfile( personal_data_manager_->UpdateProfile(profile); } - return ConvertUTF8ToJavaString(env, profile.GetGUID()); + return ConvertUTF8ToJavaString(env, profile.guid()); } @@ -252,7 +252,7 @@ ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetCreditCard( card.set_guid(guid); personal_data_manager_->UpdateCreditCard(card); } - return ConvertUTF8ToJavaString(env, card.GetGUID()); + return ConvertUTF8ToJavaString(env, card.guid()); } void PersonalDataManagerAndroid::RemoveByGUID(JNIEnv* env, diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc index 27e9128..86ad08c 100644 --- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc @@ -30,6 +30,7 @@ #include "chrome/browser/ui/extensions/shell_window.h" #include "chrome/common/chrome_version_info.h" #include "chrome/common/pref_names.h" +#include "components/autofill/browser/autofill_data_model.h" #include "components/autofill/browser/autofill_manager.h" #include "components/autofill/browser/autofill_type.h" #include "components/autofill/browser/personal_data_manager.h" @@ -827,7 +828,7 @@ scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper( } // Calculate the variant by looking at how many items come from the same - // FormGroup. + // data model. size_t variant = 0; for (int i = model->checked_item() - 1; i >= 0; --i) { if (model->GetItemKeyAt(i) == item_key) @@ -1829,7 +1830,7 @@ void AutofillDialogControllerImpl::FillOutputForSection(DialogSection section) { } void AutofillDialogControllerImpl::FillFormStructureForSection( - const FormGroup& form_group, + const AutofillDataModel& data_model, size_t variant, DialogSection section, const InputFieldComparator& compare) { @@ -1840,7 +1841,7 @@ void AutofillDialogControllerImpl::FillFormStructureForSection( const DetailInputs& inputs = RequestedFieldsForSection(section); for (size_t j = 0; j < inputs.size(); ++j) { if (compare.Run(inputs[j], *field)) { - form_group.FillFormField(*field, variant, app_locale, field); + data_model.FillFormField(*field, variant, app_locale, field); break; } } diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h index f99ee66..2daf4d3 100644 --- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h +++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.h @@ -36,7 +36,6 @@ #include "ui/base/models/simple_menu_model.h" #include "ui/base/ui_base_types.h" -class FormGroup; class Profile; class PrefRegistrySyncable; @@ -46,6 +45,7 @@ class WebContents; namespace autofill { +class AutofillDataModel; class AutofillDialogView; class AutofillPopupControllerImpl; class DataModelWrapper; @@ -305,7 +305,7 @@ class AutofillDialogControllerImpl : public AutofillDialogController, // Fills in |form_structure_| using |form_group|. Utility method for // FillOutputForSection. - void FillFormStructureForSection(const FormGroup& form_group, + void FillFormStructureForSection(const AutofillDataModel& data_model, size_t variant, DialogSection section, const InputFieldComparator& compare); diff --git a/chrome/browser/ui/autofill/data_model_wrapper.cc b/chrome/browser/ui/autofill/data_model_wrapper.cc index b30053c..b8f1c3c 100644 --- a/chrome/browser/ui/autofill/data_model_wrapper.cc +++ b/chrome/browser/ui/autofill/data_model_wrapper.cc @@ -8,10 +8,10 @@ #include "base/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/autofill/autofill_dialog_models.h" +#include "components/autofill/browser/autofill_data_model.h" #include "components/autofill/browser/autofill_profile.h" #include "components/autofill/browser/autofill_type.h" #include "components/autofill/browser/credit_card.h" -#include "components/autofill/browser/form_group.h" #include "components/autofill/browser/form_structure.h" #include "components/autofill/browser/wallet/full_wallet.h" #include "components/autofill/browser/wallet/wallet_address.h" @@ -67,21 +67,22 @@ gfx::Image DataModelWrapper::GetIcon() { return gfx::Image(); } -// AutofillFormGroupWrapper +// AutofillDataModelWrapper -AutofillFormGroupWrapper::AutofillFormGroupWrapper(const FormGroup* form_group, - size_t variant) - : form_group_(form_group), +AutofillDataModelWrapper::AutofillDataModelWrapper( + const AutofillDataModel* data_model, + size_t variant) + : data_model_(data_model), variant_(variant) {} -AutofillFormGroupWrapper::~AutofillFormGroupWrapper() {} +AutofillDataModelWrapper::~AutofillDataModelWrapper() {} -string16 AutofillFormGroupWrapper::GetInfo(AutofillFieldType type) { - return form_group_->GetInfo(type, g_browser_process->GetApplicationLocale()); +string16 AutofillDataModelWrapper::GetInfo(AutofillFieldType type) { + return data_model_->GetInfo(type, g_browser_process->GetApplicationLocale()); } -void AutofillFormGroupWrapper::FillFormField(AutofillField* field) { - form_group_->FillFormField( +void AutofillDataModelWrapper::FillFormField(AutofillField* field) { + data_model_->FillFormField( *field, variant_, g_browser_process->GetApplicationLocale(), field); } @@ -89,7 +90,7 @@ void AutofillFormGroupWrapper::FillFormField(AutofillField* field) { AutofillProfileWrapper::AutofillProfileWrapper( const AutofillProfile* profile, size_t variant) - : AutofillFormGroupWrapper(profile, variant), + : AutofillDataModelWrapper(profile, variant), profile_(profile) {} AutofillProfileWrapper::~AutofillProfileWrapper() {} @@ -106,7 +107,7 @@ void AutofillProfileWrapper::FillInputs(DetailInputs* inputs) { // AutofillCreditCardWrapper AutofillCreditCardWrapper::AutofillCreditCardWrapper(const CreditCard* card) - : AutofillFormGroupWrapper(card, 0), + : AutofillDataModelWrapper(card, 0), card_(card) {} AutofillCreditCardWrapper::~AutofillCreditCardWrapper() {} @@ -115,7 +116,7 @@ string16 AutofillCreditCardWrapper::GetInfo(AutofillFieldType type) { if (type == CREDIT_CARD_EXP_MONTH) return MonthComboboxModel::FormatMonth(card_->expiration_month()); - return AutofillFormGroupWrapper::GetInfo(type); + return AutofillDataModelWrapper::GetInfo(type); } gfx::Image AutofillCreditCardWrapper::GetIcon() { @@ -137,7 +138,7 @@ void AutofillCreditCardWrapper::FillFormField(AutofillField* field) { field->set_heuristic_type(CREDIT_CARD_NAME); } - AutofillFormGroupWrapper::FillFormField(field); + AutofillDataModelWrapper::FillFormField(field); field->set_heuristic_type(field_type); } diff --git a/chrome/browser/ui/autofill/data_model_wrapper.h b/chrome/browser/ui/autofill/data_model_wrapper.h index 639d861..4e6c486 100644 --- a/chrome/browser/ui/autofill/data_model_wrapper.h +++ b/chrome/browser/ui/autofill/data_model_wrapper.h @@ -17,9 +17,9 @@ class Image; namespace autofill { +class AutofillDataModel; class AutofillProfile; class CreditCard; -class FormGroup; class FormStructure; namespace wallet { @@ -67,10 +67,10 @@ class DataModelWrapper { }; // A DataModelWrapper for Autofill data. -class AutofillFormGroupWrapper : public DataModelWrapper { +class AutofillDataModelWrapper : public DataModelWrapper { public: - AutofillFormGroupWrapper(const FormGroup* form_group, size_t variant); - virtual ~AutofillFormGroupWrapper(); + AutofillDataModelWrapper(const AutofillDataModel* data_model, size_t variant); + virtual ~AutofillDataModelWrapper(); virtual string16 GetInfo(AutofillFieldType type) OVERRIDE; @@ -80,14 +80,14 @@ class AutofillFormGroupWrapper : public DataModelWrapper { size_t variant() const { return variant_; } private: - const FormGroup* form_group_; + const AutofillDataModel* data_model_; const size_t variant_; - DISALLOW_COPY_AND_ASSIGN(AutofillFormGroupWrapper); + DISALLOW_COPY_AND_ASSIGN(AutofillDataModelWrapper); }; // A DataModelWrapper for Autofill profiles. -class AutofillProfileWrapper : public AutofillFormGroupWrapper { +class AutofillProfileWrapper : public AutofillDataModelWrapper { public: AutofillProfileWrapper(const AutofillProfile* profile, size_t variant); virtual ~AutofillProfileWrapper(); @@ -101,7 +101,7 @@ class AutofillProfileWrapper : public AutofillFormGroupWrapper { }; // A DataModelWrapper specifically for Autofill CreditCard data. -class AutofillCreditCardWrapper : public AutofillFormGroupWrapper { +class AutofillCreditCardWrapper : public AutofillDataModelWrapper { public: explicit AutofillCreditCardWrapper(const CreditCard* card); virtual ~AutofillCreditCardWrapper(); 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" |