summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-19 03:29:55 +0000
committerisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-19 03:29:55 +0000
commit8b0a918e40699ea7732ab1da7c5f7a6e2dbad01a (patch)
tree220452a550381ed1bf80ebb6dbaaf45aaad78dc2
parentb920e7d74733aa20587ca620efedd4088c4bff3d (diff)
downloadchromium_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
-rw-r--r--chrome/browser/autofill/android/personal_data_manager_android.cc8
-rw-r--r--chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc7
-rw-r--r--chrome/browser/ui/autofill/autofill_dialog_controller_impl.h4
-rw-r--r--chrome/browser/ui/autofill/data_model_wrapper.cc29
-rw-r--r--chrome/browser/ui/autofill/data_model_wrapper.h16
-rw-r--r--components/autofill.gypi2
-rw-r--r--components/autofill/browser/address.h1
-rw-r--r--components/autofill/browser/autofill_data_model.cc182
-rw-r--r--components/autofill/browser/autofill_data_model.h55
-rw-r--r--components/autofill/browser/autofill_manager.cc26
-rw-r--r--components/autofill/browser/autofill_manager.h4
-rw-r--r--components/autofill/browser/autofill_profile.cc16
-rw-r--r--components/autofill/browser/autofill_profile.h17
-rw-r--r--components/autofill/browser/contact_info.h1
-rw-r--r--components/autofill/browser/credit_card.cc27
-rw-r--r--components/autofill/browser/credit_card.h18
-rw-r--r--components/autofill/browser/form_group.cc182
-rw-r--r--components/autofill/browser/form_group.h29
-rw-r--r--components/autofill/browser/personal_data_manager.cc1
-rw-r--r--components/autofill/browser/wallet/wallet_address.cc1
-rw-r--r--components/autofill/browser/webdata/autofill_change.cc1
-rw-r--r--components/autofill/browser/webdata/autofill_table_unittest.cc1
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"