| Index: trunk/src/chrome/browser/autocomplete/search_provider.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/autocomplete/search_provider.cc (revision 290069)
|
| +++ trunk/src/chrome/browser/autocomplete/search_provider.cc (working copy)
|
| @@ -170,34 +170,6 @@
|
| return (type == metrics::OmniboxInputType::QUERY) ? 1450 : 1100;
|
| }
|
|
|
| -// static
|
| -void SearchProvider::UpdateOldResults(
|
| - bool minimal_changes,
|
| - SearchSuggestionParser::Results* results) {
|
| - // When called without |minimal_changes|, it likely means the user has
|
| - // pressed a key. Revise the cached results appropriately.
|
| - if (!minimal_changes) {
|
| - for (SearchSuggestionParser::SuggestResults::iterator sug_it =
|
| - results->suggest_results.begin();
|
| - sug_it != results->suggest_results.end(); ++sug_it) {
|
| - sug_it->set_received_after_last_keystroke(false);
|
| - }
|
| - for (SearchSuggestionParser::NavigationResults::iterator nav_it =
|
| - results->navigation_results.begin();
|
| - nav_it != results->navigation_results.end(); ++nav_it) {
|
| - nav_it->set_received_after_last_keystroke(false);
|
| - }
|
| - }
|
| -}
|
| -
|
| -// static
|
| -ACMatches::iterator SearchProvider::FindTopMatch(ACMatches* matches) {
|
| - ACMatches::iterator it = matches->begin();
|
| - while ((it != matches->end()) && !it->allowed_to_be_default_match)
|
| - ++it;
|
| - return it;
|
| -}
|
| -
|
| void SearchProvider::Start(const AutocompleteInput& input,
|
| bool minimal_changes) {
|
| // Do our best to load the model as early as possible. This will reduce
|
| @@ -420,8 +392,6 @@
|
| }
|
|
|
| void SearchProvider::UpdateMatches() {
|
| - PersistTopSuggestions(&default_results_);
|
| - PersistTopSuggestions(&keyword_results_);
|
| ConvertResultsToAutocompleteMatches();
|
|
|
| // Check constraints that may be violated by suggested relevances.
|
| @@ -434,12 +404,8 @@
|
| if ((providers_.GetKeywordProviderURL() != NULL) &&
|
| (FindTopMatch() == matches_.end())) {
|
| // In keyword mode, disregard the keyword verbatim suggested relevance
|
| - // if necessary, so at least one match is allowed to be default. (This
|
| - // is only necessary if we were told to suppress keyword verbatim and
|
| - // hence have no default keyword match.) Give keyword verbatim the
|
| - // lowest non-zero score to best reflect what the server desired.
|
| - DCHECK_EQ(0, keyword_results_.verbatim_relevance);
|
| - keyword_results_.verbatim_relevance = 1;
|
| + // if necessary, so at least one match is allowed to be default.
|
| + keyword_results_.verbatim_relevance = -1;
|
| ConvertResultsToAutocompleteMatches();
|
| }
|
| if (IsTopMatchSearchWithURLInput()) {
|
| @@ -456,13 +422,8 @@
|
| if (FindTopMatch() == matches_.end()) {
|
| // Guarantee 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.) Give the verbatim suggestion
|
| - // the lowest non-zero scores to best reflect what the server desired.
|
| - DCHECK_EQ(0, default_results_.verbatim_relevance);
|
| - default_results_.verbatim_relevance = 1;
|
| - // We do not have to alter keyword_results_.verbatim_relevance here.
|
| - // If the user is in keyword mode, we already reverted (earlier in this
|
| - // function) the instructions to suppress keyword verbatim.
|
| + // on SearchProvider to always return one.)
|
| + ApplyCalculatedRelevance();
|
| ConvertResultsToAutocompleteMatches();
|
| }
|
| DCHECK(!IsTopMatchSearchWithURLInput());
|
| @@ -470,22 +431,6 @@
|
| }
|
| UMA_HISTOGRAM_CUSTOM_COUNTS(
|
| "Omnibox.SearchProviderMatches", matches_.size(), 1, 6, 7);
|
| -
|
| - // Record the top suggestion (if any) for future use.
|
| - top_query_suggestion_match_contents_ = base::string16();
|
| - top_navigation_suggestion_ = GURL();
|
| - ACMatches::const_iterator first_match = FindTopMatch();
|
| - if ((first_match != matches_.end()) &&
|
| - !first_match->inline_autocompletion.empty()) {
|
| - // Identify if this match came from a query suggestion or a navsuggestion.
|
| - // In either case, extracts the identifying feature of the suggestion
|
| - // (query string or navigation url).
|
| - if (AutocompleteMatch::IsSearchType(first_match->type))
|
| - top_query_suggestion_match_contents_ = first_match->contents;
|
| - else
|
| - top_navigation_suggestion_ = first_match->destination_url;
|
| - }
|
| -
|
| UpdateDone();
|
| }
|
|
|
| @@ -576,7 +521,8 @@
|
| // We can't keep running any previous query, so halt it.
|
| StopSuggest();
|
|
|
| - UpdateAllOldResults(minimal_changes);
|
| + // Remove existing results that cannot inline autocomplete the new input.
|
| + RemoveAllStaleResults();
|
|
|
| // Update the content classifications of remaining results so they look good
|
| // against the current input.
|
| @@ -660,39 +606,21 @@
|
| return true;
|
| }
|
|
|
| -void SearchProvider::UpdateAllOldResults(bool minimal_changes) {
|
| +void SearchProvider::RemoveAllStaleResults() {
|
| if (keyword_input_.text().empty()) {
|
| // User is either in keyword mode with a blank input or out of
|
| // keyword mode entirely.
|
| keyword_results_.Clear();
|
| }
|
| - UpdateOldResults(minimal_changes, &default_results_);
|
| - UpdateOldResults(minimal_changes, &keyword_results_);
|
| }
|
|
|
| -void SearchProvider::PersistTopSuggestions(
|
| - SearchSuggestionParser::Results* results) {
|
| - // Mark any results matching the current top results as having been received
|
| - // prior to the last keystroke. That prevents asynchronous updates from
|
| - // clobbering top results, which may be used for inline autocompletion.
|
| - // Other results don't need similar changes, because they shouldn't be
|
| - // displayed asynchronously anyway.
|
| - if (!top_query_suggestion_match_contents_.empty()) {
|
| - for (SearchSuggestionParser::SuggestResults::iterator sug_it =
|
| - results->suggest_results.begin();
|
| - sug_it != results->suggest_results.end(); ++sug_it) {
|
| - if (sug_it->match_contents() == top_query_suggestion_match_contents_)
|
| - sug_it->set_received_after_last_keystroke(false);
|
| - }
|
| - }
|
| - if (top_navigation_suggestion_.is_valid()) {
|
| - for (SearchSuggestionParser::NavigationResults::iterator nav_it =
|
| - results->navigation_results.begin();
|
| - nav_it != results->navigation_results.end(); ++nav_it) {
|
| - if (nav_it->url() == top_navigation_suggestion_)
|
| - nav_it->set_received_after_last_keystroke(false);
|
| - }
|
| - }
|
| +void SearchProvider::ApplyCalculatedRelevance() {
|
| + ApplyCalculatedSuggestRelevance(&keyword_results_.suggest_results);
|
| + ApplyCalculatedSuggestRelevance(&default_results_.suggest_results);
|
| + ApplyCalculatedNavigationRelevance(&keyword_results_.navigation_results);
|
| + ApplyCalculatedNavigationRelevance(&default_results_.navigation_results);
|
| + default_results_.verbatim_relevance = -1;
|
| + keyword_results_.verbatim_relevance = -1;
|
| }
|
|
|
| void SearchProvider::ApplyCalculatedSuggestRelevance(
|
| @@ -861,10 +789,9 @@
|
| AddNavigationResultsToMatches(default_results_.navigation_results, &matches);
|
|
|
| // Now add the most relevant matches to |matches_|. We take up to kMaxMatches
|
| - // suggest/navsuggest matches, regardless of origin. We always include in
|
| - // that set a legal default match if possible. If Instant Extended is enabled
|
| - // and we have server-provided (and thus hopefully more accurate) scores for
|
| - // some suggestions, we allow more of those, until we reach
|
| + // suggest/navsuggest matches, regardless of origin. If Instant Extended is
|
| + // enabled and we have server-provided (and thus hopefully more accurate)
|
| + // scores for some suggestions, we allow more of those, until we reach
|
| // AutocompleteResult::kMaxMatches total matches (that is, enough to fill the
|
| // whole popup).
|
| //
|
| @@ -873,12 +800,6 @@
|
| // higher-scoring matches under the conditions above.
|
| std::sort(matches.begin(), matches.end(), &AutocompleteMatch::MoreRelevant);
|
| matches_.clear();
|
| - // Guarantee that if there's a legal default match anywhere in the result
|
| - // set that it'll get returned. The rotate() call does this by moving the
|
| - // default match to the front of the list.
|
| - ACMatches::iterator default_match = FindTopMatch(&matches);
|
| - if (default_match != matches.end())
|
| - std::rotate(matches.begin(), default_match, default_match + 1);
|
|
|
| size_t num_suggestions = 0;
|
| for (ACMatches::const_iterator i(matches.begin());
|
| @@ -1017,15 +938,13 @@
|
| found_what_you_typed_match = true;
|
| insertion_position = scored_results.begin();
|
| }
|
| - SearchSuggestionParser::SuggestResult history_suggestion(
|
| - trimmed_suggestion, AutocompleteMatchType::SEARCH_HISTORY,
|
| - trimmed_suggestion, base::string16(), base::string16(),
|
| - base::string16(), base::string16(), std::string(), std::string(),
|
| - is_keyword, relevance, false, false, trimmed_input);
|
| - // History results are synchronous; they are received upon the last
|
| - // keystroke.
|
| - history_suggestion.set_received_after_last_keystroke(false);
|
| - scored_results.insert(insertion_position, history_suggestion);
|
| + scored_results.insert(
|
| + insertion_position,
|
| + SearchSuggestionParser::SuggestResult(
|
| + trimmed_suggestion, AutocompleteMatchType::SEARCH_HISTORY,
|
| + trimmed_suggestion, base::string16(), base::string16(),
|
| + base::string16(), base::string16(), std::string(), std::string(),
|
| + is_keyword, relevance, false, false, trimmed_input));
|
| }
|
|
|
| // History returns results sorted for us. However, we may have docked some
|
| @@ -1260,18 +1179,14 @@
|
| }
|
| // An inlineable navsuggestion can only be the default match when there
|
| // is no keyword provider active, lest it appear first and break the user
|
| - // out of keyword mode. We also must have received the navsuggestion before
|
| - // the last keystroke, to prevent asynchronous inline autocompletions changes.
|
| - // The navsuggestion can also only be default if either the inline
|
| + // out of keyword mode. It can also only be default if either the inline
|
| // autocompletion is empty or we're not preventing inline autocompletion.
|
| // Finally, if we have an inlineable navsuggestion with an inline completion
|
| // that we're not preventing, make sure we didn't trim any whitespace.
|
| // We don't want to claim http://foo.com/bar is inlineable against the
|
| // input "foo.com/b ".
|
| - match.allowed_to_be_default_match =
|
| - (prefix != NULL) &&
|
| + match.allowed_to_be_default_match = (prefix != NULL) &&
|
| (providers_.GetKeywordProviderURL() == NULL) &&
|
| - !navigation.received_after_last_keystroke() &&
|
| (match.inline_autocompletion.empty() ||
|
| (!input_.prevent_inline_autocomplete() && !trimmed_whitespace));
|
| match.EnsureUWYTIsAllowedToBeDefault(
|
|
|