| Index: chrome/browser/autocomplete/keyword_provider.cc
|
| diff --git a/chrome/browser/autocomplete/keyword_provider.cc b/chrome/browser/autocomplete/keyword_provider.cc
|
| index 7c974b9b79d75b0f1551e3c9d360048aa8c91995..fd3607eb7b6492492dacfa18954cd871477f94d5 100644
|
| --- a/chrome/browser/autocomplete/keyword_provider.cc
|
| +++ b/chrome/browser/autocomplete/keyword_provider.cc
|
| @@ -61,6 +61,9 @@ KeywordProvider::KeywordProvider(ACProviderListener* listener, Profile* profile)
|
| // suggestions are meant for us.
|
| registrar_.Add(this, NotificationType::EXTENSION_OMNIBOX_SUGGESTIONS_READY,
|
| Source<Profile>(profile->GetOriginalProfile()));
|
| + registrar_.Add(this,
|
| + NotificationType::EXTENSION_OMNIBOX_DEFAULT_SUGGESTION_CHANGED,
|
| + Source<Profile>(profile->GetOriginalProfile()));
|
| registrar_.Add(this, NotificationType::EXTENSION_OMNIBOX_INPUT_ENTERED,
|
| Source<Profile>(profile));
|
| }
|
| @@ -433,56 +436,78 @@ AutocompleteMatch KeywordProvider::CreateAutocompleteMatch(
|
| void KeywordProvider::Observe(NotificationType type,
|
| const NotificationSource& source,
|
| const NotificationDetails& details) {
|
| - if (type == NotificationType::EXTENSION_OMNIBOX_INPUT_ENTERED) {
|
| - // Input has been accepted, so we're done with this input session. Ensure
|
| - // we don't send the OnInputCancelled event.
|
| - current_keyword_extension_id_.clear();
|
| - return;
|
| - }
|
| + TemplateURLModel* model = profile_ ? profile_->GetTemplateURLModel() : model_;
|
| + const AutocompleteInput& input = extension_suggest_last_input_;
|
|
|
| - // TODO(mpcomplete): consider clamping the number of suggestions to
|
| - // AutocompleteProvider::kMaxMatches.
|
| - DCHECK(type == NotificationType::EXTENSION_OMNIBOX_SUGGESTIONS_READY);
|
| + switch (type.value) {
|
| + case NotificationType::EXTENSION_OMNIBOX_INPUT_ENTERED:
|
| + // Input has been accepted, so we're done with this input session. Ensure
|
| + // we don't send the OnInputCancelled event.
|
| + current_keyword_extension_id_.clear();
|
| + return;
|
| +
|
| + case NotificationType::EXTENSION_OMNIBOX_DEFAULT_SUGGESTION_CHANGED: {
|
| + // It's possible to change the default suggestion while not in an editing
|
| + // session.
|
| + std::wstring keyword, remaining_input;
|
| + if (matches_.empty() || current_keyword_extension_id_.empty() ||
|
| + !ExtractKeywordFromInput(input, &keyword, &remaining_input))
|
| + return;
|
| +
|
| + const TemplateURL* template_url(model->GetTemplateURLForKeyword(keyword));
|
| + ApplyDefaultSuggestionForExtensionKeyword(profile_, template_url,
|
| + WideToUTF16(remaining_input),
|
| + &matches_[0]);
|
| + listener_->OnProviderUpdate(true);
|
| + return;
|
| + }
|
|
|
| - const ExtensionOmniboxSuggestions& suggestions =
|
| - *Details<ExtensionOmniboxSuggestions>(details).ptr();
|
| - if (suggestions.request_id != current_input_id_)
|
| - return; // This is an old result. Just ignore.
|
| + case NotificationType::EXTENSION_OMNIBOX_SUGGESTIONS_READY: {
|
| + const ExtensionOmniboxSuggestions& suggestions =
|
| + *Details<ExtensionOmniboxSuggestions>(details).ptr();
|
| + if (suggestions.request_id != current_input_id_)
|
| + return; // This is an old result. Just ignore.
|
|
|
| - const AutocompleteInput& input = extension_suggest_last_input_;
|
| - std::wstring keyword, remaining_input;
|
| - if (!ExtractKeywordFromInput(input, &keyword, &remaining_input)) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| + std::wstring keyword, remaining_input;
|
| + if (!ExtractKeywordFromInput(input, &keyword, &remaining_input)) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
|
|
| - TemplateURLModel* model =
|
| - profile_ ? profile_->GetTemplateURLModel() : model_;
|
| -
|
| - for (size_t i = 0; i < suggestions.suggestions.size(); ++i) {
|
| - const ExtensionOmniboxSuggestion& suggestion = suggestions.suggestions[i];
|
| - // We want to order these suggestions in descending order, so start with
|
| - // the relevance of the first result (added synchronously in Start()),
|
| - // and subtract 1 for each subsequent suggestion from the extension.
|
| - // We know that |complete| is true, because we wouldn't get results from
|
| - // the extension unless the full keyword had been typed.
|
| - int first_relevance = CalculateRelevance(input.type(), true,
|
| - input.prefer_keyword(), input.allow_exact_keyword_match());
|
| - extension_suggest_matches_.push_back(CreateAutocompleteMatch(
|
| - model, keyword, input, keyword.length(),
|
| - UTF16ToWide(suggestion.content), first_relevance - (i + 1)));
|
| -
|
| - AutocompleteMatch* match = &extension_suggest_matches_.back();
|
| - match->contents.assign(UTF16ToWide(suggestion.description));
|
| - match->contents_class = suggestion.description_styles;
|
| - match->description.clear();
|
| - match->description_class.clear();
|
| - }
|
| + // TODO(mpcomplete): consider clamping the number of suggestions to
|
| + // AutocompleteProvider::kMaxMatches.
|
| + for (size_t i = 0; i < suggestions.suggestions.size(); ++i) {
|
| + const ExtensionOmniboxSuggestion& suggestion =
|
| + suggestions.suggestions[i];
|
| + // We want to order these suggestions in descending order, so start with
|
| + // the relevance of the first result (added synchronously in Start()),
|
| + // and subtract 1 for each subsequent suggestion from the extension.
|
| + // We know that |complete| is true, because we wouldn't get results from
|
| + // the extension unless the full keyword had been typed.
|
| + int first_relevance = CalculateRelevance(input.type(), true,
|
| + input.prefer_keyword(), input.allow_exact_keyword_match());
|
| + extension_suggest_matches_.push_back(CreateAutocompleteMatch(
|
| + model, keyword, input, keyword.length(),
|
| + UTF16ToWide(suggestion.content), first_relevance - (i + 1)));
|
| +
|
| + AutocompleteMatch* match = &extension_suggest_matches_.back();
|
| + match->contents.assign(UTF16ToWide(suggestion.description));
|
| + match->contents_class = suggestion.description_styles;
|
| + match->description.clear();
|
| + match->description_class.clear();
|
| + }
|
|
|
| - done_ = true;
|
| - matches_.insert(matches_.end(), extension_suggest_matches_.begin(),
|
| - extension_suggest_matches_.end());
|
| - listener_->OnProviderUpdate(!extension_suggest_matches_.empty());
|
| + done_ = true;
|
| + matches_.insert(matches_.end(), extension_suggest_matches_.begin(),
|
| + extension_suggest_matches_.end());
|
| + listener_->OnProviderUpdate(!extension_suggest_matches_.empty());
|
| + return;
|
| + }
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| }
|
|
|
| void KeywordProvider::EnterExtensionKeywordMode(
|
|
|