15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_COMMANDS_COMMAND_SERVICE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_COMMANDS_COMMAND_SERVICE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/scoped_observer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/command.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DictionaryValue;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext;
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Accelerator;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionRegistry;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This service keeps track of preferences related to extension commands
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (assigning initial keybindings on install and removing them on deletion
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and answers questions related to which commands are active.
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandService : public BrowserContextKeyedAPI,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       public ExtensionRegistryObserver {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An enum specifying whether to fetch all extension commands or only active
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ones.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum QueryType {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ALL,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ACTIVE_ONLY,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // An enum specifying whether the command is global in scope or not. Global
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // commands -- unlike regular commands -- have a global keyboard hook
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // associated with them (and therefore work when Chrome doesn't have focus).
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  enum CommandScope {
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    REGULAR,    // Regular (non-globally scoped) command.
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GLOBAL,     // Global command (works when Chrome doesn't have focus)
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ANY_SCOPE,  // All commands, regardless of scope (used when querying).
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // An enum specifying the types of commands that can be used by an extension.
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  enum ExtensionCommandType {
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NAMED,
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    BROWSER_ACTION,
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PAGE_ACTION
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register prefs for keybinding.
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a CommandService object for the given profile.
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit CommandService(content::BrowserContext* context);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CommandService();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // BrowserContextKeyedAPI implementation.
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static BrowserContextKeyedAPIFactory<CommandService>* GetFactoryInstance();
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Convenience method to get the CommandService for a profile.
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static CommandService* Get(content::BrowserContext* context);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if |extension| is permitted to and does remove the bookmark
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // shortcut key.
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static bool RemovesBookmarkShortcut(const Extension* extension);
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns true if |extension| is permitted to and does remove the bookmark
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // open pages shortcut key.
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static bool RemovesBookmarkOpenPagesShortcut(const Extension* extension);
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the command (if any) for the browser action of an extension given
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // its |extension_id|. The function consults the master list to see if
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the command is active. Returns false if the extension has no browser
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // action. Returns false if the command is not active and |type| requested
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is ACTIVE_ONLY. |command| contains the command found and |active| (if not
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL) contains whether |command| is active.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetBrowserActionCommand(const std::string& extension_id,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               QueryType type,
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               Command* command,
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               bool* active) const;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the command (if any) for the page action of an extension given
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // its |extension_id|. The function consults the master list to see if
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the command is active. Returns false if the extension has no page
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // action. Returns false if the command is not active and |type| requested
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is ACTIVE_ONLY. |command| contains the command found and |active| (if not
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL) contains whether |command| is active.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPageActionCommand(const std::string& extension_id,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            QueryType type,
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            Command* command,
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            bool* active) const;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Gets the active named commands (if any) for the extension with
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // |extension_id|. The function consults the master list to see if the
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // commands are active. Returns an empty map if the extension has no named
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // commands of the right |scope| or no such active named commands when |type|
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // requested is ACTIVE_ONLY.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetNamedCommands(const std::string& extension_id,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        QueryType type,
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        CommandScope scope,
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        CommandMap* command_map) const;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records a keybinding |accelerator| as active for an extension with id
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |extension_id| and command with the name |command_name|. If
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |allow_overrides| is false, the keybinding must be free for the change to
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be recorded (as determined by the master list in |user_prefs|). If
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |allow_overwrites| is true, any previously recorded keybinding for this
1258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // |accelerator| will be overwritten. If |global| is true, the command will
1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // be registered as a global command (be active even when Chrome does not have
1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // focus. Returns true if the change was successfully recorded.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddKeybindingPref(const ui::Accelerator& accelerator,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         std::string extension_id,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         std::string command_name,
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                         bool allow_overrides,
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                         bool global);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Removes all keybindings for a given extension by its |extension_id|.
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // |command_name| is optional and if specified, causes only the command with
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // the name |command_name| to be removed.
137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void RemoveKeybindingPrefs(const std::string& extension_id,
138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                             const std::string& command_name);
139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the keybinding prefs (for a command with a matching |extension_id|
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and |command_name|) to |keystroke|. If the command had another key assigned
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that key assignment will be removed.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateKeybindingPrefs(const std::string& extension_id,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::string& command_name,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::string& keystroke);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set the scope of the keybinding. If |global| is true, the keybinding works
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // even when Chrome does not have focus. If the scope requested is already
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // set, the function returns false, otherwise true.
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool SetScope(const std::string& extension_id,
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                const std::string& command_name,
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                bool global);
1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Finds the command with the name |command_name| within an extension with id
1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // |extension_id| . Returns an empty Command object (with keycode
1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // VKEY_UNKNOWN) if the command is not found.
1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Command FindCommandByName(const std::string& extension_id,
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const std::string& command) const;
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the extension with |extension_id| binds a command to |accelerator|,
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // returns true and assigns *|command| and *|command_type| to the command and
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // its type if non-NULL.
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool GetBoundExtensionCommand(const std::string& extension_id,
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                const ui::Accelerator& accelerator,
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                Command* command,
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                ExtensionCommandType* command_type) const;
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if |extension| is permitted to and does override the bookmark
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // shortcut key.
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool OverridesBookmarkShortcut(const Extension* extension) const;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class BrowserContextKeyedAPIFactory<CommandService>;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // BrowserContextKeyedAPI implementation.
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char* service_name() {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return "CommandService";
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const bool kServiceRedirectedInIncognito = true;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ExtensionRegistryObserver.
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionWillBeInstalled(
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::BrowserContext* browser_context,
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const Extension* extension,
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool is_update,
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool from_ephemeral,
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::string& old_name) OVERRIDE;
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnExtensionUninstalled(
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::BrowserContext* browser_context,
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const Extension* extension,
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::UninstallReason reason) OVERRIDE;
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Updates keybindings for a given |extension|'s page action, browser action
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // and named commands. Assigns new keybindings and removes relinquished
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // keybindings if not changed by the user. In the case of adding keybindings,
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // if the suggested keybinding is free, it will be taken by this extension. If
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // not, the keybinding request is ignored.
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void UpdateKeybindings(const Extension* extension);
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // On update, removes keybindings that the extension previously suggested but
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // now no longer does, as long as the user has not modified them.
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RemoveRelinquishedKeybindings(const Extension* extension);
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Assigns keybindings that the extension suggests, as long as they are not
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // already assigned.
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void AssignKeybindings(const Extension* extension);
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Checks if |extension| is permitted to automatically assign the
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |accelerator| key.
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool CanAutoAssign(const Command &command,
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     const Extension* extension);
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Updates the record of |extension|'s most recent suggested command shortcut
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // keys in the preferences.
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void UpdateExtensionSuggestedCommandPrefs(const Extension* extension);
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Remove suggested key command prefs that apply to commands that have been
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // removed.
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RemoveDefunctExtensionSuggestedCommandPrefs(const Extension* extension);
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns true if the user modified a command's shortcut key from the
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |extension|-suggested value.
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool IsCommandShortcutUserModified(const Extension* extension,
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     const std::string& command_name);
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns true if the extension is changing the binding of |command_name| on
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // install.
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool IsKeybindingChanging(const Extension* extension,
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            const std::string& command_name);
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns |extension|'s previous suggested key for |command_name| in the
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // preferences, or the empty string if none.
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string GetSuggestedKeyPref(const Extension* extension,
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  const std::string& command_name);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetExtensionActionCommand(const std::string& extension_id,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 QueryType query_type,
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 Command* command,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool* active,
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 ExtensionCommandType action_type) const;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A weak pointer to the profile we are associated with. Not owned by us.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extension_registry_observer_;
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CommandService);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template <>
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    BrowserContextKeyedAPIFactory<CommandService>::DeclareFactoryDependencies();
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  //  namespace extensions
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_COMMANDS_COMMAND_SERVICE_H_
258