Chromium Code Reviews| Index: chrome/browser/autocomplete/search_provider.cc |
| diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc |
| index 2e79b08f3841cd8c1562bf669ea5ce13ea10a12b..354026a51eb808869b6f82f03ffe2debf1f09d6a 100644 |
| --- a/chrome/browser/autocomplete/search_provider.cc |
| +++ b/chrome/browser/autocomplete/search_provider.cc |
| @@ -1307,15 +1307,33 @@ ACMatches::const_iterator SearchProvider::FindTopMatch( |
| return it; |
| } |
| -bool SearchProvider::IsTopMatchNavigationInKeywordMode( |
| +bool SearchProvider::IsTopMatchNavigation( |
| bool autocomplete_result_will_reorder_for_default_match) const { |
| ACMatches::const_iterator first_match = |
| FindTopMatch(autocomplete_result_will_reorder_for_default_match); |
| - return !providers_.keyword_provider().empty() && |
| - (first_match != matches_.end()) && |
| + return (first_match != matches_.end()) && |
| (first_match->type == AutocompleteMatchType::NAVSUGGEST); |
| } |
| +bool SearchProvider::HasKeywordMatchThatCanBeDefault( |
| + bool autocomplete_result_will_reorder_for_default_match) const { |
| + // In regular (non-reorder) mode we don't care about the |
| + // |allowed_to_be_default_match| state, so return true saying |
| + // everything is fine. |
| + if (!autocomplete_result_will_reorder_for_default_match) |
| + return true; |
|
Peter Kasting
2013/11/19 02:58:24
It seems kinda wrong to do this here, because it e
Mark P
2013/11/20 19:05:52
Good point. It does seem wrong. Fixed.
|
| + const TemplateURL* keyword_url = providers_.GetKeywordProviderURL(); |
| + if (keyword_url == NULL) // not in keyword mode -> say everything's okay |
| + return true; |
| + for (ACMatches::const_iterator it = matches_.begin(); it != matches_.end(); |
| + ++it) { |
| + if ((it->keyword == keyword_url->keyword()) && |
| + it->allowed_to_be_default_match) |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| bool SearchProvider::IsTopMatchScoreTooLow( |
| bool autocomplete_result_will_reorder_for_default_match) const { |
| // In reorder mode, there's no such thing as a score that's too low. |
| @@ -1364,8 +1382,15 @@ bool SearchProvider::HasValidDefaultMatch( |
| void SearchProvider::UpdateMatches() { |
| base::TimeTicks update_matches_start_time(base::TimeTicks::Now()); |
| + const TemplateURL* keyword_url = providers_.GetKeywordProviderURL(); |
| ConvertResultsToAutocompleteMatches(); |
| + // True if the omnibox will reorder matches as necessary to make the first |
| + // 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()); |
| + |
| // Check constraints that may be violated by suggested relevances. |
| if (!matches_.empty() && |
| (default_results_.HasServerProvidedScores() || |
| @@ -1373,26 +1398,27 @@ void SearchProvider::UpdateMatches() { |
| // These blocks attempt to repair undesirable behavior by suggested |
| // relevances with minimal impact, preserving other suggested relevances. |
| - // True if the omnibox will reorder matches as necessary to make the first |
| - // 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 (IsTopMatchNavigationInKeywordMode( |
| - omnibox_will_reorder_for_legal_default_match)) { |
| + if ((keyword_url != NULL) && |
| + IsTopMatchNavigation(omnibox_will_reorder_for_legal_default_match)) { |
| // Correct the suggested relevance scores if the top match is a |
| // navigation in keyword mode, since inlining a navigation match |
| - // would break the user out of keyword mode. By the way, if the top |
| - // match is a non-keyword match (query or navsuggestion) in keyword |
| - // mode, the user would also break out of keyword mode. However, |
| - // that situation is impossible given the current scoring paradigm |
| - // and the fact that only one search engine (Google) provides suggested |
| - // relevance scores at this time. |
| + // would break the user out of keyword mode. We only need to do this |
| + // correction in regular (non-reorder) mode; in reorder mode, we rely |
| + // on the fact that navigation matches are marked as not allowed to be |
| + // the default match. |
|
Peter Kasting
2013/11/19 02:58:24
This comment doesn't seem to match the code? It l
Mark P
2013/11/20 19:05:52
Clarified comment and added DCHECK.
|
| DemoteKeywordNavigationMatchesPastTopQuery(); |
| ConvertResultsToAutocompleteMatches(); |
| - DCHECK(!IsTopMatchNavigationInKeywordMode( |
| + DCHECK(!IsTopMatchNavigation( |
| omnibox_will_reorder_for_legal_default_match)); |
| } |
| + if ((keyword_url != NULL) && !HasKeywordMatchThatCanBeDefault( |
| + omnibox_will_reorder_for_legal_default_match)) { |
| + // In keyword mode, disregard the keyword verbatim suggested relevance |
| + // if necessary so there at least one keyword match that's allowed to |
| + // be the default match. |
| + keyword_results_.verbatim_relevance = -1; |
| + ConvertResultsToAutocompleteMatches(); |
| + } |
| if (IsTopMatchScoreTooLow(omnibox_will_reorder_for_legal_default_match)) { |
| // Disregard the suggested verbatim relevance if the top score is below |
| // the usual verbatim value. For example, a BarProvider may rely on |
| @@ -1429,7 +1455,9 @@ void SearchProvider::UpdateMatches() { |
| ApplyCalculatedRelevance(); |
| ConvertResultsToAutocompleteMatches(); |
| } |
| - DCHECK(!IsTopMatchNavigationInKeywordMode( |
| + DCHECK((keyword_url == NULL) || |
| + !IsTopMatchNavigation(omnibox_will_reorder_for_legal_default_match)); |
| + DCHECK((keyword_url == NULL) || HasKeywordMatchThatCanBeDefault( |
| omnibox_will_reorder_for_legal_default_match)); |
| DCHECK(!IsTopMatchScoreTooLow( |
| omnibox_will_reorder_for_legal_default_match)); |
| @@ -1438,6 +1466,26 @@ void SearchProvider::UpdateMatches() { |
| DCHECK(HasValidDefaultMatch(omnibox_will_reorder_for_legal_default_match)); |
| } |
| + if ((keyword_url != NULL) && HasKeywordMatchThatCanBeDefault( |
| + omnibox_will_reorder_for_legal_default_match)) { |
| + // If there is a keyword match that is allowed to be the default match, |
| + // then prohibit default provider matches from being the defaul match lest |
| + // such matches cause the user to break out of keyword mode. |
| + for (ACMatches::const_iterator keyword_match_it = matches_.begin(); |
| + keyword_match_it != matches_.end(); ++keyword_match_it) { |
| + if (keyword_match_it->allowed_to_be_default_match && |
| + (keyword_match_it->keyword == keyword_url->keyword())) { |
|
Peter Kasting
2013/11/19 02:58:24
Nit: You know, if we had a functor that could comp
Mark P
2013/11/20 19:05:52
I realized part of this block is redundant with Ha
|
| + // Found one such match. |
| + for (ACMatches::iterator it = matches_.begin(); it != matches_.end(); |
| + ++it) { |
| + if (it->keyword != keyword_url->keyword()) |
| + it->allowed_to_be_default_match = false; |
| + } |
| + break; |
| + } |
| + } |
| + } |
| + |
| base::TimeTicks update_starred_start_time(base::TimeTicks::Now()); |
| UpdateStarredStateOfMatches(); |
| UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.UpdateStarredTime", |
| @@ -1839,7 +1887,11 @@ 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; |
| + // A navsuggestion can only be the default match when there is no |
| + // keyword provider active lest it appear first and breaks the user |
|
Peter Kasting
2013/11/19 02:58:24
Nit: breaks -> break
Also probably add a comma af
Mark P
2013/11/20 19:05:52
Agree with both. Done.
|
| + // out of keyword mode. |
| + match.allowed_to_be_default_match = |
| + (providers_.GetKeywordProviderURL() == NULL); |
| match.inline_autocompletion = |
| match.fill_into_edit.substr(inline_autocomplete_offset); |
| } |