| Index: chrome/browser/ui/views/browser_action_view.cc
|
| ===================================================================
|
| --- chrome/browser/ui/views/browser_action_view.cc (revision 144430)
|
| +++ chrome/browser/ui/views/browser_action_view.cc (working copy)
|
| @@ -13,6 +13,7 @@
|
| #include "chrome/browser/ui/views/toolbar_view.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/extensions/extension.h"
|
| +#include "chrome/common/extensions/extension_manifest_constants.h"
|
| #include "grit/generated_resources.h"
|
| #include "grit/theme_resources.h"
|
| #include "grit/theme_resources_standard.h"
|
| @@ -45,11 +46,16 @@
|
|
|
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED,
|
| content::Source<ExtensionAction>(browser_action_));
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED,
|
| + content::Source<Profile>(
|
| + panel_->profile()->GetOriginalProfile()));
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_COMMAND_REMOVED,
|
| + content::Source<Profile>(
|
| + panel_->profile()->GetOriginalProfile()));
|
| }
|
|
|
| void BrowserActionButton::Destroy() {
|
| - if (keybinding_.get() && panel_->GetFocusManager())
|
| - panel_->GetFocusManager()->UnregisterAccelerator(*keybinding_.get(), this);
|
| + MaybeUnregisterExtensionCommand(false);
|
|
|
| if (context_menu_) {
|
| context_menu_->Cancel();
|
| @@ -81,20 +87,7 @@
|
| UpdateState();
|
| }
|
|
|
| - extensions::CommandService* command_service =
|
| - extensions::CommandServiceFactory::GetForProfile(
|
| - panel_->browser()->profile());
|
| - extensions::Command browser_action_command;
|
| - if (command_service->GetBrowserActionCommand(
|
| - extension_->id(),
|
| - extensions::CommandService::ACTIVE_ONLY,
|
| - &browser_action_command,
|
| - NULL)) {
|
| - keybinding_.reset(new ui::Accelerator(
|
| - browser_action_command.accelerator()));
|
| - panel_->GetFocusManager()->RegisterAccelerator(
|
| - *keybinding_.get(), ui::AcceleratorManager::kHighPriority, this);
|
| - }
|
| + MaybeRegisterExtensionCommand();
|
| }
|
|
|
| MenuButton::ViewHierarchyChanged(is_add, parent, child);
|
| @@ -185,11 +178,32 @@
|
| void BrowserActionButton::Observe(int type,
|
| const content::NotificationSource& source,
|
| const content::NotificationDetails& details) {
|
| - DCHECK(type == chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED);
|
| - UpdateState();
|
| - // The browser action may have become visible/hidden so we need to make
|
| - // sure the state gets updated.
|
| - panel_->OnBrowserActionVisibilityChanged();
|
| + switch (type) {
|
| + case chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED:
|
| + UpdateState();
|
| + // The browser action may have become visible/hidden so we need to make
|
| + // sure the state gets updated.
|
| + panel_->OnBrowserActionVisibilityChanged();
|
| + break;
|
| + case chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED:
|
| + case chrome::NOTIFICATION_EXTENSION_COMMAND_REMOVED: {
|
| + std::pair<const std::string, const std::string>* payload =
|
| + content::Details<std::pair<const std::string, const std::string> >(
|
| + details).ptr();
|
| + if (extension_->id() == payload->first &&
|
| + payload->second ==
|
| + extension_manifest_values::kBrowserActionKeybindingEvent) {
|
| + if (type == chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED)
|
| + MaybeRegisterExtensionCommand();
|
| + else
|
| + MaybeUnregisterExtensionCommand(true);
|
| + }
|
| + break;
|
| + }
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| }
|
|
|
| bool BrowserActionButton::Activate() {
|
| @@ -287,6 +301,42 @@
|
| BrowserActionButton::~BrowserActionButton() {
|
| }
|
|
|
| +void BrowserActionButton::MaybeRegisterExtensionCommand() {
|
| + extensions::CommandService* command_service =
|
| + extensions::CommandServiceFactory::GetForProfile(
|
| + panel_->browser()->profile());
|
| + extensions::Command browser_action_command;
|
| + if (command_service->GetBrowserActionCommand(
|
| + extension_->id(),
|
| + extensions::CommandService::ACTIVE_ONLY,
|
| + &browser_action_command,
|
| + NULL)) {
|
| + keybinding_.reset(new ui::Accelerator(
|
| + browser_action_command.accelerator()));
|
| + panel_->GetFocusManager()->RegisterAccelerator(
|
| + *keybinding_.get(), ui::AcceleratorManager::kHighPriority, this);
|
| + }
|
| +}
|
| +
|
| +void BrowserActionButton::MaybeUnregisterExtensionCommand(bool only_if_active) {
|
| + if (!keybinding_.get() || !panel_->GetFocusManager())
|
| + return;
|
| +
|
| + extensions::CommandService* command_service =
|
| + extensions::CommandServiceFactory::GetForProfile(
|
| + panel_->browser()->profile());
|
| +
|
| + extensions::Command browser_action_command;
|
| + if (!only_if_active || !command_service->GetBrowserActionCommand(
|
| + extension_->id(),
|
| + extensions::CommandService::ACTIVE_ONLY,
|
| + &browser_action_command,
|
| + NULL)) {
|
| + panel_->GetFocusManager()->UnregisterAccelerator(*keybinding_.get(), this);
|
| + }
|
| +}
|
| +
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // BrowserActionView
|
|
|
|
|