Index: components/autofill/core/browser/autofill_profile.cc |
diff --git a/components/autofill/core/browser/autofill_profile.cc b/components/autofill/core/browser/autofill_profile.cc |
index 8c9387980ef43418bfcd5d2b1a7f6c5904baa237..6ae277bc4586dd6594900f02dd33c4f86949d8f3 100644 |
--- a/components/autofill/core/browser/autofill_profile.cc |
+++ b/components/autofill/core/browser/autofill_profile.cc |
@@ -26,6 +26,7 @@ |
#include "components/autofill/core/browser/autofill_country.h" |
#include "components/autofill/core/browser/autofill_field.h" |
#include "components/autofill/core/browser/autofill_metrics.h" |
+#include "components/autofill/core/browser/autofill_profile_comparator.h" |
#include "components/autofill/core/browser/autofill_type.h" |
#include "components/autofill/core/browser/contact_info.h" |
#include "components/autofill/core/browser/phone_number.h" |
@@ -218,27 +219,6 @@ void CollapseCompoundFieldTypes(ServerFieldTypeSet* type_set) { |
std::swap(*type_set, collapsed_set); |
} |
-base::string16 NormalizeForComparison(const base::string16& text) { |
- using icu::UnicodeString; |
- using icu::Transliterator; |
- |
- // Use ICU transliteration to remove diacritics and fold case. |
- // See http://userguide.icu-project.org/transforms/general |
- UErrorCode status = U_ZERO_ERROR; |
- std::unique_ptr<Transliterator> transliterator(Transliterator::createInstance( |
- "NFD; [:Nonspacing Mark:] Remove; Lower; NFC", UTRANS_FORWARD, status)); |
- if (U_FAILURE(status) || transliterator == nullptr) { |
- LOG(ERROR) << "Failed to create ICU Transliterator: " |
- << u_errorName(status); |
- return text; |
- } |
- |
- UnicodeString value = UnicodeString(text.data(), text.length()); |
- transliterator->transliterate(value); |
- |
- return base::string16(value.getBuffer(), value.length()); |
-} |
- |
} // namespace |
AutofillProfile::AutofillProfile(const std::string& guid, |
@@ -795,64 +775,9 @@ void AutofillProfile::RecordAndLogUse() { |
// static |
base::string16 AutofillProfile::CanonicalizeProfileString( |
const base::string16& str) { |
- base::string16 ret; |
- ret.reserve(str.size()); |
- |
- // This algorithm is not designed to be perfect, we could get arbitrarily |
- // fancy here trying to canonicalize address lines. Instead, this is designed |
- // to handle common cases for all types of data (addresses and names) without |
- // the need of domain-specific logic. |
- // |
- // 1. Convert punctuation to spaces and normalize all whitespace to spaces. |
- // This will convert "Mid-Island Plz." -> "Mid Island Plz " (the trailing |
- // space will be trimmed off outside of the end of the loop). |
- // |
- // 2. Collapse consecutive punctuation/whitespace characters to a single |
- // space. We pretend the string has already started with whitespace in |
- // order to trim leading spaces. |
- // |
- // 3. Remove diacritics (accents and other non-spacing marks) and perform |
- // case folding to lower-case. |
- |
- bool previous_was_whitespace = true; |
- for (base::i18n::UTF16CharIterator iter(&str); !iter.end(); iter.Advance()) { |
- switch (u_charType(iter.get())) { |
- // Punctuation |
- case U_DASH_PUNCTUATION: |
- case U_START_PUNCTUATION: |
- case U_END_PUNCTUATION: |
- case U_CONNECTOR_PUNCTUATION: |
- case U_OTHER_PUNCTUATION: |
- // Whitespace |
- case U_CONTROL_CHAR: // To escape the '\n' character. |
- case U_SPACE_SEPARATOR: |
- case U_LINE_SEPARATOR: |
- case U_PARAGRAPH_SEPARATOR: |
- if (!previous_was_whitespace) { |
- ret.push_back(' '); |
- previous_was_whitespace = true; |
- } |
- break; |
- |
- default: |
- previous_was_whitespace = false; |
- base::WriteUnicodeCharacter(iter.get(), &ret); |
- break; |
- } |
- } |
- |
- // Trim off trailing whitespace if we left one. |
- if (previous_was_whitespace && !ret.empty()) |
- ret.resize(ret.size() - 1); |
- |
- // Remove diacritics and perform case folding. |
- return NormalizeForComparison(ret); |
-} |
- |
-// static |
-bool AutofillProfile::AreProfileStringsSimilar(const base::string16& a, |
- const base::string16& b) { |
- return CanonicalizeProfileString(a) == CanonicalizeProfileString(b); |
+ // The locale doesn't matter for general string canonicalization. |
+ AutofillProfileComparator comparator("en-US"); |
+ return comparator.NormalizeForComparison(str); |
} |
void AutofillProfile::GetSupportedTypes( |