| Index: chrome/browser/autocomplete/search_provider.cc
|
| diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc
|
| index b5a6f48296c744aaed7aec6ce2dcbee41c19fc5f..c561490ad1301b5468d61b353253b4df8253852d 100644
|
| --- a/chrome/browser/autocomplete/search_provider.cc
|
| +++ b/chrome/browser/autocomplete/search_provider.cc
|
| @@ -309,10 +309,11 @@ AutocompleteMatch SearchProvider::CreateSearchSuggestion(
|
| }
|
| }
|
| } else {
|
| - // Otherwise, we're dealing with the "default search" result which has no
|
| - // completion.
|
| + // Otherwise, |match| is a verbatim (what-you-typed) match, either for the
|
| + // default provider or a keyword search provider.
|
| match.contents_class.push_back(
|
| ACMatchClassification(0, ACMatchClassification::NONE));
|
| + match.allowed_to_be_default_match = true;
|
| }
|
|
|
| // When the user forced a query, we need to make sure all the fill_into_edit
|
| @@ -325,6 +326,7 @@ AutocompleteMatch SearchProvider::CreateSearchSuggestion(
|
| if (!input.prevent_inline_autocomplete() &&
|
| StartsWith(query_string, input_text, false)) {
|
| match.inline_autocompletion = query_string.substr(input_text.length());
|
| + match.allowed_to_be_default_match = true;
|
| }
|
| match.fill_into_edit.append(query_string);
|
|
|
| @@ -510,6 +512,7 @@ void SearchProvider::Start(const AutocompleteInput& input,
|
| match.contents_class.push_back(
|
| ACMatchClassification(0, ACMatchClassification::NONE));
|
| match.keyword = providers_.default_provider();
|
| + match.allowed_to_be_default_match = true;
|
| matches_.push_back(match);
|
| }
|
| Stop(false);
|
| @@ -1064,15 +1067,21 @@ bool SearchProvider::IsTopMatchSearchWithURLInput() const {
|
| matches_.front().type != AutocompleteMatchType::NAVSUGGEST;
|
| }
|
|
|
| -bool SearchProvider::IsTopMatchNotInlinable() const {
|
| - // Note: this test assumes the SEARCH_OTHER_ENGINE match corresponds to
|
| - // the verbatim search query on the keyword engine. SearchProvider should
|
| - // not create any other match of type SEARCH_OTHER_ENGINE.
|
| - return
|
| - matches_.front().type != AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED &&
|
| - matches_.front().type != AutocompleteMatchType::SEARCH_OTHER_ENGINE &&
|
| - matches_.front().inline_autocompletion.empty() &&
|
| - matches_.front().fill_into_edit != input_.text();
|
| +bool SearchProvider::HasValidDefaultMatch(
|
| + bool autocomplete_result_will_reorder_for_default_match) const {
|
| + // One of the SearchProvider matches may need to be the overall default. If
|
| + // AutocompleteResult is allowed to reorder matches, this means we simply
|
| + // need at least one match in the list to be |allowed_to_be_default_match|.
|
| + // If no reordering is possible, however, then our first match needs to have
|
| + // this flag.
|
| + for (ACMatches::const_iterator it = matches_.begin(); it != matches_.end();
|
| + ++it) {
|
| + if (it->allowed_to_be_default_match)
|
| + return true;
|
| + if (!autocomplete_result_will_reorder_for_default_match)
|
| + return false;
|
| + }
|
| + return false;
|
| }
|
|
|
| void SearchProvider::UpdateMatches() {
|
| @@ -1097,11 +1106,20 @@ void SearchProvider::UpdateMatches() {
|
| ConvertResultsToAutocompleteMatches();
|
| DCHECK(!IsTopMatchNavigationInKeywordMode());
|
| }
|
| - if (IsTopMatchScoreTooLow()) {
|
| + // True if the omnibox will reorder matches as necessary to make the top
|
| + // one something that is allowed to be the default match.
|
| + const bool omnibox_will_reorder_for_legal_default_match =
|
| + OmniboxFieldTrial::ReorderForLegalDefaultMatch(
|
| + input_.current_page_classification());
|
| + if (!omnibox_will_reorder_for_legal_default_match &&
|
| + IsTopMatchScoreTooLow()) {
|
| // Disregard the suggested verbatim relevance if the top score is below
|
| // the usual verbatim value. For example, a BarProvider may rely on
|
| - // SearchProvider's verbatim or inlineable matches for input "foo" to
|
| - // always outrank its own lowly-ranked non-inlineable "bar" match.
|
| + // SearchProvider's verbatim or inlineable matches for input "foo" (all
|
| + // allowed to be default match) to always outrank its own lowly-ranked
|
| + // "bar" matches that shouldn't be the default match. This only needs
|
| + // to be enforced when the omnibox will not reorder results to make a
|
| + // legal default match first.
|
| default_results_.verbatim_relevance = -1;
|
| keyword_results_.verbatim_relevance = -1;
|
| ConvertResultsToAutocompleteMatches();
|
| @@ -1117,18 +1135,25 @@ void SearchProvider::UpdateMatches() {
|
| keyword_results_.verbatim_relevance = -1;
|
| ConvertResultsToAutocompleteMatches();
|
| }
|
| - if (IsTopMatchNotInlinable()) {
|
| - // Disregard suggested relevances if the top match is not a verbatim match
|
| - // or inlinable. For example, input "foo" should not invoke a search for
|
| - // "bar", which would happen if the "bar" search match outranked all other
|
| - // matches.
|
| + if (!HasValidDefaultMatch(omnibox_will_reorder_for_legal_default_match)) {
|
| + // If the omnibox is not going to reorder results to put a legal default
|
| + // match at the top, then this provider needs to guarantee that its top
|
| + // scoring result is a legal default match (i.e., it's either a verbatim
|
| + // match or inlinable). For example, input "foo" should not invoke a
|
| + // search for "bar", which would happen if the "bar" search match
|
| + // outranked all other matches. On the other hand, if the omnibox will
|
| + // reorder matches as necessary to put a legal default match at the top,
|
| + // all we need to guarantee is that SearchProvider returns a legal
|
| + // default match. (The omnibox always needs at least one legal default
|
| + // match, and it relies on SearchProvider to always return one.)
|
| ApplyCalculatedRelevance();
|
| ConvertResultsToAutocompleteMatches();
|
| }
|
| DCHECK(!IsTopMatchNavigationInKeywordMode());
|
| - DCHECK(!IsTopMatchScoreTooLow());
|
| + DCHECK(omnibox_will_reorder_for_legal_default_match ||
|
| + !IsTopMatchScoreTooLow());
|
| DCHECK(!IsTopMatchSearchWithURLInput());
|
| - DCHECK(!IsTopMatchNotInlinable());
|
| + DCHECK(HasValidDefaultMatch(omnibox_will_reorder_for_legal_default_match));
|
| }
|
|
|
| UpdateStarredStateOfMatches();
|
| @@ -1464,6 +1489,7 @@ AutocompleteMatch SearchProvider::NavigationToMatch(
|
| if (!input_.prevent_inline_autocomplete() &&
|
| (inline_autocomplete_offset != string16::npos)) {
|
| DCHECK(inline_autocomplete_offset <= match.fill_into_edit.length());
|
| + match.allowed_to_be_default_match = true;
|
| match.inline_autocompletion =
|
| match.fill_into_edit.substr(inline_autocomplete_offset);
|
| }
|
|
|