| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_context_menu_model.h" | 5 #include "chrome/browser/extensions/extension_context_menu_model.h" |
| 6 | 6 |
| 7 #include "base/prefs/pref_service.h" | 7 #include "base/prefs/pref_service.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "chrome/app/chrome_command_ids.h" | 9 #include "chrome/app/chrome_command_ids.h" |
| 10 #include "chrome/browser/extensions/active_script_controller.h" | 10 #include "chrome/browser/extensions/active_script_controller.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 string_id = IDS_EXTENSIONS_KEEP_BUTTON_IN_TOOLBAR; | 100 string_id = IDS_EXTENSIONS_KEEP_BUTTON_IN_TOOLBAR; |
| 101 break; | 101 break; |
| 102 case (ExtensionContextMenuModel::OVERFLOWED): | 102 case (ExtensionContextMenuModel::OVERFLOWED): |
| 103 string_id = IDS_EXTENSIONS_SHOW_BUTTON_IN_TOOLBAR; | 103 string_id = IDS_EXTENSIONS_SHOW_BUTTON_IN_TOOLBAR; |
| 104 break; | 104 break; |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 return string_id; | 107 return string_id; |
| 108 } | 108 } |
| 109 | 109 |
| 110 // Returns true if the given |extension| is required to remain installed by |
| 111 // policy. |
| 112 bool IsExtensionRequiredByPolicy(const Extension* extension, |
| 113 Profile* profile) { |
| 114 extensions::ManagementPolicy* policy = |
| 115 extensions::ExtensionSystem::Get(profile)->management_policy(); |
| 116 return !policy->UserMayModifySettings(extension, nullptr) || |
| 117 policy->MustRemainInstalled(extension, nullptr); |
| 118 } |
| 119 |
| 110 } // namespace | 120 } // namespace |
| 111 | 121 |
| 112 ExtensionContextMenuModel::ExtensionContextMenuModel( | 122 ExtensionContextMenuModel::ExtensionContextMenuModel( |
| 113 const Extension* extension, | 123 const Extension* extension, |
| 114 Browser* browser, | 124 Browser* browser, |
| 115 ButtonVisibility button_visibility, | 125 ButtonVisibility button_visibility, |
| 116 PopupDelegate* delegate) | 126 PopupDelegate* delegate) |
| 117 : SimpleMenuModel(this), | 127 : SimpleMenuModel(this), |
| 118 extension_id_(extension->id()), | 128 extension_id_(extension->id()), |
| 119 is_component_(extensions::Manifest::IsComponentLocation( | 129 is_component_(extensions::Manifest::IsComponentLocation( |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 return extensions::ManifestURL::GetHomepageURL(extension).is_valid() && | 173 return extensions::ManifestURL::GetHomepageURL(extension).is_valid() && |
| 164 !is_component_; | 174 !is_component_; |
| 165 } else if (command_id == INSPECT_POPUP) { | 175 } else if (command_id == INSPECT_POPUP) { |
| 166 WebContents* web_contents = GetActiveWebContents(); | 176 WebContents* web_contents = GetActiveWebContents(); |
| 167 if (!web_contents) | 177 if (!web_contents) |
| 168 return false; | 178 return false; |
| 169 | 179 |
| 170 return extension_action_ && | 180 return extension_action_ && |
| 171 extension_action_->HasPopup(SessionTabHelper::IdForTab(web_contents)); | 181 extension_action_->HasPopup(SessionTabHelper::IdForTab(web_contents)); |
| 172 } else if (command_id == UNINSTALL) { | 182 } else if (command_id == UNINSTALL) { |
| 173 // Some extension types can not be uninstalled. | 183 return !IsExtensionRequiredByPolicy(extension, profile_); |
| 174 extensions::ManagementPolicy* policy = | |
| 175 extensions::ExtensionSystem::Get(profile_)->management_policy(); | |
| 176 return policy->UserMayModifySettings(extension, nullptr) && | |
| 177 !policy->MustRemainInstalled(extension, nullptr); | |
| 178 } | 184 } |
| 179 return true; | 185 return true; |
| 180 } | 186 } |
| 181 | 187 |
| 182 bool ExtensionContextMenuModel::GetAcceleratorForCommandId( | 188 bool ExtensionContextMenuModel::GetAcceleratorForCommandId( |
| 183 int command_id, ui::Accelerator* accelerator) { | 189 int command_id, ui::Accelerator* accelerator) { |
| 184 return false; | 190 return false; |
| 185 } | 191 } |
| 186 | 192 |
| 187 void ExtensionContextMenuModel::ExecuteCommand(int command_id, | 193 void ExtensionContextMenuModel::ExecuteCommand(int command_id, |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 WebContents* web_contents = GetActiveWebContents(); | 305 WebContents* web_contents = GetActiveWebContents(); |
| 300 if (web_contents && | 306 if (web_contents && |
| 301 extensions::ActiveScriptController::GetForWebContents(web_contents) | 307 extensions::ActiveScriptController::GetForWebContents(web_contents) |
| 302 ->WantsToRun(extension)) { | 308 ->WantsToRun(extension)) { |
| 303 AddItemWithStringId(ALWAYS_RUN, IDS_EXTENSIONS_ALWAYS_RUN); | 309 AddItemWithStringId(ALWAYS_RUN, IDS_EXTENSIONS_ALWAYS_RUN); |
| 304 } | 310 } |
| 305 | 311 |
| 306 if (!is_component_ || extensions::OptionsPageInfo::HasOptionsPage(extension)) | 312 if (!is_component_ || extensions::OptionsPageInfo::HasOptionsPage(extension)) |
| 307 AddItemWithStringId(CONFIGURE, IDS_EXTENSIONS_OPTIONS_MENU_ITEM); | 313 AddItemWithStringId(CONFIGURE, IDS_EXTENSIONS_OPTIONS_MENU_ITEM); |
| 308 | 314 |
| 309 if (!is_component_) | 315 if (!is_component_) { |
| 310 AddItem(UNINSTALL, l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL)); | 316 bool is_required_by_policy = |
| 317 IsExtensionRequiredByPolicy(extension, profile_); |
| 318 int message_id = is_required_by_policy ? |
| 319 IDS_EXTENSIONS_INSTALLED_BY_ADMIN : IDS_EXTENSIONS_UNINSTALL; |
| 320 AddItem(UNINSTALL, l10n_util::GetStringUTF16(message_id)); |
| 321 if (is_required_by_policy) { |
| 322 int uninstall_index = GetIndexOfCommandId(UNINSTALL); |
| 323 SetIcon(uninstall_index, |
| 324 ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| 325 IDR_CONTROLLED_SETTING_MANDATORY)); |
| 326 } |
| 327 } |
| 311 | 328 |
| 312 // Add a toggle visibility (show/hide) if the extension icon is shown on the | 329 // Add a toggle visibility (show/hide) if the extension icon is shown on the |
| 313 // toolbar. | 330 // toolbar. |
| 314 int visibility_string_id = | 331 int visibility_string_id = |
| 315 GetVisibilityStringId(profile_, extension, button_visibility); | 332 GetVisibilityStringId(profile_, extension, button_visibility); |
| 316 if (visibility_string_id != -1) | 333 if (visibility_string_id != -1) |
| 317 AddItemWithStringId(TOGGLE_VISIBILITY, visibility_string_id); | 334 AddItemWithStringId(TOGGLE_VISIBILITY, visibility_string_id); |
| 318 | 335 |
| 319 if (!is_component_) { | 336 if (!is_component_) { |
| 320 AddSeparator(ui::NORMAL_SEPARATOR); | 337 AddSeparator(ui::NORMAL_SEPARATOR); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 341 extension_items_count_ = 0; | 358 extension_items_count_ = 0; |
| 342 extension_items_->AppendExtensionItems(MenuItem::ExtensionKey(extension_id_), | 359 extension_items_->AppendExtensionItems(MenuItem::ExtensionKey(extension_id_), |
| 343 base::string16(), | 360 base::string16(), |
| 344 &extension_items_count_, | 361 &extension_items_count_, |
| 345 true); // is_action_menu | 362 true); // is_action_menu |
| 346 } | 363 } |
| 347 | 364 |
| 348 content::WebContents* ExtensionContextMenuModel::GetActiveWebContents() const { | 365 content::WebContents* ExtensionContextMenuModel::GetActiveWebContents() const { |
| 349 return browser_->tab_strip_model()->GetActiveWebContents(); | 366 return browser_->tab_strip_model()->GetActiveWebContents(); |
| 350 } | 367 } |
| OLD | NEW |