| Index: chrome/browser/extensions/extension_context_menu_model.cc
 | 
| diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc
 | 
| index 8ddb94b94651320226fd31e3659051ebb1c00d82..58116dd40af3f3d852ae329bc39ae1c99fd615cf 100644
 | 
| --- a/chrome/browser/extensions/extension_context_menu_model.cc
 | 
| +++ b/chrome/browser/extensions/extension_context_menu_model.cc
 | 
| @@ -6,11 +6,14 @@
 | 
|  
 | 
|  #include "base/prefs/pref_service.h"
 | 
|  #include "base/strings/utf_string_conversions.h"
 | 
| +#include "chrome/app/chrome_command_ids.h"
 | 
|  #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
 | 
| +#include "chrome/browser/extensions/context_menu_matcher.h"
 | 
|  #include "chrome/browser/extensions/extension_action.h"
 | 
|  #include "chrome/browser/extensions/extension_action_manager.h"
 | 
|  #include "chrome/browser/extensions/extension_service.h"
 | 
|  #include "chrome/browser/extensions/extension_tab_util.h"
 | 
| +#include "chrome/browser/extensions/menu_manager.h"
 | 
|  #include "chrome/browser/profiles/profile.h"
 | 
|  #include "chrome/browser/ui/browser.h"
 | 
|  #include "chrome/browser/ui/browser_window.h"
 | 
| @@ -21,7 +24,9 @@
 | 
|  #include "chrome/common/pref_names.h"
 | 
|  #include "chrome/common/url_constants.h"
 | 
|  #include "content/public/browser/web_contents.h"
 | 
| +#include "content/public/common/context_menu_params.h"
 | 
|  #include "extensions/browser/extension_prefs.h"
 | 
| +#include "extensions/browser/extension_registry.h"
 | 
|  #include "extensions/browser/extension_system.h"
 | 
|  #include "extensions/browser/management_policy.h"
 | 
|  #include "extensions/browser/uninstall_reason.h"
 | 
| @@ -34,6 +39,32 @@ using content::OpenURLParams;
 | 
|  using content::Referrer;
 | 
|  using content::WebContents;
 | 
|  using extensions::Extension;
 | 
| +using extensions::MenuItem;
 | 
| +using extensions::MenuManager;
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +// Returns true if the given |item| is of the given |type|.
 | 
