| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // KeywordExtensionsDelegateImpl contains the extensions-only logic used by |
| // KeywordProvider. Overrides KeywordExtensionsDelegate which does nothing. |
| |
| #ifndef CHROME_BROWSER_AUTOCOMPLETE_KEYWORD_EXTENSIONS_DELEGATE_IMPL_H_ |
| #define CHROME_BROWSER_AUTOCOMPLETE_KEYWORD_EXTENSIONS_DELEGATE_IMPL_H_ |
| |
| #include <vector> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/scoped_observation.h" |
| #include "components/omnibox/browser/autocomplete_input.h" |
| #include "components/omnibox/browser/autocomplete_match.h" |
| #include "components/omnibox/browser/autocomplete_provider_listener.h" |
| #include "components/omnibox/browser/keyword_extensions_delegate.h" |
| #include "components/omnibox/browser/keyword_provider.h" |
| #include "components/omnibox/browser/omnibox_input_watcher.h" |
| #include "components/omnibox/browser/omnibox_suggestions_watcher.h" |
| #include "extensions/buildflags/buildflags.h" |
| |
| #if !BUILDFLAG(ENABLE_EXTENSIONS_CORE) |
| #error "Should not be included when extensions are disabled" |
| #endif |
| |
| class Profile; |
| |
| class KeywordExtensionsDelegateImpl |
| : public KeywordExtensionsDelegate, |
| public OmniboxInputWatcher::Observer, |
| public OmniboxSuggestionsWatcher::Observer { |
| public: |
| KeywordExtensionsDelegateImpl(Profile* profile, KeywordProvider* provider); |
| |
| KeywordExtensionsDelegateImpl(const KeywordExtensionsDelegateImpl&) = delete; |
| KeywordExtensionsDelegateImpl& operator=( |
| const KeywordExtensionsDelegateImpl&) = delete; |
| |
| ~KeywordExtensionsDelegateImpl() override; |
| |
| // KeywordExtensionsDelegate: |
| void DeleteSuggestion(const TemplateURL* template_url, |
| const std::u16string& suggestion_text) override; |
| |
| private: |
| // KeywordExtensionsDelegate: |
| void IncrementInputId() override; |
| bool IsEnabledExtension(const std::string& extension_id) override; |
| bool Start(const AutocompleteInput& input, |
| bool minimal_changes, |
| const TemplateURL* template_url, |
| const std::u16string& remaining_input) override; |
| void EnterExtensionKeywordMode(const std::string& extension_id) override; |
| void MaybeEndExtensionKeywordMode() override; |
| |
| // OmniboxInputWatcher::Observer: |
| void OnOmniboxInputEntered() override; |
| // OmniboxSuggestionsWatcher::Observer: |
| void OnOmniboxSuggestionsReady( |
| const std::vector<ExtensionSuggestion>& suggestions, |
| const int request_id, |
| const std::string& extension_id) override; |
| void OnOmniboxDefaultSuggestionChanged() override; |
| |
| ACMatches* matches() { return &provider_->matches_; } |
| void set_done(bool done) { provider_->done_ = done; } |
| |
| // Notifies the KeywordProvider about asynchronous updates from the extension. |
| void OnProviderUpdate(bool updated_matches); |
| |
| // Identifies the current input state. This is incremented each time the |
| // autocomplete edit's input changes in any way. It is used to tell whether |
| // suggest results from the extension are current. |
| int current_input_id_; |
| |
| // The input state at the time we last asked the extension for suggest |
| // results. |
| AutocompleteInput extension_suggest_last_input_; |
| |
| // We remember the last suggestions we've received from the extension in case |
| // we need to reset our matches without asking the extension again. |
| std::vector<AutocompleteMatch> extension_suggest_matches_; |
| |
| // If non-empty, holds the ID of the extension whose keyword is currently in |
| // the URL bar while the autocomplete popup is open. |
| std::string current_keyword_extension_id_; |
| |
| raw_ptr<Profile> profile_; |
| |
| // The owner of this class. |
| raw_ptr<KeywordProvider> provider_; |
| |
| // We need our input IDs to be unique across all profiles, so we keep a global |
| // UID that each provider uses. |
| static int global_input_uid_; |
| |
| base::ScopedObservation<OmniboxInputWatcher, OmniboxInputWatcher::Observer> |
| omnibox_input_observation_{this}; |
| base::ScopedObservation<OmniboxSuggestionsWatcher, |
| OmniboxSuggestionsWatcher::Observer> |
| omnibox_suggestions_observation_{this}; |
| }; |
| |
| #endif // CHROME_BROWSER_AUTOCOMPLETE_KEYWORD_EXTENSIONS_DELEGATE_IMPL_H_ |