| Index: chrome/browser/autocomplete/autocomplete_result.cc
|
| diff --git a/chrome/browser/autocomplete/autocomplete_result.cc b/chrome/browser/autocomplete/autocomplete_result.cc
|
| index 0c01b3923344778c50e930e693230cfa507aa19c..7078f553091f1d39a27e10db2ca030085c655992 100644
|
| --- a/chrome/browser/autocomplete/autocomplete_result.cc
|
| +++ b/chrome/browser/autocomplete/autocomplete_result.cc
|
| @@ -154,10 +154,22 @@ void AutocompleteResult::SortAndCull(const AutocompleteInput& input,
|
| &AutocompleteMatch::DestinationsEqual),
|
| matches_.end());
|
|
|
| + // Find the top match before possibly applying demotions.
|
| + if (!matches_.empty())
|
| + std::partial_sort(matches_.begin(), matches_.begin() + 1, matches_.end(),
|
| + &AutocompleteMatch::MoreRelevant);
|
| + // Don't demote the top match if applicable.
|
| + OmniboxFieldTrial::UndemotableTopMatchTypes undemotable_top_types =
|
| + OmniboxFieldTrial::GetUndemotableTopTypes(
|
| + input.current_page_classification());
|
| + const bool preserve_top_match = !matches_.empty() &&
|
| + (undemotable_top_types.count(matches_.begin()->type) != 0);
|
| +
|
| // Sort and trim to the most relevant kMaxMatches matches.
|
| size_t max_num_matches = std::min(kMaxMatches, matches_.size());
|
| CompareWithDemoteByType comparing_object(input.current_page_classification());
|
| - std::sort(matches_.begin(), matches_.end(), comparing_object);
|
| + std::sort(matches_.begin() + (preserve_top_match ? 1 : 0), matches_.end(),
|
| + comparing_object);
|
| if (!matches_.empty() && !matches_.begin()->allowed_to_be_default_match &&
|
| OmniboxFieldTrial::ReorderForLegalDefaultMatch(
|
| input.current_page_classification())) {
|
| @@ -316,6 +328,8 @@ void AutocompleteResult::AddMatch(
|
| DCHECK_EQ(AutocompleteMatch::SanitizeString(match.contents), match.contents);
|
| DCHECK_EQ(AutocompleteMatch::SanitizeString(match.description),
|
| match.description);
|
| + // GetUndemotableTopTypes() is not used here because it's done in
|
| + // SortAndCull(), and we depend on SortAndCull() to be called afterwards.
|
| CompareWithDemoteByType comparing_object(page_classification);
|
| ACMatches::iterator insertion_point =
|
| std::upper_bound(begin(), end(), match, comparing_object);
|
|
|