summaryrefslogtreecommitdiffstats
path: root/components
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 /components
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
Diffstat (limited to 'components')
-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
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"