extension_context_menu_model.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTEXT_MENU_MODEL_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTEXT_MENU_MODEL_H_
7
8#include <string>
9
10#include "base/memory/scoped_ptr.h"
11#include "chrome/browser/extensions/extension_uninstall_dialog.h"
12#include "ui/base/models/simple_menu_model.h"
13
14class Browser;
15class ExtensionAction;
16class Profile;
17
18namespace extensions {
19class Extension;
20}
21
22// The context menu model for extension icons.
23class ExtensionContextMenuModel
24    : public base::RefCounted<ExtensionContextMenuModel>,
25      public ui::SimpleMenuModel,
26      public ui::SimpleMenuModel::Delegate,
27      public extensions::ExtensionUninstallDialog::Delegate {
28 public:
29  enum MenuEntries {
30    NAME = 0,
31    CONFIGURE,
32    HIDE,
33    UNINSTALL,
34    MANAGE,
35    INSPECT_POPUP
36  };
37
38  // Delegate to handle showing an ExtensionAction popup.
39  class PopupDelegate {
40   public:
41    // Called when the user selects the menu item which requests that the
42    // popup be shown and inspected.
43    virtual void InspectPopup(ExtensionAction* action) = 0;
44
45   protected:
46    virtual ~PopupDelegate() {}
47  };
48
49  // Creates a menu model for the given extension. If
50  // prefs::kExtensionsUIDeveloperMode is enabled then a menu item
51  // will be shown for "Inspect Popup" which, when selected, will cause
52  // ShowPopupForDevToolsWindow() to be called on |delegate|.
53  ExtensionContextMenuModel(const extensions::Extension* extension,
54                            Browser* browser,
55                            PopupDelegate* delegate);
56
57  // Create a menu model for the given extension, without support
58  // for the "Inspect Popup" command.
59  ExtensionContextMenuModel(const extensions::Extension* extension,
60                            Browser* browser);
61
62  // SimpleMenuModel::Delegate overrides.
63  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
64  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
65  virtual bool GetAcceleratorForCommandId(
66      int command_id,
67      ui::Accelerator* accelerator) OVERRIDE;
68  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
69
70  // ExtensionUninstallDialog::Delegate:
71  virtual void ExtensionUninstallAccepted() OVERRIDE;
72  virtual void ExtensionUninstallCanceled() OVERRIDE;
73
74 private:
75  friend class base::RefCounted<ExtensionContextMenuModel>;
76  virtual ~ExtensionContextMenuModel();
77
78  void InitMenu(const extensions::Extension* extension);
79
80  // Gets the extension we are displaying the menu for. Returns NULL if the
81  // extension has been uninstalled and no longer exists.
82  const extensions::Extension* GetExtension() const;
83
84  // A copy of the extension's id.
85  std::string extension_id_;
86
87  // The extension action of the extension we are displaying the menu for (if
88  // it has one, otherwise NULL).
89  ExtensionAction* extension_action_;
90
91  Browser* browser_;
92
93  Profile* profile_;
94
95  // The delegate which handles the 'inspect popup' menu command (or NULL).
96  PopupDelegate* delegate_;
97
98  // Keeps track of the extension uninstall dialog.
99  scoped_ptr<extensions::ExtensionUninstallDialog> extension_uninstall_dialog_;
100
101  DISALLOW_COPY_AND_ASSIGN(ExtensionContextMenuModel);
102};
103
104#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTEXT_MENU_MODEL_H_
105