Index: chrome/browser/download/download_query.cc |
diff --git a/chrome/browser/download/download_query.cc b/chrome/browser/download/download_query.cc |
index 14bc73e8d170d3d99855f52b4335af86f184ffb1..57ea7f341f0f92ed4fdc2557d7ca50b12d55022f 100644 |
--- a/chrome/browser/download/download_query.cc |
+++ b/chrome/browser/download/download_query.cc |
@@ -50,22 +50,30 @@ template<> bool GetAs(const base::Value& in, std::string* out) { |
template<> bool GetAs(const base::Value& in, string16* out) { |
return in.GetAsString(out); |
} |
+template<> bool GetAs(const base::Value& in, std::vector<string16>* out) { |
+ out->clear(); |
+ const base::ListValue* list = NULL; |
+ if (!in.GetAsList(&list)) |
+ return false; |
+ for (size_t i = 0; i < list->GetSize(); ++i) { |
+ string16 element; |
+ if (!list->GetString(i, &element)) { |
+ out->clear(); |
+ return false; |
+ } |
+ out->push_back(element); |
+ } |
+ return true; |
+} |
// The next several functions are helpers for making Callbacks that access |
// DownloadItem fields. |
-static bool MatchesQuery(const string16& query, const DownloadItem& item) { |
- if (query.empty()) |
- return true; |
- |
- DCHECK_EQ(query, base::i18n::ToLower(query)); |
- |
+static bool MatchesQuery( |
+ const std::vector<string16>& query_terms, |
+ const DownloadItem& item) { |
+ DCHECK(!query_terms.empty()); |
string16 url_raw(UTF8ToUTF16(item.GetOriginalUrl().spec())); |
- if (base::i18n::StringSearchIgnoringCaseAndAccents( |
- query, url_raw, NULL, NULL)) { |
- return true; |
- } |
- |
string16 url_formatted = url_raw; |
if (item.GetBrowserContext()) { |
Profile* profile = Profile::FromBrowserContext(item.GetBrowserContext()); |
@@ -73,14 +81,21 @@ static bool MatchesQuery(const string16& query, const DownloadItem& item) { |
item.GetOriginalUrl(), |
profile->GetPrefs()->GetString(prefs::kAcceptLanguages)); |
} |
- if (base::i18n::StringSearchIgnoringCaseAndAccents( |
- query, url_formatted, NULL, NULL)) { |
- return true; |
- } |
- |
string16 path(item.GetTargetFilePath().LossyDisplayName()); |
- return base::i18n::StringSearchIgnoringCaseAndAccents( |
- query, path, NULL, NULL); |
+ |
+ for (std::vector<string16>::const_iterator it = query_terms.begin(); |
+ it != query_terms.end(); ++it) { |
+ string16 term = base::i18n::ToLower(*it); |
+ if (!base::i18n::StringSearchIgnoringCaseAndAccents( |
+ term, url_raw, NULL, NULL) && |
+ !base::i18n::StringSearchIgnoringCaseAndAccents( |
+ term, url_formatted, NULL, NULL) && |
+ !base::i18n::StringSearchIgnoringCaseAndAccents( |
+ term, path, NULL, NULL)) { |
+ return false; |
+ } |
+ } |
+ return true; |
} |
static int64 GetStartTimeMsEpoch(const DownloadItem& item) { |
@@ -268,9 +283,10 @@ bool DownloadQuery::AddFilter(DownloadQuery::FilterType type, |
case FILTER_PAUSED: |
return AddFilter(BuildFilter<bool>(value, EQ, &IsPaused)); |
case FILTER_QUERY: { |
- string16 query; |
- return GetAs(value, &query) && |
- AddFilter(base::Bind(&MatchesQuery, query)); |
+ std::vector<string16> query_terms; |
+ return GetAs(value, &query_terms) && |
+ (query_terms.empty() || |
+ AddFilter(base::Bind(&MatchesQuery, query_terms))); |
} |
case FILTER_ENDED_AFTER: |
return AddFilter(BuildFilter<std::string>(value, GT, &GetEndTime)); |