| Index: chrome/browser/extensions/extension_keybinding_registry.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_keybinding_registry.cc (revision 0)
|
| +++ chrome/browser/extensions/extension_keybinding_registry.cc (revision 0)
|
| @@ -0,0 +1,113 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/extensions/extension_keybinding_registry.h"
|
| +
|
| +#include "chrome/browser/extensions/extension_browser_event_router.h"
|
| +#include "chrome/browser/extensions/extension_event_router.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/common/chrome_notification_types.h"
|
| +#include "chrome/common/extensions/extension_constants.h"
|
| +#include "ui/views/focus/focus_manager.h"
|
| +
|
| +ExtensionKeybindingRegistry::ExtensionKeybindingRegistry(
|
| + Profile* profile, views::FocusManager* focus_manager)
|
| + : profile_(profile),
|
| + focus_manager_(focus_manager) {
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
|
| + content::Source<Profile>(profile->GetOriginalProfile()));
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| + content::Source<Profile>(profile->GetOriginalProfile()));
|
| +
|
| + ExtensionService* service = profile->GetExtensionService();
|
| + if (!service)
|
| + return; // ExtensionService can be null during testing.
|
| +
|
| + const ExtensionSet* extensions = service->extensions();
|
| +
|
| + ExtensionSet::const_iterator iter = extensions->begin();
|
| + for (; iter != extensions->end(); ++iter)
|
| + AddExtensionKeybinding(*iter);
|
| +}
|
| +
|
| +ExtensionKeybindingRegistry::~ExtensionKeybindingRegistry() {
|
| + EventTargets::const_iterator iter;
|
| + for (iter = event_targets_.begin(); iter != event_targets_.end(); ++iter)
|
| + focus_manager_->UnregisterAccelerator(iter->first, this);
|
| +}
|
| +
|
| +void ExtensionKeybindingRegistry::AddExtensionKeybinding(
|
| + const Extension* extension) {
|
| + // Add all the keybindings (except pageAction and browserAction, which are
|
| + // handled elsewhere).
|
| + const std::vector<Extension::ExtensionKeybinding> commands =
|
| + extension->keybindings();
|
| + for (size_t i = 0; i < commands.size(); ++i) {
|
| + if (ShouldIgnoreCommand(commands[i].command_name()))
|
| + continue;
|
| +
|
| + event_targets_[commands[i].accelerator()] =
|
| + std::make_pair(extension->id(), commands[i].command_name());
|
| + focus_manager_->RegisterAccelerator(
|
| + commands[i].accelerator(), ui::AcceleratorManager::kHighPriority, this);
|
| + }
|
| +}
|
| +
|
| +void ExtensionKeybindingRegistry::RemoveExtensionKeybinding(
|
| + const Extension* extension) {
|
| + EventTargets::const_iterator iter;
|
| + for (iter = event_targets_.begin(); iter != event_targets_.end(); ++iter) {
|
| + if (iter->second.first != extension->id())
|
| + continue; // Not the extension we asked for.
|
| +
|
| + focus_manager_->UnregisterAccelerator(iter->first, this);
|
| + }
|
| +}
|
| +
|
| +bool ExtensionKeybindingRegistry::ShouldIgnoreCommand(
|
| + const std::string& command) const {
|
| + return command == extension_manifest_values::kPageActionKeybindingEvent ||
|
| + command == extension_manifest_values::kBrowserActionKeybindingEvent;
|
| +}
|
| +
|
| +bool ExtensionKeybindingRegistry::AcceleratorPressed(
|
| + const ui::Accelerator& accelerator) {
|
| + ExtensionService* service = profile_->GetExtensionService();
|
| +
|
| + EventTargets::iterator it = event_targets_.find(accelerator);
|
| + if (it == event_targets_.end()) {
|
| + NOTREACHED(); // Shouldn't get this event for something not registered.
|
| + return false;
|
| + }
|
| +
|
| + service->browser_event_router()->CommandExecuted(
|
| + profile_, it->second.first, it->second.second);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool ExtensionKeybindingRegistry::CanHandleAccelerators() const {
|
| + return true;
|
| +}
|
| +
|
| +void ExtensionKeybindingRegistry::Observe(
|
| + int type,
|
| + const content::NotificationSource& source,
|
| + const content::NotificationDetails& details) {
|
| + switch (type) {
|
| + case chrome::NOTIFICATION_EXTENSION_LOADED:
|
| + AddExtensionKeybinding(
|
| + content::Details<const Extension>(details).ptr());
|
| + break;
|
| + case chrome::NOTIFICATION_EXTENSION_UNLOADED:
|
| + RemoveExtensionKeybinding(
|
| + content::Details<UnloadedExtensionInfo>(details)->extension);
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
|
|
| Property changes on: chrome\browser\extensions\extension_keybinding_registry.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|