Chromium Code Reviews| 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,112 @@ |
| +// 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 (IgnoreCommand(commands[i].event_name())) |
| + continue; |
| + |
| + event_targets_[commands[i].accelerator()] = |
| + std::make_pair(extension->id(), commands[i].event_name()); |
| + focus_manager_->RegisterAccelerator(commands[i].accelerator(), true, 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::IgnoreCommand( |
| + 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, std::string("toggleToggle")); |
|
Matt Perry
2012/02/21 23:13:39
toggleToggle => it->second.second ?
Finnur
2012/02/22 23:45:22
Woops! Good catch! :)
|
| + |
| + 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 |