| +bool MenuItemMatchesAction(ExtensionContextMenuModel::ActionType type,
 | 
| +                           const MenuItem* item) {
 | 
| +  if (type == ExtensionContextMenuModel::NO_ACTION)
 | 
| +    return false;
 | 
| +
 | 
| +  const MenuItem::ContextList& contexts = item->contexts();
 | 
| +
 | 
| +  if (contexts.Contains(MenuItem::ALL))
 | 
| +    return true;
 | 
| +  if (contexts.Contains(MenuItem::PAGE_ACTION) &&
 | 
| +      (type == ExtensionContextMenuModel::PAGE_ACTION))
 | 
| +    return true;
 | 
| +  if (contexts.Contains(MenuItem::BROWSER_ACTION) &&
 | 
| +      (type == ExtensionContextMenuModel::BROWSER_ACTION))
 | 
| +    return true;
 | 
| +
 | 
| +  return false;
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
|  
 | 
|  ExtensionContextMenuModel::ExtensionContextMenuModel(const Extension* extension,
 | 
|                                                       Browser* browser,
 | 
| @@ -42,7 +73,9 @@ ExtensionContextMenuModel::ExtensionContextMenuModel(const Extension* extension,
 | 
|        extension_id_(extension->id()),
 | 
|        browser_(browser),
 | 
|        profile_(browser->profile()),
 | 
| -      delegate_(delegate) {
 | 
| +      delegate_(delegate),
 | 
| +      action_type_(NO_ACTION),
 | 
| +      extension_items_count_(0) {
 | 
|    InitMenu(extension);
 | 
|  
 | 
|    if (profile_->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode) &&
 | 
| @@ -58,20 +91,28 @@ ExtensionContextMenuModel::ExtensionContextMenuModel(const Extension* extension,
 | 
|        extension_id_(extension->id()),
 | 
|        browser_(browser),
 | 
|        profile_(browser->profile()),
 | 
| -      delegate_(NULL) {
 | 
| +      delegate_(NULL),
 | 
| +      action_type_(NO_ACTION),
 | 
| +      extension_items_count_(0) {
 | 
|    InitMenu(extension);
 | 
|  }
 | 
|  
 | 
|  bool ExtensionContextMenuModel::IsCommandIdChecked(int command_id) const {
 | 
| +  if (command_id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST &&
 | 
| +      command_id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST)
 | 
| +    return extension_items_->IsCommandIdChecked(command_id);
 | 
|    return false;
 | 
|  }
 | 
|  
 | 
|  bool ExtensionContextMenuModel::IsCommandIdEnabled(int command_id) const {
 | 
| -  const Extension* extension = this->GetExtension();
 | 
| +  const Extension* extension = GetExtension();
 | 
|    if (!extension)
 | 
|      return false;
 | 
|  
 | 
| -  if (command_id == CONFIGURE) {
 | 
| +  if (command_id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST &&
 | 
| +      command_id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) {
 | 
| +    return extension_items_->IsCommandIdEnabled(command_id);
 | 
| +  } else if (command_id == CONFIGURE) {
 | 
|      return
 | 
|          extensions::ManifestURL::GetOptionsPage(extension).spec().length() > 0;
 | 
|    } else if (command_id == NAME) {
 | 
| @@ -105,6 +146,16 @@ void ExtensionContextMenuModel::ExecuteCommand(int command_id,
 | 
|    if (!extension)
 | 
|      return;
 | 
|  
 | 
| +  if (command_id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST &&
 | 
| +      command_id <= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) {
 | 
| +    WebContents* web_contents =
 | 
| +        browser_->tab_strip_model()->GetActiveWebContents();
 | 
| +    DCHECK(extension_items_);
 | 
| +    extension_items_->ExecuteCommand(
 | 
| +        command_id, web_contents, content::ContextMenuParams());
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
|    switch (command_id) {
 | 
|      case NAME: {
 | 
|        OpenURLParams params(extensions::ManifestURL::GetHomepageURL(extension),
 | 
| @@ -166,14 +217,26 @@ void ExtensionContextMenuModel::InitMenu(const Extension* extension) {
 | 
|    extensions::ExtensionActionManager* extension_action_manager =
 | 
|        extensions::ExtensionActionManager::Get(profile_);
 | 
|    extension_action_ = extension_action_manager->GetBrowserAction(*extension);
 | 
| -  if (!extension_action_)
 | 
| +  if (!extension_action_) {
 | 
|      extension_action_ = extension_action_manager->GetPageAction(*extension);
 | 
| +    if (extension_action_)
 | 
| +      action_type_ = PAGE_ACTION;
 | 
| +  } else {
 | 
| +    action_type_ = BROWSER_ACTION;
 | 
| +  }
 | 
| +
 | 
| +  extension_items_.reset(new extensions::ContextMenuMatcher(
 | 
| +      profile_,
 | 
| +      this,
 | 
| +      this,
 | 
| +      base::Bind(MenuItemMatchesAction, action_type_)));
 | 
|  
 | 
|    std::string extension_name = extension->name();
 | 
|    // Ampersands need to be escaped to avoid being treated like
 | 
|    // mnemonics in the menu.
 | 
|    base::ReplaceChars(extension_name, "&", "&&", &extension_name);
 | 
|    AddItem(NAME, base::UTF8ToUTF16(extension_name));
 | 
| +  AppendExtensionItems();
 | 
|    AddSeparator(ui::NORMAL_SEPARATOR);
 | 
|    AddItemWithStringId(CONFIGURE, IDS_EXTENSIONS_OPTIONS_MENU_ITEM);
 | 
|    AddItem(UNINSTALL, l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL));
 | 
| @@ -184,7 +247,24 @@ void ExtensionContextMenuModel::InitMenu(const Extension* extension) {
 | 
|  }
 | 
|  
 | 
|  const Extension* ExtensionContextMenuModel::GetExtension() const {
 | 
| -  ExtensionService* extension_service =
 | 
| -      extensions::ExtensionSystem::Get(profile_)->extension_service();
 | 
| -  return extension_service->GetExtensionById(extension_id_, false);
 | 
| +  return extensions::ExtensionRegistry::Get(profile_)
 | 
| +      ->enabled_extensions()
 | 
| +      .GetByID(extension_id_);
 | 
| +}
 | 
| +
 | 
| +void ExtensionContextMenuModel::AppendExtensionItems() {
 | 
| +  extension_items_->Clear();
 | 
| +
 | 
| +  MenuManager* menu_manager = MenuManager::Get(profile_);
 | 
| +  if (!menu_manager ||
 | 
| +      !menu_manager->MenuItems(MenuItem::ExtensionKey(extension_id_)))
 | 
| +    return;
 | 
| +
 | 
| +  AddSeparator(ui::NORMAL_SEPARATOR);
 | 
| +
 | 
| +  extension_items_count_ = 0;
 | 
| +  extension_items_->AppendExtensionItems(MenuItem::ExtensionKey(extension_id_),
 | 
| +                                         base::string16(),
 | 
| +                                         &extension_items_count_,
 | 
| +                                         true);  // is_action_menu
 | 
|  }
 | 
| 
 |