OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/base_search_provider.h" | 5 #include "chrome/browser/autocomplete/base_search_provider.h" |
6 | 6 |
7 #include "base/i18n/case_conversion.h" | 7 #include "base/i18n/case_conversion.h" |
8 #include "base/i18n/icu_string_conversions.h" | 8 #include "base/i18n/icu_string_conversions.h" |
9 #include "base/json/json_string_value_serializer.h" | 9 #include "base/json/json_string_value_serializer.h" |
| 10 #include "base/json/json_writer.h" |
10 #include "base/prefs/pref_registry_simple.h" | 11 #include "base/prefs/pref_registry_simple.h" |
11 #include "base/prefs/pref_service.h" | 12 #include "base/prefs/pref_service.h" |
12 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
13 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
14 #include "chrome/browser/autocomplete/autocomplete_provider_listener.h" | 15 #include "chrome/browser/autocomplete/autocomplete_provider_listener.h" |
15 #include "chrome/browser/autocomplete/url_prefix.h" | 16 #include "chrome/browser/autocomplete/url_prefix.h" |
16 #include "chrome/browser/history/history_service.h" | 17 #include "chrome/browser/history/history_service.h" |
17 #include "chrome/browser/history/history_service_factory.h" | 18 #include "chrome/browser/history/history_service_factory.h" |
18 #include "chrome/browser/omnibox/omnibox_field_trial.h" | 19 #include "chrome/browser/omnibox/omnibox_field_trial.h" |
19 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 | 136 |
136 // static | 137 // static |
137 AutocompleteMatch BaseSearchProvider::CreateSearchSuggestion( | 138 AutocompleteMatch BaseSearchProvider::CreateSearchSuggestion( |
138 const base::string16& suggestion, | 139 const base::string16& suggestion, |
139 AutocompleteMatchType::Type type, | 140 AutocompleteMatchType::Type type, |
140 bool from_keyword_provider, | 141 bool from_keyword_provider, |
141 const TemplateURL* template_url) { | 142 const TemplateURL* template_url) { |
142 return CreateSearchSuggestion( | 143 return CreateSearchSuggestion( |
143 NULL, AutocompleteInput(), BaseSearchProvider::SuggestResult( | 144 NULL, AutocompleteInput(), BaseSearchProvider::SuggestResult( |
144 suggestion, type, suggestion, base::string16(), base::string16(), | 145 suggestion, type, suggestion, base::string16(), base::string16(), |
145 std::string(), std::string(), from_keyword_provider, 0, false, false, | 146 base::string16(), base::string16(), std::string(), std::string(), |
146 base::string16()), | 147 from_keyword_provider, 0, false, false, base::string16()), |
147 template_url, 0, 0, false, false); | 148 template_url, 0, 0, false, false); |
148 } | 149 } |
149 | 150 |
150 void BaseSearchProvider::Stop(bool clear_cached_results) { | 151 void BaseSearchProvider::Stop(bool clear_cached_results) { |
151 StopSuggest(); | 152 StopSuggest(); |
152 done_ = true; | 153 done_ = true; |
153 | 154 |
154 if (clear_cached_results) | 155 if (clear_cached_results) |
155 ClearAllResults(); | 156 ClearAllResults(); |
156 } | 157 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 BaseSearchProvider::Result::~Result() {} | 226 BaseSearchProvider::Result::~Result() {} |
226 | 227 |
227 // BaseSearchProvider::SuggestResult ------------------------------------------- | 228 // BaseSearchProvider::SuggestResult ------------------------------------------- |
228 | 229 |
229 BaseSearchProvider::SuggestResult::SuggestResult( | 230 BaseSearchProvider::SuggestResult::SuggestResult( |
230 const base::string16& suggestion, | 231 const base::string16& suggestion, |
231 AutocompleteMatchType::Type type, | 232 AutocompleteMatchType::Type type, |
232 const base::string16& match_contents, | 233 const base::string16& match_contents, |
233 const base::string16& match_contents_prefix, | 234 const base::string16& match_contents_prefix, |
234 const base::string16& annotation, | 235 const base::string16& annotation, |
| 236 const base::string16& answer_contents, |
| 237 const base::string16& answer_type, |
235 const std::string& suggest_query_params, | 238 const std::string& suggest_query_params, |
236 const std::string& deletion_url, | 239 const std::string& deletion_url, |
237 bool from_keyword_provider, | 240 bool from_keyword_provider, |
238 int relevance, | 241 int relevance, |
239 bool relevance_from_server, | 242 bool relevance_from_server, |
240 bool should_prefetch, | 243 bool should_prefetch, |
241 const base::string16& input_text) | 244 const base::string16& input_text) |
242 : Result(from_keyword_provider, | 245 : Result(from_keyword_provider, |
243 relevance, | 246 relevance, |
244 relevance_from_server, | 247 relevance_from_server, |
245 type, | 248 type, |
246 deletion_url), | 249 deletion_url), |
247 suggestion_(suggestion), | 250 suggestion_(suggestion), |
248 match_contents_prefix_(match_contents_prefix), | 251 match_contents_prefix_(match_contents_prefix), |
249 annotation_(annotation), | 252 annotation_(annotation), |
250 suggest_query_params_(suggest_query_params), | 253 suggest_query_params_(suggest_query_params), |
| 254 answer_contents_(answer_contents), |
| 255 answer_type_(answer_type), |
251 should_prefetch_(should_prefetch) { | 256 should_prefetch_(should_prefetch) { |
252 match_contents_ = match_contents; | 257 match_contents_ = match_contents; |
253 DCHECK(!match_contents_.empty()); | 258 DCHECK(!match_contents_.empty()); |
254 ClassifyMatchContents(true, input_text); | 259 ClassifyMatchContents(true, input_text); |
255 } | 260 } |
256 | 261 |
257 BaseSearchProvider::SuggestResult::~SuggestResult() {} | 262 BaseSearchProvider::SuggestResult::~SuggestResult() {} |
258 | 263 |
259 void BaseSearchProvider::SuggestResult::ClassifyMatchContents( | 264 void BaseSearchProvider::SuggestResult::ClassifyMatchContents( |
260 const bool allow_bolding_all, | 265 const bool allow_bolding_all, |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 bool append_extra_query_params, | 486 bool append_extra_query_params, |
482 bool from_app_list) { | 487 bool from_app_list) { |
483 AutocompleteMatch match(autocomplete_provider, suggestion.relevance(), false, | 488 AutocompleteMatch match(autocomplete_provider, suggestion.relevance(), false, |
484 suggestion.type()); | 489 suggestion.type()); |
485 | 490 |
486 if (!template_url) | 491 if (!template_url) |
487 return match; | 492 return match; |
488 match.keyword = template_url->keyword(); | 493 match.keyword = template_url->keyword(); |
489 match.contents = suggestion.match_contents(); | 494 match.contents = suggestion.match_contents(); |
490 match.contents_class = suggestion.match_contents_class(); | 495 match.contents_class = suggestion.match_contents_class(); |
| 496 match.answer_contents = suggestion.answer_contents(); |
| 497 match.answer_type = suggestion.answer_type(); |
491 if (suggestion.type() == AutocompleteMatchType::SEARCH_SUGGEST_INFINITE) { | 498 if (suggestion.type() == AutocompleteMatchType::SEARCH_SUGGEST_INFINITE) { |
492 match.RecordAdditionalInfo( | 499 match.RecordAdditionalInfo( |
493 kACMatchPropertyInputText, base::UTF16ToUTF8(input.text())); | 500 kACMatchPropertyInputText, base::UTF16ToUTF8(input.text())); |
494 match.RecordAdditionalInfo( | 501 match.RecordAdditionalInfo( |
495 kACMatchPropertyContentsPrefix, | 502 kACMatchPropertyContentsPrefix, |
496 base::UTF16ToUTF8(suggestion.match_contents_prefix())); | 503 base::UTF16ToUTF8(suggestion.match_contents_prefix())); |
497 match.RecordAdditionalInfo( | 504 match.RecordAdditionalInfo( |
498 kACMatchPropertyContentsStartIndex, | 505 kACMatchPropertyContentsStartIndex, |
499 static_cast<int>( | 506 static_cast<int>( |
500 suggestion.suggestion().length() - match.contents.length())); | 507 suggestion.suggestion().length() - match.contents.length())); |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 if (descriptions != NULL) | 888 if (descriptions != NULL) |
882 descriptions->GetString(index, &title); | 889 descriptions->GetString(index, &title); |
883 results->navigation_results.push_back(NavigationResult( | 890 results->navigation_results.push_back(NavigationResult( |
884 *this, url, match_type, title, deletion_url, is_keyword_result, | 891 *this, url, match_type, title, deletion_url, is_keyword_result, |
885 relevance, relevances != NULL, input.text(), languages)); | 892 relevance, relevances != NULL, input.text(), languages)); |
886 } | 893 } |
887 } else { | 894 } else { |
888 base::string16 match_contents = suggestion; | 895 base::string16 match_contents = suggestion; |
889 base::string16 match_contents_prefix; | 896 base::string16 match_contents_prefix; |
890 base::string16 annotation; | 897 base::string16 annotation; |
| 898 base::string16 answer_contents; |
| 899 base::string16 answer_type; |
891 std::string suggest_query_params; | 900 std::string suggest_query_params; |
892 | 901 |
893 if (suggestion_details) { | 902 if (suggestion_details) { |
894 suggestion_details->GetDictionary(index, &suggestion_detail); | 903 suggestion_details->GetDictionary(index, &suggestion_detail); |
895 if (suggestion_detail) { | 904 if (suggestion_detail) { |
896 suggestion_detail->GetString("t", &match_contents); | 905 suggestion_detail->GetString("t", &match_contents); |
897 suggestion_detail->GetString("mp", &match_contents_prefix); | 906 suggestion_detail->GetString("mp", &match_contents_prefix); |
898 // Error correction for bad data from server. | 907 // Error correction for bad data from server. |
899 if (match_contents.empty()) | 908 if (match_contents.empty()) |
900 match_contents = suggestion; | 909 match_contents = suggestion; |
901 suggestion_detail->GetString("a", &annotation); | 910 suggestion_detail->GetString("a", &annotation); |
902 suggestion_detail->GetString("q", &suggest_query_params); | 911 suggestion_detail->GetString("q", &suggest_query_params); |
| 912 |
| 913 // Extract Answers, if provided. |
| 914 const base::DictionaryValue* answer_json = NULL; |
| 915 if (suggestion_detail->GetDictionary("ansa", &answer_json)) { |
| 916 std::string contents; |
| 917 base::JSONWriter::Write(answer_json, &contents); |
| 918 answer_contents = base::UTF8ToUTF16(contents); |
| 919 suggestion_detail->GetString("ansb", &answer_type); |
| 920 } |
903 } | 921 } |
904 } | 922 } |
905 | 923 |
906 bool should_prefetch = static_cast<int>(index) == prefetch_index; | 924 bool should_prefetch = static_cast<int>(index) == prefetch_index; |
907 // TODO(kochi): Improve calculator suggestion presentation. | 925 // TODO(kochi): Improve calculator suggestion presentation. |
908 results->suggest_results.push_back(SuggestResult( | 926 results->suggest_results.push_back(SuggestResult( |
909 base::CollapseWhitespace(suggestion, false), match_type, | 927 base::CollapseWhitespace(suggestion, false), match_type, |
910 base::CollapseWhitespace(match_contents, false), | 928 base::CollapseWhitespace(match_contents, false), |
911 match_contents_prefix, annotation, suggest_query_params, | 929 match_contents_prefix, annotation, answer_contents, answer_type, |
912 deletion_url, is_keyword_result, relevance, relevances != NULL, | 930 suggest_query_params, deletion_url, is_keyword_result, relevance, |
913 should_prefetch, trimmed_input)); | 931 relevances != NULL, should_prefetch, trimmed_input)); |
914 } | 932 } |
915 } | 933 } |
916 SortResults(is_keyword_result, relevances, results); | 934 SortResults(is_keyword_result, relevances, results); |
917 return true; | 935 return true; |
918 } | 936 } |
919 | 937 |
920 void BaseSearchProvider::SortResults(bool is_keyword, | 938 void BaseSearchProvider::SortResults(bool is_keyword, |
921 const base::ListValue* relevances, | 939 const base::ListValue* relevances, |
922 Results* results) { | 940 Results* results) { |
923 } | 941 } |
(...skipping 24 matching lines...) Expand all Loading... |
948 } | 966 } |
949 | 967 |
950 void BaseSearchProvider::OnDeletionComplete( | 968 void BaseSearchProvider::OnDeletionComplete( |
951 bool success, SuggestionDeletionHandler* handler) { | 969 bool success, SuggestionDeletionHandler* handler) { |
952 RecordDeletionResult(success); | 970 RecordDeletionResult(success); |
953 SuggestionDeletionHandlers::iterator it = std::find( | 971 SuggestionDeletionHandlers::iterator it = std::find( |
954 deletion_handlers_.begin(), deletion_handlers_.end(), handler); | 972 deletion_handlers_.begin(), deletion_handlers_.end(), handler); |
955 DCHECK(it != deletion_handlers_.end()); | 973 DCHECK(it != deletion_handlers_.end()); |
956 deletion_handlers_.erase(it); | 974 deletion_handlers_.erase(it); |
957 } | 975 } |
OLD | NEW |