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