OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autocomplete/search_provider.h" | 5 #include "chrome/browser/autocomplete/search_provider.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/base64.h" | 10 #include "base/base64.h" |
(...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 | 887 |
888 SearchProvider::SuggestResults SearchProvider::ScoreHistoryResults( | 888 SearchProvider::SuggestResults SearchProvider::ScoreHistoryResults( |
889 const HistoryResults& results, | 889 const HistoryResults& results, |
890 bool base_prevent_inline_autocomplete, | 890 bool base_prevent_inline_autocomplete, |
891 bool input_multiple_words, | 891 bool input_multiple_words, |
892 const base::string16& input_text, | 892 const base::string16& input_text, |
893 bool is_keyword) { | 893 bool is_keyword) { |
894 AutocompleteClassifier* classifier = | 894 AutocompleteClassifier* classifier = |
895 AutocompleteClassifierFactory::GetForProfile(profile_); | 895 AutocompleteClassifierFactory::GetForProfile(profile_); |
896 SuggestResults scored_results; | 896 SuggestResults scored_results; |
| 897 // True if the user has asked this exact query previously. |
| 898 bool found_what_you_typed_match = false; |
897 const bool prevent_search_history_inlining = | 899 const bool prevent_search_history_inlining = |
898 OmniboxFieldTrial::SearchHistoryPreventInlining( | 900 OmniboxFieldTrial::SearchHistoryPreventInlining( |
899 input_.current_page_classification()); | 901 input_.current_page_classification()); |
900 const base::string16& trimmed_input = | 902 const base::string16& trimmed_input = |
901 base::CollapseWhitespace(input_text, false); | 903 base::CollapseWhitespace(input_text, false); |
902 for (HistoryResults::const_iterator i(results.begin()); i != results.end(); | 904 for (HistoryResults::const_iterator i(results.begin()); i != results.end(); |
903 ++i) { | 905 ++i) { |
904 const base::string16& trimmed_suggestion = | 906 const base::string16& trimmed_suggestion = |
905 base::CollapseWhitespace(i->term, false); | 907 base::CollapseWhitespace(i->term, false); |
906 | 908 |
(...skipping 21 matching lines...) Expand all Loading... |
928 AutocompleteMatch match; | 930 AutocompleteMatch match; |
929 classifier->Classify(trimmed_suggestion, false, false, | 931 classifier->Classify(trimmed_suggestion, false, false, |
930 input_.current_page_classification(), &match, NULL); | 932 input_.current_page_classification(), &match, NULL); |
931 prevent_inline_autocomplete = | 933 prevent_inline_autocomplete = |
932 !AutocompleteMatch::IsSearchType(match.type); | 934 !AutocompleteMatch::IsSearchType(match.type); |
933 } | 935 } |
934 | 936 |
935 int relevance = CalculateRelevanceForHistory( | 937 int relevance = CalculateRelevanceForHistory( |
936 i->time, is_keyword, !prevent_inline_autocomplete, | 938 i->time, is_keyword, !prevent_inline_autocomplete, |
937 prevent_search_history_inlining); | 939 prevent_search_history_inlining); |
938 scored_results.push_back(SuggestResult( | 940 // Add the match to |scored_results| by putting the what-you-typed match |
| 941 // on the front and appending all other matches. We want the what-you- |
| 942 // typed match to always be first. |
| 943 SuggestResults::iterator insertion_position = scored_results.end(); |
| 944 if (trimmed_suggestion == trimmed_input) { |
| 945 found_what_you_typed_match = true; |
| 946 insertion_position = scored_results.begin(); |
| 947 } |
| 948 scored_results.insert(insertion_position, SuggestResult( |
939 trimmed_suggestion, AutocompleteMatchType::SEARCH_HISTORY, | 949 trimmed_suggestion, AutocompleteMatchType::SEARCH_HISTORY, |
940 trimmed_suggestion, base::string16(), base::string16(), | 950 trimmed_suggestion, base::string16(), base::string16(), |
941 base::string16(), base::string16(), std::string(), std::string(), | 951 base::string16(), base::string16(), std::string(), std::string(), |
942 is_keyword, relevance, false, false, trimmed_input)); | 952 is_keyword, relevance, false, false, trimmed_input)); |
943 } | 953 } |
944 | 954 |
945 // History returns results sorted for us. However, we may have docked some | 955 // History returns results sorted for us. However, we may have docked some |
946 // results' scores, so things are no longer in order. Do a stable sort to get | 956 // results' scores, so things are no longer in order. While keeping the |
| 957 // what-you-typed match at the front (if it exists), do a stable sort to get |
947 // things back in order without otherwise disturbing results with equal | 958 // things back in order without otherwise disturbing results with equal |
948 // scores, then force the scores to be unique, so that the order in which | 959 // scores, then force the scores to be unique, so that the order in which |
949 // they're shown is deterministic. | 960 // they're shown is deterministic. |
950 std::stable_sort(scored_results.begin(), scored_results.end(), | 961 std::stable_sort(scored_results.begin() + |
| 962 (found_what_you_typed_match ? 1 : 0), |
| 963 scored_results.end(), |
951 CompareScoredResults()); | 964 CompareScoredResults()); |
952 int last_relevance = 0; | 965 int last_relevance = 0; |
953 for (SuggestResults::iterator i(scored_results.begin()); | 966 for (SuggestResults::iterator i(scored_results.begin()); |
954 i != scored_results.end(); ++i) { | 967 i != scored_results.end(); ++i) { |
955 if ((i != scored_results.begin()) && (i->relevance() >= last_relevance)) | 968 if ((i != scored_results.begin()) && (i->relevance() >= last_relevance)) |
956 i->set_relevance(last_relevance - 1); | 969 i->set_relevance(last_relevance - 1); |
957 last_relevance = i->relevance(); | 970 last_relevance = i->relevance(); |
958 } | 971 } |
959 | 972 |
960 return scored_results; | 973 return scored_results; |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 // Make the base64 encoded value URL and filename safe(see RFC 3548). | 1181 // Make the base64 encoded value URL and filename safe(see RFC 3548). |
1169 std::replace(current_token_.begin(), current_token_.end(), '+', '-'); | 1182 std::replace(current_token_.begin(), current_token_.end(), '+', '-'); |
1170 std::replace(current_token_.begin(), current_token_.end(), '/', '_'); | 1183 std::replace(current_token_.begin(), current_token_.end(), '/', '_'); |
1171 } | 1184 } |
1172 | 1185 |
1173 // Extend expiration time another 60 seconds. | 1186 // Extend expiration time another 60 seconds. |
1174 token_expiration_time_ = current_time + base::TimeDelta::FromSeconds(60); | 1187 token_expiration_time_ = current_time + base::TimeDelta::FromSeconds(60); |
1175 | 1188 |
1176 return current_token_; | 1189 return current_token_; |
1177 } | 1190 } |
OLD | NEW |