1 // Copyright (c) 2014 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 #include "chrome/browser/extensions/ntp_overridden_bubble_controller.h" 6 7 #include "base/metrics/histogram.h" 8 #include "chrome/browser/extensions/extension_service.h" 9 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/common/url_constants.h" 11 #include "extensions/browser/extension_prefs.h" 12 #include "extensions/browser/extension_registry.h" 13 #include "extensions/browser/extension_system.h" 14 #include "grit/generated_resources.h" 15 #include "ui/base/l10n/l10n_util.h" 16 17 using extensions::ExtensionMessageBubbleController; 18 using extensions::NtpOverriddenBubbleController; 19 20 namespace { 21 22 //////////////////////////////////////////////////////////////////////////////// 23 // NtpOverriddenBubbleDelegate 24 25 class NtpOverriddenBubbleDelegate 26 : public extensions::ExtensionMessageBubbleController::Delegate { 27 public: 28 NtpOverriddenBubbleDelegate(ExtensionService* service, Profile* profile); 29 virtual ~NtpOverriddenBubbleDelegate(); 30 31 // ExtensionMessageBubbleController::Delegate methods. 32 virtual bool ShouldIncludeExtension(const std::string& extension_id) OVERRIDE; 33 virtual void AcknowledgeExtension( 34 const std::string& extension_id, 35 extensions::ExtensionMessageBubbleController::BubbleAction 36 user_action) OVERRIDE; 37 virtual void PerformAction(const extensions::ExtensionIdList& list) OVERRIDE; 38 virtual base::string16 GetTitle() const OVERRIDE; 39 virtual base::string16 GetMessageBody( 40 bool anchored_to_browser_action) const OVERRIDE; 41 virtual base::string16 GetOverflowText( 42 const base::string16& overflow_count) const OVERRIDE; 43 virtual base::string16 GetLearnMoreLabel() const OVERRIDE; 44 virtual GURL GetLearnMoreUrl() const OVERRIDE; 45 virtual base::string16 GetActionButtonLabel() const OVERRIDE; 46 virtual base::string16 GetDismissButtonLabel() const OVERRIDE; 47 virtual bool ShouldShowExtensionList() const OVERRIDE; 48 virtual void RestrictToSingleExtension( 49 const std::string& extension_id) OVERRIDE; 50 virtual void LogExtensionCount(size_t count) OVERRIDE; 51 virtual void LogAction( 52 extensions::ExtensionMessageBubbleController::BubbleAction 53 action) OVERRIDE; 54 55 private: 56 // Our extension service. Weak, not owned by us. 57 ExtensionService* service_; 58 59 // A weak pointer to the profile we are associated with. Not owned by us. 60 Profile* profile_; 61 62 // The ID of the extension we are showing the bubble for. 63 std::string extension_id_; 64 65 DISALLOW_COPY_AND_ASSIGN(NtpOverriddenBubbleDelegate); 66 }; 67 68 NtpOverriddenBubbleDelegate::NtpOverriddenBubbleDelegate( 69 ExtensionService* service, 70 Profile* profile) 71 : service_(service), profile_(profile) {} 72 73 NtpOverriddenBubbleDelegate::~NtpOverriddenBubbleDelegate() {} 74 75 bool NtpOverriddenBubbleDelegate::ShouldIncludeExtension( 76 const std::string& extension_id) { 77 if (!extension_id_.empty() && extension_id_ != extension_id) 78 return false; 79 80 using extensions::ExtensionRegistry; 81 ExtensionRegistry* registry = ExtensionRegistry::Get(profile_); 82 const extensions::Extension* extension = 83 registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED); 84 if (!extension) 85 return false; // The extension provided is no longer enabled. 86 87 extensions::ExtensionPrefs* prefs = extensions::ExtensionPrefs::Get(profile_); 88 if (prefs->HasNtpOverriddenBubbleBeenAcknowledged(extension_id)) 89 return false; 90 91 return true; 92 } 93 94 void NtpOverriddenBubbleDelegate::AcknowledgeExtension( 95 const std::string& extension_id, 96 ExtensionMessageBubbleController::BubbleAction user_action) { 97 if (user_action != ExtensionMessageBubbleController::ACTION_EXECUTE) { 98 extensions::ExtensionPrefs* prefs = 99 extensions::ExtensionPrefs::Get(profile_); 100 prefs->SetNtpOverriddenBubbleBeenAcknowledged(extension_id, true); 101 } 102 } 103 104 void NtpOverriddenBubbleDelegate::PerformAction( 105 const extensions::ExtensionIdList& list) { 106 for (size_t i = 0; i < list.size(); ++i) { 107 service_->DisableExtension(list[i], 108 extensions::Extension::DISABLE_USER_ACTION); 109 } 110 } 111 112 base::string16 NtpOverriddenBubbleDelegate::GetTitle() const { 113 return l10n_util::GetStringUTF16( 114 IDS_EXTENSIONS_NTP_CONTROLLED_TITLE_HOME_PAGE_BUBBLE); 115 } 116 117 base::string16 NtpOverriddenBubbleDelegate::GetMessageBody( 118 bool anchored_to_browser_action) const { 119 base::string16 body = 120 l10n_util::GetStringUTF16(IDS_EXTENSIONS_NTP_CONTROLLED_FIRST_LINE); 121 body += l10n_util::GetStringUTF16( 122 IDS_EXTENSIONS_SETTINGS_API_THIRD_LINE_CONFIRMATION); 123 return body; 124 } 125 126 base::string16 NtpOverriddenBubbleDelegate::GetOverflowText( 127 const base::string16& overflow_count) const { 128 // Does not have more than one extension in the list at a time. 129 NOTREACHED(); 130 return base::string16(); 131 } 132 133 base::string16 NtpOverriddenBubbleDelegate::GetLearnMoreLabel() const { 134 return l10n_util::GetStringUTF16(IDS_LEARN_MORE); 135 } 136 137 GURL NtpOverriddenBubbleDelegate::GetLearnMoreUrl() const { 138 return GURL(chrome::kExtensionControlledSettingLearnMoreURL); 139 } 140 141 base::string16 NtpOverriddenBubbleDelegate::GetActionButtonLabel() const { 142 return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_RESTORE_SETTINGS); 143 } 144 145 base::string16 NtpOverriddenBubbleDelegate::GetDismissButtonLabel() const { 146 return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_KEEP_CHANGES); 147 } 148 149 bool NtpOverriddenBubbleDelegate::ShouldShowExtensionList() const { 150 return false; 151 } 152 153 void NtpOverriddenBubbleDelegate::RestrictToSingleExtension( 154 const std::string& extension_id) { 155 extension_id_ = extension_id; 156 } 157 158 void NtpOverriddenBubbleDelegate::LogExtensionCount(size_t count) { 159 } 160 161 void NtpOverriddenBubbleDelegate::LogAction( 162 ExtensionMessageBubbleController::BubbleAction action) { 163 UMA_HISTOGRAM_ENUMERATION( 164 "ExtensionOverrideBubble.NtpOverriddenUserSelection", 165 action, 166 ExtensionMessageBubbleController::ACTION_BOUNDARY); 167 } 168 169 } // namespace 170 171 namespace extensions { 172 173 //////////////////////////////////////////////////////////////////////////////// 174 // NtpOverriddenBubbleController 175 176 NtpOverriddenBubbleController::NtpOverriddenBubbleController(Profile* profile) 177 : ExtensionMessageBubbleController( 178 new NtpOverriddenBubbleDelegate( 179 ExtensionSystem::Get(profile)->extension_service(), 180 profile), 181 profile), 182 profile_(profile) {} 183 184 NtpOverriddenBubbleController::~NtpOverriddenBubbleController() {} 185 186 bool NtpOverriddenBubbleController::ShouldShow( 187 const std::string& extension_id) { 188 if (!delegate()->ShouldIncludeExtension(extension_id)) 189 return false; 190 191 delegate()->RestrictToSingleExtension(extension_id); 192 return true; 193 } 194 195 bool NtpOverriddenBubbleController::CloseOnDeactivate() { 196 return true; 197 } 198 199 } // namespace extensions 200