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/prefs/pref_registry_simple.h" | 8 #include "base/prefs/pref_registry_simple.h" |
9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 return match.GetAdditionalInfo(kShouldPrefetchKey) == kTrue; | 109 return match.GetAdditionalInfo(kShouldPrefetchKey) == kTrue; |
110 } | 110 } |
111 | 111 |
112 // static | 112 // static |
113 AutocompleteMatch BaseSearchProvider::CreateSearchSuggestion( | 113 AutocompleteMatch BaseSearchProvider::CreateSearchSuggestion( |
114 const base::string16& suggestion, | 114 const base::string16& suggestion, |
115 AutocompleteMatchType::Type type, | 115 AutocompleteMatchType::Type type, |
116 bool from_keyword_provider, | 116 bool from_keyword_provider, |
117 const TemplateURL* template_url, | 117 const TemplateURL* template_url, |
118 const SearchTermsData& search_terms_data) { | 118 const SearchTermsData& search_terms_data) { |
| 119 // This call uses a number of default values. For instance, it assumes that |
| 120 // if this match is from a keyword provider than the user is in keyword mode. |
119 return CreateSearchSuggestion( | 121 return CreateSearchSuggestion( |
120 NULL, AutocompleteInput(), SearchSuggestionParser::SuggestResult( | 122 NULL, AutocompleteInput(), from_keyword_provider, |
| 123 SearchSuggestionParser::SuggestResult( |
121 suggestion, type, suggestion, base::string16(), base::string16(), | 124 suggestion, type, suggestion, base::string16(), base::string16(), |
122 base::string16(), base::string16(), std::string(), std::string(), | 125 base::string16(), base::string16(), std::string(), std::string(), |
123 from_keyword_provider, 0, false, false, base::string16()), | 126 from_keyword_provider, 0, false, false, base::string16()), |
124 template_url, search_terms_data, 0, false); | 127 template_url, search_terms_data, 0, false); |
125 } | 128 } |
126 | 129 |
127 void BaseSearchProvider::Stop(bool clear_cached_results) { | 130 void BaseSearchProvider::Stop(bool clear_cached_results) { |
128 StopSuggest(); | 131 StopSuggest(); |
129 done_ = true; | 132 done_ = true; |
130 | 133 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 match->RecordAdditionalInfo(BaseSearchProvider::kDeletionUrlKey, | 204 match->RecordAdditionalInfo(BaseSearchProvider::kDeletionUrlKey, |
202 url.spec()); | 205 url.spec()); |
203 match->deletable = true; | 206 match->deletable = true; |
204 } | 207 } |
205 } | 208 } |
206 | 209 |
207 // static | 210 // static |
208 AutocompleteMatch BaseSearchProvider::CreateSearchSuggestion( | 211 AutocompleteMatch BaseSearchProvider::CreateSearchSuggestion( |
209 AutocompleteProvider* autocomplete_provider, | 212 AutocompleteProvider* autocomplete_provider, |
210 const AutocompleteInput& input, | 213 const AutocompleteInput& input, |
| 214 const bool in_keyword_mode, |
211 const SearchSuggestionParser::SuggestResult& suggestion, | 215 const SearchSuggestionParser::SuggestResult& suggestion, |
212 const TemplateURL* template_url, | 216 const TemplateURL* template_url, |
213 const SearchTermsData& search_terms_data, | 217 const SearchTermsData& search_terms_data, |
214 int accepted_suggestion, | 218 int accepted_suggestion, |
215 bool append_extra_query_params) { | 219 bool append_extra_query_params) { |
216 AutocompleteMatch match(autocomplete_provider, suggestion.relevance(), false, | 220 AutocompleteMatch match(autocomplete_provider, suggestion.relevance(), false, |
217 suggestion.type()); | 221 suggestion.type()); |
218 | 222 |
219 if (!template_url) | 223 if (!template_url) |
220 return match; | 224 return match; |
(...skipping 12 matching lines...) Expand all Loading... |
233 kACMatchPropertyContentsStartIndex, | 237 kACMatchPropertyContentsStartIndex, |
234 static_cast<int>( | 238 static_cast<int>( |
235 suggestion.suggestion().length() - match.contents.length())); | 239 suggestion.suggestion().length() - match.contents.length())); |
236 } | 240 } |
237 | 241 |
238 if (!suggestion.annotation().empty()) | 242 if (!suggestion.annotation().empty()) |
239 match.description = suggestion.annotation(); | 243 match.description = suggestion.annotation(); |
240 | 244 |
241 // suggestion.match_contents() should have already been collapsed. | 245 // suggestion.match_contents() should have already been collapsed. |
242 match.allowed_to_be_default_match = | 246 match.allowed_to_be_default_match = |
| 247 (!in_keyword_mode || suggestion.from_keyword_provider()) && |
243 (base::CollapseWhitespace(input.text(), false) == | 248 (base::CollapseWhitespace(input.text(), false) == |
244 suggestion.match_contents()); | 249 suggestion.match_contents()); |
245 | 250 |
246 // When the user forced a query, we need to make sure all the fill_into_edit | 251 // When the user forced a query, we need to make sure all the fill_into_edit |
247 // values preserve that property. Otherwise, if the user starts editing a | 252 // values preserve that property. Otherwise, if the user starts editing a |
248 // suggestion, non-Search results will suddenly appear. | 253 // suggestion, non-Search results will suddenly appear. |
249 if (input.type() == metrics::OmniboxInputType::FORCED_QUERY) | 254 if (input.type() == metrics::OmniboxInputType::FORCED_QUERY) |
250 match.fill_into_edit.assign(base::ASCIIToUTF16("?")); | 255 match.fill_into_edit.assign(base::ASCIIToUTF16("?")); |
251 if (suggestion.from_keyword_provider()) | 256 if (suggestion.from_keyword_provider()) |
252 match.fill_into_edit.append(match.keyword + base::char16(' ')); | 257 match.fill_into_edit.append(match.keyword + base::char16(' ')); |
253 if (!input.prevent_inline_autocomplete() && | 258 // We only allow inlinable navsuggestions that were received before the |
| 259 // last keystroke because we don't want asynchronous inline autocompletions. |
| 260 if (!suggestion.received_after_last_keystroke() && |
| 261 !input.prevent_inline_autocomplete() && |
| 262 (!in_keyword_mode || suggestion.from_keyword_provider()) && |
254 StartsWith(suggestion.suggestion(), input.text(), false)) { | 263 StartsWith(suggestion.suggestion(), input.text(), false)) { |
255 match.inline_autocompletion = | 264 match.inline_autocompletion = |
256 suggestion.suggestion().substr(input.text().length()); | 265 suggestion.suggestion().substr(input.text().length()); |
257 match.allowed_to_be_default_match = true; | 266 match.allowed_to_be_default_match = true; |
258 } | 267 } |
259 match.fill_into_edit.append(suggestion.suggestion()); | 268 match.fill_into_edit.append(suggestion.suggestion()); |
260 | 269 |
261 const TemplateURLRef& search_url = template_url->url_ref(); | 270 const TemplateURLRef& search_url = template_url->url_ref(); |
262 DCHECK(search_url.SupportsReplacement(search_terms_data)); | 271 DCHECK(search_url.SupportsReplacement(search_terms_data)); |
263 match.search_terms_args.reset( | 272 match.search_terms_args.reset( |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 return false; | 372 return false; |
364 | 373 |
365 return true; | 374 return true; |
366 } | 375 } |
367 | 376 |
368 void BaseSearchProvider::AddMatchToMap( | 377 void BaseSearchProvider::AddMatchToMap( |
369 const SearchSuggestionParser::SuggestResult& result, | 378 const SearchSuggestionParser::SuggestResult& result, |
370 const std::string& metadata, | 379 const std::string& metadata, |
371 int accepted_suggestion, | 380 int accepted_suggestion, |
372 bool mark_as_deletable, | 381 bool mark_as_deletable, |
| 382 bool in_keyword_mode, |
373 MatchMap* map) { | 383 MatchMap* map) { |
374 AutocompleteMatch match = CreateSearchSuggestion( | 384 AutocompleteMatch match = CreateSearchSuggestion( |
375 this, GetInput(result.from_keyword_provider()), result, | 385 this, GetInput(result.from_keyword_provider()), in_keyword_mode, result, |
376 GetTemplateURL(result.from_keyword_provider()), | 386 GetTemplateURL(result.from_keyword_provider()), |
377 template_url_service_->search_terms_data(), accepted_suggestion, | 387 template_url_service_->search_terms_data(), accepted_suggestion, |
378 ShouldAppendExtraParams(result)); | 388 ShouldAppendExtraParams(result)); |
379 if (!match.destination_url.is_valid()) | 389 if (!match.destination_url.is_valid()) |
380 return; | 390 return; |
381 match.search_terms_args->bookmark_bar_pinned = | 391 match.search_terms_args->bookmark_bar_pinned = |
382 profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); | 392 profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); |
383 match.RecordAdditionalInfo(kRelevanceFromServerKey, | 393 match.RecordAdditionalInfo(kRelevanceFromServerKey, |
384 result.relevance_from_server() ? kTrue : kFalse); | 394 result.relevance_from_server() ? kTrue : kFalse); |
385 match.RecordAdditionalInfo(kShouldPrefetchKey, | 395 match.RecordAdditionalInfo(kShouldPrefetchKey, |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 } | 497 } |
488 | 498 |
489 void BaseSearchProvider::OnDeletionComplete( | 499 void BaseSearchProvider::OnDeletionComplete( |
490 bool success, SuggestionDeletionHandler* handler) { | 500 bool success, SuggestionDeletionHandler* handler) { |
491 RecordDeletionResult(success); | 501 RecordDeletionResult(success); |
492 SuggestionDeletionHandlers::iterator it = std::find( | 502 SuggestionDeletionHandlers::iterator it = std::find( |
493 deletion_handlers_.begin(), deletion_handlers_.end(), handler); | 503 deletion_handlers_.begin(), deletion_handlers_.end(), handler); |
494 DCHECK(it != deletion_handlers_.end()); | 504 DCHECK(it != deletion_handlers_.end()); |
495 deletion_handlers_.erase(it); | 505 deletion_handlers_.erase(it); |
496 } | 506 } |
OLD | NEW |