| Index: chrome/browser/autocomplete/keyword_provider.cc
|
| diff --git a/chrome/browser/autocomplete/keyword_provider.cc b/chrome/browser/autocomplete/keyword_provider.cc
|
| index 756818c865b86d51a0974ade5019bb8fbf1889fc..1e68de52265ea79814c653d01aa2d15dace04e99 100644
|
| --- a/chrome/browser/autocomplete/keyword_provider.cc
|
| +++ b/chrome/browser/autocomplete/keyword_provider.cc
|
| @@ -20,6 +20,24 @@
|
| #include "net/base/escape.h"
|
| #include "net/base/net_util.h"
|
|
|
| +// Helper functor for Start(), for ending keyword mode unless explicitly told
|
| +// otherwise.
|
| +class KeywordProvider::ScopedEndExtensionKeywordMode {
|
| + public:
|
| + ScopedEndExtensionKeywordMode(KeywordProvider* provider)
|
| + : provider_(provider) { }
|
| + ~ScopedEndExtensionKeywordMode() {
|
| + if (provider_)
|
| + provider_->MaybeEndExtensionKeywordMode();
|
| + }
|
| +
|
| + void StayInKeywordMode() {
|
| + provider_ = NULL;
|
| + }
|
| + private:
|
| + KeywordProvider* provider_;
|
| +};
|
| +
|
| // static
|
| std::wstring KeywordProvider::SplitReplacementStringFromInput(
|
| const std::wstring& input) {
|
| @@ -42,6 +60,8 @@ 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_INPUT_ENTERED,
|
| + Source<Profile>(profile));
|
| }
|
|
|
| KeywordProvider::KeywordProvider(ACProviderListener* listener,
|
| @@ -97,6 +117,10 @@ const TemplateURL* KeywordProvider::GetSubstitutingTemplateURLForInput(
|
|
|
| void KeywordProvider::Start(const AutocompleteInput& input,
|
| bool minimal_changes) {
|
| + // This object ensures we end keyword mode if we exit the function without
|
| + // toggling keyword mode to on.
|
| + ScopedEndExtensionKeywordMode keyword_mode_toggle(this);
|
| +
|
| matches_.clear();
|
|
|
| if (!minimal_changes) {
|
| @@ -165,6 +189,12 @@ void KeywordProvider::Start(const AutocompleteInput& input,
|
| if (!enabled)
|
| return;
|
|
|
| + if (extension->id() != current_keyword_extension_id_)
|
| + MaybeEndExtensionKeywordMode();
|
| + if (current_keyword_extension_id_.empty())
|
| + EnterExtensionKeywordMode(extension->id());
|
| + keyword_mode_toggle.StayInKeywordMode();
|
| +
|
| if (minimal_changes) {
|
| // If the input hasn't significantly changed, we can just use the
|
| // suggestions from last time. We need to readjust the relevance to
|
| @@ -205,6 +235,11 @@ void KeywordProvider::Start(const AutocompleteInput& input,
|
| }
|
| }
|
|
|
| +void KeywordProvider::Stop() {
|
| + done_ = true;
|
| + MaybeEndExtensionKeywordMode();
|
| +}
|
| +
|
| // static
|
| bool KeywordProvider::ExtractKeywordFromInput(const AutocompleteInput& input,
|
| std::wstring* keyword,
|
| @@ -365,6 +400,13 @@ 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;
|
| + }
|
| +
|
| // TODO(mpcomplete): consider clamping the number of suggestions to
|
| // AutocompleteProvider::kMaxMatches.
|
| DCHECK(type == NotificationType::EXTENSION_OMNIBOX_SUGGESTIONS_READY);
|
| @@ -409,3 +451,21 @@ void KeywordProvider::Observe(NotificationType type,
|
| extension_suggest_matches_.end());
|
| listener_->OnProviderUpdate(!extension_suggest_matches_.empty());
|
| }
|
| +
|
| +void KeywordProvider::EnterExtensionKeywordMode(
|
| + const std::string& extension_id) {
|
| + DCHECK(current_keyword_extension_id_.empty());
|
| + current_keyword_extension_id_ = extension_id;
|
| +
|
| + ExtensionOmniboxEventRouter::OnInputStarted(
|
| + profile_, current_keyword_extension_id_);
|
| +}
|
| +
|
| +void KeywordProvider::MaybeEndExtensionKeywordMode() {
|
| + if (!current_keyword_extension_id_.empty()) {
|
| + ExtensionOmniboxEventRouter::OnInputCancelled(
|
| + profile_, current_keyword_extension_id_);
|
| +
|
| + current_keyword_extension_id_.clear();
|
| + }
|
| +}
|
|
|