extension_keybinding_registry_views.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#include "chrome/browser/ui/views/extensions/extension_keybinding_registry_views.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/commands/command_service.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_keybinding_registry.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void extensions::ExtensionKeybindingRegistry::SetShortcutHandlingSuspended( 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suspended) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::FocusManager::set_shortcut_handling_suspended(suspended); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionKeybindingRegistryViews::ExtensionKeybindingRegistryViews( 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::FocusManager* focus_manager, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionFilter extension_filter, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ExtensionKeybindingRegistry(profile, extension_filter, delegate), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager_(focus_manager) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionKeybindingRegistryViews::~ExtensionKeybindingRegistryViews() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTargets::const_iterator iter; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (iter = event_targets_.begin(); iter != event_targets_.end(); ++iter) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager_->UnregisterAccelerator(iter->first, this); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionKeybindingRegistryViews::AddExtensionKeybinding( 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& command_name) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This object only handles named commands, not browser/page actions. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldIgnoreCommand(command_name)) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::CommandService* command_service = 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::CommandService::Get(profile_); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add all the active keybindings (except page actions and browser actions, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which are handled elsewhere). 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::CommandMap commands; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!command_service->GetNamedCommands( 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension->id(), 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::CommandService::ACTIVE_ONLY, 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::CommandService::REGULAR, 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &commands)) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::CommandMap::const_iterator iter = commands.begin(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; iter != commands.end(); ++iter) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!command_name.empty() && (iter->second.command_name() != command_name)) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_targets_[iter->second.accelerator()] = 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(extension->id(), iter->second.command_name()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager_->RegisterAccelerator( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter->second.accelerator(), 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorManager::kHighPriority, this); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ExtensionKeybindingRegistryViews::RemoveExtensionKeybindingImpl( 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ui::Accelerator& accelerator, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& command_name) { 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) focus_manager_->UnregisterAccelerator(accelerator, this); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionKeybindingRegistryViews::AcceleratorPressed( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTargets::iterator it = event_targets_.find(accelerator); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == event_targets_.end()) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); // Shouldn't get this event for something not registered. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandExecuted(it->second.first, it->second.second); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionKeybindingRegistryViews::CanHandleAccelerators() const { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 90