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/profiles/profile.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/extensions/accelerator_priority.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/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() { 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) focus_manager_->UnregisterAccelerators(this); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionKeybindingRegistryViews::AddExtensionKeybinding( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& command_name) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This object only handles named commands, not browser/page actions. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldIgnoreCommand(command_name)) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::CommandService* command_service = 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::CommandService::Get(profile_); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add all the active keybindings (except page actions and browser actions, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which are handled elsewhere). 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::CommandMap commands; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!command_service->GetNamedCommands( 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension->id(), 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::CommandService::ACTIVE_ONLY, 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::CommandService::REGULAR, 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &commands)) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::CommandMap::const_iterator iter = commands.begin(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; iter != commands.end(); ++iter) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!command_name.empty() && (iter->second.command_name() != command_name)) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::Accelerator &accelerator = iter->second.accelerator(); 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!IsAcceleratorRegistered(accelerator)) { 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch focus_manager_->RegisterAccelerator( 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accelerator, GetAcceleratorPriority(accelerator, extension), this); 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddEventTarget(accelerator, extension->id(), iter->second.command_name()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ExtensionKeybindingRegistryViews::RemoveExtensionKeybindingImpl( 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ui::Accelerator& accelerator, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& command_name) { 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) focus_manager_->UnregisterAccelerator(accelerator, this); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionKeybindingRegistryViews::AcceleratorPressed( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string extension_id, command_name; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFirstTarget(accelerator, &extension_id, &command_name); 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::AcceleratorManager::HandlerPriority priority = 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetAcceleratorPriorityById(accelerator, extension_id, browser_context()); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Normal priority shortcuts must be handled via standard browser commands to 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // be processed at the proper time. 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return (priority == ui::AcceleratorManager::kHighPriority) && 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionKeybindingRegistry::NotifyEventTargets(accelerator); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionKeybindingRegistryViews::CanHandleAccelerators() const { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 88