• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 class Browser;
15 class ExtensionAction;
16 class Profile;
17 
18 namespace extensions {
19 class Extension;
20 }
21 
22 // The context menu model for extension icons.
23 class 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:
~PopupDelegate()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