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 content {
19class WebContents;
20}
21
22namespace extensions {
23class Extension;
24class ContextMenuMatcher;
25class ExtensionContextMenuModelTest;
26}
27
28// The context menu model for extension icons.
29class ExtensionContextMenuModel
30    : public base::RefCounted<ExtensionContextMenuModel>,
31      public ui::SimpleMenuModel,
32      public ui::SimpleMenuModel::Delegate,
33      public extensions::ExtensionUninstallDialog::Delegate {
34 public:
35  enum MenuEntries {
36    NAME = 0,
37    CONFIGURE,
38    TOGGLE_VISIBILITY,
39    UNINSTALL,
40    MANAGE,
41    INSPECT_POPUP,
42    ALWAYS_RUN
43  };
44
45  // Type of action the extension icon represents.
46  enum ActionType { NO_ACTION = 0, BROWSER_ACTION, PAGE_ACTION };
47
48  // Delegate to handle showing an ExtensionAction popup.
49  class PopupDelegate {
50   public:
51    // Called when the user selects the menu item which requests that the
52    // popup be shown and inspected.
53    // The delegate should know which popup to display.
54    virtual void InspectPopup() = 0;
55
56   protected:
57    virtual ~PopupDelegate() {}
58  };
59
60  // Creates a menu model for the given extension. If
61  // prefs::kExtensionsUIDeveloperMode is enabled then a menu item
62  // will be shown for "Inspect Popup" which, when selected, will cause
63  // ShowPopupForDevToolsWindow() to be called on |delegate|.
64  ExtensionContextMenuModel(const extensions::Extension* extension,
65                            Browser* browser,
66                            PopupDelegate* delegate);
67
68  // Create a menu model for the given extension, without support
69  // for the "Inspect Popup" command.
70  ExtensionContextMenuModel(const extensions::Extension* extension,
71                            Browser* browser);
72
73  // SimpleMenuModel::Delegate overrides.
74  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
75  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
76  virtual bool GetAcceleratorForCommandId(
77      int command_id,
78      ui::Accelerator* accelerator) OVERRIDE;
79  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
80
81  // ExtensionUninstallDialog::Delegate:
82  virtual void ExtensionUninstallAccepted() OVERRIDE;
83  virtual void ExtensionUninstallCanceled() OVERRIDE;
84
85 private:
86  friend class base::RefCounted<ExtensionContextMenuModel>;
87  friend class extensions::ExtensionContextMenuModelTest;
88
89  virtual ~ExtensionContextMenuModel();
90
91  void InitMenu(const extensions::Extension* extension);
92
93  // Gets the extension we are displaying the menu for. Returns NULL if the
94  // extension has been uninstalled and no longer exists.
95  const extensions::Extension* GetExtension() const;
96
97  // Returns the active web contents.
98  content::WebContents* GetActiveWebContents() const;
99
100  // Appends the extension's context menu items.
101  void AppendExtensionItems();
102
103  // A copy of the extension's id.
104  std::string extension_id_;
105
106  // The extension action of the extension we are displaying the menu for (if
107  // it has one, otherwise NULL).
108  ExtensionAction* extension_action_;
109
110  Browser* browser_;
111
112  Profile* profile_;
113
114  // The delegate which handles the 'inspect popup' menu command (or NULL).
115  PopupDelegate* delegate_;
116
117  // The type of extension action to which this context menu is attached.
118  ActionType action_type_;
119
120  // Keeps track of the extension uninstall dialog.
121  scoped_ptr<extensions::ExtensionUninstallDialog> extension_uninstall_dialog_;
122
123  // Menu matcher for context menu items specified by the extension.
124  scoped_ptr<extensions::ContextMenuMatcher> extension_items_;
125
126  // Number of extension items in this menu. Used for testing.
127  int extension_items_count_;
128
129  DISALLOW_COPY_AND_ASSIGN(ExtensionContextMenuModel);
130};
131
132#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTEXT_MENU_MODEL_H_
133