summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-05 05:34:48 +0000
committerisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-05 05:34:48 +0000
commit4d11fcde4d6bb6d2a98fedff9e3a4812b0c24e89 (patch)
treeb44a155924fac62ab8872adc1a22169f598ec3e4 /chrome/browser
parent0e7f2b7f4023f10cc1d4d4a9eabca701faedec01 (diff)
downloadchromium_src-4d11fcde4d6bb6d2a98fedff9e3a4812b0c24e89.zip
chromium_src-4d11fcde4d6bb6d2a98fedff9e3a4812b0c24e89.tar.gz
chromium_src-4d11fcde4d6bb6d2a98fedff9e3a4812b0c24e89.tar.bz2
[Autofill] Rename {Get,Set}CanonicalizedInfo() to {Get,Set}Info(), and pass in the app locale.
Also: * Pass the app locale to FormGroup::GetMatchingTypes(), FormGroup::GetNonEmptyTypes(), and CreditCard::UpdateFromImportedCard(). * Update PhoneNumber::GetRawInfo() to not rely on knowing the locale, and move all the code that depended on knowing the locale into PhoneNumber::GetInfo(). * Within the AutofillManager code, read the app locale on the UI thread, and pass it as a parameter to the worker thread. BUG=100845 TEST=none (this is a refactoring change) Review URL: https://chromiumcodereview.appspot.com/11417131 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171166 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/autofill/address.cc19
-rw-r--r--chrome/browser/autofill/address.h1
-rw-r--r--chrome/browser/autofill/address_unittest.cc8
-rw-r--r--chrome/browser/autofill/autofill_ie_toolbar_import_win.cc7
-rw-r--r--chrome/browser/autofill/autofill_ie_toolbar_import_win_unittest.cc7
-rw-r--r--chrome/browser/autofill/autofill_manager.cc18
-rw-r--r--chrome/browser/autofill/autofill_profile.cc66
-rw-r--r--chrome/browser/autofill/autofill_profile.h20
-rw-r--r--chrome/browser/autofill/credit_card.cc30
-rw-r--r--chrome/browser/autofill/credit_card.h13
-rw-r--r--chrome/browser/autofill/form_group.cc20
-rw-r--r--chrome/browser/autofill/form_group.h26
-rw-r--r--chrome/browser/autofill/personal_data_manager.cc21
-rw-r--r--chrome/browser/autofill/phone_number.cc133
-rw-r--r--chrome/browser/autofill/phone_number.h19
-rw-r--r--chrome/browser/autofill/phone_number_i18n.h2
-rw-r--r--chrome/browser/autofill/phone_number_unittest.cc37
-rw-r--r--chrome/browser/ui/autofill/autofill_dialog_controller.cc12
18 files changed, 263 insertions, 196 deletions
diff --git a/chrome/browser/autofill/address.cc b/chrome/browser/autofill/address.cc
index c5e61ed..c1ed7ac 100644
--- a/chrome/browser/autofill/address.cc
+++ b/chrome/browser/autofill/address.cc
@@ -17,13 +17,6 @@ namespace {
const char16 kAddressSplitChars[] = {'-', ',', '#', '.', ' ', 0};
-// Returns the country code corresponding to |country|, which should be a
-// localized country name.
-std::string ToCountryCode(const string16& country) {
- std::string app_locale = AutofillCountry::ApplicationLocale();
- return AutofillCountry::GetCountryCode(country, app_locale);
-}
-
} // namespace
Address::Address() {}
@@ -89,7 +82,12 @@ void Address::SetRawInfo(AutofillFieldType type, const string16& value) {
else if (type == ADDRESS_HOME_STATE)
state_ = value;
else if (type == ADDRESS_HOME_COUNTRY)
- country_code_ = ToCountryCode(value);
+ // TODO(isherman): When setting the country, it should only be possible to
+ // call this with a country code, which means we should be able to drop the
+ // call to GetCountryCode() below.
+ country_code_ =
+ AutofillCountry::GetCountryCode(value,
+ AutofillCountry::ApplicationLocale());
else if (type == ADDRESS_HOME_ZIP)
zip_code_ = value;
else
@@ -97,11 +95,12 @@ void Address::SetRawInfo(AutofillFieldType type, const string16& value) {
}
void Address::GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const {
- FormGroup::GetMatchingTypes(text, matching_types);
+ FormGroup::GetMatchingTypes(text, app_locale, matching_types);
// Check to see if the |text| canonicalized as a country name is a match.
- std::string country_code = ToCountryCode(text);
+ std::string country_code = AutofillCountry::GetCountryCode(text, app_locale);
if (!country_code.empty() && country_code_ == country_code)
matching_types->insert(ADDRESS_HOME_COUNTRY);
}
diff --git a/chrome/browser/autofill/address.h b/chrome/browser/autofill/address.h
index 44c50c6..a13b330 100644
--- a/chrome/browser/autofill/address.h
+++ b/chrome/browser/autofill/address.h
@@ -27,6 +27,7 @@ class Address : public FormGroup {
virtual void SetRawInfo(AutofillFieldType type,
const string16& value) OVERRIDE;
virtual void GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const OVERRIDE;
const std::string& country_code() const { return country_code_; }
diff --git a/chrome/browser/autofill/address_unittest.cc b/chrome/browser/autofill/address_unittest.cc
index 5f4c883..9dcda2a 100644
--- a/chrome/browser/autofill/address_unittest.cc
+++ b/chrome/browser/autofill/address_unittest.cc
@@ -108,7 +108,8 @@ TEST_F(AddressTest, IsCountry) {
for (size_t i = 0; i < arraysize(kValidMatches); ++i) {
SCOPED_TRACE(kValidMatches[i]);
FieldTypeSet matching_types;
- address.GetMatchingTypes(ASCIIToUTF16(kValidMatches[i]), &matching_types);
+ address.GetMatchingTypes(ASCIIToUTF16(kValidMatches[i]), "US",
+ &matching_types);
ASSERT_EQ(1U, matching_types.size());
EXPECT_EQ(ADDRESS_HOME_COUNTRY, *matching_types.begin());
}
@@ -119,7 +120,8 @@ TEST_F(AddressTest, IsCountry) {
};
for (size_t i = 0; i < arraysize(kInvalidMatches); ++i) {
FieldTypeSet matching_types;
- address.GetMatchingTypes(ASCIIToUTF16(kInvalidMatches[i]), &matching_types);
+ address.GetMatchingTypes(ASCIIToUTF16(kInvalidMatches[i]), "US",
+ &matching_types);
EXPECT_EQ(0U, matching_types.size());
}
@@ -127,6 +129,6 @@ TEST_F(AddressTest, IsCountry) {
address.set_country_code("");
EXPECT_EQ(std::string(), address.country_code());
FieldTypeSet matching_types;
- address.GetMatchingTypes(ASCIIToUTF16("Garbage"), &matching_types);
+ address.GetMatchingTypes(ASCIIToUTF16("Garbage"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
}
diff --git a/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc b/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc
index c01d997..aa08f07 100644
--- a/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc
+++ b/chrome/browser/autofill/autofill_ie_toolbar_import_win.cc
@@ -150,7 +150,7 @@ bool ImportSingleProfile(FormGroup* profile,
// We need to store phone data in |phone| before building the whole number
// at the end. The rest of the fields are set "as is".
- // TODO(isherman): Call SetCanonicalizedInfo(), rather than SetRawInfo().
+ // TODO(isherman): Call SetInfo(), rather than SetRawInfo().
if (!phone.SetInfo(it->second, field_value))
profile->SetRawInfo(it->second, field_value);
}
@@ -159,7 +159,7 @@ bool ImportSingleProfile(FormGroup* profile,
string16 constructed_number;
if (!phone.IsEmpty() &&
phone.ParseNumber(std::string("US"), &constructed_number)) {
- profile->SetCanonicalizedInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number);
+ profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number);
}
return has_non_empty_fields;
@@ -256,8 +256,7 @@ bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles,
RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ);
CreditCard credit_card;
if (ImportSingleProfile(&credit_card, &key, reg_to_field)) {
- // TODO(isherman): Call into GetCanonicalizedInfo() below, rather than
- // GetRawInfo().
+ // TODO(isherman): Call into GetInfo() below, rather than GetRawInfo().
string16 cc_number = credit_card.GetRawInfo(CREDIT_CARD_NUMBER);
if (!cc_number.empty())
credit_cards->push_back(credit_card);
diff --git a/chrome/browser/autofill/autofill_ie_toolbar_import_win_unittest.cc b/chrome/browser/autofill/autofill_ie_toolbar_import_win_unittest.cc
index e5c5b98..ace0867 100644
--- a/chrome/browser/autofill/autofill_ie_toolbar_import_win_unittest.cc
+++ b/chrome/browser/autofill/autofill_ie_toolbar_import_win_unittest.cc
@@ -165,9 +165,10 @@ TEST_F(AutofillIeToolbarImportTest, TestAutofillImport) {
EXPECT_EQ(profile1[2].value, profiles[1].GetRawInfo(NAME_LAST));
EXPECT_EQ(profile1[3].value, profiles[1].GetRawInfo(EMAIL_ADDRESS));
EXPECT_EQ(profile1[4].value, profiles[1].GetRawInfo(COMPANY_NAME));
- EXPECT_EQ(profile1[7].value, profiles[1].GetRawInfo(PHONE_HOME_COUNTRY_CODE));
- EXPECT_EQ(profile1[6].value, profiles[1].GetRawInfo(PHONE_HOME_CITY_CODE));
- EXPECT_EQ(L"5555555", profiles[1].GetRawInfo(PHONE_HOME_NUMBER));
+ EXPECT_EQ(profile1[7].value,
+ profiles[1].GetInfo(PHONE_HOME_COUNTRY_CODE, "US"));
+ EXPECT_EQ(profile1[6].value, profiles[1].GetInfo(PHONE_HOME_CITY_CODE, "US"));
+ EXPECT_EQ(L"5555555", profiles[1].GetInfo(PHONE_HOME_NUMBER, "US"));
EXPECT_EQ(L"+1 650-555-5555",
profiles[1].GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
diff --git a/chrome/browser/autofill/autofill_manager.cc b/chrome/browser/autofill/autofill_manager.cc
index 65c213b..7ef5323 100644
--- a/chrome/browser/autofill/autofill_manager.cc
+++ b/chrome/browser/autofill/autofill_manager.cc
@@ -25,6 +25,7 @@
#include "chrome/browser/api/sync/profile_sync_service_base.h"
#include "chrome/browser/autofill/autocomplete_history_manager.h"
#include "chrome/browser/autofill/autofill_cc_infobar_delegate.h"
+#include "chrome/browser/autofill/autofill_country.h"
#include "chrome/browser/autofill/autofill_external_delegate.h"
#include "chrome/browser/autofill/autofill_field.h"
#include "chrome/browser/autofill/autofill_manager_delegate.h"
@@ -143,6 +144,7 @@ bool FormIsHTTPS(const FormStructure& form) {
void DeterminePossibleFieldTypesForUpload(
const std::vector<AutofillProfile>& profiles,
const std::vector<CreditCard>& credit_cards,
+ const std::string& app_locale,
FormStructure* submitted_form) {
DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
@@ -155,11 +157,11 @@ void DeterminePossibleFieldTypesForUpload(
FieldTypeSet matching_types;
for (std::vector<AutofillProfile>::const_iterator it = profiles.begin();
it != profiles.end(); ++it) {
- it->GetMatchingTypes(value, &matching_types);
+ it->GetMatchingTypes(value, app_locale, &matching_types);
}
for (std::vector<CreditCard>::const_iterator it = credit_cards.begin();
it != credit_cards.end(); ++it) {
- it->GetMatchingTypes(value, &matching_types);
+ it->GetMatchingTypes(value, app_locale, &matching_types);
}
if (matching_types.empty())
@@ -432,6 +434,7 @@ bool AutofillManager::OnFormSubmitted(const FormData& form,
base::Bind(&DeterminePossibleFieldTypesForUpload,
copied_profiles,
copied_credit_cards,
+ AutofillCountry::ApplicationLocale(),
raw_submitted_form),
base::Bind(&AutofillManager::UploadFormDataAsyncCallback,
this,
@@ -1106,6 +1109,7 @@ void AutofillManager::GetProfileSuggestions(
std::vector<string16>* icons,
std::vector<int>* unique_ids) const {
const std::vector<AutofillProfile*>& profiles = personal_data_->GetProfiles();
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
if (!field.is_autofilled) {
std::vector<AutofillProfile*> matched_profiles;
for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin();
@@ -1114,7 +1118,7 @@ void AutofillManager::GetProfileSuggestions(
// The value of the stored data for this field type in the |profile|.
std::vector<string16> multi_values;
- profile->GetCanonicalizedMultiInfo(type, &multi_values);
+ profile->GetMultiInfo(type, app_locale, &multi_values);
for (size_t i = 0; i < multi_values.size(); ++i) {
if (!multi_values[i].empty() &&
@@ -1146,7 +1150,7 @@ void AutofillManager::GetProfileSuggestions(
// The value of the stored data for this field type in the |profile|.
std::vector<string16> multi_values;
- profile->GetCanonicalizedMultiInfo(type, &multi_values);
+ profile->GetMultiInfo(type, app_locale, &multi_values);
for (size_t i = 0; i < multi_values.size(); ++i) {
if (multi_values[i].empty())
@@ -1192,14 +1196,14 @@ void AutofillManager::GetCreditCardSuggestions(
std::vector<string16>* labels,
std::vector<string16>* icons,
std::vector<int>* unique_ids) const {
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
for (std::vector<CreditCard*>::const_iterator iter =
personal_data_->credit_cards().begin();
iter != personal_data_->credit_cards().end(); ++iter) {
CreditCard* credit_card = *iter;
// The value of the stored data for this field type in the |credit_card|.
- string16 creditcard_field_value =
- credit_card->GetCanonicalizedInfo(type);
+ string16 creditcard_field_value = credit_card->GetInfo(type, app_locale);
if (!creditcard_field_value.empty() &&
StartsWith(creditcard_field_value, field.value, false)) {
if (type == CREDIT_CARD_NUMBER)
@@ -1208,7 +1212,7 @@ void AutofillManager::GetCreditCardSuggestions(
string16 label;
if (credit_card->number().empty()) {
// If there is no CC number, return name to show something.
- label = credit_card->GetCanonicalizedInfo(CREDIT_CARD_NAME);
+ label = credit_card->GetInfo(CREDIT_CARD_NAME, app_locale);
} else {
label = kCreditCardPrefix;
label.append(credit_card->LastFourDigits());
diff --git a/chrome/browser/autofill/autofill_profile.cc b/chrome/browser/autofill/autofill_profile.cc
index df9a9fa..bd692ef 100644
--- a/chrome/browser/autofill/autofill_profile.cc
+++ b/chrome/browser/autofill/autofill_profile.cc
@@ -119,6 +119,14 @@ const string16 MultiString(const AutofillProfile& p, AutofillFieldType type) {
return accumulate;
}
+string16 GetFormGroupInfo(const FormGroup& form_group,
+ AutofillFieldType type,
+ const std::string& app_locale) {
+ return app_locale.empty() ?
+ form_group.GetRawInfo(type) :
+ form_group.GetInfo(type, app_locale);
+}
+
template <class T>
void CopyValuesToItems(AutofillFieldType type,
const std::vector<string16>& values,
@@ -137,14 +145,11 @@ void CopyValuesToItems(AutofillFieldType type,
template <class T>
void CopyItemsToValues(AutofillFieldType type,
const std::vector<T>& form_group_items,
- bool canonicalize,
+ const std::string& app_locale,
std::vector<string16>* values) {
values->resize(form_group_items.size());
for (size_t i = 0; i < values->size(); ++i) {
- if (canonicalize)
- (*values)[i] = form_group_items[i].GetCanonicalizedInfo(type);
- else
- (*values)[i] = form_group_items[i].GetRawInfo(type);
+ (*values)[i] = GetFormGroupInfo(form_group_items[i], type, app_locale);
}
}
@@ -258,10 +263,11 @@ std::string AutofillProfile::GetGUID() const {
}
void AutofillProfile::GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const {
FormGroupList info = FormGroups();
for (FormGroupList::const_iterator it = info.begin(); it != info.end(); ++it)
- (*it)->GetMatchingTypes(text, matching_types);
+ (*it)->GetMatchingTypes(text, app_locale, matching_types);
}
string16 AutofillProfile::GetRawInfo(AutofillFieldType type) const {
@@ -280,24 +286,25 @@ void AutofillProfile::SetRawInfo(AutofillFieldType type,
form_group->SetRawInfo(type, CollapseWhitespace(value, false));
}
-string16 AutofillProfile::GetCanonicalizedInfo(AutofillFieldType type) const {
+string16 AutofillProfile::GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const {
AutofillFieldType return_type = AutofillType::GetEquivalentFieldType(type);
const FormGroup* form_group = FormGroupForType(return_type);
if (!form_group)
return string16();
- return form_group->GetCanonicalizedInfo(return_type);
+ return form_group->GetInfo(return_type, app_locale);
}
-bool AutofillProfile::SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value) {
+bool AutofillProfile::SetInfo(AutofillFieldType type,
+ const string16& value,
+ const std::string& app_locale) {
FormGroup* form_group = MutableFormGroupForType(type);
- if (form_group) {
- return form_group->SetCanonicalizedInfo(type,
- CollapseWhitespace(value, false));
- }
+ if (!form_group)
+ return false;
- return false;
+ return
+ form_group->SetInfo(type, CollapseWhitespace(value, false), app_locale);
}
void AutofillProfile::SetRawMultiInfo(AutofillFieldType type,
@@ -330,12 +337,13 @@ void AutofillProfile::SetRawMultiInfo(AutofillFieldType type,
void AutofillProfile::GetRawMultiInfo(AutofillFieldType type,
std::vector<string16>* values) const {
- GetMultiInfoImpl(type, false, values);
+ GetMultiInfoImpl(type, std::string(), values);
}
-void AutofillProfile::GetCanonicalizedMultiInfo(
- AutofillFieldType type, std::vector<string16>* values) const {
- GetMultiInfoImpl(type, true, values);
+void AutofillProfile::GetMultiInfo(AutofillFieldType type,
+ const std::string& app_locale,
+ std::vector<string16>* values) const {
+ GetMultiInfoImpl(type, app_locale, values);
}
void AutofillProfile::FillFormField(const AutofillField& field,
@@ -351,7 +359,7 @@ void AutofillProfile::FillFormField(const AutofillField& field,
FillSelectControl(type, field_data);
} else {
std::vector<string16> values;
- GetCanonicalizedMultiInfo(type, &values);
+ GetMultiInfo(type, AutofillCountry::ApplicationLocale(), &values);
if (variant >= values.size()) {
// If the variant is unavailable, bail. This case is reachable, for
// example if Sync updates a profile during the filling process.
@@ -366,7 +374,7 @@ void AutofillProfile::FillPhoneNumberField(const AutofillField& field,
size_t variant,
FormFieldData* field_data) const {
std::vector<string16> values;
- GetCanonicalizedMultiInfo(field.type(), &values);
+ GetMultiInfo(field.type(), AutofillCountry::ApplicationLocale(), &values);
DCHECK(variant < values.size());
// If we are filling a phone number, check to see if the size field
@@ -402,7 +410,7 @@ void AutofillProfile::SetCountryCode(const std::string& country_code) {
bool AutofillProfile::IsEmpty() const {
FieldTypeSet types;
- GetNonEmptyTypes(&types);
+ GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &types);
return types.empty();
}
@@ -461,7 +469,7 @@ const string16 AutofillProfile::PrimaryValue() const {
bool AutofillProfile::IsSubsetOf(const AutofillProfile& profile) const {
FieldTypeSet types;
- GetNonEmptyTypes(&types);
+ GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &types);
for (FieldTypeSet::const_iterator iter = types.begin(); iter != types.end();
++iter) {
@@ -491,7 +499,7 @@ bool AutofillProfile::IsSubsetOf(const AutofillProfile& profile) const {
void AutofillProfile::OverwriteWithOrAddTo(const AutofillProfile& profile) {
FieldTypeSet field_types;
- profile.GetNonEmptyTypes(&field_types);
+ profile.GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &field_types);
// Only transfer "full" types (e.g. full name) and not fragments (e.g.
// first name, last name).
@@ -635,21 +643,21 @@ bool AutofillProfile::FillCountrySelectControl(FormFieldData* field_data)
}
void AutofillProfile::GetMultiInfoImpl(AutofillFieldType type,
- bool canonicalize,
+ const std::string& app_locale,
std::vector<string16>* values) const {
switch (AutofillType(type).group()) {
case AutofillType::NAME:
- CopyItemsToValues(type, name_, canonicalize, values);
+ CopyItemsToValues(type, name_, app_locale, values);
break;
case AutofillType::EMAIL:
- CopyItemsToValues(type, email_, canonicalize, values);
+ CopyItemsToValues(type, email_, app_locale, values);
break;
case AutofillType::PHONE:
- CopyItemsToValues(type, home_number_, canonicalize, values);
+ CopyItemsToValues(type, home_number_, app_locale, values);
break;
default:
values->resize(1);
- (*values)[0] = GetRawInfo(type);
+ (*values)[0] = GetFormGroupInfo(*this, type, app_locale);
}
}
diff --git a/chrome/browser/autofill/autofill_profile.h b/chrome/browser/autofill/autofill_profile.h
index 921b831..e24d6f82 100644
--- a/chrome/browser/autofill/autofill_profile.h
+++ b/chrome/browser/autofill/autofill_profile.h
@@ -40,13 +40,16 @@ class AutofillProfile : public FormGroup {
// FormGroup:
virtual std::string GetGUID() const OVERRIDE;
virtual void GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const OVERRIDE;
virtual string16 GetRawInfo(AutofillFieldType type) const OVERRIDE;
virtual void SetRawInfo(AutofillFieldType type,
const string16& value) OVERRIDE;
- virtual string16 GetCanonicalizedInfo(AutofillFieldType type) const OVERRIDE;
- virtual bool SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value) OVERRIDE;
+ virtual string16 GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const OVERRIDE;
+ virtual bool SetInfo(AutofillFieldType type,
+ const string16& value,
+ const std::string& app_locale) OVERRIDE;
virtual void FillFormField(const AutofillField& field,
size_t variant,
FormFieldData* field_data) const OVERRIDE;
@@ -56,8 +59,9 @@ class AutofillProfile : public FormGroup {
const std::vector<string16>& values);
void GetRawMultiInfo(AutofillFieldType type,
std::vector<string16>* values) const;
- void GetCanonicalizedMultiInfo(AutofillFieldType type,
- std::vector<string16>* values) const;
+ void GetMultiInfo(AutofillFieldType type,
+ const std::string& app_locale,
+ std::vector<string16>* values) const;
// Set |field_data|'s value for phone number based on contents of |this|.
// The |field| specifies the type of the phone and whether this is a
@@ -148,9 +152,11 @@ class AutofillProfile : public FormGroup {
virtual bool FillCountrySelectControl(FormFieldData* field) const OVERRIDE;
virtual void GetSupportedTypes(FieldTypeSet* supported_types) const OVERRIDE;
- // Shared implementation for GetMultiInfo() and GetCanonicalizedMultiInfo().
+ // Shared implementation for GetRawMultiInfo() and GetMultiInfo(). Pass an
+ // empty |app_locale| to get the raw info; otherwise, the returned info is
+ // canonicalized according to the given |app_locale|, if appropriate.
void GetMultiInfoImpl(AutofillFieldType type,
- bool canonicalize,
+ const std::string& app_locale,
std::vector<string16>* values) const;
// Checks if the |phone| is in the |existing_phones| using fuzzy matching:
diff --git a/chrome/browser/autofill/credit_card.cc b/chrome/browser/autofill/credit_card.cc
index d3631eb..e78f74e 100644
--- a/chrome/browser/autofill/credit_card.cc
+++ b/chrome/browser/autofill/credit_card.cc
@@ -331,15 +331,17 @@ void CreditCard::SetRawInfo(AutofillFieldType type, const string16& value) {
}
}
-string16 CreditCard::GetCanonicalizedInfo(AutofillFieldType type) const {
+string16 CreditCard::GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const {
if (type == CREDIT_CARD_NUMBER)
return StripSeparators(number_);
return GetRawInfo(type);
}
-bool CreditCard::SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value) {
+bool CreditCard::SetInfo(AutofillFieldType type,
+ const string16& value,
+ const std::string& app_locale) {
if (type == CREDIT_CARD_NUMBER)
SetRawInfo(type, StripSeparators(value));
else
@@ -349,10 +351,11 @@ bool CreditCard::SetCanonicalizedInfo(AutofillFieldType type,
}
void CreditCard::GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const {
- FormGroup::GetMatchingTypes(text, matching_types);
+ FormGroup::GetMatchingTypes(text, app_locale, matching_types);
- string16 card_number = GetCanonicalizedInfo(CREDIT_CARD_NUMBER);
+ string16 card_number = GetInfo(CREDIT_CARD_NUMBER, app_locale);
if (!card_number.empty() && StripSeparators(text) == card_number)
matching_types->insert(CREDIT_CARD_NUMBER);
@@ -433,9 +436,10 @@ void CreditCard::operator=(const CreditCard& credit_card) {
guid_ = credit_card.guid_;
}
-bool CreditCard::UpdateFromImportedCard(const CreditCard& imported_card) {
- if (this->GetCanonicalizedInfo(CREDIT_CARD_NUMBER) !=
- imported_card.GetCanonicalizedInfo(CREDIT_CARD_NUMBER)) {
+bool CreditCard::UpdateFromImportedCard(const CreditCard& imported_card,
+ const std::string& app_locale) {
+ if (this->GetInfo(CREDIT_CARD_NUMBER, app_locale) !=
+ imported_card.GetInfo(CREDIT_CARD_NUMBER, app_locale)) {
return false;
}
@@ -459,19 +463,21 @@ void CreditCard::FillFormField(const AutofillField& field,
DCHECK_EQ(AutofillType::CREDIT_CARD, AutofillType(field.type()).group());
DCHECK(field_data);
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
+
if (field_data->form_control_type == "select-one") {
FillSelectControl(field.type(), field_data);
} else if (field_data->form_control_type == "month") {
// HTML5 input="month" consists of year-month.
- string16 year = GetCanonicalizedInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR);
- string16 month = GetCanonicalizedInfo(CREDIT_CARD_EXP_MONTH);
+ string16 year = GetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, app_locale);
+ string16 month = GetInfo(CREDIT_CARD_EXP_MONTH, app_locale);
if (!year.empty() && !month.empty()) {
// Fill the value only if |this| includes both year and month
// information.
field_data->value = year + ASCIIToUTF16("-") + month;
}
} else {
- field_data->value = GetCanonicalizedInfo(field.type());
+ field_data->value = GetInfo(field.type(), app_locale);
}
}
@@ -542,7 +548,7 @@ bool CreditCard::IsValidCreditCardNumber(const string16& text) {
bool CreditCard::IsEmpty() const {
FieldTypeSet types;
- GetNonEmptyTypes(&types);
+ GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &types);
return types.empty();
}
diff --git a/chrome/browser/autofill/credit_card.h b/chrome/browser/autofill/credit_card.h
index 714a4c5..6a37438 100644
--- a/chrome/browser/autofill/credit_card.h
+++ b/chrome/browser/autofill/credit_card.h
@@ -28,13 +28,16 @@ class CreditCard : public FormGroup {
// FormGroup implementation:
virtual std::string GetGUID() const OVERRIDE;
virtual void GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const OVERRIDE;
virtual string16 GetRawInfo(AutofillFieldType type) const OVERRIDE;
virtual void SetRawInfo(AutofillFieldType type,
const string16& value) OVERRIDE;
- virtual string16 GetCanonicalizedInfo(AutofillFieldType type) const OVERRIDE;
- virtual bool SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value) OVERRIDE;
+ virtual string16 GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const OVERRIDE;
+ virtual bool SetInfo(AutofillFieldType type,
+ const string16& value,
+ const std::string& app_locale) OVERRIDE;
virtual void FillFormField(const AutofillField& field,
size_t variant,
FormFieldData* field_data) const OVERRIDE;
@@ -63,8 +66,8 @@ class CreditCard : public FormGroup {
// If the card numbers for |this| and |imported_card| match, overwrites |this|
// card's data with the data in |credit_card| and returns true. Otherwise,
// returns false.
- bool UpdateFromImportedCard(const CreditCard& imported_card)
- WARN_UNUSED_RESULT;
+ bool UpdateFromImportedCard(const CreditCard& imported_card,
+ const std::string& app_locale) WARN_UNUSED_RESULT;
// Comparison for Sync. Returns 0 if the credit card is the same as |this|,
// or < 0, or > 0 if it is different. The implied ordering can be used for
diff --git a/chrome/browser/autofill/form_group.cc b/chrome/browser/autofill/form_group.cc
index b814c42..42dd19c6a 100644
--- a/chrome/browser/autofill/form_group.cc
+++ b/chrome/browser/autofill/form_group.cc
@@ -11,6 +11,7 @@
#include "base/logging.h"
#include "base/string_number_conversions.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/autofill/autofill_country.h"
#include "chrome/common/form_field_data.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
@@ -213,6 +214,7 @@ std::string FormGroup::GetGUID() const {
}
void FormGroup::GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const {
if (text.empty()) {
matching_types->insert(EMPTY_TYPE);
@@ -226,27 +228,30 @@ void FormGroup::GetMatchingTypes(const string16& text,
// TODO(isherman): Matches are case-sensitive for now. Let's keep an eye on
// this and decide whether there are compelling reasons to add case-
// insensitivity.
- if (GetRawInfo(*type) == text)
+ if (GetInfo(*type, app_locale) == text)
matching_types->insert(*type);
}
}
-void FormGroup::GetNonEmptyTypes(FieldTypeSet* non_empty_types) const {
+void FormGroup::GetNonEmptyTypes(const std::string& app_locale,
+ FieldTypeSet* non_empty_types) const {
FieldTypeSet types;
GetSupportedTypes(&types);
for (FieldTypeSet::const_iterator type = types.begin();
type != types.end(); ++type) {
- if (!GetRawInfo(*type).empty())
+ if (!GetInfo(*type, app_locale).empty())
non_empty_types->insert(*type);
}
}
-string16 FormGroup::GetCanonicalizedInfo(AutofillFieldType type) const {
+string16 FormGroup::GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const {
return GetRawInfo(type);
}
-bool FormGroup::SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value) {
+bool FormGroup::SetInfo(AutofillFieldType type,
+ const string16& value,
+ const std::string& app_locale) {
SetRawInfo(type, value);
return true;
}
@@ -263,7 +268,8 @@ void FormGroup::FillSelectControl(AutofillFieldType type,
DCHECK_EQ("select-one", field->form_control_type);
DCHECK_EQ(field->option_values.size(), field->option_contents.size());
- string16 field_text = GetCanonicalizedInfo(type);
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
+ string16 field_text = GetInfo(type, app_locale);
string16 field_text_lower = StringToLowerASCII(field_text);
if (field_text.empty())
return;
diff --git a/chrome/browser/autofill/form_group.h b/chrome/browser/autofill/form_group.h
index 807be86..edffeea 100644
--- a/chrome/browser/autofill/form_group.h
+++ b/chrome/browser/autofill/form_group.h
@@ -27,33 +27,37 @@ class FormGroup {
virtual std::string GetGUID() const;
// Used to determine the type of a field based on the text that a user enters
- // into the field. The field types can then be reported back to the server.
- // This method is additive on |matching_types|.
+ // 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
+ // additive on |matching_types|.
virtual void GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const;
// Returns a set of AutofillFieldTypes for which this FormGroup has non-empty
// data. This method is additive on |non_empty_types|.
- virtual void GetNonEmptyTypes(FieldTypeSet* non_empty_types) const;
+ virtual void GetNonEmptyTypes(const std::string& app_locale,
+ FieldTypeSet* non_empty_types) const;
// Returns the string associated with |type|, without canonicalizing the
- // returned value. For user-visible strings, use GetCanonicalizedInfo()
- // instead.
+ // returned value. For user-visible strings, use GetInfo() instead.
virtual string16 GetRawInfo(AutofillFieldType type) const = 0;
// Sets this FormGroup object's data for |type| to |value|, without
// canonicalizing the |value|. For data that has not already been
- // canonicalized, use SetCanonicalizedInfo() instead.
+ // canonicalized, use SetInfo() instead.
virtual void SetRawInfo(AutofillFieldType type, const string16& value) = 0;
// Returns the string that should be auto-filled into a text field given the
- // type of that field.
- virtual string16 GetCanonicalizedInfo(AutofillFieldType type) const;
+ // type of that field, localized to the given |app_locale| if appropriate.
+ virtual string16 GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const;
// Used to populate this FormGroup object with data. Canonicalizes the data
- // prior to storing, if appropriate.
- virtual bool SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value);
+ // according to the specified |app_locale| prior to storing, if appropriate.
+ virtual bool SetInfo(AutofillFieldType type,
+ const 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.
diff --git a/chrome/browser/autofill/personal_data_manager.cc b/chrome/browser/autofill/personal_data_manager.cc
index 387bc6d..9f687bd 100644
--- a/chrome/browser/autofill/personal_data_manager.cc
+++ b/chrome/browser/autofill/personal_data_manager.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/api/sync/profile_sync_service_base.h"
#include "chrome/browser/api/webdata/autofill_web_data_service.h"
#include "chrome/browser/autofill/autofill-inl.h"
+#include "chrome/browser/autofill/autofill_country.h"
#include "chrome/browser/autofill/autofill_field.h"
#include "chrome/browser/autofill/autofill_metrics.h"
#include "chrome/browser/autofill/autofill_regexes.h"
@@ -243,6 +244,7 @@ bool PersonalDataManager::ImportFormData(
// complete at the end.
PhoneNumber::PhoneCombineHelper home;
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
for (size_t i = 0; i < form.field_count(); ++i) {
const AutofillField* field = form.field(i);
string16 value = CollapseWhitespace(field->value, false);
@@ -270,7 +272,7 @@ bool PersonalDataManager::ImportFormData(
DCHECK_EQ(CREDIT_CARD_EXP_MONTH, field_type);
local_imported_credit_card->SetInfoForMonthInputType(value);
} else {
- local_imported_credit_card->SetCanonicalizedInfo(field_type, value);
+ local_imported_credit_card->SetInfo(field_type, value, app_locale);
}
++importable_credit_card_fields;
} else {
@@ -279,7 +281,7 @@ bool PersonalDataManager::ImportFormData(
// If the fields are not the phone fields in question home.SetInfo() is
// going to return false.
if (!home.SetInfo(field_type, value))
- imported_profile->SetCanonicalizedInfo(field_type, value);
+ imported_profile->SetInfo(field_type, value, app_locale);
// Reject profiles with invalid country information.
if (field_type == ADDRESS_HOME_COUNTRY &&
@@ -295,8 +297,8 @@ bool PersonalDataManager::ImportFormData(
string16 constructed_number;
if (!home.ParseNumber(imported_profile->CountryCode(),
&constructed_number) ||
- !imported_profile->SetCanonicalizedInfo(PHONE_HOME_WHOLE_NUMBER,
- constructed_number)) {
+ !imported_profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number,
+ app_locale)) {
imported_profile.reset();
}
}
@@ -320,7 +322,8 @@ bool PersonalDataManager::ImportFormData(
for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin();
iter != credit_cards_.end();
++iter) {
- if ((*iter)->UpdateFromImportedCard(*local_imported_credit_card.get())) {
+ if ((*iter)->UpdateFromImportedCard(*local_imported_credit_card.get(),
+ app_locale)) {
merged_credit_card = true;
UpdateCreditCard(**iter);
local_imported_credit_card.reset();
@@ -491,15 +494,16 @@ CreditCard* PersonalDataManager::GetCreditCardByGUID(const std::string& guid) {
void PersonalDataManager::GetNonEmptyTypes(
FieldTypeSet* non_empty_types) {
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
const std::vector<AutofillProfile*>& profiles = GetProfiles();
for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin();
iter != profiles.end(); ++iter) {
- (*iter)->GetNonEmptyTypes(non_empty_types);
+ (*iter)->GetNonEmptyTypes(app_locale, non_empty_types);
}
for (ScopedVector<CreditCard>::const_iterator iter = credit_cards_.begin();
iter != credit_cards_.end(); ++iter) {
- (*iter)->GetNonEmptyTypes(non_empty_types);
+ (*iter)->GetNonEmptyTypes(app_locale, non_empty_types);
}
}
@@ -859,13 +863,14 @@ void PersonalDataManager::SaveImportedCreditCard(
// Set to true if |imported_card| is merged into the credit card list.
bool merged = false;
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
std::vector<CreditCard> credit_cards;
for (std::vector<CreditCard*>::const_iterator card = credit_cards_.begin();
card != credit_cards_.end();
++card) {
// If |imported_card| has not yet been merged, check whether it should be
// with the current |card|.
- if (!merged && (*card)->UpdateFromImportedCard(imported_card))
+ if (!merged && (*card)->UpdateFromImportedCard(imported_card, app_locale))
merged = true;
credit_cards.push_back(**card);
diff --git a/chrome/browser/autofill/phone_number.cc b/chrome/browser/autofill/phone_number.cc
index e242521..e5027fa 100644
--- a/chrome/browser/autofill/phone_number.cc
+++ b/chrome/browser/autofill/phone_number.cc
@@ -8,6 +8,7 @@
#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/autofill/autofill_country.h"
#include "chrome/browser/autofill/autofill_profile.h"
#include "chrome/browser/autofill/autofill_type.h"
#include "chrome/browser/autofill/field_types.h"
@@ -63,25 +64,9 @@ string16 PhoneNumber::GetRawInfo(AutofillFieldType type) const {
if (type == PHONE_HOME_WHOLE_NUMBER)
return number_;
- UpdateCacheIfNeeded();
- if (!cached_parsed_phone_.IsValidNumber())
- return string16();
-
- if (type == PHONE_HOME_NUMBER)
- return cached_parsed_phone_.GetNumber();
-
- if (type == PHONE_HOME_CITY_CODE)
- return cached_parsed_phone_.GetCityCode();
-
- if (type == PHONE_HOME_COUNTRY_CODE)
- return cached_parsed_phone_.GetCountryCode();
-
- if (type == PHONE_HOME_CITY_AND_NUMBER) {
- string16 city_and_local(cached_parsed_phone_.GetCityCode());
- city_and_local.append(cached_parsed_phone_.GetNumber());
- return city_and_local;
- }
-
+ // Only the whole number is available as raw data. All of the other types are
+ // parsed from this raw info, and parsing requires knowledge of the phone
+ // number's region, which is only available via GetInfo().
return string16();
}
@@ -94,79 +79,110 @@ void PhoneNumber::SetRawInfo(AutofillFieldType type, const string16& value) {
}
number_ = value;
- cached_parsed_phone_ = autofill_i18n::PhoneObject(number_, GetRegion());
+
+ // Invalidate the cached number.
+ cached_parsed_phone_ = autofill_i18n::PhoneObject();
}
// Normalize phones if |type| is a whole number:
// (650)2345678 -> 6502345678
// 1-800-FLOWERS -> 18003569377
// If the phone cannot be normalized, returns the stored value verbatim.
-string16 PhoneNumber::GetCanonicalizedInfo(AutofillFieldType type) const {
- string16 phone = GetRawInfo(type);
- if (type != PHONE_HOME_WHOLE_NUMBER)
- return phone;
+string16 PhoneNumber::GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const {
+ if (type == PHONE_HOME_WHOLE_NUMBER) {
+ // Whole numbers require special handling: If normalization for the number
+ // fails, return the non-normalized number instead.
+ string16 phone = GetRawInfo(type);
+
+ // TODO(isherman): Can/should this use the cached_parsed_phone_?
+ string16 normalized_phone =
+ autofill_i18n::NormalizePhoneNumber(phone, GetRegion(app_locale));
+ return !normalized_phone.empty() ? normalized_phone : phone;
+ }
+
+ UpdateCacheIfNeeded(app_locale);
+ if (!cached_parsed_phone_.IsValidNumber())
+ return string16();
+
+ switch (type) {
+ case PHONE_HOME_NUMBER:
+ return cached_parsed_phone_.GetNumber();
+
+ case PHONE_HOME_CITY_CODE:
+ return cached_parsed_phone_.GetCityCode();
+
+ case PHONE_HOME_COUNTRY_CODE:
+ return cached_parsed_phone_.GetCountryCode();
- string16 normalized_phone = autofill_i18n::NormalizePhoneNumber(phone,
- GetRegion());
- if (!normalized_phone.empty())
- return normalized_phone;
+ case PHONE_HOME_CITY_AND_NUMBER:
+ return
+ cached_parsed_phone_.GetCityCode() + cached_parsed_phone_.GetNumber();
- return phone;
+ case PHONE_HOME_WHOLE_NUMBER:
+ NOTREACHED(); // Should have been handled above.
+ return string16();
+
+ default:
+ NOTREACHED();
+ return string16();
+ }
}
-bool PhoneNumber::SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value) {
+bool PhoneNumber::SetInfo(AutofillFieldType type,
+ const string16& value,
+ const std::string& app_locale) {
string16 number = value;
StripPunctuation(&number);
SetRawInfo(type, number);
- return NormalizePhone();
+ if (number_.empty())
+ return true;
+
+ // Normalize the phone number by validating and translating it into a
+ // digits-only format.
+ UpdateCacheIfNeeded(app_locale);
+ number_ = cached_parsed_phone_.GetWholeNumber();
+ return !number_.empty();
}
void PhoneNumber::GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const {
string16 stripped_text = text;
StripPunctuation(&stripped_text);
- FormGroup::GetMatchingTypes(stripped_text, matching_types);
+ FormGroup::GetMatchingTypes(stripped_text, app_locale, matching_types);
// For US numbers, also compare to the three-digit prefix and the four-digit
// suffix, since web sites often split numbers into these two fields.
- string16 number = GetCanonicalizedInfo(PHONE_HOME_NUMBER);
- if (GetRegion() == "US" && number.size() == (kPrefixLength + kSuffixLength)) {
+ string16 number = GetInfo(PHONE_HOME_NUMBER, app_locale);
+ if (GetRegion(app_locale) == "US" &&
+ number.size() == (kPrefixLength + kSuffixLength)) {
string16 prefix = number.substr(kPrefixOffset, kPrefixLength);
string16 suffix = number.substr(kSuffixOffset, kSuffixLength);
if (text == prefix || text == suffix)
matching_types->insert(PHONE_HOME_NUMBER);
}
- string16 whole_number = GetCanonicalizedInfo(PHONE_HOME_WHOLE_NUMBER);
- if (!whole_number.empty() &&
- autofill_i18n::NormalizePhoneNumber(text, GetRegion()) == whole_number) {
- matching_types->insert(PHONE_HOME_WHOLE_NUMBER);
+ string16 whole_number = GetInfo(PHONE_HOME_WHOLE_NUMBER, app_locale);
+ if (!whole_number.empty()) {
+ string16 normalized_number =
+ autofill_i18n::NormalizePhoneNumber(text, GetRegion(app_locale));
+ if (normalized_number == whole_number)
+ matching_types->insert(PHONE_HOME_WHOLE_NUMBER);
}
}
-bool PhoneNumber::NormalizePhone() {
- // Empty number does not need normalization.
- if (number_.empty())
- return true;
-
- UpdateCacheIfNeeded();
- number_ = cached_parsed_phone_.GetWholeNumber();
- return !number_.empty();
-}
-
-std::string PhoneNumber::GetRegion() const {
- if (!profile_) {
- NOTREACHED();
- return "US";
- }
+std::string PhoneNumber::GetRegion(const std::string& app_locale) const {
+ const std::string country_code = profile_->CountryCode();
+ if (country_code.empty())
+ return AutofillCountry::CountryCodeForLocale(app_locale);
- return profile_->CountryCode();
+ return country_code;
}
-void PhoneNumber::UpdateCacheIfNeeded() const {
- std::string region = GetRegion();
+void PhoneNumber::UpdateCacheIfNeeded(const std::string& app_locale) const {
+ std::string region = GetRegion(app_locale);
if (!number_.empty() && cached_parsed_phone_.GetRegion() != region)
cached_parsed_phone_ = autofill_i18n::PhoneObject(number_, region);
}
@@ -215,8 +231,7 @@ bool PhoneNumber::PhoneCombineHelper::ParseNumber(const std::string& region,
}
return autofill_i18n::ConstructPhoneNumber(
- country_, city_, phone_,
- region,
+ country_, city_, phone_, region,
(country_.empty() ?
autofill_i18n::NATIONAL : autofill_i18n::INTERNATIONAL),
value);
diff --git a/chrome/browser/autofill/phone_number.h b/chrome/browser/autofill/phone_number.h
index 192b4a83..a4ce5c6 100644
--- a/chrome/browser/autofill/phone_number.h
+++ b/chrome/browser/autofill/phone_number.h
@@ -29,13 +29,16 @@ class PhoneNumber : public FormGroup {
// FormGroup implementation:
virtual void GetMatchingTypes(const string16& text,
+ const std::string& app_locale,
FieldTypeSet* matching_types) const OVERRIDE;
virtual string16 GetRawInfo(AutofillFieldType type) const OVERRIDE;
virtual void SetRawInfo(AutofillFieldType type,
const string16& value) OVERRIDE;
- virtual string16 GetCanonicalizedInfo(AutofillFieldType type) const OVERRIDE;
- virtual bool SetCanonicalizedInfo(AutofillFieldType type,
- const string16& value) OVERRIDE;
+ virtual string16 GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const OVERRIDE;
+ virtual bool SetInfo(AutofillFieldType type,
+ const string16& value,
+ const std::string& app_locale) OVERRIDE;
// Size and offset of the prefix and suffix portions of phone numbers.
static const size_t kPrefixOffset = 0;
@@ -70,18 +73,16 @@ class PhoneNumber : public FormGroup {
// FormGroup:
virtual void GetSupportedTypes(FieldTypeSet* supported_types) const OVERRIDE;
- // Validates |number_| and translates it into digits-only format.
- bool NormalizePhone();
-
// Returns the region code for this phone number, which is an ISO 3166
// 2-letter country code. The name "region" is chosen since "country code"
// already refers to part of a phone number. The returned value is based on
- // the |profile_|.
- std::string GetRegion() const;
+ // the |profile_|; if the |profile_| does not have a country code associated
+ // with it, falls back to the country code corresponding to the |app_locale|.
+ std::string GetRegion(const std::string& app_locale) const;
// Updates the cached parsed number if the profile's region has changed
// since the last time the cache was updated.
- void UpdateCacheIfNeeded() const;
+ void UpdateCacheIfNeeded(const std::string& app_locale) const;
// The phone number.
string16 number_;
diff --git a/chrome/browser/autofill/phone_number_i18n.h b/chrome/browser/autofill/phone_number_i18n.h
index ad990ef..7b9a140 100644
--- a/chrome/browser/autofill/phone_number_i18n.h
+++ b/chrome/browser/autofill/phone_number_i18n.h
@@ -67,7 +67,7 @@ bool ConstructPhoneNumber(const string16& country_code,
bool PhoneNumbersMatch(const string16& number_a,
const string16& number_b,
- const std::string& country_code);
+ const std::string& region);
// The cached phone number, does parsing only once, improves performance.
class PhoneObject {
diff --git a/chrome/browser/autofill/phone_number_unittest.cc b/chrome/browser/autofill/phone_number_unittest.cc
index df49d01..c2c77e1 100644
--- a/chrome/browser/autofill/phone_number_unittest.cc
+++ b/chrome/browser/autofill/phone_number_unittest.cc
@@ -16,62 +16,65 @@ TEST(PhoneNumberTest, Matcher) {
// Set phone number so country_code == 1, city_code = 650, number = 2345678.
string16 phone(ASCIIToUTF16("1 [650] 234-5678"));
PhoneNumber phone_number(&profile);
- phone_number.SetCanonicalizedInfo(PHONE_HOME_WHOLE_NUMBER, phone);
+ phone_number.SetInfo(PHONE_HOME_WHOLE_NUMBER, phone, "US");
FieldTypeSet matching_types;
- phone_number.GetMatchingTypes(string16(), &matching_types);
+ phone_number.GetMatchingTypes(string16(), "US", &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(EMPTY_TYPE) != matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("1"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("1"), "US", &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_COUNTRY_CODE) !=
matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("16"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("16"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
- phone_number.GetMatchingTypes(ASCIIToUTF16("165"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("165"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
- phone_number.GetMatchingTypes(ASCIIToUTF16("1650"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("1650"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
- phone_number.GetMatchingTypes(ASCIIToUTF16("16502"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("16502"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
- phone_number.GetMatchingTypes(ASCIIToUTF16("165023"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("165023"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
- phone_number.GetMatchingTypes(ASCIIToUTF16("1650234"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("1650234"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("16502345678"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("16502345678"), "US",
+ &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_WHOLE_NUMBER) !=
matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("650"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("650"), "US", &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_CITY_CODE) !=
matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("2345678"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("2345678"), "US", &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_NUMBER) != matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("234"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("234"), "US", &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_NUMBER) != matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("5678"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("5678"), "US", &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_NUMBER) != matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("2345"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("2345"), "US", &matching_types);
EXPECT_EQ(0U, matching_types.size());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("6502345678"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("6502345678"), "US",
+ &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_CITY_AND_NUMBER) !=
matching_types.end());
matching_types.clear();
- phone_number.GetMatchingTypes(ASCIIToUTF16("(650)2345678"), &matching_types);
+ phone_number.GetMatchingTypes(ASCIIToUTF16("(650)2345678"), "US",
+ &matching_types);
EXPECT_EQ(1U, matching_types.size());
EXPECT_TRUE(matching_types.find(PHONE_HOME_CITY_AND_NUMBER) !=
matching_types.end());
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller.cc b/chrome/browser/ui/autofill/autofill_dialog_controller.cc
index ced7417..a97c5ab 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller.cc
@@ -6,6 +6,7 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/autofill/autofill_country.h"
#include "chrome/browser/autofill/autofill_manager.h"
#include "chrome/browser/autofill/personal_data_manager.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
@@ -82,6 +83,8 @@ template<class T> FormGroup* GetBestDataSource(
const std::vector<T*>& sources,
const DetailInputs* const* all_inputs,
size_t all_inputs_length) {
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
+
int best_field_fill_count = 0;
FormGroup* best_source = NULL;
@@ -91,9 +94,8 @@ template<class T> FormGroup* GetBestDataSource(
for (size_t j = 0; j < all_inputs_length; ++j) {
const DetailInputs& inputs = *all_inputs[j];
for (size_t k = 0; k < inputs.size(); ++k) {
- if (!sources[i]->GetCanonicalizedInfo(inputs[k].type).empty()) {
+ if (!sources[i]->GetInfo(inputs[k].type, app_locale).empty())
field_fill_count++;
- }
}
}
@@ -112,10 +114,11 @@ template<class T> FormGroup* GetBestDataSource(
void FillInputsFromFormGroup(FormGroup* group,
DetailInputs** all_inputs,
size_t all_inputs_length) {
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
for (size_t i = 0; i < all_inputs_length; ++i) {
DetailInputs& inputs = *all_inputs[i];
for (size_t j = 0; j < inputs.size(); ++j) {
- inputs[j].starting_value = group->GetCanonicalizedInfo(inputs[j].type);
+ inputs[j].starting_value = group->GetInfo(inputs[j].type, app_locale);
}
}
}
@@ -348,8 +351,9 @@ void AutofillDialogController::GenerateComboboxModels() {
suggested_cc_.AddItem("", ASCIIToUTF16("Enter new card"));
const std::vector<AutofillProfile*>& profiles = manager->GetProfiles();
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
for (size_t i = 0; i < profiles.size(); ++i) {
- string16 email = profiles[i]->GetCanonicalizedInfo(EMAIL_ADDRESS);
+ string16 email = profiles[i]->GetInfo(EMAIL_ADDRESS, app_locale);
if (!email.empty())
suggested_email_.AddItem(profiles[i]->guid(), email);
suggested_billing_.AddItem(profiles[i]->guid(), profiles[i]->Label());