omnibox_api.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_API_OMNIBOX_OMNIBOX_API_H_
6#define CHROME_BROWSER_EXTENSIONS_API_OMNIBOX_OMNIBOX_API_H_
7
8#include <set>
9#include <string>
10#include <vector>
11
12#include "base/memory/scoped_ptr.h"
13#include "base/strings/string16.h"
14#include "chrome/browser/autocomplete/autocomplete_match.h"
15#include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
16#include "chrome/browser/extensions/extension_function.h"
17#include "chrome/browser/extensions/extension_icon_manager.h"
18#include "chrome/browser/search_engines/template_url_service.h"
19#include "chrome/common/extensions/api/omnibox.h"
20#include "content/public/browser/notification_observer.h"
21#include "content/public/browser/notification_registrar.h"
22#include "ui/base/window_open_disposition.h"
23
24class Profile;
25class TemplateURL;
26class TemplateURLService;
27
28namespace base {
29class ListValue;
30}
31
32namespace content {
33class WebContents;
34}
35
36namespace gfx {
37class Image;
38}
39
40namespace extensions {
41
42// Event router class for events related to the omnibox API.
43class ExtensionOmniboxEventRouter {
44 public:
45  // The user has just typed the omnibox keyword. This is sent exactly once in
46  // a given input session, before any OnInputChanged events.
47  static void OnInputStarted(
48      Profile* profile, const std::string& extension_id);
49
50  // The user has changed what is typed into the omnibox while in an extension
51  // keyword session. Returns true if someone is listening to this event, and
52  // thus we have some degree of confidence we'll get a response.
53  static bool OnInputChanged(
54      Profile* profile,
55      const std::string& extension_id,
56      const std::string& input, int suggest_id);
57
58  // The user has accepted the omnibox input.
59  static void OnInputEntered(
60      content::WebContents* web_contents,
61      const std::string& extension_id,
62      const std::string& input,
63      WindowOpenDisposition disposition);
64
65  // The user has cleared the keyword, or closed the omnibox popup. This is
66  // sent at most once in a give input session, after any OnInputChanged events.
67  static void OnInputCancelled(
68      Profile* profile, const std::string& extension_id);
69
70 private:
71  DISALLOW_COPY_AND_ASSIGN(ExtensionOmniboxEventRouter);
72};
73
74class OmniboxSendSuggestionsFunction : public SyncExtensionFunction {
75 public:
76  DECLARE_EXTENSION_FUNCTION("omnibox.sendSuggestions", OMNIBOX_SENDSUGGESTIONS)
77
78 protected:
79  virtual ~OmniboxSendSuggestionsFunction() {}
80
81  // ExtensionFunction:
82  virtual bool RunImpl() OVERRIDE;
83};
84
85class OmniboxAPI : public ProfileKeyedAPI,
86                   public content::NotificationObserver {
87 public:
88  explicit OmniboxAPI(Profile* profile);
89  virtual ~OmniboxAPI();
90
91  // ProfileKeyedAPI implementation.
92  static ProfileKeyedAPIFactory<OmniboxAPI>* GetFactoryInstance();
93
94  // Convenience method to get the OmniboxAPI for a profile.
95  static OmniboxAPI* Get(Profile* profile);
96
97  // content::NotificationObserver implementation.
98  virtual void Observe(int type,
99                       const content::NotificationSource& source,
100                       const content::NotificationDetails& details) OVERRIDE;
101
102  // BrowserContextKeyedService implementation.
103  virtual void Shutdown() OVERRIDE;
104
105  // Returns the icon to display in the omnibox for the given extension.
106  gfx::Image GetOmniboxIcon(const std::string& extension_id);
107
108  // Returns the icon to display in the omnibox popup window for the given
109  // extension.
110  gfx::Image GetOmniboxPopupIcon(const std::string& extension_id);
111
112 private:
113  friend class ProfileKeyedAPIFactory<OmniboxAPI>;
114
115  typedef std::set<const Extension*> PendingExtensions;
116
117  void OnTemplateURLsLoaded();
118
119  // ProfileKeyedAPI implementation.
120  static const char* service_name() {
121    return "OmniboxAPI";
122  }
123  static const bool kServiceRedirectedInIncognito = true;
124
125  Profile* profile_;
126
127  TemplateURLService* url_service_;
128
129  // List of extensions waiting for the TemplateURLService to Load to
130  // have keywords registered.
131  PendingExtensions pending_extensions_;
132
133  content::NotificationRegistrar registrar_;
134
135  // Keeps track of favicon-sized omnibox icons for extensions.
136  ExtensionIconManager omnibox_icon_manager_;
137  ExtensionIconManager omnibox_popup_icon_manager_;
138
139  scoped_ptr<TemplateURLService::Subscription> template_url_sub_;
140
141  DISALLOW_COPY_AND_ASSIGN(OmniboxAPI);
142};
143
144template <>
145void ProfileKeyedAPIFactory<OmniboxAPI>::DeclareFactoryDependencies();
146
147class OmniboxSetDefaultSuggestionFunction : public SyncExtensionFunction {
148 public:
149  DECLARE_EXTENSION_FUNCTION("omnibox.setDefaultSuggestion",
150                             OMNIBOX_SETDEFAULTSUGGESTION)
151
152 protected:
153  virtual ~OmniboxSetDefaultSuggestionFunction() {}
154
155  // ExtensionFunction:
156  virtual bool RunImpl() OVERRIDE;
157};
158
159// If the extension has set a custom default suggestion via
160// omnibox.setDefaultSuggestion, apply that to |match|. Otherwise, do nothing.
161void ApplyDefaultSuggestionForExtensionKeyword(
162    Profile* profile,
163    const TemplateURL* keyword,
164    const string16& remaining_input,
165    AutocompleteMatch* match);
166
167// This function converts style information populated by the JSON schema
168// // compiler into an ACMatchClassifications object.
169ACMatchClassifications StyleTypesToACMatchClassifications(
170    const api::omnibox::SuggestResult &suggestion);
171
172}  // namespace extensions
173
174#endif  // CHROME_BROWSER_EXTENSIONS_API_OMNIBOX_OMNIBOX_API_H_
175