extension_commands_global_registry.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2013 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_EXTENSION_COMMANDS_GLOBAL_REGISTRY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_COMMANDS_GLOBAL_REGISTRY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_keybinding_registry.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/extensions/global_shortcut_listener.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace extensions {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Extension;
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtensionCommandsGlobalRegistry is a class that handles the cross-platform
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation of the global shortcut registration for the Extension Commands
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API).
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: It handles regular extension commands (not browserAction and pageAction
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// popups, which are not bindable to global shortcuts). This class registers the
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// accelerators on behalf of the extensions and routes the commands to them via
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the BrowserEventRouter.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionCommandsGlobalRegistry
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public ProfileKeyedAPI,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public ExtensionKeybindingRegistry,
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      public GlobalShortcutListener::Observer {
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ProfileKeyedAPI implementation.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static ProfileKeyedAPIFactory<
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionCommandsGlobalRegistry>* GetFactoryInstance();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Convenience method to get the ExtensionCommandsGlobalRegistry for a
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // profile.
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static ExtensionCommandsGlobalRegistry* Get(Profile* profile);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ExtensionCommandsGlobalRegistry(Profile* profile);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionCommandsGlobalRegistry();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ProfileKeyedAPIFactory<ExtensionCommandsGlobalRegistry>;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProfileKeyedAPI implementation.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* service_name() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "ExtensionCommandsGlobalRegistry";
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ExtensionKeybindingRegistry:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddExtensionKeybinding(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* extension,
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& command_name) OVERRIDE;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RemoveExtensionKeybindingImpl(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ui::Accelerator& accelerator,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& command_name) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called by the GlobalShortcutListener object when a shortcut this class has
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // registered for has been pressed.
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void OnKeyPressed(const ui::Accelerator& accelerator) OVERRIDE;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer to our profile. Not owned by us.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionCommandsGlobalRegistry);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace extensions
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_COMMANDS_GLOBAL_REGISTRY_H_
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)