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

Unified Diff: chrome/browser/ui/toolbar/action_box_button_controller.cc

Issue 12095023: Allow platform apps to add themselves to the Action Box. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Use raw pointer + IconImage signature changed Created 7 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/ui/toolbar/action_box_button_controller.cc
diff --git a/chrome/browser/ui/toolbar/action_box_button_controller.cc b/chrome/browser/ui/toolbar/action_box_button_controller.cc
index 5044d8f856925c53a4f5efe3073742efbf53e67f..030053166b63085ad7d5b68c5af9249392bc78e1 100644
--- a/chrome/browser/ui/toolbar/action_box_button_controller.cc
+++ b/chrome/browser/ui/toolbar/action_box_button_controller.cc
@@ -7,6 +7,8 @@
#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/utf_string_conversions.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/extensions/api/page_launcher/page_launcher_api.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/profiles/profile.h"
@@ -15,39 +17,27 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/toolbar/action_box_menu_model.h"
#include "chrome/common/chrome_notification_types.h"
+#include "chrome/common/extensions/api/extension_action/action_info.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_set.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_contents.h"
-#include "grit/generated_resources.h"
-#include "webkit/glue/webkit_glue.h"
-
-namespace {
-
-// Share intents get command IDs that are beyond the maximal valid command ID
-// (0xDFFF) so that they are not confused with actual commands that appear in
-// the menu. Extensions get a reserved block of commands after share handlers.
-// For more details see: chrome/app/chrome_command_ids.h
-const int kMaxShareItemsToShow = 20; // TODO(skare): Show extras in submenu.
-enum ActionBoxLocalCommandIds {
- CWS_FIND_SHARE_INTENTS_COMMAND = 0xE000,
- SHARE_COMMAND_FIRST,
- SHARE_COMMAND_LAST =
- SHARE_COMMAND_FIRST + kMaxShareItemsToShow - 1,
- EXTENSION_COMMAND_FIRST
-};
-
-} // namespace
using content::UserMetricsAction;
+using content::WebContents;
+using extensions::ActionInfo;
+
+void ActionBoxButtonController::Delegate::ShowMenu(
+ scoped_ptr<ActionBoxMenuModel> menu_model) {
+}
ActionBoxButtonController::ActionBoxButtonController(Browser* browser,
Delegate* delegate)
: browser_(browser),
delegate_(delegate),
- next_extension_command_id_(EXTENSION_COMMAND_FIRST) {
+ next_command_id_(0) {
DCHECK(browser_);
DCHECK(delegate_);
registrar_.Add(this,
@@ -62,19 +52,18 @@ void ActionBoxButtonController::OnButtonClicked() {
scoped_ptr<ActionBoxMenuModel> menu_model(
new ActionBoxMenuModel(browser_, this));
- ExtensionService* extension_service =
+ const ExtensionSet* extensions =
extensions::ExtensionSystem::Get(browser_->profile())->
- extension_service();
-
- // Add Extensions.
- next_extension_command_id_ = EXTENSION_COMMAND_FIRST;
- extension_command_ids_.clear();
- const extensions::ExtensionList& extensions =
- extension_service->toolbar_model()->action_box_menu_items();
- for (extensions::ExtensionList::const_iterator it = extensions.begin();
- it != extensions.end(); ++it) {
- menu_model->AddExtension(**it, GetCommandIdForExtension(**it));
+ extension_service()->extensions();
+ for (ExtensionSet::const_iterator it = extensions->begin();
+ it != extensions->end(); ++it) {
+ const extensions::Extension* extension = *it;
+ if (ActionInfo::GetPageLauncherInfo(extension)) {
+ int command_id = GetCommandIdForExtension(*extension);
+ menu_model->AddExtension(*extension, command_id);
+ }
}
+ content::RecordAction(UserMetricsAction("ActionBox.ClickButton"));
// And show the menu.
delegate_->ShowMenu(menu_model.Pass());
@@ -95,16 +84,21 @@ bool ActionBoxButtonController::GetAcceleratorForCommandId(
}
void ActionBoxButtonController::ExecuteCommand(int command_id) {
- // Handle commands associated with extensions.
- // Note that the extension might have been uninstalled or disabled while the
- // menu was open (sync perhaps?) but that will just fall through safely.
- const extensions::Extension* extension =
- GetExtensionForCommandId(command_id);
- if (extension) {
- // TODO(kalman): do something with the result.
- extensions::ExtensionSystem::Get(browser_->profile())->
- extension_service()->toolbar_model()->ExecuteBrowserAction(
- extension, browser_, NULL);
+ // If the command id belongs to an extension, dispatch an onClicked event
+ // to its pageLauncher.
+ ExtensionIdCommandMap::const_iterator it =
+ extension_command_ids_.find(command_id);
+ if (it != extension_command_ids_.end()) {
+ WebContents* web_contents =
+ browser_->tab_strip_model()->GetActiveWebContents();
+ // TODO(rfevang): Send page title and selected text.
+ extensions::PageLauncherAPI::DispatchOnClickedEvent(
+ browser_->profile(),
+ it->second,
+ web_contents->GetURL(),
+ web_contents->GetContentsMimeType(),
+ NULL,
+ NULL);
return;
}
@@ -114,34 +108,32 @@ void ActionBoxButtonController::ExecuteCommand(int command_id) {
int ActionBoxButtonController::GetCommandIdForExtension(
const extensions::Extension& extension) {
- ExtensionIdCommandMap::iterator it =
- extension_command_ids_.find(extension.id());
- if (it != extension_command_ids_.end())
- return it->second;
- int command_id = next_extension_command_id_++;
-
- // Note that we deliberately don't clean up extension IDs here when
- // extensions are unloaded, so that if they're reloaded they get assigned the
- // old command ID. This situation could arise if an extension is updated
- // while the menu is open. On the other hand, we leak some memory... but
- // that's unlikely to matter.
- extension_command_ids_[extension.id()] = command_id;
+ for (ExtensionIdCommandMap::const_iterator it =
+ extension_command_ids_.begin();
+ it != extension_command_ids_.end(); ++it) {
+ if (it->second == extension.id())
+ return it->first;
+ }
+
+ int command_id = GetNextCommandId();
+ extension_command_ids_[command_id] = extension.id();
return command_id;
}
-const extensions::Extension*
- ActionBoxButtonController::GetExtensionForCommandId(int command_id) {
- for (ExtensionIdCommandMap::iterator it = extension_command_ids_.begin();
- it != extension_command_ids_.end(); ++it) {
- if (it->second == command_id) {
- // Note: might be NULL anyway if the extension has been uninstalled.
- return extensions::ExtensionSystem::Get(browser_->profile())->
- extension_service()->extensions()->GetByID(it->first);
- }
- }
+int ActionBoxButtonController::GetNextCommandId() {
+ int command_id = next_command_id_;
+ // Find an available command id to return next time the function is called.
+ do {
+ next_command_id_++;
+ // Larger command ids are reserved for non-dynamic entries, so we start
+ // reusing old ids at this point.
+ if (next_command_id_ >= IDC_MinimumLabelValue)
+ next_command_id_ = 0;
+ } while (extension_command_ids_.find(next_command_id_) !=
+ extension_command_ids_.end());
- return NULL;
+ return command_id;
}
void ActionBoxButtonController::Observe(
@@ -152,7 +144,14 @@ void ActionBoxButtonController::Observe(
const extensions::Extension* extension =
content::Details<extensions::UnloadedExtensionInfo>(details)->extension;
+ // Remove any entry point command ids associated with the extension.
+ for (ExtensionIdCommandMap::iterator it = extension_command_ids_.begin();
+ it != extension_command_ids_.end();) {
+ if (it->second== extension->id())
+ extension_command_ids_.erase(it++);
+ else
+ ++it;
+ }
// TODO(kalman): if there's a menu open, remove it from that too.
// We may also want to listen to EXTENSION_LOADED to do the opposite.
- extension_command_ids_.erase(extension->id());
}
« no previous file with comments | « chrome/browser/ui/toolbar/action_box_button_controller.h ('k') | chrome/browser/ui/toolbar/action_box_menu_model.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698