Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Side by Side Diff: components/autofill/core/browser/autofill_country.cc

Issue 1541843002: Autofill's CountryCode should use scoped_ptr for owned pointers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | components/autofill/core/common/autofill_l10n_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/autofill/core/browser/autofill_country.h" 5 #include "components/autofill/core/browser/autofill_country.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <map> 9 #include <map>
10 #include <utility> 10 #include <utility>
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 864
865 // Interprets |country_name| as a full country name localized to the given 865 // Interprets |country_name| as a full country name localized to the given
866 // |locale| and returns the corresponding country code stored in 866 // |locale| and returns the corresponding country code stored in
867 // |locales_to_localized_names_|, or an empty string if there is none. 867 // |locales_to_localized_names_|, or an empty string if there is none.
868 const std::string GetCountryCodeForLocalizedName( 868 const std::string GetCountryCodeForLocalizedName(
869 const base::string16& country_name, 869 const base::string16& country_name,
870 const std::string& locale); 870 const std::string& locale);
871 871
872 // Returns an ICU collator -- i.e. string comparator -- appropriate for the 872 // Returns an ICU collator -- i.e. string comparator -- appropriate for the
873 // given |locale|, or null if no collator is available. 873 // given |locale|, or null if no collator is available.
874 icu::Collator* GetCollatorForLocale(const std::string& locale); 874 const icu::Collator* GetCollatorForLocale(const std::string& locale);
875 875
876 // Returns the ICU sort key corresponding to |str| for the given |collator|. 876 // Returns the ICU sort key corresponding to |str| for the given |collator|.
877 // Uses |buffer| as temporary storage, and might resize |buffer| as a side- 877 // Uses |buffer| as temporary storage, and might resize |buffer| as a side-
878 // effect. |buffer_size| should specify the |buffer|'s size, and is updated if 878 // effect. |buffer_size| should specify the |buffer|'s size, and is updated if
879 // the |buffer| is resized. 879 // the |buffer| is resized.
880 const std::string GetSortKey(const icu::Collator& collator, 880 const std::string GetSortKey(const icu::Collator& collator,
881 const base::string16& str, 881 const base::string16& str,
882 scoped_ptr<uint8_t[]>* buffer, 882 scoped_ptr<uint8_t[]>* buffer,
883 int32_t* buffer_size) const; 883 int32_t* buffer_size) const;
884 884
885 // Maps from common country names, including 2- and 3-letter country codes, 885 // Maps from common country names, including 2- and 3-letter country codes,
886 // to the corresponding 2-letter country codes. The keys are uppercase ASCII 886 // to the corresponding 2-letter country codes. The keys are uppercase ASCII
887 // strings. 887 // strings.
888 std::map<std::string, std::string> common_names_; 888 std::map<std::string, std::string> common_names_;
889 889
890 // The outer map keys are ICU locale identifiers. 890 // The outer map keys are ICU locale identifiers.
891 // The inner maps map from localized country names to their corresponding 891 // The inner maps map from localized country names to their corresponding
892 // country codes. The inner map keys are ICU collation sort keys corresponding 892 // country codes. The inner map keys are ICU collation sort keys corresponding
893 // to the target localized country name. 893 // to the target localized country name.
894 std::map<std::string, std::map<std::string, std::string> > 894 std::map<std::string, std::map<std::string, std::string> >
895 locales_to_localized_names_; 895 locales_to_localized_names_;
896 896
897 // Maps ICU locale names to their corresponding collators. 897 // Maps ICU locale names to their corresponding collators.
898 std::map<std::string, icu::Collator*> collators_; 898 std::map<std::string, scoped_ptr<icu::Collator>> collators_;
899 899
900 DISALLOW_COPY_AND_ASSIGN(CountryNames); 900 DISALLOW_COPY_AND_ASSIGN(CountryNames);
901 }; 901 };
902 902
903 // static 903 // static
904 CountryNames* CountryNames::GetInstance() { 904 CountryNames* CountryNames::GetInstance() {
905 return base::Singleton<CountryNames>::get(); 905 return base::Singleton<CountryNames>::get();
906 } 906 }
907 907
908 CountryNames::CountryNames() { 908 CountryNames::CountryNames() {
(...skipping 14 matching lines...) Expand all
923 923
924 // Add a few other common synonyms. 924 // Add a few other common synonyms.
925 common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US")); 925 common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US"));
926 common_names_.insert(std::make_pair("U.S.A.", "US")); 926 common_names_.insert(std::make_pair("U.S.A.", "US"));
927 common_names_.insert(std::make_pair("GREAT BRITAIN", "GB")); 927 common_names_.insert(std::make_pair("GREAT BRITAIN", "GB"));
928 common_names_.insert(std::make_pair("UK", "GB")); 928 common_names_.insert(std::make_pair("UK", "GB"));
929 common_names_.insert(std::make_pair("BRASIL", "BR")); 929 common_names_.insert(std::make_pair("BRASIL", "BR"));
930 common_names_.insert(std::make_pair("DEUTSCHLAND", "DE")); 930 common_names_.insert(std::make_pair("DEUTSCHLAND", "DE"));
931 } 931 }
932 932
933 CountryNames::~CountryNames() { 933 CountryNames::~CountryNames() {}
934 STLDeleteContainerPairSecondPointers(collators_.begin(),
935 collators_.end());
936 }
937 934
938 const std::string CountryNames::GetCountryCode(const base::string16& country, 935 const std::string CountryNames::GetCountryCode(const base::string16& country,
939 const std::string& locale) { 936 const std::string& locale) {
940 // First, check common country names, including 2- and 3-letter country codes. 937 // First, check common country names, including 2- and 3-letter country codes.
941 std::string country_utf8 = base::UTF16ToUTF8(base::ToUpperASCII(country)); 938 std::string country_utf8 = base::UTF16ToUTF8(base::ToUpperASCII(country));
942 const auto result = common_names_.find(country_utf8); 939 const auto result = common_names_.find(country_utf8);
943 if (result != common_names_.end()) 940 if (result != common_names_.end())
944 return result->second; 941 return result->second;
945 942
946 // Next, check country names localized to |locale|. 943 // Next, check country names localized to |locale|.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 } 975 }
979 976
980 locales_to_localized_names_.insert(std::make_pair(locale, localized_names)); 977 locales_to_localized_names_.insert(std::make_pair(locale, localized_names));
981 } 978 }
982 979
983 const std::string CountryNames::GetCountryCodeForLocalizedName( 980 const std::string CountryNames::GetCountryCodeForLocalizedName(
984 const base::string16& country_name, 981 const base::string16& country_name,
985 const std::string& locale) { 982 const std::string& locale) {
986 AddLocalizedNamesForLocale(locale); 983 AddLocalizedNamesForLocale(locale);
987 984
988 icu::Collator* collator = GetCollatorForLocale(locale); 985 const icu::Collator* collator = GetCollatorForLocale(locale);
989 // In very rare cases, the collator fails to initialize. 986 // In very rare cases, the collator fails to initialize.
990 if (!collator) 987 if (!collator)
991 return std::string(); 988 return std::string();
992 989
993 // As recommended[1] by ICU, initialize the buffer size to four times the 990 // As recommended[1] by ICU, initialize the buffer size to four times the
994 // source string length. 991 // source string length.
995 // [1] http://userguide.icu-project.org/collation/api#TOC-Examples 992 // [1] http://userguide.icu-project.org/collation/api#TOC-Examples
996 int32_t buffer_size = country_name.size() * 4; 993 int32_t buffer_size = country_name.size() * 4;
997 scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); 994 scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
998 std::string sort_key = GetSortKey(*collator, 995 std::string sort_key = GetSortKey(*collator,
999 country_name, 996 country_name,
1000 &buffer, 997 &buffer,
1001 &buffer_size); 998 &buffer_size);
1002 999
1003 const std::map<std::string, std::string>& localized_names = 1000 const std::map<std::string, std::string>& localized_names =
1004 locales_to_localized_names_[locale]; 1001 locales_to_localized_names_[locale];
1005 std::map<std::string, std::string>::const_iterator result = 1002 std::map<std::string, std::string>::const_iterator result =
1006 localized_names.find(sort_key); 1003 localized_names.find(sort_key);
1007 1004
1008 if (result != localized_names.end()) 1005 if (result != localized_names.end())
1009 return result->second; 1006 return result->second;
1010 1007
1011 return std::string(); 1008 return std::string();
1012 } 1009 }
1013 1010
1014 icu::Collator* CountryNames::GetCollatorForLocale(const std::string& locale) { 1011 const icu::Collator* CountryNames::GetCollatorForLocale(
1015 if (!collators_.count(locale)) { 1012 const std::string& locale) {
1016 icu::Collator* collator( 1013 if (!ContainsKey(collators_, locale)) {
1014 scoped_ptr<icu::Collator> collator(
1017 autofill::l10n::GetCollatorForLocale(icu::Locale(locale.c_str()))); 1015 autofill::l10n::GetCollatorForLocale(icu::Locale(locale.c_str())));
1018 if (!collator) 1016 if (!collator)
1019 return nullptr; 1017 return nullptr;
1020 1018
1021 // Compare case-insensitively and ignoring punctuation. 1019 // Compare case-insensitively and ignoring punctuation.
1022 UErrorCode ignored = U_ZERO_ERROR; 1020 UErrorCode ignored = U_ZERO_ERROR;
1023 collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored); 1021 collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored);
1024 ignored = U_ZERO_ERROR; 1022 ignored = U_ZERO_ERROR;
1025 collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored); 1023 collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored);
1026 1024
1027 collators_.insert(std::make_pair(locale, collator)); 1025 collators_[locale] = std::move(collator);
1028 } 1026 }
1029 1027
1030 return collators_[locale]; 1028 return collators_[locale].get();
1031 } 1029 }
1032 1030
1033 const std::string CountryNames::GetSortKey(const icu::Collator& collator, 1031 const std::string CountryNames::GetSortKey(const icu::Collator& collator,
1034 const base::string16& str, 1032 const base::string16& str,
1035 scoped_ptr<uint8_t[]>* buffer, 1033 scoped_ptr<uint8_t[]>* buffer,
1036 int32_t* buffer_size) const { 1034 int32_t* buffer_size) const {
1037 DCHECK(buffer); 1035 DCHECK(buffer);
1038 DCHECK(buffer_size); 1036 DCHECK(buffer_size);
1039 1037
1040 icu::UnicodeString icu_str(str.c_str(), str.length()); 1038 icu::UnicodeString icu_str(str.c_str(), str.length());
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1115 const base::string16& name, 1113 const base::string16& name,
1116 const base::string16& postal_code_label, 1114 const base::string16& postal_code_label,
1117 const base::string16& state_label) 1115 const base::string16& state_label)
1118 : country_code_(country_code), 1116 : country_code_(country_code),
1119 name_(name), 1117 name_(name),
1120 postal_code_label_(postal_code_label), 1118 postal_code_label_(postal_code_label),
1121 state_label_(state_label) { 1119 state_label_(state_label) {
1122 } 1120 }
1123 1121
1124 } // namespace autofill 1122 } // namespace autofill
OLDNEW
« no previous file with comments | « no previous file | components/autofill/core/common/autofill_l10n_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698