Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / extensions / extension_action_context_menu_controller.mm
1 // Copyright 2013 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 #import "chrome/browser/ui/cocoa/extensions/extension_action_context_menu_controller.h"
6
7 #include "base/strings/sys_string_conversions.h"
8 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
9 #include "chrome/browser/extensions/extension_action_manager.h"
10 #include "chrome/browser/extensions/extension_service.h"
11 #include "chrome/browser/extensions/extension_tab_util.h"
12 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/chrome_pages.h"
16 #include "chrome/browser/ui/cocoa/browser_window_cocoa.h"
17 #include "chrome/browser/ui/cocoa/browser_window_controller.h"
18 #include "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
19 #include "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h"
20 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
21 #include "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
22 #include "chrome/common/extensions/extension_constants.h"
23 #include "chrome/common/extensions/manifest_url_handler.h"
24 #include "chrome/common/pref_names.h"
25 #include "chrome/common/url_constants.h"
26 #include "content/public/browser/web_contents.h"
27 #include "extensions/browser/extension_system.h"
28 #include "extensions/common/extension.h"
29 #include "grit/chromium_strings.h"
30 #include "grit/generated_resources.h"
31 #include "ui/base/l10n/l10n_util_mac.h"
32
33 using content::OpenURLParams;
34 using content::Referrer;
35 using content::WebContents;
36 using extensions::Extension;
37
38 // A class that shows a confirmation dialog to uninstall the given extension.
39 // Also acts as the extension's UI delegate in order to display the dialog.
40 class AsyncUninstaller : public ExtensionUninstallDialog::Delegate {
41  public:
42   AsyncUninstaller(const Extension* extension, Browser* browser)
43       : extension_(extension),
44         profile_(browser->profile()) {
45     extension_uninstall_dialog_.reset(
46         ExtensionUninstallDialog::Create(profile_, browser, this));
47     extension_uninstall_dialog_->ConfirmUninstall(extension_);
48   }
49
50   virtual ~AsyncUninstaller() {}
51
52   // ExtensionUninstallDialog::Delegate:
53   virtual void ExtensionUninstallAccepted() OVERRIDE {
54     extensions::ExtensionSystem::Get(profile_)->extension_service()->
55         UninstallExtension(extension_->id(), false, NULL);
56   }
57   virtual void ExtensionUninstallCanceled() OVERRIDE {}
58
59  private:
60   // The extension that's being uninstalled.
61   const Extension* extension_;
62
63   // The current profile. Weak.
64   Profile* profile_;
65
66   scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_;
67
68   DISALLOW_COPY_AND_ASSIGN(AsyncUninstaller);
69 };
70
71 @interface ExtensionActionContextMenuController ()
72 - (void)onExtensionName:(id)sender;
73 - (void)onOptions:(id)sender;
74 - (void)onUninstall:(id)sender;
75 - (void)onHide:(id)sender;
76 - (void)onManage:(id)sender;
77 - (void)onInspect:(id)sender;
78 @end
79
80 @implementation ExtensionActionContextMenuController
81
82 - (id)initWithExtension:(const Extension*)extension
83                 browser:(Browser*)browser
84         extensionAction:(ExtensionAction*)action{
85   if ((self = [super init])) {
86     action_ = action;
87     extension_ = extension;
88     browser_ = browser;
89   }
90   return self;
91 }
92
93 - (void)populateMenu:(NSMenu*)menu {
94   [menu setAutoenablesItems:NO];
95
96   // Extension name.
97   NSMenuItem* item =
98       [menu addItemWithTitle:base::SysUTF8ToNSString(extension_->name())
99                       action:@selector(onExtensionName:)
100                keyEquivalent:@""];
101   [item setTarget:self];
102   [item setEnabled:extensions::ManifestURL::GetHomepageURL(
103       extension_).is_valid()];
104
105   // Separator.
106   [menu addItem:[NSMenuItem separatorItem]];
107
108   // Options.
109   item = [menu addItemWithTitle:
110               l10n_util::GetNSStringWithFixup(IDS_EXTENSIONS_OPTIONS_MENU_ITEM)
111                          action:@selector(onOptions:)
112                   keyEquivalent:@""];
113   [item setTarget:self];
114   [item setEnabled:extensions::ManifestURL::GetOptionsPage(
115       extension_).spec().length() > 0];
116
117
118   // Uninstall.
119   item = [menu addItemWithTitle:
120               l10n_util::GetNSStringWithFixup(IDS_EXTENSIONS_UNINSTALL)
121                          action:@selector(onUninstall:)
122                   keyEquivalent:@""];
123   [item setTarget:self];
124
125   // Hide. Only used for browser actions.
126   if (extensions::ExtensionActionManager::Get(
127           browser_->profile())->GetBrowserAction(*extension_)) {
128     item = [menu addItemWithTitle:
129                 l10n_util::GetNSStringWithFixup(IDS_EXTENSIONS_HIDE_BUTTON)
130                            action:@selector(onHide:)
131                     keyEquivalent:@""];
132     [item setTarget:self];
133   }
134
135   // Separator.
136   [menu addItem:[NSMenuItem separatorItem]];
137
138   // Manage.
139   item = [menu addItemWithTitle:
140               l10n_util::GetNSStringWithFixup(IDS_MANAGE_EXTENSION)
141                          action:@selector(onManage:)
142                   keyEquivalent:@""];
143   [item setTarget:self];
144
145   // Inspect.
146   PrefService* service = browser_->profile()->GetPrefs();
147   bool devMode = service->GetBoolean(prefs::kExtensionsUIDeveloperMode);
148   if (devMode) {
149     item = [menu addItemWithTitle:l10n_util::GetNSStringWithFixup(
150                 IDS_EXTENSION_ACTION_INSPECT_POPUP)
151                            action:@selector(onInspect:)
152                     keyEquivalent:@""];
153     [item setTarget:self];
154   }
155 }
156
157 - (void)onExtensionName:(id)sender {
158   GURL url(std::string(extension_urls::kGalleryBrowsePrefix) +
159            std::string("/detail/") + extension_->id());
160   OpenURLParams params(url,
161                        Referrer(),
162                        NEW_FOREGROUND_TAB,
163                        content::PAGE_TRANSITION_LINK,
164                        false);
165   browser_->OpenURL(params);
166 }
167
168 - (void)onOptions:(id)sender {
169   DCHECK(!extensions::ManifestURL::GetOptionsPage(extension_).is_empty());
170   extensions::ExtensionTabUtil::OpenOptionsPage(extension_, browser_);
171 }
172
173 - (void)onUninstall:(id)sender {
174   uninstaller_.reset(new AsyncUninstaller(extension_, browser_));
175 }
176
177 - (void)onHide:(id)sender {
178   extensions::ExtensionActionAPI::SetBrowserActionVisibility(
179       extensions::ExtensionSystem::Get(
180           browser_->profile())->extension_service()->extension_prefs(),
181       extension_->id(),
182       false);
183 }
184
185 - (void)onManage:(id)sender {
186   chrome::ShowExtensions(browser_, extension_->id());
187 }
188
189 - (void)onInspect:(id)sender {
190   BrowserWindowCocoa* window =
191       static_cast<BrowserWindowCocoa*>(browser_->window());
192   ToolbarController* toolbarController =
193       [window->cocoa_controller() toolbarController];
194   LocationBarViewMac* locationBarView = [toolbarController locationBarBridge];
195
196   extensions::ExtensionActionManager* actionManager =
197       extensions::ExtensionActionManager::Get(browser_->profile());
198   NSPoint popupPoint = NSZeroPoint;
199   if (actionManager->GetPageAction(*extension_) == action_) {
200     popupPoint = locationBarView->GetPageActionBubblePoint(action_);
201   } else if (actionManager->GetBrowserAction(*extension_) == action_) {
202     BrowserActionsController* controller =
203         [toolbarController browserActionsController];
204     popupPoint = [controller popupPointForBrowserAction:extension_];
205   } else {
206     NOTREACHED() << "action_ is not a page action or browser action?";
207   }
208
209   content::WebContents* activeTab =
210       browser_->tab_strip_model()->GetActiveWebContents();
211   if (!activeTab)
212     return;
213
214   int tabId = extensions::ExtensionTabUtil::GetTabId(activeTab);
215
216   GURL url = action_->GetPopupUrl(tabId);
217   if (!url.is_valid())
218     return;
219
220   [ExtensionPopupController showURL:url
221                           inBrowser:browser_
222                          anchoredAt:popupPoint
223                       arrowLocation:info_bubble::kTopRight
224                             devMode:YES];
225 }
226
227 @end