1 // Copyright (c) 2013 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_EXTENSION_COMMANDS_GLOBAL_REGISTRY_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_COMMANDS_GLOBAL_REGISTRY_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/compiler_specific.h" 12 #include "chrome/browser/extensions/extension_keybinding_registry.h" 13 #include "chrome/browser/extensions/global_shortcut_listener.h" 14 #include "extensions/browser/browser_context_keyed_api_factory.h" 15 #include "ui/base/accelerators/accelerator.h" 16 17 namespace content { 18 class BrowserContext; 19 } 20 21 namespace extensions { 22 class Extension; 23 24 // ExtensionCommandsGlobalRegistry is a class that handles the cross-platform 25 // implementation of the global shortcut registration for the Extension Commands 26 // API). 27 // Note: It handles regular extension commands (not browserAction and pageAction 28 // popups, which are not bindable to global shortcuts). This class registers the 29 // accelerators on behalf of the extensions and routes the commands to them via 30 // the BrowserEventRouter. 31 class ExtensionCommandsGlobalRegistry 32 : public BrowserContextKeyedAPI, 33 public ExtensionKeybindingRegistry, 34 public GlobalShortcutListener::Observer { 35 public: 36 // BrowserContextKeyedAPI implementation. 37 static BrowserContextKeyedAPIFactory<ExtensionCommandsGlobalRegistry>* 38 GetFactoryInstance(); 39 40 // Convenience method to get the ExtensionCommandsGlobalRegistry for a 41 // profile. 42 static ExtensionCommandsGlobalRegistry* Get(content::BrowserContext* context); 43 44 // Enables/Disables global shortcut handling in Chrome. 45 static void SetShortcutHandlingSuspended(bool suspended); 46 47 explicit ExtensionCommandsGlobalRegistry(content::BrowserContext* context); 48 virtual ~ExtensionCommandsGlobalRegistry(); 49 50 // Returns which non-global command registry is active (belonging to the 51 // currently active window). registry_for_active_window()52 ExtensionKeybindingRegistry* registry_for_active_window() { 53 return registry_for_active_window_; 54 } 55 set_registry_for_active_window(ExtensionKeybindingRegistry * registry)56 void set_registry_for_active_window(ExtensionKeybindingRegistry* registry) { 57 registry_for_active_window_ = registry; 58 } 59 60 // Returns whether |accelerator| is registered on the registry for the active 61 // window or on the global registry. 62 bool IsRegistered(const ui::Accelerator& accelerator); 63 64 private: 65 friend class BrowserContextKeyedAPIFactory<ExtensionCommandsGlobalRegistry>; 66 67 // BrowserContextKeyedAPI implementation. service_name()68 static const char* service_name() { 69 return "ExtensionCommandsGlobalRegistry"; 70 } 71 72 // Overridden from ExtensionKeybindingRegistry: 73 virtual void AddExtensionKeybinding( 74 const Extension* extension, 75 const std::string& command_name) OVERRIDE; 76 virtual void RemoveExtensionKeybindingImpl( 77 const ui::Accelerator& accelerator, 78 const std::string& command_name) OVERRIDE; 79 80 // Called by the GlobalShortcutListener object when a shortcut this class has 81 // registered for has been pressed. 82 virtual void OnKeyPressed(const ui::Accelerator& accelerator) OVERRIDE; 83 84 // Weak pointer to our browser context. Not owned by us. 85 content::BrowserContext* browser_context_; 86 87 // The global commands registry not only keeps track of global commands 88 // registered, but also of which non-global command registry is active 89 // (belonging to the currently active window). Only valid for TOOLKIT_VIEWS 90 // and 91 // NULL otherwise. 92 ExtensionKeybindingRegistry* registry_for_active_window_; 93 94 DISALLOW_COPY_AND_ASSIGN(ExtensionCommandsGlobalRegistry); 95 }; 96 97 } // namespace extensions 98 99 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_COMMANDS_GLOBAL_REGISTRY_H_ 100