| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_I18N_H_ |
| #define COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_I18N_H_ |
| |
| #include "base/strings/string16.h" |
| #include "third_party/icu/source/common/unicode/uchar.h" |
| |
| // Functor for a simple 16-bit Unicode case-insensitive comparison. This is |
| // designed for the autocomplete system where we would rather get prefix lenths |
| // correct than handle all possible case sensitivity issues. |
| // |
| // Any time this is used the result will be incorrect in some cases that |
| // certain users will be able to discern. Ideally, this class would be deleted |
| // and we would do full Unicode case-sensitivity mappings using |
| // base::i18n::ToLower. However, ToLower can change the lenghts of strings, |
| // making computations of offsets or prefix lengths difficult. Getting all |
| // edge cases correct will require careful implementation and testing. In the |
| // mean time, we use this simpler approach. |
| // |
| // This comparator will not handle combining accents properly since it compares |
| // 16-bit values in isolation. If the two strings use the same sequence of |
| // combining accents (this is the normal case) in both strings, it will work. |
| // |
| // Additionally, this comparator does not decode UTF sequences which is why it |
| // is called "UCS2". UTF-16 surrogates will be compared literally (i.e. "case- |
| // sensitively"). |
| // |
| // There are also a few cases where the lower-case version of a character |
| // expands to more than one code point that will not be handled properly. Such |
| // characters will be compared case-sensitively. |
| struct SimpleCaseInsensitiveCompareUCS2 { |
| public: |
| bool operator()(base::char16 x, base::char16 y) const { |
| return u_tolower(x) == u_tolower(y); |
| } |
| }; |
| |
| #endif // COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_I18N_H_ |