Chromium Code Reviews| Index: chrome/browser/autocomplete/autocomplete.cc |
| =================================================================== |
| --- chrome/browser/autocomplete/autocomplete.cc (revision 80868) |
| +++ chrome/browser/autocomplete/autocomplete.cc (working copy) |
| @@ -5,6 +5,8 @@ |
| #include "chrome/browser/autocomplete/autocomplete.h" |
| #include <algorithm> |
| +#include <set> |
| +#include <utility> |
| #include "base/basictypes.h" |
| #include "base/command_line.h" |
| @@ -23,10 +25,13 @@ |
| #include "chrome/browser/autocomplete/keyword_provider.h" |
| #include "chrome/browser/autocomplete/search_provider.h" |
| #include "chrome/browser/bookmarks/bookmark_model.h" |
| +#include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/external_protocol_handler.h" |
| #include "chrome/browser/net/url_fixer_upper.h" |
| #include "chrome/browser/prefs/pref_service.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/search_engines/template_url.h" |
| +#include "chrome/browser/search_engines/template_url_model.h" |
| #include "chrome/browser/ui/webui/history_ui.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/pref_names.h" |
| @@ -642,6 +647,9 @@ |
| } |
| void AutocompleteResult::SortAndCull(const AutocompleteInput& input) { |
| + for (ACMatches::iterator i = matches_.begin(); i != matches_.end(); ++i) |
| + i->ComputeStrippedDestinationURL(); |
| + |
| // Remove duplicates. |
| std::sort(matches_.begin(), matches_.end(), |
| &AutocompleteMatch::DestinationSortFunc); |
| @@ -785,7 +793,8 @@ |
| AutocompleteControllerDelegate* delegate) |
| : delegate_(delegate), |
| done_(true), |
| - in_start_(false) { |
| + in_start_(false), |
| + profile_(profile) { |
| search_provider_ = new SearchProvider(this, profile); |
| providers_.push_back(search_provider_); |
| if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| @@ -820,6 +829,7 @@ |
| void AutocompleteController::SetProfile(Profile* profile) { |
| Stop(true); |
| + profile_ = profile; |
| for (ACProviders::iterator i(providers_.begin()); i != providers_.end(); ++i) |
| (*i)->SetProfile(profile); |
| input_.Clear(); // Ensure we don't try to do a "minimal_changes" query on a |
| @@ -932,6 +942,38 @@ |
| // Sort the matches and trim to a small number of "best" matches. |
| result_.SortAndCull(input_); |
| + std::set<string16> keywords; |
| + for (ACMatches::iterator match(result_.begin()); match != result_.end(); |
| + ++match) { |
| + string16 keyword_text = GetKeywordForText(match->fill_into_edit); |
|
Peter Kasting
2011/04/11 23:17:33
Nit: This should be moved inside the first "else"
|
| + bool is_keyword_hint = false; |
| + bool is_keyword_mode = false; |
| + |
| + // If the current match is a keyword, assign that as the selected keyword. |
| + if (TemplateURL::SupportsReplacement(match->template_url)) { |
| + keyword_text.assign(match->template_url->keyword()); |
|
Peter Kasting
2011/04/11 23:17:33
Nit: Indent 2, not 4
|
| + is_keyword_mode = true; |
| + } else if (!keyword_text.empty()) { |
| + is_keyword_hint = true; |
| + } |
| + |
| + if (is_keyword_hint || is_keyword_mode) { |
| + std::pair<std::set<string16>::iterator, bool> result = |
|
Peter Kasting
2011/04/11 23:17:33
Nit: Instead of getting the result pair and checki
|
| + keywords.insert(keyword_text); |
| + |
| + // Only add the keyword if the match does not have a duplicate keyword |
| + // with a more relevant match. |
| + if (result.second) { |
| + match->keyword = new AutocompleteMatch::Keyword( |
|
Peter Kasting
2011/04/11 23:17:33
Nit: Seems like Keyword's constructor should init
|
| + keyword_text, is_keyword_hint, is_keyword_mode); |
| + |
| + if (is_keyword_hint) |
| + match->keyword->template_url = profile_->GetTemplateURLModel()-> |
| + GetTemplateURLForKeyword(keyword_text); |
| + } |
| + } |
| + } |
| + |
| // Need to validate before invoking CopyOldMatches as the old matches are not |
| // valid against the current input. |
| #ifndef NDEBUG |
| @@ -990,3 +1032,34 @@ |
| expire_timer_.Start(base::TimeDelta::FromMilliseconds(kExpireTimeMS), |
| this, &AutocompleteController::ExpireCopiedEntries); |
| } |
| + |
| +string16 AutocompleteController::GetKeywordForText( |
| + const string16& text) const { |
|
Peter Kasting
2011/04/11 23:17:33
Nit: Indent 4, not 9
|
| + // Creates keyword_hint first in case |keyword| is a pointer to |text|. |
|
Peter Kasting
2011/04/11 23:17:33
Nit: This comment no longer makes sense.
Also, |k
|
| + const string16 keyword_hint(TemplateURLModel::CleanUserInputKeyword(text)); |
| + |
| + if (keyword_hint.empty()) |
| + return keyword_hint; |
| + if (!profile_->GetTemplateURLModel()) |
| + return string16(); |
| + profile_->GetTemplateURLModel()->Load(); |
| + |
| + // Don't provide a hint if this keyword doesn't support replacement. |
| + const TemplateURL* const template_url = |
| + profile_->GetTemplateURLModel()->GetTemplateURLForKeyword(keyword_hint); |
| + if (!TemplateURL::SupportsReplacement(template_url)) |
| + return string16(); |
| + |
| + // Don't provide a hint for inactive/disabled extension keywords. |
| + if (template_url->IsExtensionKeyword()) { |
| + const Extension* extension = profile_->GetExtensionService()-> |
| + GetExtensionById(template_url->GetExtensionId(), false); |
| + if (!extension || |
| + (profile_->IsOffTheRecord() && |
|
Peter Kasting
2011/04/11 23:17:33
Nit: Indent 4, not 3
|
| + !profile_->GetExtensionService()->IsIncognitoEnabled(extension->id()))) |
| + return string16(); |
| + } |
|
Peter Kasting
2011/04/11 23:17:33
Nit: Remove unmatched }
|
| + |
| + return keyword_hint; |
| +} |
| + |