keyword_extensions_delegate_impl.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth// Copyright 2014 The Chromium Authors. All rights reserved.
27ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth// Use of this source code is governed by a BSD-style license that can be
3e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregor// found in the LICENSE file.
406bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor//
506bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor// KeywordExtensionsDelegateImpl contains the extensions-only logic used by
67ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth// KeywordProvider. Overrides KeywordExtensionsDelegate which does nothing.
7929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth
87ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth#ifndef CHROME_BROWSER_AUTOCOMPLETE_KEYWORD_EXTENSIONS_DELEGATE_IMPL_H_
97ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth#define CHROME_BROWSER_AUTOCOMPLETE_KEYWORD_EXTENSIONS_DELEGATE_IMPL_H_
107ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth
117ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth#include <vector>
1243fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth
1343fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth#include "base/compiler_specific.h"
1443fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth#include "chrome/browser/autocomplete/autocomplete_input.h"
1543fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth#include "chrome/browser/autocomplete/autocomplete_match.h"
1643fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth#include "chrome/browser/autocomplete/autocomplete_provider_listener.h"
1743fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth#include "chrome/browser/autocomplete/keyword_extensions_delegate.h"
18929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth#include "chrome/browser/autocomplete/keyword_provider.h"
19929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth#include "content/public/browser/notification_observer.h"
207ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth#include "content/public/browser/notification_registrar.h"
217ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth
227ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth#if !defined(ENABLE_EXTENSIONS)
2306bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor#error "Should not be included when extensions are disabled"
247ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth#endif
25929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth
2606bc9eb9908e42696775b395b290827bde468c8bDouglas Gregorclass KeywordExtensionsDelegateImpl : public KeywordExtensionsDelegate,
2706bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor                                      public content::NotificationObserver {
2806bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor public:
2906bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor  explicit KeywordExtensionsDelegateImpl(KeywordProvider* provider);
30929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth  virtual ~KeywordExtensionsDelegateImpl();
3106bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor
3206bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor private:
33929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth  // KeywordExtensionsDelegate:
3406bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor  virtual void IncrementInputId() OVERRIDE;
3506bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor  virtual bool IsEnabledExtension(Profile* profile,
36929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth                                  const std::string& extension_id) OVERRIDE;
3706bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor  virtual bool Start(const AutocompleteInput& input,
3806bc9eb9908e42696775b395b290827bde468c8bDouglas Gregor                     bool minimal_changes,
39929f0135ab60166202f52e0dd19835c0490d792aChandler Carruth                     const TemplateURL* template_url,
407ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth                     const base::string16& remaining_input) OVERRIDE;
41707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  virtual void EnterExtensionKeywordMode(
42707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor      const std::string& extension_id) OVERRIDE;
43707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  virtual void MaybeEndExtensionKeywordMode() OVERRIDE;
44707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
45707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // content::NotificationObserver:
46707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  virtual void Observe(int type,
47707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor                       const content::NotificationSource& source,
48707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor                       const content::NotificationDetails& details) OVERRIDE;
49707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
50707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  Profile* profile() { return provider_->profile_; }
51707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  ACMatches* matches() { return &provider_->matches_; }
52707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  void set_done(bool done) {
53707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor    provider_->done_ = done;
54707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  }
55707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
56707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // Notifies the KeywordProvider about asynchronous updates from the extension.
57707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  void OnProviderUpdate(bool updated_matches);
58707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
59707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // Identifies the current input state. This is incremented each time the
60707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // autocomplete edit's input changes in any way. It is used to tell whether
61707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // suggest results from the extension are current.
62707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  int current_input_id_;
63707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
64707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // The input state at the time we last asked the extension for suggest
65707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // results.
66707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  AutocompleteInput extension_suggest_last_input_;
67707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
68707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // We remember the last suggestions we've received from the extension in case
69707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // we need to reset our matches without asking the extension again.
70707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  std::vector<AutocompleteMatch> extension_suggest_matches_;
71707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
72707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // If non-empty, holds the ID of the extension whose keyword is currently in
73707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // the URL bar while the autocomplete popup is open.
74707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  std::string current_keyword_extension_id_;
75707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
76707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  // The owner of this class.
77707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  KeywordProvider* provider_;
78707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
79707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor  content::NotificationRegistrar registrar_;
80707a23e8b87410332b55bb4534fa1c799edef38aDouglas Gregor
817ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth  // We need our input IDs to be unique across all profiles, so we keep a global
827ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth  // UID that each provider uses.
83134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth  static int global_input_uid_;
84134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth
85134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth  DISALLOW_COPY_AND_ASSIGN(KeywordExtensionsDelegateImpl);
86134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth};
87134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth
88134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth#endif  // CHROME_BROWSER_AUTOCOMPLETE_KEYWORD_EXTENSIONS_DELEGATE_IMPL_H_
89134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth