| Index: chrome/browser/chromeos/drive/search_metadata.cc
|
| diff --git a/chrome/browser/chromeos/drive/search_metadata.cc b/chrome/browser/chromeos/drive/search_metadata.cc
|
| index 69e4629e02a1fe923952444fcce4d01a1e9ce1e3..258d39d122958960baf4161b69fccab3780341e4 100644
|
| --- a/chrome/browser/chromeos/drive/search_metadata.cc
|
| +++ b/chrome/browser/chromeos/drive/search_metadata.cc
|
| @@ -8,7 +8,8 @@
|
| #include <queue>
|
|
|
| #include "base/bind.h"
|
| -#include "base/string_util.h"
|
| +#include "base/i18n/string_search.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| #include "chrome/browser/chromeos/drive/file_cache.h"
|
| #include "chrome/browser/chromeos/drive/file_system_util.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -21,7 +22,7 @@ namespace internal {
|
|
|
| namespace {
|
|
|
| -// Used to sort the result canididates per the last accessed/modified time. The
|
| +// Used to sort the result candidates per the last accessed/modified time. The
|
| // recently accessed/modified files come first.
|
| bool CompareByTimestamp(const ResourceEntry& a, const ResourceEntry& b) {
|
| const PlatformFileInfoProto& a_file_info = a.file_info();
|
| @@ -129,7 +130,7 @@ void MaybeAddEntryToResult(
|
|
|
| // Add |entry| to the result if the entry is eligible for the given
|
| // |options| and matches the query. The base name of the entry must
|
| - // contains |query| to match the query.
|
| + // contain |query| to match the query.
|
| std::string highlighted;
|
| if (!IsEligibleEntry(entry, cache, options) ||
|
| !FindAndHighlight(entry.base_name(), query, &highlighted))
|
| @@ -216,36 +217,22 @@ bool FindAndHighlight(const std::string& text,
|
| if (query.empty())
|
| return true;
|
|
|
| - // TODO(satorux): Should support non-ASCII characters.
|
| - std::string lower_text = StringToLowerASCII(text);
|
| - std::string lower_query = StringToLowerASCII(query);
|
| -
|
| - int num_matches = 0;
|
| - std::string::size_type cursor = 0;
|
| -
|
| - while (cursor < text.size()) {
|
| - std::string::size_type matched_position =
|
| - lower_text.find(lower_query, cursor);
|
| - if (matched_position == std::string::npos)
|
| - break;
|
| - ++num_matches;
|
| -
|
| - std::string skipped_piece =
|
| - net::EscapeForHTML(text.substr(cursor, matched_position - cursor));
|
| - std::string matched_piece =
|
| - net::EscapeForHTML(text.substr(matched_position, query.size()));
|
| -
|
| - highlighted_text->append(skipped_piece);
|
| - highlighted_text->append("<b>" + matched_piece + "</b>");
|
| -
|
| - cursor = matched_position + query.size();
|
| - }
|
| - if (num_matches == 0)
|
| + string16 text16 = base::UTF8ToUTF16(text);
|
| + string16 query16 = base::UTF8ToUTF16(query);
|
| + size_t match_start = 0;
|
| + size_t match_length = 0;
|
| + if (!base::i18n::StringSearchIgnoringCaseAndAccents(
|
| + query16, text16, &match_start, &match_length)) {
|
| return false;
|
| -
|
| - std::string remaining_piece = text.substr(cursor);
|
| - highlighted_text->append(net::EscapeForHTML(remaining_piece));
|
| -
|
| + }
|
| + string16 pre = text16.substr(0, match_start);
|
| + string16 match = text16.substr(match_start, match_length);
|
| + string16 post = text16.substr(match_start + match_length);
|
| + highlighted_text->append(net::EscapeForHTML(UTF16ToUTF8(pre)));
|
| + highlighted_text->append("<b>");
|
| + highlighted_text->append(net::EscapeForHTML(UTF16ToUTF8(match)));
|
| + highlighted_text->append("</b>");
|
| + highlighted_text->append(net::EscapeForHTML(UTF16ToUTF8(post)));
|
| return true;
|
| }
|
|
|
|
|