summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-05 20:13:23 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-05 20:13:23 +0000
commit0b2f513b8e24956466fcb04fad1d912ff8cfe65b (patch)
treeaa76fe9bd680e19131a54aadd6c43732f62ec785
parent33959607f032668f0da22f9332e7f95c5f037121 (diff)
downloadchromium_src-0b2f513b8e24956466fcb04fad1d912ff8cfe65b.zip
chromium_src-0b2f513b8e24956466fcb04fad1d912ff8cfe65b.tar.gz
chromium_src-0b2f513b8e24956466fcb04fad1d912ff8cfe65b.tar.bz2
Remove application locale cache in autofill code (AutofillCountry::ApplicationLOcale).
This is in preparation for removing content::GetContentClient calls outside of content. BUG=227047 Review URL: https://codereview.chromium.org/13488009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@192622 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/android/tab_android.cc4
-rw-r--r--chrome/browser/autofill/autofill_external_delegate_browsertest.cc5
-rw-r--r--chrome/browser/autofill/personal_data_manager_factory.cc4
-rw-r--r--chrome/browser/sync/profile_sync_service_autofill_unittest.cc7
-rw-r--r--chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc13
-rw-r--r--chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc2
-rw-r--r--chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc2
-rw-r--r--chrome/browser/ui/autofill/country_combobox_model.cc3
-rw-r--r--chrome/browser/ui/autofill/data_model_wrapper.cc19
-rw-r--r--chrome/browser/ui/browser_tab_contents.cc4
-rw-r--r--chrome/browser/ui/webui/options/autofill_options_handler.cc12
-rw-r--r--chrome/browser/webdata/autofill_profile_syncable_service.cc7
-rw-r--r--chrome/browser/webdata/autofill_profile_syncable_service.h8
-rw-r--r--chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc6
-rw-r--r--chrome/browser/webdata/web_data_service_factory.cc3
-rw-r--r--chrome_frame/test/delete_chrome_history_test.cc2
-rw-r--r--components/autofill/browser/autocheckout_manager.cc11
-rw-r--r--components/autofill/browser/autocomplete_history_manager_unittest.cc2
-rw-r--r--components/autofill/browser/autofill_country.cc31
-rw-r--r--components/autofill/browser/autofill_country.h6
-rw-r--r--components/autofill/browser/autofill_ie_toolbar_import_win.cc23
-rw-r--r--components/autofill/browser/autofill_ie_toolbar_import_win_unittest.cc7
-rw-r--r--components/autofill/browser/autofill_manager.cc17
-rw-r--r--components/autofill/browser/autofill_manager.h10
-rw-r--r--components/autofill/browser/autofill_manager_unittest.cc2
-rw-r--r--components/autofill/browser/autofill_merge_unittest.cc5
-rw-r--r--components/autofill/browser/autofill_metrics_unittest.cc4
-rw-r--r--components/autofill/browser/autofill_profile.cc56
-rw-r--r--components/autofill/browser/autofill_profile.h14
-rw-r--r--components/autofill/browser/autofill_profile_unittest.cc20
-rw-r--r--components/autofill/browser/credit_card.cc10
-rw-r--r--components/autofill/browser/credit_card.h3
-rw-r--r--components/autofill/browser/credit_card_unittest.cc18
-rw-r--r--components/autofill/browser/form_group.cc10
-rw-r--r--components/autofill/browser/form_group.h5
-rw-r--r--components/autofill/browser/personal_data_manager.cc85
-rw-r--r--components/autofill/browser/personal_data_manager.h9
-rw-r--r--components/autofill/browser/personal_data_manager_mac.mm18
-rw-r--r--components/autofill/browser/personal_data_manager_unittest.cc2
-rw-r--r--components/autofill/browser/phone_number_i18n.cc28
-rw-r--r--components/autofill/browser/phone_number_i18n.h6
-rw-r--r--components/autofill/browser/phone_number_i18n_unittest.cc30
-rw-r--r--components/autofill/browser/wallet/wallet_address.cc6
-rw-r--r--components/autofill/browser/wallet/wallet_address.h3
-rw-r--r--components/autofill/browser/wallet/wallet_items.cc6
-rw-r--r--components/autofill/browser/wallet/wallet_items.h3
-rw-r--r--components/webdata/autofill/autofill_table.cc8
-rw-r--r--components/webdata/autofill/autofill_table.h2
-rw-r--r--components/webdata/autofill/autofill_table_unittest.cc2
-rw-r--r--components/webdata/autofill/web_data_service_unittest.cc2
-rw-r--r--components/webdata/autofill/web_database_migration_unittest.cc2
51 files changed, 312 insertions, 255 deletions
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index 71a847b..4e41e71 100644
--- a/chrome/browser/android/tab_android.cc
+++ b/chrome/browser/android/tab_android.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/android/tab_android.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "chrome/browser/extensions/tab_helper.h"
#include "chrome/browser/favicon/favicon_tab_helper.h"
@@ -64,7 +65,8 @@ void BrowserTabContents::AttachTabHelpers(WebContents* contents) {
autofill::TabAutofillManagerDelegate::CreateForWebContents(contents);
AutofillManager::CreateForWebContentsAndDelegate(
contents,
- autofill::TabAutofillManagerDelegate::FromWebContents(contents));
+ autofill::TabAutofillManagerDelegate::FromWebContents(contents),
+ g_browser_process->GetApplicationLocale());
AutofillExternalDelegate::CreateForWebContentsAndManager(
contents, AutofillManager::FromWebContents(contents));
AutofillManager::FromWebContents(contents)->SetExternalDelegate(
diff --git a/chrome/browser/autofill/autofill_external_delegate_browsertest.cc b/chrome/browser/autofill/autofill_external_delegate_browsertest.cc
index d0697f3..1dbc114 100644
--- a/chrome/browser/autofill/autofill_external_delegate_browsertest.cc
+++ b/chrome/browser/autofill/autofill_external_delegate_browsertest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/memory/scoped_ptr.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -58,7 +59,9 @@ class TestAutofillManager : public AutofillManager {
public:
TestAutofillManager(content::WebContents* web_contents,
autofill::AutofillManagerDelegate* delegate)
- : AutofillManager(web_contents, delegate) {}
+ : AutofillManager(web_contents,
+ delegate,
+ g_browser_process->GetApplicationLocale()) {}
virtual ~TestAutofillManager() {}
private:
diff --git a/chrome/browser/autofill/personal_data_manager_factory.cc b/chrome/browser/autofill/personal_data_manager_factory.cc
index 803c628..7150b17 100644
--- a/chrome/browser/autofill/personal_data_manager_factory.cc
+++ b/chrome/browser/autofill/personal_data_manager_factory.cc
@@ -6,6 +6,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/singleton.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_dependency_manager.h"
#include "chrome/browser/webdata/web_data_service_factory.h"
@@ -28,7 +29,8 @@ class PersonalDataManagerServiceImpl : public PersonalDataManagerService {
PersonalDataManagerServiceImpl::PersonalDataManagerServiceImpl(
Profile* profile) {
- personal_data_manager_.reset(new PersonalDataManager());
+ personal_data_manager_.reset(new PersonalDataManager(
+ g_browser_process->GetApplicationLocale()));
personal_data_manager_->Init(profile);
}
diff --git a/chrome/browser/sync/profile_sync_service_autofill_unittest.cc b/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
index 8b0b4a9..6d73ee2 100644
--- a/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_autofill_unittest.cc
@@ -102,7 +102,7 @@ void RunAndSignal(const base::Closure& cb, WaitableEvent* event) {
class AutofillTableMock : public AutofillTable {
public:
- AutofillTableMock() : AutofillTable() {}
+ AutofillTableMock() : AutofillTable("en-US") {}
MOCK_METHOD2(RemoveFormElement,
bool(const string16& name, const string16& value)); // NOLINT
MOCK_METHOD1(GetAllAutofillEntries,
@@ -386,6 +386,7 @@ class AutofillProfileFactory : public AbstractAutofillFactory {
class MockPersonalDataManager : public PersonalDataManager {
public:
+ MockPersonalDataManager() : PersonalDataManager("en-US") {}
MOCK_CONST_METHOD0(IsDataLoaded, bool());
MOCK_METHOD0(LoadProfiles, void());
MOCK_METHOD0(LoadCreditCards, void());
@@ -1089,7 +1090,7 @@ TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfileCombine) {
"91601", "US", "19482937549");
AutofillProfile expected_profile(sync_profile);
- expected_profile.OverwriteWithOrAddTo(*native_profile);
+ expected_profile.OverwriteWithOrAddTo(*native_profile, "en-US");
std::vector<AutofillProfile*> native_profiles;
native_profiles.push_back(native_profile);
@@ -1114,7 +1115,7 @@ TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfileCombine) {
&new_sync_profiles));
ASSERT_EQ(1U, new_sync_profiles.size());
// Check that key fields are the same.
- EXPECT_TRUE(new_sync_profiles[0].IsSubsetOf(sync_profile));
+ EXPECT_TRUE(new_sync_profiles[0].IsSubsetOf(sync_profile, "en-US"));
// Check that multivalued fields of the synced back data include original
// data.
EXPECT_TRUE(IncludesField(new_sync_profiles[0], sync_profile, NAME_FULL));
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
index a2b66da..197287de 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
@@ -30,7 +30,6 @@
#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_country.h"
#include "components/autofill/browser/autofill_manager.h"
#include "components/autofill/browser/autofill_type.h"
#include "components/autofill/browser/personal_data_manager.h"
@@ -141,10 +140,9 @@ void BuildInputs(const DetailInput* input_template,
// Uses |group| to fill in the |initial_value| for all inputs in |all_inputs|
// (an out-param).
void FillInputFromFormGroup(FormGroup* group, DetailInputs* inputs) {
- const std::string app_locale = AutofillCountry::ApplicationLocale();
+ const std::string app_locale = g_browser_process->GetApplicationLocale();
for (size_t j = 0; j < inputs->size(); ++j) {
- (*inputs)[j].initial_value =
- group->GetInfo((*inputs)[j].type, app_locale);
+ (*inputs)[j].initial_value = group->GetInfo((*inputs)[j].type, app_locale);
}
}
@@ -1659,7 +1657,7 @@ void AutofillDialogControllerImpl::SuggestionsUpdated() {
}
const std::vector<AutofillProfile*>& profiles = manager->GetProfiles();
- const std::string app_locale = AutofillCountry::ApplicationLocale();
+ const std::string app_locale = g_browser_process->GetApplicationLocale();
for (size_t i = 0; i < profiles.size(); ++i) {
if (!IsCompleteProfile(*profiles[i]))
continue;
@@ -1702,7 +1700,7 @@ void AutofillDialogControllerImpl::SuggestionsUpdated() {
bool AutofillDialogControllerImpl::IsCompleteProfile(
const AutofillProfile& profile) {
- const std::string app_locale = AutofillCountry::ApplicationLocale();
+ const std::string app_locale = g_browser_process->GetApplicationLocale();
for (size_t i = 0; i < requested_shipping_fields_.size(); ++i) {
AutofillFieldType type = requested_shipping_fields_[i].type;
if (type != ADDRESS_HOME_LINE2 &&
@@ -1773,13 +1771,14 @@ void AutofillDialogControllerImpl::FillFormStructureForSection(
size_t variant,
DialogSection section,
const InputFieldComparator& compare) {
+ std::string app_locale = g_browser_process->GetApplicationLocale();
for (size_t i = 0; i < form_structure_.field_count(); ++i) {
AutofillField* field = form_structure_.field(i);
// Only fill in data that is associated with this section.
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, field);
+ form_group.FillFormField(*field, variant, app_locale, field);
break;
}
}
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc
index c45a959..ab59009 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc
@@ -66,7 +66,7 @@ class TestAutofillDialogView : public AutofillDialogView {
class TestPersonalDataManager : public PersonalDataManager {
public:
- TestPersonalDataManager() {}
+ TestPersonalDataManager() : PersonalDataManager("en-US") {}
virtual ~TestPersonalDataManager() {}
void AddTestingProfile(AutofillProfile* profile) {
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
index 317a2ee..4267b2c 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
@@ -143,7 +143,7 @@ class AutofillPopupControllerUnitTest : public ChromeRenderViewHostTestHarness {
ChromeRenderViewHostTestHarness::SetUp();
AutofillManager::CreateForWebContentsAndDelegate(
- web_contents(), manager_delegate_.get());
+ web_contents(), manager_delegate_.get(), "en-US");
external_delegate_.reset(
new NiceMock<MockAutofillExternalDelegate>(
web_contents(), AutofillManager::FromWebContents(web_contents())));
diff --git a/chrome/browser/ui/autofill/country_combobox_model.cc b/chrome/browser/ui/autofill/country_combobox_model.cc
index 462d77f..fafa49c 100644
--- a/chrome/browser/ui/autofill/country_combobox_model.cc
+++ b/chrome/browser/ui/autofill/country_combobox_model.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/ui/autofill/country_combobox_model.h"
+#include "chrome/browser/browser_process.h"
#include "components/autofill/browser/autofill_country.h"
#include "ui/base/l10n/l10n_util_collator.h"
@@ -11,7 +12,7 @@ namespace autofill {
CountryComboboxModel::CountryComboboxModel() {
// Insert the default country at the top as well as in the ordered list.
- std::string app_locale = AutofillCountry::ApplicationLocale();
+ std::string app_locale = g_browser_process->GetApplicationLocale();
std::string default_country_code =
AutofillCountry::CountryCodeForLocale(app_locale);
countries_.push_back(new AutofillCountry(default_country_code, app_locale));
diff --git a/chrome/browser/ui/autofill/data_model_wrapper.cc b/chrome/browser/ui/autofill/data_model_wrapper.cc
index 0d76987..b30053c 100644
--- a/chrome/browser/ui/autofill/data_model_wrapper.cc
+++ b/chrome/browser/ui/autofill/data_model_wrapper.cc
@@ -6,8 +6,8 @@
#include "base/callback.h"
#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_country.h"
#include "components/autofill/browser/autofill_profile.h"
#include "components/autofill/browser/autofill_type.h"
#include "components/autofill/browser/credit_card.h"
@@ -77,11 +77,12 @@ AutofillFormGroupWrapper::AutofillFormGroupWrapper(const FormGroup* form_group,
AutofillFormGroupWrapper::~AutofillFormGroupWrapper() {}
string16 AutofillFormGroupWrapper::GetInfo(AutofillFieldType type) {
- return form_group_->GetInfo(type, AutofillCountry::ApplicationLocale());
+ return form_group_->GetInfo(type, g_browser_process->GetApplicationLocale());
}
void AutofillFormGroupWrapper::FillFormField(AutofillField* field) {
- form_group_->FillFormField(*field, variant_, field);
+ form_group_->FillFormField(
+ *field, variant_, g_browser_process->GetApplicationLocale(), field);
}
// AutofillProfileWrapper
@@ -94,7 +95,7 @@ AutofillProfileWrapper::AutofillProfileWrapper(
AutofillProfileWrapper::~AutofillProfileWrapper() {}
void AutofillProfileWrapper::FillInputs(DetailInputs* inputs) {
- const std::string app_locale = AutofillCountry::ApplicationLocale();
+ const std::string app_locale = g_browser_process->GetApplicationLocale();
for (size_t j = 0; j < inputs->size(); ++j) {
std::vector<string16> values;
profile_->GetMultiInfo((*inputs)[j].type, app_locale, &values);
@@ -149,7 +150,7 @@ WalletAddressWrapper::WalletAddressWrapper(
WalletAddressWrapper::~WalletAddressWrapper() {}
string16 WalletAddressWrapper::GetInfo(AutofillFieldType type) {
- return address_->GetInfo(type);
+ return address_->GetInfo(type, g_browser_process->GetApplicationLocale());
}
// WalletInstrumentWrapper
@@ -164,7 +165,7 @@ string16 WalletInstrumentWrapper::GetInfo(AutofillFieldType type) {
if (type == CREDIT_CARD_EXP_MONTH)
return MonthComboboxModel::FormatMonth(instrument_->expiration_month());
- return instrument_->GetInfo(type);
+ return instrument_->GetInfo(type, g_browser_process->GetApplicationLocale());
}
gfx::Image WalletInstrumentWrapper::GetIcon() {
@@ -192,7 +193,8 @@ string16 FullWalletBillingWrapper::GetInfo(AutofillFieldType type) {
if (AutofillType(type).group() == AutofillType::CREDIT_CARD)
return full_wallet_->GetInfo(type);
- return full_wallet_->billing_address()->GetInfo(type);
+ return full_wallet_->billing_address()->GetInfo(
+ type, g_browser_process->GetApplicationLocale());
}
// FullWalletShippingWrapper
@@ -206,7 +208,8 @@ FullWalletShippingWrapper::FullWalletShippingWrapper(
FullWalletShippingWrapper::~FullWalletShippingWrapper() {}
string16 FullWalletShippingWrapper::GetInfo(AutofillFieldType type) {
- return full_wallet_->shipping_address()->GetInfo(type);
+ return full_wallet_->shipping_address()->GetInfo(
+ type, g_browser_process->GetApplicationLocale());
}
} // namespace autofill
diff --git a/chrome/browser/ui/browser_tab_contents.cc b/chrome/browser/ui/browser_tab_contents.cc
index 92f868f..c4fe56c 100644
--- a/chrome/browser/ui/browser_tab_contents.cc
+++ b/chrome/browser/ui/browser_tab_contents.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/browser_tab_contents.h"
#include "base/command_line.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
#include "chrome/browser/extensions/tab_helper.h"
@@ -106,7 +107,8 @@ void BrowserTabContents::AttachTabHelpers(WebContents* web_contents) {
autofill::TabAutofillManagerDelegate::CreateForWebContents(web_contents);
AutofillManager::CreateForWebContentsAndDelegate(
web_contents,
- autofill::TabAutofillManagerDelegate::FromWebContents(web_contents));
+ autofill::TabAutofillManagerDelegate::FromWebContents(web_contents),
+ g_browser_process->GetApplicationLocale());
if (!CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableNativeAutofillUi)) {
AutofillExternalDelegate::CreateForWebContentsAndManager(
diff --git a/chrome/browser/ui/webui/options/autofill_options_handler.cc b/chrome/browser/ui/webui/options/autofill_options_handler.cc
index 96c30b0..47202f9 100644
--- a/chrome/browser/ui/webui/options/autofill_options_handler.cc
+++ b/chrome/browser/ui/webui/options/autofill_options_handler.cc
@@ -15,6 +15,7 @@
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/autofill/country_combobox_model.h"
#include "chrome/common/url_constants.h"
@@ -33,9 +34,8 @@ namespace {
// Sets data related to the country <select>.
void SetCountryData(DictionaryValue* localized_strings) {
- std::string app_locale = AutofillCountry::ApplicationLocale();
- std::string default_country_code =
- AutofillCountry::CountryCodeForLocale(app_locale);
+ std::string default_country_code = AutofillCountry::CountryCodeForLocale(
+ g_browser_process->GetApplicationLocale());
localized_strings->SetString("defaultCountryCode", default_country_code);
autofill::CountryComboboxModel model;
@@ -199,6 +199,7 @@ void RemoveDuplicatePhoneNumberAtIndex(size_t index,
}
bool is_duplicate = false;
+ std::string app_locale = g_browser_process->GetApplicationLocale();
for (size_t i = 0; i < list->GetSize() && !is_duplicate; ++i) {
if (i == index)
continue;
@@ -208,9 +209,8 @@ void RemoveDuplicatePhoneNumberAtIndex(size_t index,
NOTREACHED() << "List should have a value at index " << i;
continue;
}
- is_duplicate = autofill_i18n::PhoneNumbersMatch(new_value,
- existing_value,
- country_code);
+ is_duplicate = autofill_i18n::PhoneNumbersMatch(
+ new_value, existing_value, country_code, app_locale);
}
if (is_duplicate)
diff --git a/chrome/browser/webdata/autofill_profile_syncable_service.cc b/chrome/browser/webdata/autofill_profile_syncable_service.cc
index 348a849..952a4d8 100644
--- a/chrome/browser/webdata/autofill_profile_syncable_service.cc
+++ b/chrome/browser/webdata/autofill_profile_syncable_service.cc
@@ -143,7 +143,7 @@ AutofillProfileSyncableService::MergeDataAndStartSyncing(
remaining_profiles.find(it->first);
if (profile_to_merge != remaining_profiles.end()) {
bundle.profiles_to_delete.push_back(profile_to_merge->second->guid());
- if (MergeProfile(*(profile_to_merge->second), it->second))
+ if (MergeProfile(*(profile_to_merge->second), it->second, app_locale_))
bundle.profiles_to_sync_back.push_back(it->second);
DVLOG(2) << "[AUTOFILL SYNC]"
<< "Found similar profile in sync db but with a different guid: "
@@ -563,8 +563,9 @@ bool AutofillProfileSyncableService::UpdateMultivaluedField(
bool AutofillProfileSyncableService::MergeProfile(
const AutofillProfile& merge_from,
- AutofillProfile* merge_into) {
- merge_into->OverwriteWithOrAddTo(merge_from);
+ AutofillProfile* merge_into,
+ const std::string& app_locale) {
+ merge_into->OverwriteWithOrAddTo(merge_from, app_locale);
return (merge_into->Compare(merge_from) != 0);
}
diff --git a/chrome/browser/webdata/autofill_profile_syncable_service.h b/chrome/browser/webdata/autofill_profile_syncable_service.h
index 997b6b7..ab0165e 100644
--- a/chrome/browser/webdata/autofill_profile_syncable_service.h
+++ b/chrome/browser/webdata/autofill_profile_syncable_service.h
@@ -73,9 +73,8 @@ class AutofillProfileSyncableService
const AutofillProfileChange& change) OVERRIDE;
protected:
- explicit AutofillProfileSyncableService(
- AutofillWebDataService* web_data_service,
- const std::string& app_locale);
+ AutofillProfileSyncableService(AutofillWebDataService* web_data_service,
+ const std::string& app_locale);
// A convenience wrapper of a bunch of state we pass around while
// associating models, and send to the WebDatabase for persistence.
@@ -162,7 +161,8 @@ class AutofillProfileSyncableService
// |merge_into| has extra data. Returns |true| if |merge_into| posseses some
// multi-valued field values that are not in |merge_from|, false otherwise.
static bool MergeProfile(const AutofillProfile& merge_from,
- AutofillProfile* merge_into);
+ AutofillProfile* merge_into,
+ const std::string& app_locale);
// For unit-tests.
AutofillProfileSyncableService();
diff --git a/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc b/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
index d3070c0..3d0ab37 100644
--- a/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
+++ b/chrome/browser/webdata/autofill_profile_syncable_service_unittest.cc
@@ -352,7 +352,8 @@ TEST_F(AutofillProfileSyncableServiceTest, MergeProfile) {
profile2.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, values);
EXPECT_FALSE(AutofillProfileSyncableService::MergeProfile(profile2,
- &profile1));
+ &profile1,
+ "en-US"));
profile1.GetRawMultiInfo(NAME_FIRST, &values);
ASSERT_EQ(values.size(), 2U);
@@ -386,7 +387,8 @@ TEST_F(AutofillProfileSyncableServiceTest, MergeProfile) {
profile3.SetRawMultiInfo(NAME_LAST, values);
EXPECT_TRUE(AutofillProfileSyncableService::MergeProfile(profile3,
- &profile1));
+ &profile1,
+ "en-US"));
profile1.GetRawMultiInfo(NAME_FIRST, &values);
ASSERT_EQ(values.size(), 3U);
diff --git a/chrome/browser/webdata/web_data_service_factory.cc b/chrome/browser/webdata/web_data_service_factory.cc
index e72329f..f00793b 100644
--- a/chrome/browser/webdata/web_data_service_factory.cc
+++ b/chrome/browser/webdata/web_data_service_factory.cc
@@ -61,7 +61,8 @@ WebDataServiceWrapper::WebDataServiceWrapper(Profile* profile) {
// All tables objects that participate in managing the database must
// be added here.
web_database_->AddTable(
- scoped_ptr<WebDatabaseTable>(new AutofillTable()));
+ scoped_ptr<WebDatabaseTable>(new AutofillTable(
+ g_browser_process->GetApplicationLocale())));
web_database_->AddTable(
scoped_ptr<WebDatabaseTable>(new KeywordTable()));
// TODO(mdm): We only really need the LoginsTable on Windows for IE7 password
diff --git a/chrome_frame/test/delete_chrome_history_test.cc b/chrome_frame/test/delete_chrome_history_test.cc
index 6a47ca2..480bde9 100644
--- a/chrome_frame/test/delete_chrome_history_test.cc
+++ b/chrome_frame/test/delete_chrome_history_test.cc
@@ -102,7 +102,7 @@ ACTION_P2(ExpectFormValuesForElementNameMatch, element_name, matcher) {
base::FilePath profile_path(
root_path.Append(L"Default").Append(kWebDataFilename));
- AutofillTable autofill_table;
+ AutofillTable autofill_table("en-US");
WebDatabase web_database;
web_database.AddTable(&autofill_table);
sql::InitStatus init_status = web_database.Init(profile_path);
diff --git a/components/autofill/browser/autocheckout_manager.cc b/components/autofill/browser/autocheckout_manager.cc
index 46fcb95..a66f9d1 100644
--- a/components/autofill/browser/autocheckout_manager.cc
+++ b/components/autofill/browser/autocheckout_manager.cc
@@ -354,10 +354,13 @@ void AutocheckoutManager::SetValue(const AutofillField& field,
// TODO(ramankk): Handle variants in a better fashion, need to distinguish
// between shipping and billing address.
- if (AutofillType(type).group() == AutofillType::CREDIT_CARD)
- credit_card_->FillFormField(field, 0, field_to_fill);
- else
- profile_->FillFormField(field, 0, field_to_fill);
+ if (AutofillType(type).group() == AutofillType::CREDIT_CARD) {
+ credit_card_->FillFormField(
+ field, 0, autofill_manager_->app_locale(), field_to_fill);
+ } else {
+ profile_->FillFormField(
+ field, 0, autofill_manager_->app_locale(), field_to_fill);
+ }
}
void AutocheckoutManager::SendAutocheckoutStatus(AutocheckoutStatus status) {
diff --git a/components/autofill/browser/autocomplete_history_manager_unittest.cc b/components/autofill/browser/autocomplete_history_manager_unittest.cc
index fcee54d..3b4bc38 100644
--- a/components/autofill/browser/autocomplete_history_manager_unittest.cc
+++ b/components/autofill/browser/autocomplete_history_manager_unittest.cc
@@ -250,7 +250,7 @@ TEST_F(AutocompleteHistoryManagerTest, ExternalDelegate) {
web_contents());
AutofillManager::CreateForWebContentsAndDelegate(
- web_contents(), &manager_delegate);
+ web_contents(), &manager_delegate, "en-US");
MockAutofillExternalDelegate external_delegate(web_contents());
autocomplete_history_manager.SetExternalDelegate(&external_delegate);
diff --git a/components/autofill/browser/autofill_country.cc b/components/autofill/browser/autofill_country.cc
index f38ba09..9018d6a 100644
--- a/components/autofill/browser/autofill_country.cc
+++ b/components/autofill/browser/autofill_country.cc
@@ -16,8 +16,6 @@
#include "base/string_util.h"
#include "base/threading/thread_checker.h"
#include "base/utf_string_conversions.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/content_browser_client.h"
#include "grit/generated_resources.h"
#include "third_party/icu/public/common/unicode/locid.h"
#include "third_party/icu/public/common/unicode/uloc.h"
@@ -28,8 +26,6 @@
#include "third_party/icu/public/i18n/unicode/ucol.h"
#include "ui/base/l10n/l10n_util.h"
-using content::BrowserThread;
-
namespace {
// The maximum capacity needed to store a locale up to the country code.
@@ -845,9 +841,6 @@ class CountryNames {
public:
static CountryNames* GetInstance();
- // Returns the application locale.
- const std::string ApplicationLocale();
-
// Returns the country code corresponding to |country|, which should be a
// country code or country name localized to |locale|.
const std::string GetCountryCode(const string16& country,
@@ -899,9 +892,6 @@ class CountryNames {
// Verifies thread-safety of accesses to the application locale.
base::ThreadChecker thread_checker_;
- // Caches the application locale, for thread-safe access.
- std::string application_locale_;
-
DISALLOW_COPY_AND_ASSIGN(CountryNames);
};
@@ -910,22 +900,6 @@ CountryNames* CountryNames::GetInstance() {
return Singleton<CountryNames>::get();
}
-const std::string CountryNames::ApplicationLocale() {
- if (application_locale_.empty()) {
- // In production code, this class is always constructed on the UI thread, so
- // the two conditions in the below DCHECK are identical. In test code,
- // sometimes there is a UI thread, and sometimes there is just the unnamed
- // main thread. Since this class is a singleton, it needs to support both
- // cases. Hence, the somewhat strange looking DCHECK below.
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
- thread_checker_.CalledOnValidThread());
- application_locale_ =
- content::GetContentClient()->browser()->GetApplicationLocale();
- }
-
- return application_locale_;
-}
-
CountryNames::CountryNames() {
// Add 2- and 3-letter ISO country codes.
for (CountryDataMap::Iterator it = CountryDataMap::Begin();
@@ -1126,11 +1100,6 @@ const std::string AutofillCountry::GetCountryCode(const string16& country,
return CountryNames::GetInstance()->GetCountryCode(country, locale);
}
-// static
-const std::string AutofillCountry::ApplicationLocale() {
- return CountryNames::GetInstance()->ApplicationLocale();
-}
-
AutofillCountry::AutofillCountry(const std::string& country_code,
const string16& name,
const string16& postal_code_label,
diff --git a/components/autofill/browser/autofill_country.h b/components/autofill/browser/autofill_country.h
index 72f0a8c..4c5ed38 100644
--- a/components/autofill/browser/autofill_country.h
+++ b/components/autofill/browser/autofill_country.h
@@ -59,12 +59,6 @@ class AutofillCountry {
static const std::string GetCountryCode(const string16& country,
const std::string& locale);
- // Returns the application locale.
- // The first time this is called, it should be called from the UI thread.
- // Once [ http://crbug.com/100845 ] is fixed, this method should *only* be
- // called from the UI thread.
- static const std::string ApplicationLocale();
-
const std::string country_code() const { return country_code_; }
const string16 name() const { return name_; }
const string16 postal_code_label() const { return postal_code_label_; }
diff --git a/components/autofill/browser/autofill_ie_toolbar_import_win.cc b/components/autofill/browser/autofill_ie_toolbar_import_win.cc
index 29ba67b..6a30103 100644
--- a/components/autofill/browser/autofill_ie_toolbar_import_win.cc
+++ b/components/autofill/browser/autofill_ie_toolbar_import_win.cc
@@ -30,7 +30,8 @@ using base::win::RegKey;
// Forward declaration. This function is not in unnamed namespace as it
// is referenced in the unittest.
-bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles,
+bool ImportCurrentUserProfiles(const std::string& app_locale,
+ std::vector<AutofillProfile>* profiles,
std::vector<CreditCard>* credit_cards);
namespace {
@@ -130,6 +131,7 @@ typedef std::map<std::wstring, AutofillFieldType> RegToFieldMap;
// Returns true if any fields were set, false otherwise.
bool ImportSingleFormGroup(const RegKey& key,
const RegToFieldMap& reg_to_field,
+ const std::string& app_locale,
FormGroup* form_group,
PhoneNumber::PhoneCombineHelper* phone) {
if (!key.Valid())
@@ -137,7 +139,6 @@ bool ImportSingleFormGroup(const RegKey& key,
bool has_non_empty_fields = false;
- const std::string app_locale = AutofillCountry::ApplicationLocale();
for (uint32 i = 0; i < key.GetValueCount(); ++i) {
std::wstring value_name;
if (key.GetValueNameAt(i, &value_name) != ERROR_SUCCESS)
@@ -167,16 +168,16 @@ bool ImportSingleFormGroup(const RegKey& key,
// Imports address data from the given registry |key| into the given |profile|,
// with the help of |reg_to_field|. Returns true if any fields were set, false
// otherwise.
-bool ImportSingleProfile(const RegKey& key,
+bool ImportSingleProfile(const std::string& app_locale,
+ const RegKey& key,
const RegToFieldMap& reg_to_field,
AutofillProfile* profile) {
PhoneNumber::PhoneCombineHelper phone;
bool has_non_empty_fields =
- ImportSingleFormGroup(key, reg_to_field, profile, &phone);
+ ImportSingleFormGroup(key, reg_to_field, app_locale, profile, &phone);
// Now re-construct the phones if needed.
string16 constructed_number;
- const std::string app_locale = AutofillCountry::ApplicationLocale();
if (phone.ParseNumber(*profile, app_locale, &constructed_number)) {
has_non_empty_fields = true;
profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number);
@@ -195,7 +196,9 @@ class AutofillImporter : public PersonalDataManagerObserver {
}
bool ImportProfiles() {
- if (!ImportCurrentUserProfiles(&profiles_, &credit_cards_)) {
+ if (!ImportCurrentUserProfiles(personal_data_manager_->app_locale(),
+ &profiles_,
+ &credit_cards_)) {
delete this;
return false;
}
@@ -232,7 +235,8 @@ class AutofillImporter : public PersonalDataManagerObserver {
// Imports Autofill profiles and credit cards from IE Toolbar if present and not
// password protected. Returns true if data is successfully retrieved. False if
// there is no data, data is password protected or error occurred.
-bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles,
+bool ImportCurrentUserProfiles(const std::string& app_locale,
+ std::vector<AutofillProfile>* profiles,
std::vector<CreditCard>* credit_cards) {
DCHECK(profiles);
DCHECK(credit_cards);
@@ -252,7 +256,7 @@ bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles,
key_name.append(iterator_profiles.Name());
RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ);
AutofillProfile profile;
- if (ImportSingleProfile(key, reg_to_field, &profile)) {
+ if (ImportSingleProfile(app_locale, key, reg_to_field, &profile)) {
// Combine phones into whole phone #.
profiles->push_back(profile);
}
@@ -275,7 +279,8 @@ bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles,
key_name.append(iterator_cc.Name());
RegKey key(HKEY_CURRENT_USER, key_name.c_str(), KEY_READ);
CreditCard credit_card;
- if (ImportSingleFormGroup(key, reg_to_field, &credit_card, NULL)) {
+ if (ImportSingleFormGroup(
+ key, reg_to_field, app_locale, &credit_card, NULL)) {
string16 cc_number = credit_card.GetRawInfo(CREDIT_CARD_NUMBER);
if (!cc_number.empty())
credit_cards->push_back(credit_card);
diff --git a/components/autofill/browser/autofill_ie_toolbar_import_win_unittest.cc b/components/autofill/browser/autofill_ie_toolbar_import_win_unittest.cc
index b81a833..be6aeb8 100644
--- a/components/autofill/browser/autofill_ie_toolbar_import_win_unittest.cc
+++ b/components/autofill/browser/autofill_ie_toolbar_import_win_unittest.cc
@@ -16,7 +16,8 @@
using base::win::RegKey;
// Defined in autofill_ie_toolbar_import_win.cc. Not exposed in the header file.
-bool ImportCurrentUserProfiles(std::vector<AutofillProfile>* profiles,
+bool ImportCurrentUserProfiles(const std::string& app_locale,
+ std::vector<AutofillProfile>* profiles,
std::vector<CreditCard>* credit_cards);
namespace {
@@ -157,7 +158,7 @@ TEST_F(AutofillIeToolbarImportTest, TestAutofillImport) {
std::vector<AutofillProfile> profiles;
std::vector<CreditCard> credit_cards;
- EXPECT_TRUE(ImportCurrentUserProfiles(&profiles, &credit_cards));
+ EXPECT_TRUE(ImportCurrentUserProfiles("en-US", &profiles, &credit_cards));
ASSERT_EQ(2U, profiles.size());
// The profiles are read in reverse order.
EXPECT_EQ(profile1[0].value, profiles[1].GetRawInfo(NAME_FIRST));
@@ -195,7 +196,7 @@ TEST_F(AutofillIeToolbarImportTest, TestAutofillImport) {
profiles.clear();
credit_cards.clear();
- EXPECT_TRUE(ImportCurrentUserProfiles(&profiles, &credit_cards));
+ EXPECT_TRUE(ImportCurrentUserProfiles("en-US", &profiles, &credit_cards));
// Profiles are not protected.
EXPECT_EQ(2U, profiles.size());
// Credit cards are.
diff --git a/components/autofill/browser/autofill_manager.cc b/components/autofill/browser/autofill_manager.cc
index 3db909b..c9acb0d 100644
--- a/components/autofill/browser/autofill_manager.cc
+++ b/components/autofill/browser/autofill_manager.cc
@@ -23,7 +23,6 @@
#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_country.h"
#include "components/autofill/browser/autofill_external_delegate.h"
#include "components/autofill/browser/autofill_field.h"
#include "components/autofill/browser/autofill_manager_delegate.h"
@@ -172,12 +171,13 @@ void DeterminePossibleFieldTypesForUpload(
// static
void AutofillManager::CreateForWebContentsAndDelegate(
content::WebContents* contents,
- autofill::AutofillManagerDelegate* delegate) {
+ autofill::AutofillManagerDelegate* delegate,
+ const std::string& app_locale) {
if (FromWebContents(contents))
return;
contents->SetUserData(kAutofillManagerWebContentsUserDataKey,
- new AutofillManager(contents, delegate));
+ new AutofillManager(contents, delegate, app_locale));
// Trigger the lazy creation of AutocheckoutWhitelistManagerService, and
// schedule a fetch of the Autocheckout whitelist file if it's not already
@@ -194,9 +194,11 @@ AutofillManager* AutofillManager::FromWebContents(
}
AutofillManager::AutofillManager(content::WebContents* web_contents,
- autofill::AutofillManagerDelegate* delegate)
+ autofill::AutofillManagerDelegate* delegate,
+ const std::string& app_locale)
: content::WebContentsObserver(web_contents),
manager_delegate_(delegate),
+ app_locale_(app_locale),
personal_data_(delegate->GetPersonalDataManager()),
download_manager_(web_contents->GetBrowserContext(), this),
disable_download_manager_requests_(false),
@@ -433,7 +435,7 @@ bool AutofillManager::OnFormSubmitted(const FormData& form,
base::Bind(&DeterminePossibleFieldTypesForUpload,
copied_profiles,
copied_credit_cards,
- AutofillCountry::ApplicationLocale(),
+ app_locale_,
raw_submitted_form),
base::Bind(&AutofillManager::UploadFormDataAsyncCallback,
weak_ptr_factory_.GetWeakPtr(),
@@ -629,7 +631,8 @@ 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(*autofill_field, variant, &(*iter));
+ form_group->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).
autofill_field->is_autofilled = true;
@@ -668,6 +671,7 @@ void AutofillManager::OnFillAutofillFormData(int query_id,
}
form_group->FillFormField(*cached_field,
use_variant,
+ app_locale_,
&result.fields[i]);
// Mark the cached field as autofilled, so that we can detect when a user
// edits an autofilled field (for metrics).
@@ -1006,6 +1010,7 @@ AutofillManager::AutofillManager(content::WebContents* web_contents,
PersonalDataManager* personal_data)
: content::WebContentsObserver(web_contents),
manager_delegate_(delegate),
+ app_locale_("en-US"),
personal_data_(personal_data),
download_manager_(web_contents->GetBrowserContext(), this),
disable_download_manager_requests_(true),
diff --git a/components/autofill/browser/autofill_manager.h b/components/autofill/browser/autofill_manager.h
index fae3984..a7cc564 100644
--- a/components/autofill/browser/autofill_manager.h
+++ b/components/autofill/browser/autofill_manager.h
@@ -79,7 +79,8 @@ class AutofillManager : public content::WebContentsObserver,
public:
static void CreateForWebContentsAndDelegate(
content::WebContents* contents,
- autofill::AutofillManagerDelegate* delegate);
+ autofill::AutofillManagerDelegate* delegate,
+ const std::string& app_locale);
static AutofillManager* FromWebContents(content::WebContents* contents);
// Registers our Enable/Disable Autofill pref.
@@ -132,13 +133,16 @@ class AutofillManager : public content::WebContentsObserver,
return manager_delegate_;
}
+ const std::string& app_locale() const { return app_locale_; }
+
// Only for testing.
void SetTestDelegate(autofill::AutofillManagerTestDelegate* delegate);
protected:
// Only test code should subclass AutofillManager.
AutofillManager(content::WebContents* web_contents,
- autofill::AutofillManagerDelegate* delegate);
+ autofill::AutofillManagerDelegate* delegate,
+ const std::string& app_locale);
virtual ~AutofillManager();
// Test code should prefer to use this constructor.
@@ -358,6 +362,8 @@ class AutofillManager : public content::WebContentsObserver,
autofill::AutofillManagerDelegate* const manager_delegate_;
+ std::string app_locale_;
+
// The personal data manager, used to save and load personal data to/from the
// web database. This is overridden by the AutofillManagerTest.
// Weak reference.
diff --git a/components/autofill/browser/autofill_manager_unittest.cc b/components/autofill/browser/autofill_manager_unittest.cc
index e88906b..475465d 100644
--- a/components/autofill/browser/autofill_manager_unittest.cc
+++ b/components/autofill/browser/autofill_manager_unittest.cc
@@ -71,7 +71,7 @@ typedef Tuple5<int,
class TestPersonalDataManager : public PersonalDataManager {
public:
- TestPersonalDataManager() {
+ TestPersonalDataManager() : PersonalDataManager("en-US") {
CreateTestAutofillProfiles(&web_profiles_);
CreateTestCreditCards(&credit_cards_);
}
diff --git a/components/autofill/browser/autofill_merge_unittest.cc b/components/autofill/browser/autofill_merge_unittest.cc
index dad4fdb..5a85b5e 100644
--- a/components/autofill/browser/autofill_merge_unittest.cc
+++ b/components/autofill/browser/autofill_merge_unittest.cc
@@ -82,7 +82,8 @@ class PersonalDataManagerMock : public PersonalDataManager {
DISALLOW_COPY_AND_ASSIGN(PersonalDataManagerMock);
};
-PersonalDataManagerMock::PersonalDataManagerMock() : PersonalDataManager() {
+PersonalDataManagerMock::PersonalDataManagerMock()
+ : PersonalDataManager("en-US") {
}
PersonalDataManagerMock::~PersonalDataManagerMock() {
@@ -95,7 +96,7 @@ void PersonalDataManagerMock::Reset() {
void PersonalDataManagerMock::SaveImportedProfile(
const AutofillProfile& profile) {
std::vector<AutofillProfile> profiles;
- if (!MergeProfile(profile, profiles_.get(), &profiles))
+ if (!MergeProfile(profile, profiles_.get(), "en-US", &profiles))
profiles_.push_back(new AutofillProfile(profile));
}
diff --git a/components/autofill/browser/autofill_metrics_unittest.cc b/components/autofill/browser/autofill_metrics_unittest.cc
index 60cc4a3..ab9d803 100644
--- a/components/autofill/browser/autofill_metrics_unittest.cc
+++ b/components/autofill/browser/autofill_metrics_unittest.cc
@@ -82,7 +82,9 @@ class MockAutofillMetrics : public AutofillMetrics {
class TestPersonalDataManager : public PersonalDataManager {
public:
- TestPersonalDataManager() : autofill_enabled_(true) {
+ TestPersonalDataManager()
+ : PersonalDataManager("en-US"),
+ autofill_enabled_(true) {
set_metric_logger(new testing::NiceMock<MockAutofillMetrics>());
CreateTestAutofillProfiles(&web_profiles_);
}
diff --git a/components/autofill/browser/autofill_profile.cc b/components/autofill/browser/autofill_profile.cc
index b1a0da0..6cbd32d 100644
--- a/components/autofill/browser/autofill_profile.cc
+++ b/components/autofill/browser/autofill_profile.cc
@@ -186,22 +186,28 @@ void CollapseCompoundFieldTypes(FieldTypeSet* type_set) {
class FindByPhone {
public:
- FindByPhone(const string16& phone, const std::string& country_code)
+ FindByPhone(const string16& phone,
+ const std::string& country_code,
+ const std::string& app_locale)
: phone_(phone),
- country_code_(country_code) {
+ country_code_(country_code),
+ app_locale_(app_locale) {
}
bool operator()(const string16& phone) {
- return autofill_i18n::PhoneNumbersMatch(phone, phone_, country_code_);
+ return autofill_i18n::PhoneNumbersMatch(
+ phone, phone_, country_code_, app_locale_);
}
bool operator()(const string16* phone) {
- return autofill_i18n::PhoneNumbersMatch(*phone, phone_, country_code_);
+ return autofill_i18n::PhoneNumbersMatch(
+ *phone, phone_, country_code_, app_locale_);
}
private:
string16 phone_;
std::string country_code_;
+ std::string app_locale_;
};
// Functor used to check for case-insensitive equality of two strings.
@@ -348,18 +354,19 @@ void AutofillProfile::GetMultiInfo(AutofillFieldType type,
void AutofillProfile::FillFormField(const AutofillField& field,
size_t variant,
+ const std::string& app_locale,
FormFieldData* field_data) const {
AutofillFieldType type = field.type();
DCHECK_NE(AutofillType::CREDIT_CARD, AutofillType(type).group());
DCHECK(field_data);
if (type == PHONE_HOME_NUMBER) {
- FillPhoneNumberField(field, variant, field_data);
+ FillPhoneNumberField(field, variant, app_locale, field_data);
} else if (field_data->form_control_type == "select-one") {
- FillSelectControl(type, field_data);
+ FillSelectControl(type, app_locale, field_data);
} else {
std::vector<string16> values;
- GetMultiInfo(type, AutofillCountry::ApplicationLocale(), &values);
+ GetMultiInfo(type, app_locale, &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.
@@ -372,9 +379,10 @@ void AutofillProfile::FillFormField(const AutofillField& field,
void AutofillProfile::FillPhoneNumberField(const AutofillField& field,
size_t variant,
+ const std::string& app_locale,
FormFieldData* field_data) const {
std::vector<string16> values;
- GetMultiInfo(field.type(), AutofillCountry::ApplicationLocale(), &values);
+ GetMultiInfo(field.type(), app_locale, &values);
DCHECK(variant < values.size());
// If we are filling a phone number, check to see if the size field
@@ -400,9 +408,9 @@ const string16 AutofillProfile::Label() const {
return label_;
}
-bool AutofillProfile::IsEmpty() const {
+bool AutofillProfile::IsEmpty(const std::string& app_locale) const {
FieldTypeSet types;
- GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &types);
+ GetNonEmptyTypes(app_locale, &types);
return types.empty();
}
@@ -459,9 +467,10 @@ const string16 AutofillProfile::PrimaryValue() const {
return GetRawInfo(ADDRESS_HOME_LINE1) + GetRawInfo(ADDRESS_HOME_CITY);
}
-bool AutofillProfile::IsSubsetOf(const AutofillProfile& profile) const {
+bool AutofillProfile::IsSubsetOf(const AutofillProfile& profile,
+ const std::string& app_locale) const {
FieldTypeSet types;
- GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &types);
+ GetNonEmptyTypes(app_locale, &types);
for (FieldTypeSet::const_iterator iter = types.begin(); iter != types.end();
++iter) {
@@ -478,7 +487,8 @@ bool AutofillProfile::IsSubsetOf(const AutofillProfile& profile) const {
} else if (!autofill_i18n::PhoneNumbersMatch(
GetRawInfo(*iter),
profile.GetRawInfo(*iter),
- UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY)))) {
+ UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY)),
+ app_locale)) {
return false;
}
} else if (StringToLowerASCII(GetRawInfo(*iter)) !=
@@ -490,9 +500,10 @@ bool AutofillProfile::IsSubsetOf(const AutofillProfile& profile) const {
return true;
}
-void AutofillProfile::OverwriteWithOrAddTo(const AutofillProfile& profile) {
+void AutofillProfile::OverwriteWithOrAddTo(const AutofillProfile& profile,
+ const std::string& app_locale) {
FieldTypeSet field_types;
- profile.GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &field_types);
+ profile.GetNonEmptyTypes(app_locale, &field_types);
// Only transfer "full" types (e.g. full name) and not fragments (e.g.
// first name, last name).
@@ -516,7 +527,7 @@ void AutofillProfile::OverwriteWithOrAddTo(const AutofillProfile& profile) {
value_iter != new_values.end(); ++value_iter) {
// Don't add duplicates.
if (group == AutofillType::PHONE) {
- AddPhoneIfUnique(*value_iter, &existing_values);
+ AddPhoneIfUnique(*value_iter, app_locale, &existing_values);
} else {
std::vector<string16>::const_iterator existing_iter = std::find_if(
existing_values.begin(), existing_values.end(),
@@ -613,10 +624,10 @@ void AutofillProfile::GetSupportedTypes(FieldTypeSet* supported_types) const {
(*it)->GetSupportedTypes(supported_types);
}
-bool AutofillProfile::FillCountrySelectControl(FormFieldData* field_data)
- const {
+bool AutofillProfile::FillCountrySelectControl(
+ const std::string& app_locale,
+ FormFieldData* field_data) const {
std::string country_code = UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY));
- std::string app_locale = AutofillCountry::ApplicationLocale();
DCHECK_EQ(field_data->option_values.size(),
field_data->option_contents.size());
@@ -655,13 +666,14 @@ void AutofillProfile::GetMultiInfoImpl(AutofillFieldType type,
}
void AutofillProfile::AddPhoneIfUnique(const string16& phone,
+ const std::string& app_locale,
std::vector<string16>* existing_phones) {
DCHECK(existing_phones);
// Phones allow "fuzzy" matching, so "1-800-FLOWERS", "18003569377",
// "(800)356-9377" and "356-9377" are considered the same.
- if (std::find_if(
- existing_phones->begin(), existing_phones->end(),
- FindByPhone(phone, UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY)))) ==
+ std::string country_code = UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY));
+ if (std::find_if(existing_phones->begin(), existing_phones->end(),
+ FindByPhone(phone, country_code, app_locale)) ==
existing_phones->end()) {
existing_phones->push_back(phone);
}
diff --git a/components/autofill/browser/autofill_profile.h b/components/autofill/browser/autofill_profile.h
index d5a0561..be7367b 100644
--- a/components/autofill/browser/autofill_profile.h
+++ b/components/autofill/browser/autofill_profile.h
@@ -52,6 +52,7 @@ class AutofillProfile : public FormGroup {
const std::string& app_locale) OVERRIDE;
virtual void FillFormField(const AutofillField& field,
size_t variant,
+ const std::string& app_locale,
FormFieldData* field_data) const OVERRIDE;
// Multi-value equivalents to |GetInfo| and |SetInfo|.
@@ -69,6 +70,7 @@ class AutofillProfile : public FormGroup {
// multi-valued profile.
void FillPhoneNumberField(const AutofillField& field,
size_t variant,
+ const std::string& app_locale,
FormFieldData* field_data) const;
// The user-visible label of the profile, generated in relation to other
@@ -83,7 +85,7 @@ class AutofillProfile : public FormGroup {
void set_guid(const std::string& guid) { guid_ = guid; }
// Returns true if there are no values (field types) set.
- bool IsEmpty() const;
+ bool IsEmpty(const std::string& app_locale) const;
// Comparison for Sync. Returns 0 if the profile is the same as |this|,
// or < 0, or > 0 if it is different. The implied ordering can be used for
@@ -104,11 +106,13 @@ class AutofillProfile : public FormGroup {
// Returns true if the data in this AutofillProfile is a subset of the data in
// |profile|.
- bool IsSubsetOf(const AutofillProfile& profile) const;
+ bool IsSubsetOf(const AutofillProfile& profile,
+ const std::string& app_locale) const;
// Overwrites the single-valued field data in |profile| with this
// Profile. Or, for multi-valued fields append the new values.
- void OverwriteWithOrAddTo(const AutofillProfile& profile);
+ void OverwriteWithOrAddTo(const AutofillProfile& profile,
+ const std::string& app_locale);
// Returns |true| if |type| accepts multi-values.
static bool SupportsMultiValue(AutofillFieldType type);
@@ -145,7 +149,8 @@ class AutofillProfile : public FormGroup {
typedef std::vector<const FormGroup*> FormGroupList;
// FormGroup:
- virtual bool FillCountrySelectControl(FormFieldData* field) const OVERRIDE;
+ virtual bool FillCountrySelectControl(const std::string& app_locale,
+ FormFieldData* field) const OVERRIDE;
virtual void GetSupportedTypes(FieldTypeSet* supported_types) const OVERRIDE;
// Shared implementation for GetRawMultiInfo() and GetMultiInfo(). Pass an
@@ -160,6 +165,7 @@ class AutofillProfile : public FormGroup {
// are considered the same.
// Adds the |phone| to the |existing_phones| if not already there.
void AddPhoneIfUnique(const string16& phone,
+ const std::string& app_locale,
std::vector<string16>* existing_phones);
// Builds inferred label from the first |num_fields_to_include| non-empty
diff --git a/components/autofill/browser/autofill_profile_unittest.cc b/components/autofill/browser/autofill_profile_unittest.cc
index c93547f..1fb38c1 100644
--- a/components/autofill/browser/autofill_profile_unittest.cc
+++ b/components/autofill/browser/autofill_profile_unittest.cc
@@ -512,13 +512,13 @@ TEST(AutofillProfileTest, IsSubsetOf) {
autofill_test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson",
"declaration_guy@gmail.com", "United States Government", "Monticello",
NULL, "Charlottesville", "Virginia", "22902", NULL, NULL);
- EXPECT_TRUE(a->IsSubsetOf(*b));
+ EXPECT_TRUE(a->IsSubsetOf(*b, "en-US"));
// |b| is not a subset of |a|.
- EXPECT_FALSE(b->IsSubsetOf(*a));
+ EXPECT_FALSE(b->IsSubsetOf(*a, "en-US"));
// |a| is a subset of |a|.
- EXPECT_TRUE(a->IsSubsetOf(*a));
+ EXPECT_TRUE(a->IsSubsetOf(*a, "en-US"));
// One field in |b| is different.
a.reset(new AutofillProfile);
@@ -529,7 +529,7 @@ TEST(AutofillProfileTest, IsSubsetOf) {
autofill_test::SetProfileInfo(a.get(), "Thomas", NULL, "Adams",
"declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL);
- EXPECT_FALSE(a->IsSubsetOf(*b));
+ EXPECT_FALSE(a->IsSubsetOf(*b, "en-US"));
}
TEST(AutofillProfileTest, AssignmentOperator) {
@@ -731,7 +731,7 @@ TEST(AutofillProfileTest, AddressCountryFull) {
AutofillProfile profile;
profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("CA"));
- profile.FillSelectControl(ADDRESS_HOME_COUNTRY, &field);
+ profile.FillSelectControl(ADDRESS_HOME_COUNTRY, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Canada"), field.value);
}
@@ -751,7 +751,7 @@ TEST(AutofillProfileTest, AddressCountryAbbrev) {
AutofillProfile profile;
profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("CA"));
- profile.FillSelectControl(ADDRESS_HOME_COUNTRY, &field);
+ profile.FillSelectControl(ADDRESS_HOME_COUNTRY, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("CA"), field.value);
}
@@ -771,7 +771,7 @@ TEST(AutofillProfileTest, AddressStateFull) {
AutofillProfile profile;
profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
- profile.FillSelectControl(ADDRESS_HOME_STATE, &field);
+ profile.FillSelectControl(ADDRESS_HOME_STATE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("California"), field.value);
}
@@ -791,7 +791,7 @@ TEST(AutofillProfileTest, AddressStateAbbrev) {
AutofillProfile profile;
profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("California"));
- profile.FillSelectControl(ADDRESS_HOME_STATE, &field);
+ profile.FillSelectControl(ADDRESS_HOME_STATE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("CA"), field.value);
}
@@ -813,7 +813,7 @@ TEST(AutofillProfileTest, FillByValue) {
AutofillProfile profile;
profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("California"));
- profile.FillSelectControl(ADDRESS_HOME_STATE, &field);
+ profile.FillSelectControl(ADDRESS_HOME_STATE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("California"), field.value);
}
@@ -835,6 +835,6 @@ TEST(AutofillProfileTest, FillByContents) {
AutofillProfile profile;
profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("California"));
- profile.FillSelectControl(ADDRESS_HOME_STATE, &field);
+ profile.FillSelectControl(ADDRESS_HOME_STATE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("2"), field.value);
}
diff --git a/components/autofill/browser/credit_card.cc b/components/autofill/browser/credit_card.cc
index 4d004c4..d02b47d 100644
--- a/components/autofill/browser/credit_card.cc
+++ b/components/autofill/browser/credit_card.cc
@@ -17,7 +17,6 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.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/autofill_regexes.h"
#include "components/autofill/browser/autofill_type.h"
@@ -512,14 +511,13 @@ bool CreditCard::UpdateFromImportedCard(const CreditCard& imported_card,
void CreditCard::FillFormField(const AutofillField& field,
size_t /*variant*/,
+ const std::string& app_locale,
FormFieldData* field_data) const {
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);
+ FillSelectControl(field.type(), app_locale, field_data);
} else if (field_data->form_control_type == "month") {
// HTML5 input="month" consists of year-month.
string16 year = GetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, app_locale);
@@ -563,9 +561,9 @@ bool CreditCard::operator!=(const CreditCard& credit_card) const {
return !operator==(credit_card);
}
-bool CreditCard::IsEmpty() const {
+bool CreditCard::IsEmpty(const std::string& app_locale) const {
FieldTypeSet types;
- GetNonEmptyTypes(AutofillCountry::ApplicationLocale(), &types);
+ GetNonEmptyTypes(app_locale, &types);
return types.empty();
}
diff --git a/components/autofill/browser/credit_card.h b/components/autofill/browser/credit_card.h
index 320908a..18ad97c 100644
--- a/components/autofill/browser/credit_card.h
+++ b/components/autofill/browser/credit_card.h
@@ -46,6 +46,7 @@ class CreditCard : public FormGroup {
const std::string& app_locale) OVERRIDE;
virtual void FillFormField(const AutofillField& field,
size_t variant,
+ const std::string& app_locale,
FormFieldData* field_data) const OVERRIDE;
// Credit card preview summary, for example: ******1234, Exp: 01/2020
@@ -97,7 +98,7 @@ class CreditCard : public FormGroup {
bool operator!=(const CreditCard& credit_card) const;
// Returns true if there are no values (field types) set.
- bool IsEmpty() const;
+ bool IsEmpty(const std::string& app_locale) const;
// Returns true if all field types have valid values set.
bool IsComplete() const;
diff --git a/components/autofill/browser/credit_card_unittest.cc b/components/autofill/browser/credit_card_unittest.cc
index 847b344..fb98e2b 100644
--- a/components/autofill/browser/credit_card_unittest.cc
+++ b/components/autofill/browser/credit_card_unittest.cc
@@ -223,7 +223,7 @@ TEST(CreditCardTest, CreditCardMonthExact) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
- credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("01"), field.value);
}
@@ -244,7 +244,7 @@ TEST(CreditCardTest, CreditCardMonthAbbreviated) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
- credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Jan"), field.value);
}
@@ -265,7 +265,7 @@ TEST(CreditCardTest, CreditCardMonthFull) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
- credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("January"), field.value);
}
@@ -285,7 +285,7 @@ TEST(CreditCardTest, CreditCardMonthNumeric) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
- credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_EXP_MONTH, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("1"), field.value);
}
@@ -305,7 +305,7 @@ TEST(CreditCardTest, CreditCardTwoDigitYear) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2017"));
- credit_card.FillSelectControl(CREDIT_CARD_EXP_4_DIGIT_YEAR, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_EXP_4_DIGIT_YEAR, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("17"), field.value);
EXPECT_EQ(2017, credit_card.expiration_year());
}
@@ -333,7 +333,7 @@ TEST(CreditCardTest, CreditCardTypeSelectControl) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
ASCIIToUTF16("4111111111111111"));
- credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Visa"), field.value);
}
@@ -342,7 +342,7 @@ TEST(CreditCardTest, CreditCardTypeSelectControl) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
ASCIIToUTF16("5105105105105100"));
- credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value);
}
@@ -350,7 +350,7 @@ TEST(CreditCardTest, CreditCardTypeSelectControl) {
// American Express is sometimes abbreviated as AmEx:
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("371449635398431"));
- credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value);
}
@@ -359,7 +359,7 @@ TEST(CreditCardTest, CreditCardTypeSelectControl) {
CreditCard credit_card;
credit_card.SetRawInfo(CREDIT_CARD_NUMBER,
ASCIIToUTF16("6011111111111117"));
- credit_card.FillSelectControl(CREDIT_CARD_TYPE, &field);
+ credit_card.FillSelectControl(CREDIT_CARD_TYPE, "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("discover"), field.value);
}
}
diff --git a/components/autofill/browser/form_group.cc b/components/autofill/browser/form_group.cc
index b2f21d2..aca01b4 100644
--- a/components/autofill/browser/form_group.cc
+++ b/components/autofill/browser/form_group.cc
@@ -258,17 +258,18 @@ bool FormGroup::SetInfo(AutofillFieldType type,
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());
- 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())
@@ -299,20 +300,21 @@ void FormGroup::FillSelectControl(AutofillFieldType type,
if (type == ADDRESS_HOME_STATE || type == ADDRESS_BILLING_STATE) {
FillStateSelectControl(field_text, field);
} else if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) {
- FillCountrySelectControl(field);
+ 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, field);
+ FillSelectControl(CREDIT_CARD_EXP_2_DIGIT_YEAR, app_locale, field);
} else if (type == CREDIT_CARD_TYPE) {
FillCreditCardTypeSelectControl(field_text, field);
}
}
-bool FormGroup::FillCountrySelectControl(FormFieldData* field_data) const {
+bool FormGroup::FillCountrySelectControl(const std::string& app_locale,
+ FormFieldData* field_data) const {
return false;
}
diff --git a/components/autofill/browser/form_group.h b/components/autofill/browser/form_group.h
index d7f0c8c..c0038b5 100644
--- a/components/autofill/browser/form_group.h
+++ b/components/autofill/browser/form_group.h
@@ -63,11 +63,13 @@ class FormGroup {
// 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;
// Returns true if |value| is a valid US state name or abbreviation. It is
@@ -86,7 +88,8 @@ class FormGroup {
// Fills in a select control for a country from data in |this|. Returns true
// for success.
- virtual bool FillCountrySelectControl(FormFieldData* field_data) const;
+ virtual bool FillCountrySelectControl(const std::string& app_locale,
+ FormFieldData* field_data) const;
};
#endif // COMPONENTS_AUTOFILL_BROWSER_FORM_GROUP_H_
diff --git a/components/autofill/browser/personal_data_manager.cc b/components/autofill/browser/personal_data_manager.cc
index fd6456b..5696421 100644
--- a/components/autofill/browser/personal_data_manager.cc
+++ b/components/autofill/browser/personal_data_manager.cc
@@ -13,9 +13,8 @@
#include "base/prefs/pref_service.h"
#include "base/strings/string_number_conversions.h"
#include "base/utf_string_conversions.h"
-#include "chrome/common/chrome_notification_types.h"
-#include "components/autofill/browser/autofill-inl.h"
#include "components/autofill/browser/autofill_country.h"
+#include "components/autofill/browser/autofill-inl.h"
#include "components/autofill/browser/autofill_field.h"
#include "components/autofill/browser/autofill_metrics.h"
#include "components/autofill/browser/form_group.h"
@@ -28,7 +27,6 @@
#include "components/user_prefs/user_prefs.h"
#include "components/webdata/autofill/autofill_webdata_service.h"
#include "content/public/browser/browser_context.h"
-#include "content/public/browser/notification_source.h"
using content::BrowserContext;
@@ -82,11 +80,11 @@ T* address_of(T& v) {
// required as determined by its country code.
// No verification of validity of the contents is preformed. This is an
// existence check only.
-bool IsMinimumAddress(const AutofillProfile& profile) {
+bool IsMinimumAddress(const AutofillProfile& profile,
+ const std::string& app_locale) {
// All countries require at least one address line.
if (profile.GetRawInfo(ADDRESS_HOME_LINE1).empty())
return false;
- std::string app_locale = AutofillCountry::ApplicationLocale();
std::string country_code =
UTF16ToASCII(profile.GetRawInfo(ADDRESS_HOME_COUNTRY));
@@ -130,11 +128,12 @@ bool IsValidFieldTypeAndValue(const std::set<AutofillFieldType>& types_seen,
} // namespace
-PersonalDataManager::PersonalDataManager()
+PersonalDataManager::PersonalDataManager(const std::string& app_locale)
: browser_context_(NULL),
is_data_loaded_(false),
pending_profiles_query_(0),
pending_creditcards_query_(0),
+ app_locale_(app_locale),
metric_logger_(new AutofillMetrics),
has_logged_profile_count_(false) {}
@@ -238,7 +237,6 @@ 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);
@@ -266,7 +264,7 @@ bool PersonalDataManager::ImportFormData(
DCHECK_EQ(CREDIT_CARD_EXP_MONTH, field_type);
local_imported_credit_card->SetInfoForMonthInputType(value);
} else {
- local_imported_credit_card->SetInfo(field_type, value, app_locale);
+ local_imported_credit_card->SetInfo(field_type, value, app_locale_);
}
++importable_credit_card_fields;
} else {
@@ -275,7 +273,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->SetInfo(field_type, value, app_locale);
+ imported_profile->SetInfo(field_type, value, app_locale_);
// Reject profiles with invalid country information.
if (field_type == ADDRESS_HOME_COUNTRY &&
@@ -290,16 +288,18 @@ bool PersonalDataManager::ImportFormData(
// Construct the phone number. Reject the profile if the number is invalid.
if (imported_profile.get() && !home.IsEmpty()) {
string16 constructed_number;
- if (!home.ParseNumber(*imported_profile, app_locale, &constructed_number) ||
+ if (!home.ParseNumber(*imported_profile, app_locale_,
+ &constructed_number) ||
!imported_profile->SetInfo(PHONE_HOME_WHOLE_NUMBER, constructed_number,
- app_locale)) {
+ app_locale_)) {
imported_profile.reset();
}
}
// Reject the profile if minimum address and validation requirements are not
// met.
- if (imported_profile.get() && !IsValidLearnableProfile(*imported_profile))
+ if (imported_profile.get() &&
+ !IsValidLearnableProfile(*imported_profile, app_locale_))
imported_profile.reset();
// Reject the credit card if we did not detect enough filled credit card
@@ -317,7 +317,7 @@ bool PersonalDataManager::ImportFormData(
iter != credit_cards_.end();
++iter) {
if ((*iter)->UpdateFromImportedCard(*local_imported_credit_card.get(),
- app_locale)) {
+ app_locale_)) {
merged_credit_card = true;
UpdateCreditCard(**iter);
local_imported_credit_card.reset();
@@ -345,7 +345,7 @@ void PersonalDataManager::AddProfile(const AutofillProfile& profile) {
if (browser_context_->IsOffTheRecord())
return;
- if (profile.IsEmpty())
+ if (profile.IsEmpty(app_locale_))
return;
// Don't add an existing profile.
@@ -375,7 +375,7 @@ void PersonalDataManager::UpdateProfile(const AutofillProfile& profile) {
if (!FindByGUID<AutofillProfile>(web_profiles_, profile.guid()))
return;
- if (profile.IsEmpty()) {
+ if (profile.IsEmpty(app_locale_)) {
RemoveByGUID(profile.guid());
return;
}
@@ -407,7 +407,7 @@ void PersonalDataManager::AddCreditCard(const CreditCard& credit_card) {
if (browser_context_->IsOffTheRecord())
return;
- if (credit_card.IsEmpty())
+ if (credit_card.IsEmpty(app_locale_))
return;
if (FindByGUID<CreditCard>(credit_cards_, credit_card.guid()))
@@ -436,7 +436,7 @@ void PersonalDataManager::UpdateCreditCard(const CreditCard& credit_card) {
if (!FindByGUID<CreditCard>(credit_cards_, credit_card.guid()))
return;
- if (credit_card.IsEmpty()) {
+ if (credit_card.IsEmpty(app_locale_)) {
RemoveByGUID(credit_card.guid());
return;
}
@@ -488,16 +488,15 @@ 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(app_locale, 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(app_locale, non_empty_types);
+ (*iter)->GetNonEmptyTypes(app_locale_, non_empty_types);
}
}
@@ -550,7 +549,6 @@ void PersonalDataManager::GetProfileSuggestions(
guid_pairs->clear();
const std::vector<AutofillProfile*>& profiles = GetProfiles();
- const std::string app_locale = AutofillCountry::ApplicationLocale();
std::vector<AutofillProfile*> matched_profiles;
for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin();
iter != profiles.end(); ++iter) {
@@ -558,7 +556,7 @@ void PersonalDataManager::GetProfileSuggestions(
// The value of the stored data for this field type in the |profile|.
std::vector<string16> multi_values;
- profile->GetMultiInfo(type, app_locale, &multi_values);
+ profile->GetMultiInfo(type, app_locale_, &multi_values);
for (size_t i = 0; i < multi_values.size(); ++i) {
if (!field_is_autofilled) {
@@ -623,13 +621,12 @@ void PersonalDataManager::GetCreditCardSuggestions(
std::vector<string16>* labels,
std::vector<string16>* icons,
std::vector<GUIDPair>* guid_pairs) {
- const std::string app_locale = AutofillCountry::ApplicationLocale();
for (std::vector<CreditCard*>::const_iterator iter = credit_cards().begin();
iter != 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->GetInfo(type, app_locale);
+ string16 creditcard_field_value = credit_card->GetInfo(type, app_locale_);
if (!creditcard_field_value.empty() &&
StartsWith(creditcard_field_value, field_contents, false)) {
if (type == CREDIT_CARD_NUMBER)
@@ -638,7 +635,7 @@ void PersonalDataManager::GetCreditCardSuggestions(
string16 label;
if (credit_card->number().empty()) {
// If there is no CC number, return name to show something.
- label = credit_card->GetInfo(CREDIT_CARD_NAME, app_locale);
+ label = credit_card->GetInfo(CREDIT_CARD_NAME, app_locale_);
} else {
label = kCreditCardPrefix;
label.append(credit_card->LastFourDigits());
@@ -659,8 +656,9 @@ bool PersonalDataManager::IsAutofillEnabled() const {
// static
bool PersonalDataManager::IsValidLearnableProfile(
- const AutofillProfile& profile) {
- if (!IsMinimumAddress(profile))
+ const AutofillProfile& profile,
+ const std::string& app_locale) {
+ if (!IsMinimumAddress(profile, app_locale))
return false;
string16 email = profile.GetRawInfo(EMAIL_ADDRESS);
@@ -687,6 +685,7 @@ bool PersonalDataManager::IsValidLearnableProfile(
bool PersonalDataManager::MergeProfile(
const AutofillProfile& profile,
const std::vector<AutofillProfile*>& existing_profiles,
+ const std::string& app_locale,
std::vector<AutofillProfile>* merged_profiles) {
merged_profiles->clear();
@@ -703,7 +702,7 @@ bool PersonalDataManager::MergeProfile(
StringToLowerASCII((*iter)->PrimaryValue()) ==
StringToLowerASCII(profile.PrimaryValue())) {
merged = true;
- (*iter)->OverwriteWithOrAddTo(profile);
+ (*iter)->OverwriteWithOrAddTo(profile, app_locale);
}
}
merged_profiles->push_back(**iter);
@@ -721,10 +720,13 @@ void PersonalDataManager::SetProfiles(std::vector<AutofillProfile>* profiles) {
return;
// Remove empty profiles from input.
- profiles->erase(
- std::remove_if(profiles->begin(), profiles->end(),
- std::mem_fun_ref(&AutofillProfile::IsEmpty)),
- profiles->end());
+ for (std::vector<AutofillProfile>::iterator it = profiles->begin();
+ it != profiles->end();) {
+ if (it->IsEmpty(app_locale_))
+ profiles->erase(it);
+ else
+ it++;
+ }
// Ensure that profile labels are up to date. Currently, sync relies on
// labels to identify a profile.
@@ -781,11 +783,13 @@ void PersonalDataManager::SetCreditCards(
return;
// Remove empty credit cards from input.
- credit_cards->erase(
- std::remove_if(
- credit_cards->begin(), credit_cards->end(),
- std::mem_fun_ref(&CreditCard::IsEmpty)),
- credit_cards->end());
+ for (std::vector<CreditCard>::iterator it = credit_cards->begin();
+ it != credit_cards->end();) {
+ if (it->IsEmpty(app_locale_))
+ credit_cards->erase(it);
+ else
+ it++;
+ }
scoped_refptr<AutofillWebDataService> autofill_data(
AutofillWebDataService::FromBrowserContext(browser_context_));
@@ -923,12 +927,12 @@ void PersonalDataManager::SaveImportedProfile(
for (std::vector<AutofillProfile*>::const_iterator iter =
auxiliary_profiles_.begin();
iter != auxiliary_profiles_.end(); ++iter) {
- if (imported_profile.IsSubsetOf(**iter))
+ if (imported_profile.IsSubsetOf(**iter, app_locale_))
return;
}
std::vector<AutofillProfile> profiles;
- MergeProfile(imported_profile, web_profiles_.get(), &profiles);
+ MergeProfile(imported_profile, web_profiles_.get(), app_locale_, &profiles);
SetProfiles(&profiles);
}
@@ -946,14 +950,13 @@ 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, app_locale))
+ if (!merged && (*card)->UpdateFromImportedCard(imported_card, app_locale_))
merged = true;
credit_cards.push_back(**card);
diff --git a/components/autofill/browser/personal_data_manager.h b/components/autofill/browser/personal_data_manager.h
index 5920b9a..b614233c 100644
--- a/components/autofill/browser/personal_data_manager.h
+++ b/components/autofill/browser/personal_data_manager.h
@@ -42,7 +42,7 @@ class PersonalDataManager : public WebDataServiceConsumer,
// specific data variant.
typedef std::pair<std::string, size_t> GUIDPair;
- PersonalDataManager();
+ explicit PersonalDataManager(const std::string& app_locale);
virtual ~PersonalDataManager();
// Kicks off asynchronous loading of profiles and credit cards.
@@ -152,8 +152,11 @@ class PersonalDataManager : public WebDataServiceConsumer,
// Also see SetProfile for more details.
virtual void Refresh();
+ const std::string& app_locale() const { return app_locale_; }
+
// Checks suitability of |profile| for adding to the user's set of profiles.
- static bool IsValidLearnableProfile(const AutofillProfile& profile);
+ static bool IsValidLearnableProfile(const AutofillProfile& profile,
+ const std::string& app_locale);
// Merges |profile| into one of the |existing_profiles| if possible; otherwise
// appends |profile| to the end of that list. Fills |merged_profiles| with the
@@ -161,6 +164,7 @@ class PersonalDataManager : public WebDataServiceConsumer,
static bool MergeProfile(
const AutofillProfile& profile,
const std::vector<AutofillProfile*>& existing_profiles,
+ const std::string& app_locale,
std::vector<AutofillProfile>* merged_profiles);
protected:
@@ -261,6 +265,7 @@ class PersonalDataManager : public WebDataServiceConsumer,
ObserverList<PersonalDataManagerObserver> observers_;
private:
+ std::string app_locale_;
// For logging UMA metrics. Overridden by metrics tests.
scoped_ptr<const AutofillMetrics> metric_logger_;
diff --git a/components/autofill/browser/personal_data_manager_mac.mm b/components/autofill/browser/personal_data_manager_mac.mm
index 1ffe696..7534190 100644
--- a/components/autofill/browser/personal_data_manager_mac.mm
+++ b/components/autofill/browser/personal_data_manager_mac.mm
@@ -42,13 +42,15 @@ class AuxiliaryProfilesImpl {
virtual ~AuxiliaryProfilesImpl() {}
// Import the "me" card from the Mac Address Book and fill in |profiles_|.
- void GetAddressBookMeCard();
+ void GetAddressBookMeCard(const std::string& app_locale);
private:
void GetAddressBookNames(ABPerson* me,
NSString* addressLabelRaw,
AutofillProfile* profile);
- void GetAddressBookAddress(NSDictionary* address, AutofillProfile* profile);
+ void GetAddressBookAddress(const std::string& app_locale,
+ NSDictionary* address,
+ AutofillProfile* profile);
void GetAddressBookEmail(ABPerson* me,
NSString* addressLabelRaw,
AutofillProfile* profile);
@@ -67,7 +69,8 @@ class AuxiliaryProfilesImpl {
// from the active user's address book. It looks for the user address
// information and translates it to the internal list of |AutofillProfile| data
// structures.
-void AuxiliaryProfilesImpl::GetAddressBookMeCard() {
+void AuxiliaryProfilesImpl::GetAddressBookMeCard(
+ const std::string& app_locale) {
profiles_.clear();
// +[ABAddressBook sharedAddressBook] throws an exception internally in
@@ -122,7 +125,7 @@ void AuxiliaryProfilesImpl::GetAddressBookMeCard() {
GetAddressBookNames(me, addressLabelRaw, profile.get());
// Fill in address information.
- GetAddressBookAddress(address, profile.get());
+ GetAddressBookAddress(app_locale, address, profile.get());
// Fill in email information.
GetAddressBookEmail(me, addressLabelRaw, profile.get());
@@ -158,7 +161,8 @@ void AuxiliaryProfilesImpl::GetAddressBookNames(
// second line we join with commas.
// For example: "c/o John Doe\n1122 Other Avenue\nApt #7" translates to
// line 1: "c/o John Doe", line 2: "1122 Other Avenue, Apt #7".
-void AuxiliaryProfilesImpl::GetAddressBookAddress(NSDictionary* address,
+void AuxiliaryProfilesImpl::GetAddressBookAddress(const std::string& app_locale,
+ NSDictionary* address,
AutofillProfile* profile) {
if (NSString* addressField = [address objectForKey:kABAddressStreetKey]) {
// If there are newlines in the address, split into two lines.
@@ -197,7 +201,7 @@ void AuxiliaryProfilesImpl::GetAddressBookAddress(NSDictionary* address,
if (NSString* country = [address objectForKey:kABAddressCountryKey]) {
profile->SetInfo(ADDRESS_HOME_COUNTRY,
base::SysNSStringToUTF16(country),
- AutofillCountry::ApplicationLocale());
+ app_locale);
}
}
@@ -258,5 +262,5 @@ void AuxiliaryProfilesImpl::GetAddressBookPhoneNumbers(
// Populate |auxiliary_profiles_| with the Address Book data.
void PersonalDataManager::LoadAuxiliaryProfiles() {
AuxiliaryProfilesImpl impl(&auxiliary_profiles_);
- impl.GetAddressBookMeCard();
+ impl.GetAddressBookMeCard(app_locale_);
}
diff --git a/components/autofill/browser/personal_data_manager_unittest.cc b/components/autofill/browser/personal_data_manager_unittest.cc
index ac3a40f..fe4238c 100644
--- a/components/autofill/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/browser/personal_data_manager_unittest.cc
@@ -92,7 +92,7 @@ class PersonalDataManagerTest : public testing::Test {
}
void ResetPersonalDataManager() {
- personal_data_.reset(new PersonalDataManager);
+ personal_data_.reset(new PersonalDataManager("en-US"));
personal_data_->Init(profile_.get());
personal_data_->AddObserver(&personal_data_observer_);
diff --git a/components/autofill/browser/phone_number_i18n.cc b/components/autofill/browser/phone_number_i18n.cc
index 0f71deb..8ff85df 100644
--- a/components/autofill/browser/phone_number_i18n.cc
+++ b/components/autofill/browser/phone_number_i18n.cc
@@ -18,12 +18,12 @@ using i18n::phonenumbers::PhoneNumberUtil;
namespace {
-std::string SanitizeRegion(const std::string& region) {
+std::string SanitizeRegion(const std::string& region,
+ const std::string& app_locale) {
if (region.length() == 2)
return region;
- return AutofillCountry::CountryCodeForLocale(
- AutofillCountry::ApplicationLocale());
+ return AutofillCountry::CountryCodeForLocale(app_locale);
}
// Returns true if |phone_number| is valid.
@@ -149,13 +149,14 @@ bool ParsePhoneNumber(const string16& value,
}
string16 NormalizePhoneNumber(const string16& value,
- std::string const& region) {
+ const std::string& region) {
+ DCHECK_EQ(2u, region.size());
string16 country_code;
string16 unused_city_code;
string16 unused_number;
PhoneNumber phone_number;
- if (!ParsePhoneNumber(value, SanitizeRegion(region), &country_code,
- &unused_city_code, &unused_number, &phone_number)) {
+ if (!ParsePhoneNumber(value, region, &country_code, &unused_city_code,
+ &unused_number, &phone_number)) {
return string16(); // Parsing failed - do not store phone.
}
@@ -169,14 +170,14 @@ bool ConstructPhoneNumber(const string16& country_code,
const string16& number,
const std::string& region,
string16* whole_number) {
+ DCHECK_EQ(2u, region.size());
whole_number->clear();
string16 unused_country_code;
string16 unused_city_code;
string16 unused_number;
PhoneNumber phone_number;
- if (!ParsePhoneNumber(country_code + city_code + number,
- SanitizeRegion(region),
+ if (!ParsePhoneNumber(country_code + city_code + number, region,
&unused_country_code, &unused_city_code, &unused_number,
&phone_number)) {
return false;
@@ -188,9 +189,10 @@ bool ConstructPhoneNumber(const string16& country_code,
bool PhoneNumbersMatch(const string16& number_a,
const string16& number_b,
- const std::string& raw_region) {
+ const std::string& raw_region,
+ const std::string& app_locale) {
// Sanitize the provided |raw_region| before trying to use it for parsing.
- const std::string region = SanitizeRegion(raw_region);
+ const std::string region = SanitizeRegion(raw_region, app_locale);
PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance();
@@ -222,9 +224,11 @@ bool PhoneNumbersMatch(const string16& number_a,
return false;
}
-PhoneObject::PhoneObject(const string16& number, const std::string& region)
- : region_(SanitizeRegion(region)),
+PhoneObject::PhoneObject(const string16& number,
+ const std::string& region)
+ : region_(region),
i18n_number_(NULL) {
+ DCHECK_EQ(2u, region.size());
// TODO(isherman): Autofill profiles should always have a |region| set, but in
// some cases it should be marked as implicit. Otherwise, phone numbers
// might behave differently when they are synced across computers:
diff --git a/components/autofill/browser/phone_number_i18n.h b/components/autofill/browser/phone_number_i18n.h
index 3a35c3b..708da45 100644
--- a/components/autofill/browser/phone_number_i18n.h
+++ b/components/autofill/browser/phone_number_i18n.h
@@ -59,12 +59,14 @@ bool ConstructPhoneNumber(const string16& country_code,
// the given |region|.
bool PhoneNumbersMatch(const string16& number_a,
const string16& number_b,
- const std::string& region);
+ const std::string& region,
+ const std::string& app_locale);
// The cached phone number, does parsing only once, improves performance.
class PhoneObject {
public:
- PhoneObject(const string16& number, const std::string& region);
+ PhoneObject(const string16& number,
+ const std::string& region);
PhoneObject(const PhoneObject&);
PhoneObject();
~PhoneObject();
diff --git a/components/autofill/browser/phone_number_i18n_unittest.cc b/components/autofill/browser/phone_number_i18n_unittest.cc
index 8e25520..7744272 100644
--- a/components/autofill/browser/phone_number_i18n_unittest.cc
+++ b/components/autofill/browser/phone_number_i18n_unittest.cc
@@ -332,41 +332,51 @@ TEST(PhoneNumberI18NTest, PhoneNumbersMatch) {
// Same numbers, defined country code.
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
ASCIIToUTF16("4158889999"),
- "US"));
+ "US",
+ "en-US"));
// Same numbers, undefined country code.
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
ASCIIToUTF16("4158889999"),
- ""));
+ "",
+ "en-US"));
// Numbers differ by country code only.
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("14158889999"),
ASCIIToUTF16("4158889999"),
- "US"));
+ "US",
+ "en-US"));
// Same numbers, different formats.
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
ASCIIToUTF16("415-888-9999"),
- "US"));
+ "US",
+ "en-US"));
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
ASCIIToUTF16("(415)888-9999"),
- "US"));
+ "US",
+ "en-US"));
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
ASCIIToUTF16("415 888 9999"),
- "US"));
+ "US",
+ "en-US"));
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
ASCIIToUTF16("415 TUV WXYZ"),
- "US"));
+ "US",
+ "en-US"));
EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("1(415)888-99-99"),
ASCIIToUTF16("+14158889999"),
- "US"));
+ "US",
+ "en-US"));
// Partial matches don't count.
EXPECT_FALSE(PhoneNumbersMatch(ASCIIToUTF16("14158889999"),
ASCIIToUTF16("8889999"),
- "US"));
+ "US",
+ "en-US"));
// Different numbers don't match.
EXPECT_FALSE(PhoneNumbersMatch(ASCIIToUTF16("14158889999"),
ASCIIToUTF16("1415888"),
- "US"));
+ "US",
+ "en-US"));
}
diff --git a/components/autofill/browser/wallet/wallet_address.cc b/components/autofill/browser/wallet/wallet_address.cc
index 9e5f5d4..209330d 100644
--- a/components/autofill/browser/wallet/wallet_address.cc
+++ b/components/autofill/browser/wallet/wallet_address.cc
@@ -233,7 +233,8 @@ string16 Address::DisplayNameDetail() const {
#endif
}
-string16 Address::GetInfo(AutofillFieldType type) const {
+string16 Address::GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const {
switch (type) {
case NAME_FULL:
return recipient_name();
@@ -254,8 +255,7 @@ string16 Address::GetInfo(AutofillFieldType type) const {
return postal_code_number();
case ADDRESS_HOME_COUNTRY: {
- AutofillCountry country(country_name_code(),
- AutofillCountry::ApplicationLocale());
+ AutofillCountry country(country_name_code(), app_locale);
return country.name();
}
diff --git a/components/autofill/browser/wallet/wallet_address.h b/components/autofill/browser/wallet/wallet_address.h
index c6ac95e..b8ebf94 100644
--- a/components/autofill/browser/wallet/wallet_address.h
+++ b/components/autofill/browser/wallet/wallet_address.h
@@ -88,7 +88,8 @@ class Address {
string16 DisplayNameDetail() const;
// Returns data appropriate for |type|.
- string16 GetInfo(AutofillFieldType type) const;
+ string16 GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const;
const std::string& country_name_code() const { return country_name_code_; }
const string16& recipient_name() const { return recipient_name_; }
diff --git a/components/autofill/browser/wallet/wallet_items.cc b/components/autofill/browser/wallet/wallet_items.cc
index 4084998..8d7e8c4 100644
--- a/components/autofill/browser/wallet/wallet_items.cc
+++ b/components/autofill/browser/wallet/wallet_items.cc
@@ -313,9 +313,11 @@ const gfx::Image& WalletItems::MaskedInstrument::CardIcon() const {
return ResourceBundle::GetSharedInstance().GetImageNamed(idr);
}
-string16 WalletItems::MaskedInstrument::GetInfo(AutofillFieldType type) const {
+string16 WalletItems::MaskedInstrument::GetInfo(
+ AutofillFieldType type,
+ const std::string& app_locale) const {
if (AutofillType(type).group() != AutofillType::CREDIT_CARD)
- return address().GetInfo(type);
+ return address().GetInfo(type, app_locale);
switch (type) {
case CREDIT_CARD_NAME:
diff --git a/components/autofill/browser/wallet/wallet_items.h b/components/autofill/browser/wallet/wallet_items.h
index ddd22b7..f072b79 100644
--- a/components/autofill/browser/wallet/wallet_items.h
+++ b/components/autofill/browser/wallet/wallet_items.h
@@ -86,7 +86,8 @@ class WalletItems {
string16 DisplayNameDetail() const;
// Gets info that corresponds with |type|.
- string16 GetInfo(AutofillFieldType type) const;
+ string16 GetInfo(AutofillFieldType type,
+ const std::string& app_locale) const;
// Returns the display type of the and last four digits (e.g. Visa - 4444).
string16 TypeAndLastFourDigits() const;
diff --git a/components/webdata/autofill/autofill_table.cc b/components/webdata/autofill/autofill_table.cc
index 8218d14..318458d 100644
--- a/components/webdata/autofill/autofill_table.cc
+++ b/components/webdata/autofill/autofill_table.cc
@@ -333,8 +333,8 @@ WebDatabaseTable::TypeKey GetKey() {
// The maximum length allowed for form data.
const size_t AutofillTable::kMaxDataLength = 1024;
-AutofillTable::AutofillTable()
- : app_locale_(AutofillCountry::ApplicationLocale()) {
+AutofillTable::AutofillTable(const std::string& app_locale)
+ : app_locale_(app_locale) {
}
AutofillTable::~AutofillTable() {
@@ -1991,10 +1991,10 @@ bool AutofillTable::MigrateToVersion37MergeAndCullOlderProfiles() {
scoped_ptr<AutofillProfile> p(profile);
- if (PersonalDataManager::IsValidLearnableProfile(*p)) {
+ if (PersonalDataManager::IsValidLearnableProfile(*p, app_locale_)) {
std::vector<AutofillProfile> merged_profiles;
bool merged = PersonalDataManager::MergeProfile(
- *p, accumulated_profiles_p, &merged_profiles);
+ *p, accumulated_profiles_p, app_locale_, &merged_profiles);
std::swap(accumulated_profiles, merged_profiles);
diff --git a/components/webdata/autofill/autofill_table.h b/components/webdata/autofill/autofill_table.h
index 22991d4..c0c24bb 100644
--- a/components/webdata/autofill/autofill_table.h
+++ b/components/webdata/autofill/autofill_table.h
@@ -115,7 +115,7 @@ class Time;
//
class AutofillTable : public WebDatabaseTable {
public:
- AutofillTable();
+ explicit AutofillTable(const std::string& app_locale);
virtual ~AutofillTable();
// Retrieves the AutofillTable* owned by |database|.
diff --git a/components/webdata/autofill/autofill_table_unittest.cc b/components/webdata/autofill/autofill_table_unittest.cc
index 6ce6d57..34be794 100644
--- a/components/webdata/autofill/autofill_table_unittest.cc
+++ b/components/webdata/autofill/autofill_table_unittest.cc
@@ -98,7 +98,7 @@ class AutofillTableTest : public testing::Test {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
file_ = temp_dir_.path().AppendASCII("TestWebDatabase");
- table_.reset(new AutofillTable);
+ table_.reset(new AutofillTable("en-US"));
db_.reset(new WebDatabase);
db_->AddTable(table_.get());
ASSERT_EQ(sql::INIT_OK, db_->Init(file_));
diff --git a/components/webdata/autofill/web_data_service_unittest.cc b/components/webdata/autofill/web_data_service_unittest.cc
index b7124ac..0f74612 100644
--- a/components/webdata/autofill/web_data_service_unittest.cc
+++ b/components/webdata/autofill/web_data_service_unittest.cc
@@ -71,7 +71,7 @@ class WebDataServiceTest : public testing::Test {
base::FilePath path = temp_dir_.path().AppendASCII("TestWebDB");
wdbs_ = new WebDatabaseService(path);
- wdbs_->AddTable(scoped_ptr<WebDatabaseTable>(new AutofillTable()));
+ wdbs_->AddTable(scoped_ptr<WebDatabaseTable>(new AutofillTable("en-US")));
wdbs_->LoadDatabase(WebDatabaseService::InitCallback());
wds_ = new AutofillWebDataService(
diff --git a/components/webdata/autofill/web_database_migration_unittest.cc b/components/webdata/autofill/web_database_migration_unittest.cc
index 8a715a5..8c3bb1c 100644
--- a/components/webdata/autofill/web_database_migration_unittest.cc
+++ b/components/webdata/autofill/web_database_migration_unittest.cc
@@ -175,7 +175,7 @@ class WebDatabaseMigrationTest : public testing::Test {
// for now, as it needs to know about all the different table
// types. Once all webdata datatypes have been componentized, this
// could move to components_unittests.
- AutofillTable autofill_table;
+ AutofillTable autofill_table("en-US");
KeywordTable keyword_table;
LoginsTable logins_table;
TokenServiceTable token_service_table;