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 87e55459d813174258cb5f8f5f421822d95d710d..4b81dec09b2985510ee7051402ed22bdd0ceaa46 100644 |
| --- a/chrome/browser/autocomplete/search_provider.cc |
| +++ b/chrome/browser/autocomplete/search_provider.cc |
| @@ -891,8 +891,6 @@ SearchProvider::SuggestResults SearchProvider::ScoreHistoryResults( |
| bool input_multiple_words, |
| const base::string16& input_text, |
| bool is_keyword) { |
| - AutocompleteClassifier* classifier = |
| - AutocompleteClassifierFactory::GetForProfile(profile_); |
| SuggestResults scored_results; |
| // True if the user has asked this exact query previously. |
| bool found_what_you_typed_match = false; |
| @@ -912,28 +910,6 @@ SearchProvider::SuggestResults SearchProvider::ScoreHistoryResults( |
| (!input_multiple_words && (i->visits < 2) && |
| HasMultipleWords(trimmed_suggestion)); |
| - // Don't autocomplete search terms that would normally be treated as URLs |
| - // when typed. For example, if the user searched for "google.com" and types |
| - // "goog", don't autocomplete to the search term "google.com". Otherwise, |
| - // the input will look like a URL but act like a search, which is confusing. |
| - // NOTE: We don't check this in the following cases: |
| - // * When inline autocomplete is disabled, we won't be inline |
| - // autocompleting this term, so we don't need to worry about confusion as |
| - // much. This also prevents calling Classify() again from inside the |
| - // classifier (which will corrupt state and likely crash), since the |
| - // classifier always disables inline autocomplete. |
| - // * When the user has typed the whole term, the "what you typed" history |
| - // match will outrank us for URL-like inputs anyway, so we need not do |
| - // anything special. |
| - if (!prevent_inline_autocomplete && classifier && |
| - (trimmed_suggestion != trimmed_input)) { |
| - AutocompleteMatch match; |
| - classifier->Classify(trimmed_suggestion, false, false, |
| - input_.current_page_classification(), &match, NULL); |
| - prevent_inline_autocomplete = |
| - !AutocompleteMatch::IsSearchType(match.type); |
| - } |
| - |
| int relevance = CalculateRelevanceForHistory( |
| i->time, is_keyword, !prevent_inline_autocomplete, |
| prevent_search_history_inlining); |
| @@ -962,10 +938,55 @@ SearchProvider::SuggestResults SearchProvider::ScoreHistoryResults( |
| (found_what_you_typed_match ? 1 : 0), |
| scored_results.end(), |
| CompareScoredResults()); |
| + |
| + // Don't autocomplete to search terms that would normally be treated as URLs |
| + // when typed. For example, if the user searched for "google.com" and types |
| + // "goog", don't autocomplete to the search term "google.com". Otherwise, |
| + // the input will look like a URL but act like a search, which is confusing. |
| + // The 1200 relevance score threshold in the test below is the lowest |
|
Mark P
2014/07/23 23:52:39
I added stuff here to the comment.
|
| + // possible score in CalculateRelevanceForHistory()'s aggressive-scoring |
| + // curve. This is an appropriate threshold to use to decide if we're overly |
| + // aggressively inlining because, if we decide the answer is yes, the |
| + // way we resolve it it to not use the aggressive-scoring curve. |
| + // NOTE: We don't check for autocompleting to URLs in the following cases: |
| + // * When inline autocomplete is disabled, we won't be inline autocompleting |
| + // this term, so we don't need to worry about confusion as much. This |
| + // also prevents calling Classify() again from inside the classifier |
| + // (which will corrupt state and likely crash), since the classifier |
| + // always disables inline autocomplete. |
| + // * When the user has typed the whole string before as a query, then it's |
|
Mark P
2014/07/23 23:52:39
I rewrote (re-justified) this second bullet point
|
| + // likely the user has no expectation that term should be interpreted as |
| + // as a URL, so we need not do anything special to preserve user |
| + // expectation. |
| + AutocompleteClassifier* classifier = |
| + AutocompleteClassifierFactory::GetForProfile(profile_); |
| int last_relevance = 0; |
| + if (!base_prevent_inline_autocomplete && !found_what_you_typed_match && |
| + classifier && (scored_results.front().relevance() >= 1200)) { |
| + AutocompleteMatch match; |
| + classifier->Classify(scored_results.front().suggestion(), false, false, |
| + input_.current_page_classification(), &match, NULL); |
| + // Demote this match that would normally be interpreted as a URL to have |
| + // the highest score a previously-issued search query could have when |
| + // scoring with the non-aggressive method. A consequence of demoting |
| + // by revising |last_relevance| is that this match and all following |
| + // matches get demoted; the relative order of matches is preserved. |
| + // One could imagine demoting only those matches that might cause |
| + // confusion (which, by the way, might change the relative order of |
| + // matches. We have decided to go with the simple demote-all approach |
| + // because selective demotion requires multiple Classify() calls and |
| + // such calls can be expensive (as expensive as running the whole |
| + // autocomplete system). |
| + if (!AutocompleteMatch::IsSearchType(match.type)) { |
| + last_relevance = CalculateRelevanceForHistory( |
| + base::Time::Now(), is_keyword, false, |
| + prevent_search_history_inlining); |
| + } |
| + } |
| + |
| for (SuggestResults::iterator i(scored_results.begin()); |
| i != scored_results.end(); ++i) { |
| - if ((i != scored_results.begin()) && (i->relevance() >= last_relevance)) |
| + if ((last_relevance != 0) && (i->relevance() >= last_relevance)) |
| i->set_relevance(last_relevance - 1); |
| last_relevance = i->relevance(); |
| } |