OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/browser/autocomplete/history_contents_provider.h" | 5 #include "chrome/browser/autocomplete/history_contents_provider.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 ConvertResults(); | 126 ConvertResults(); |
127 | 127 |
128 if (!input.synchronous_only()) { | 128 if (!input.synchronous_only()) { |
129 HistoryService* history = | 129 HistoryService* history = |
130 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); | 130 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
131 if (history) { | 131 if (history) { |
132 done_ = false; | 132 done_ = false; |
133 | 133 |
134 history::QueryOptions options; | 134 history::QueryOptions options; |
135 options.SetRecentDayRange(kDaysToSearch); | 135 options.SetRecentDayRange(kDaysToSearch); |
136 options.max_count = kMaxMatchCount; | 136 options.max_count = kMaxMatches; |
137 history->QueryHistory(WideToUTF16(input.text()), options, | 137 history->QueryHistory(WideToUTF16(input.text()), options, |
138 &request_consumer_, | 138 &request_consumer_, |
139 NewCallback(this, &HistoryContentsProvider::QueryComplete)); | 139 NewCallback(this, &HistoryContentsProvider::QueryComplete)); |
140 } | 140 } |
141 } | 141 } |
142 } | 142 } |
143 | 143 |
144 void HistoryContentsProvider::Stop() { | 144 void HistoryContentsProvider::Stop() { |
145 done_ = true; | 145 done_ = true; |
146 request_consumer_.CancelAllRequests(); | 146 request_consumer_.CancelAllRequests(); |
(...skipping 29 matching lines...) Expand all Loading... |
176 | 176 |
177 // Results are sorted in decreasing order so we run the loop backwards so that | 177 // Results are sorted in decreasing order so we run the loop backwards so that |
178 // the relevance increment favors the higher ranked results. | 178 // the relevance increment favors the higher ranked results. |
179 for (std::vector<history::URLResult*>::const_reverse_iterator i = | 179 for (std::vector<history::URLResult*>::const_reverse_iterator i = |
180 results_.rbegin(); i != results_.rend(); ++i) { | 180 results_.rbegin(); i != results_.rend(); ++i) { |
181 history::URLResult* result = *i; | 181 history::URLResult* result = *i; |
182 MatchReference ref(result, CalculateRelevance(*result)); | 182 MatchReference ref(result, CalculateRelevance(*result)); |
183 result_refs.push_back(ref); | 183 result_refs.push_back(ref); |
184 } | 184 } |
185 | 185 |
186 // Get the top matches and add them. Always do max number of matches the popup | 186 // Get the top matches and add them. |
187 // will show plus one. This ensures that if the other providers provide the | |
188 // exact same set of results, and the db only has max_matches + 1 results | |
189 // available for this query, we know the last one. | |
190 // | |
191 // This is done to avoid having the history search shortcut show | |
192 // 'See 1 previously viewed ...'. | |
193 // | |
194 // Note that AutocompleteResult::kMaxMatches (maximum size of the popup) | |
195 // is different than both kMaxMatches (the provider's maximum) and | |
196 // kMaxMatchCount (the number of items we want from the history). | |
197 size_t max_for_popup = std::min(AutocompleteResult::kMaxMatches + 1, | |
198 result_refs.size()); | |
199 size_t max_for_provider = std::min(kMaxMatches, result_refs.size()); | 187 size_t max_for_provider = std::min(kMaxMatches, result_refs.size()); |
200 std::partial_sort(result_refs.begin(), result_refs.begin() + max_for_popup, | 188 std::partial_sort(result_refs.begin(), result_refs.begin() + max_for_provider, |
201 result_refs.end(), &CompareMatchRelevance); | 189 result_refs.end(), &CompareMatchRelevance); |
202 matches_.clear(); | 190 matches_.clear(); |
203 for (size_t i = 0; i < max_for_popup; i++) { | 191 for (size_t i = 0; i < max_for_provider; i++) { |
204 matches_.push_back(ResultToMatch(*result_refs[i].result, | 192 matches_.push_back(ResultToMatch(*result_refs[i].result, |
205 result_refs[i].relevance)); | 193 result_refs[i].relevance)); |
206 } | 194 } |
207 | |
208 // We made more matches than the autocomplete service requested for this | |
209 // provider (see previous comment). We invert the weights for the items | |
210 // we want to get removed, but preserve their magnitude which will be used | |
211 // to fill them in with our other results. | |
212 for (size_t i = max_for_provider; i < max_for_popup; i++) | |
213 matches_[i].relevance = -matches_[i].relevance; | |
214 } | 195 } |
215 | 196 |
216 static bool MatchInTitle(const history::URLResult& result) { | 197 static bool MatchInTitle(const history::URLResult& result) { |
217 return !result.title_match_positions().empty(); | 198 return !result.title_match_positions().empty(); |
218 } | 199 } |
219 | 200 |
220 AutocompleteMatch HistoryContentsProvider::ResultToMatch( | 201 AutocompleteMatch HistoryContentsProvider::ResultToMatch( |
221 const history::URLResult& result, | 202 const history::URLResult& result, |
222 int score) { | 203 int score) { |
223 // TODO(sky): if matched title highlight matching words in title. | 204 // TODO(sky): if matched title highlight matching words in title. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 UMA_HISTOGRAM_TIMES("Omnibox.QueryBookmarksTime", | 272 UMA_HISTOGRAM_TIMES("Omnibox.QueryBookmarksTime", |
292 TimeTicks::Now() - start_time); | 273 TimeTicks::Now() - start_time); |
293 } | 274 } |
294 | 275 |
295 void HistoryContentsProvider::AddBookmarkTitleMatchToResults( | 276 void HistoryContentsProvider::AddBookmarkTitleMatchToResults( |
296 const bookmark_utils::TitleMatch& match) { | 277 const bookmark_utils::TitleMatch& match) { |
297 history::URLResult url_result(match.node->GetURL(), match.match_positions); | 278 history::URLResult url_result(match.node->GetURL(), match.match_positions); |
298 url_result.set_title(match.node->GetTitle()); | 279 url_result.set_title(match.node->GetTitle()); |
299 results_.AppendURLBySwapping(&url_result); | 280 results_.AppendURLBySwapping(&url_result); |
300 } | 281 } |
OLD | NEW |