1// Copyright (c) 2012 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#include "chrome/browser/ui/views/extensions/extension_keybinding_registry_views.h" 6 7#include "chrome/browser/extensions/api/commands/command_service.h" 8#include "chrome/browser/extensions/extension_keybinding_registry.h" 9#include "chrome/browser/profiles/profile.h" 10#include "chrome/browser/ui/extensions/accelerator_priority.h" 11#include "extensions/common/extension.h" 12#include "ui/views/focus/focus_manager.h" 13 14// static 15void extensions::ExtensionKeybindingRegistry::SetShortcutHandlingSuspended( 16 bool suspended) { 17 views::FocusManager::set_shortcut_handling_suspended(suspended); 18} 19 20ExtensionKeybindingRegistryViews::ExtensionKeybindingRegistryViews( 21 Profile* profile, 22 views::FocusManager* focus_manager, 23 ExtensionFilter extension_filter, 24 Delegate* delegate) 25 : ExtensionKeybindingRegistry(profile, extension_filter, delegate), 26 profile_(profile), 27 focus_manager_(focus_manager) { 28 Init(); 29} 30 31ExtensionKeybindingRegistryViews::~ExtensionKeybindingRegistryViews() { 32 focus_manager_->UnregisterAccelerators(this); 33} 34 35void ExtensionKeybindingRegistryViews::AddExtensionKeybinding( 36 const extensions::Extension* extension, 37 const std::string& command_name) { 38 // This object only handles named commands, not browser/page actions. 39 if (ShouldIgnoreCommand(command_name)) 40 return; 41 42 extensions::CommandService* command_service = 43 extensions::CommandService::Get(profile_); 44 // Add all the active keybindings (except page actions and browser actions, 45 // which are handled elsewhere). 46 extensions::CommandMap commands; 47 if (!command_service->GetNamedCommands( 48 extension->id(), 49 extensions::CommandService::ACTIVE_ONLY, 50 extensions::CommandService::REGULAR, 51 &commands)) 52 return; 53 extensions::CommandMap::const_iterator iter = commands.begin(); 54 for (; iter != commands.end(); ++iter) { 55 if (!command_name.empty() && (iter->second.command_name() != command_name)) 56 continue; 57 const ui::Accelerator &accelerator = iter->second.accelerator(); 58 if (!IsAcceleratorRegistered(accelerator)) { 59 focus_manager_->RegisterAccelerator( 60 accelerator, GetAcceleratorPriority(accelerator, extension), this); 61 } 62 63 AddEventTarget(accelerator, extension->id(), iter->second.command_name()); 64 } 65} 66 67void ExtensionKeybindingRegistryViews::RemoveExtensionKeybindingImpl( 68 const ui::Accelerator& accelerator, 69 const std::string& command_name) { 70 focus_manager_->UnregisterAccelerator(accelerator, this); 71} 72 73bool ExtensionKeybindingRegistryViews::AcceleratorPressed( 74 const ui::Accelerator& accelerator) { 75 std::string extension_id, command_name; 76 GetFirstTarget(accelerator, &extension_id, &command_name); 77 const ui::AcceleratorManager::HandlerPriority priority = 78 GetAcceleratorPriorityById(accelerator, extension_id, browser_context()); 79 // Normal priority shortcuts must be handled via standard browser commands to 80 // be processed at the proper time. 81 return (priority == ui::AcceleratorManager::kHighPriority) && 82 ExtensionKeybindingRegistry::NotifyEventTargets(accelerator); 83} 84 85bool ExtensionKeybindingRegistryViews::CanHandleAccelerators() const { 86 return true; 87} 88