1// Copyright (c) 2011 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#pragma once
8
9#include <string>
10
11#include "chrome/browser/extensions/extension_uninstall_dialog.h"
12#include "ui/base/models/simple_menu_model.h"
13
14class Browser;
15class Extension;
16class ExtensionAction;
17class Profile;
18
19// The menu model for the context menu for extension action icons (browser and
20// page actions).
21class ExtensionContextMenuModel
22    : public base::RefCounted<ExtensionContextMenuModel>,
23      public ui::SimpleMenuModel,
24      public ui::SimpleMenuModel::Delegate,
25      public ExtensionUninstallDialog::Delegate {
26 public:
27  // Delegate to handle showing an ExtensionAction popup.
28  class PopupDelegate {
29   public:
30    // Called when the user selects the menu item which requests that the
31    // popup be shown and inspected.
32    virtual void InspectPopup(ExtensionAction* action) = 0;
33
34   protected:
35    virtual ~PopupDelegate() {}
36  };
37
38  // Creates a menu model for the given extension action. If
39  // prefs::kExtensionsUIDeveloperMode is enabled then a menu item
40  // will be shown for "Inspect Popup" which, when selected, will cause
41  // ShowPopupForDevToolsWindow() to be called on |delegate|.
42  ExtensionContextMenuModel(const Extension* extension,
43                            Browser* browser,
44                            PopupDelegate* delegate);
45  virtual ~ExtensionContextMenuModel();
46
47  // SimpleMenuModel::Delegate overrides.
48  virtual bool IsCommandIdChecked(int command_id) const;
49  virtual bool IsCommandIdEnabled(int command_id) const;
50  virtual bool GetAcceleratorForCommandId(int command_id,
51                                          ui::Accelerator* accelerator);
52  virtual void ExecuteCommand(int command_id);
53
54  // ExtensionUninstallDialog::Delegate:
55  virtual void ExtensionDialogAccepted();
56  virtual void ExtensionDialogCanceled();
57
58 private:
59  void InitCommonCommands();
60
61  // Gets the extension we are displaying the menu for. Returns NULL if the
62  // extension has been uninstalled and no longer exists.
63  const Extension* GetExtension() const;
64
65  // A copy of the extension's id.
66  std::string extension_id_;
67
68  // The extension action we are displaying the menu for (or NULL).
69  ExtensionAction* extension_action_;
70
71  Browser* browser_;
72
73  Profile* profile_;
74
75  // The delegate which handles the 'inspect popup' menu command (or NULL).
76  PopupDelegate* delegate_;
77
78  // Keeps track of the extension uninstall dialog.
79  scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_;
80
81  DISALLOW_COPY_AND_ASSIGN(ExtensionContextMenuModel);
82};
83
84#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_CONTEXT_MENU_MODEL_H_
85