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 "components/omnibox/search_provider.h" | 5 #include "components/omnibox/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 855 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
866 // that set a legal default match if possible. If Instant Extended is enabled | 866 // that set a legal default match if possible. If Instant Extended is enabled |
867 // and we have server-provided (and thus hopefully more accurate) scores for | 867 // and we have server-provided (and thus hopefully more accurate) scores for |
868 // some suggestions, we allow more of those, until we reach | 868 // some suggestions, we allow more of those, until we reach |
869 // AutocompleteResult::kMaxMatches total matches (that is, enough to fill the | 869 // AutocompleteResult::kMaxMatches total matches (that is, enough to fill the |
870 // whole popup). | 870 // whole popup). |
871 // | 871 // |
872 // We will always return any verbatim matches, no matter how we obtained their | 872 // We will always return any verbatim matches, no matter how we obtained their |
873 // scores, unless we have already accepted AutocompleteResult::kMaxMatches | 873 // scores, unless we have already accepted AutocompleteResult::kMaxMatches |
874 // higher-scoring matches under the conditions above. | 874 // higher-scoring matches under the conditions above. |
875 std::sort(matches.begin(), matches.end(), &AutocompleteMatch::MoreRelevant); | 875 std::sort(matches.begin(), matches.end(), &AutocompleteMatch::MoreRelevant); |
876 matches_.clear(); | 876 |
877 // Guarantee that if there's a legal default match anywhere in the result | 877 // Guarantee that if there's a legal default match anywhere in the result |
878 // set that it'll get returned. The rotate() call does this by moving the | 878 // set that it'll get returned. The rotate() call does this by moving the |
879 // default match to the front of the list. | 879 // default match to the front of the list. |
880 ACMatches::iterator default_match = FindTopMatch(&matches); | 880 ACMatches::iterator default_match = FindTopMatch(&matches); |
881 if (default_match != matches.end()) | 881 if (default_match != matches.end()) |
882 std::rotate(matches.begin(), default_match, default_match + 1); | 882 std::rotate(matches.begin(), default_match, default_match + 1); |
883 | 883 |
884 // It's possible to get a copy of an answer from previous matches and get the | |
885 // same answer attached to a similar server-provided answer. In the future, | |
Mark P
2014/09/25 16:23:47
consider something like:
get the same answer attac
Justin Donnelly
2014/09/25 19:53:39
Done.
| |
886 // we may decide that we want to have different answers attached to multiple | |
Mark P
2014/09/25 16:23:47
omit "different"
Justin Donnelly
2014/09/25 19:53:39
Done.
| |
887 // suggestions, but the current assumption is that there should only ever be | |
888 // one suggestion with an answer. To maintain this assumption, remove any | |
889 // answers after the first. | |
890 RemoveExtraAnswers(&matches); | |
891 | |
892 matches_.clear(); | |
884 size_t num_suggestions = 0; | 893 size_t num_suggestions = 0; |
885 for (ACMatches::const_iterator i(matches.begin()); | 894 for (ACMatches::const_iterator i(matches.begin()); |
886 (i != matches.end()) && | 895 (i != matches.end()) && |
887 (matches_.size() < AutocompleteResult::kMaxMatches); | 896 (matches_.size() < AutocompleteResult::kMaxMatches); |
888 ++i) { | 897 ++i) { |
889 // SEARCH_OTHER_ENGINE is only used in the SearchProvider for the keyword | 898 // SEARCH_OTHER_ENGINE is only used in the SearchProvider for the keyword |
890 // verbatim result, so this condition basically means "if this match is a | 899 // verbatim result, so this condition basically means "if this match is a |
891 // suggestion of some sort". | 900 // suggestion of some sort". |
892 if ((i->type != AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED) && | 901 if ((i->type != AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED) && |
893 (i->type != AutocompleteMatchType::SEARCH_OTHER_ENGINE)) { | 902 (i->type != AutocompleteMatchType::SEARCH_OTHER_ENGINE)) { |
894 // If we've already hit the limit on non-server-scored suggestions, and | 903 // If we've already hit the limit on non-server-scored suggestions, and |
895 // this isn't a server-scored suggestion we can add, skip it. | 904 // this isn't a server-scored suggestion we can add, skip it. |
896 if ((num_suggestions >= kMaxMatches) && | 905 if ((num_suggestions >= kMaxMatches) && |
897 (!chrome::IsInstantExtendedAPIEnabled() || | 906 (!chrome::IsInstantExtendedAPIEnabled() || |
898 (i->GetAdditionalInfo(kRelevanceFromServerKey) != kTrue))) { | 907 (i->GetAdditionalInfo(kRelevanceFromServerKey) != kTrue))) { |
899 continue; | 908 continue; |
900 } | 909 } |
901 | 910 |
902 ++num_suggestions; | 911 ++num_suggestions; |
903 } | 912 } |
904 | 913 |
905 matches_.push_back(*i); | 914 matches_.push_back(*i); |
906 } | 915 } |
907 UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.ConvertResultsTime", | 916 UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.ConvertResultsTime", |
908 base::TimeTicks::Now() - start_time); | 917 base::TimeTicks::Now() - start_time); |
909 } | 918 } |
910 | 919 |
920 void SearchProvider::RemoveExtraAnswers(ACMatches* matches) { | |
921 bool answer_seen = false; | |
922 for (ACMatches::iterator it = matches->begin(); it != matches->end(); ++it) { | |
923 if (!it->answer_contents.empty()) { | |
924 if (!answer_seen) { | |
925 answer_seen = true; | |
926 } else { | |
927 it->answer_contents.clear(); | |
928 it->answer_type.clear(); | |
929 } | |
930 } | |
931 } | |
932 } | |
933 | |
911 ACMatches::const_iterator SearchProvider::FindTopMatch() const { | 934 ACMatches::const_iterator SearchProvider::FindTopMatch() const { |
912 ACMatches::const_iterator it = matches_.begin(); | 935 ACMatches::const_iterator it = matches_.begin(); |
913 while ((it != matches_.end()) && !it->allowed_to_be_default_match) | 936 while ((it != matches_.end()) && !it->allowed_to_be_default_match) |
914 ++it; | 937 ++it; |
915 return it; | 938 return it; |
916 } | 939 } |
917 | 940 |
918 bool SearchProvider::IsTopMatchSearchWithURLInput() const { | 941 bool SearchProvider::IsTopMatchSearchWithURLInput() const { |
919 ACMatches::const_iterator first_match = FindTopMatch(); | 942 ACMatches::const_iterator first_match = FindTopMatch(); |
920 return (input_.type() == metrics::OmniboxInputType::URL) && | 943 return (input_.type() == metrics::OmniboxInputType::URL) && |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1329 match->fill_into_edit.empty()) | 1352 match->fill_into_edit.empty()) |
1330 return; | 1353 return; |
1331 | 1354 |
1332 // Valid answer encountered, cache it for further queries. | 1355 // Valid answer encountered, cache it for further queries. |
1333 answers_cache_.UpdateRecentAnswers(match->fill_into_edit, match->answer_type); | 1356 answers_cache_.UpdateRecentAnswers(match->fill_into_edit, match->answer_type); |
1334 } | 1357 } |
1335 | 1358 |
1336 void SearchProvider::DoAnswersQuery(const AutocompleteInput& input) { | 1359 void SearchProvider::DoAnswersQuery(const AutocompleteInput& input) { |
1337 prefetch_data_ = answers_cache_.GetTopAnswerEntry(input.text()); | 1360 prefetch_data_ = answers_cache_.GetTopAnswerEntry(input.text()); |
1338 } | 1361 } |
OLD | NEW |