Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1207)

Unified Diff: chrome/browser/extensions/extension_keybinding_registry.cc

Issue 9402018: Experimental Extension Keybinding (first cut). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/extensions/extension_keybinding_registry.h ('k') | chrome/browser/external_tab_container_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698