• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
NtpOverriddenBubbleDelegate(ExtensionService * service,Profile * profile)68 NtpOverriddenBubbleDelegate::NtpOverriddenBubbleDelegate(
69     ExtensionService* service,
70     Profile* profile)
71     : service_(service), profile_(profile) {}
72 
~NtpOverriddenBubbleDelegate()73 NtpOverriddenBubbleDelegate::~NtpOverriddenBubbleDelegate() {}
74 
ShouldIncludeExtension(const std::string & extension_id)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 
AcknowledgeExtension(const std::string & extension_id,ExtensionMessageBubbleController::BubbleAction user_action)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 
PerformAction(const extensions::ExtensionIdList & list)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 
GetTitle() const112 base::string16 NtpOverriddenBubbleDelegate::GetTitle() const {
113   return l10n_util::GetStringUTF16(
114       IDS_EXTENSIONS_NTP_CONTROLLED_TITLE_HOME_PAGE_BUBBLE);
115 }
116 
GetMessageBody(bool anchored_to_browser_action) const117 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 
GetOverflowText(const base::string16 & overflow_count) const126 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 
GetLearnMoreLabel() const133 base::string16 NtpOverriddenBubbleDelegate::GetLearnMoreLabel() const {
134   return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
135 }
136 
GetLearnMoreUrl() const137 GURL NtpOverriddenBubbleDelegate::GetLearnMoreUrl() const {
138   return GURL(chrome::kExtensionControlledSettingLearnMoreURL);
139 }
140 
GetActionButtonLabel() const141 base::string16 NtpOverriddenBubbleDelegate::GetActionButtonLabel() const {
142   return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_RESTORE_SETTINGS);
143 }
144 
GetDismissButtonLabel() const145 base::string16 NtpOverriddenBubbleDelegate::GetDismissButtonLabel() const {
146   return l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_KEEP_CHANGES);
147 }
148 
ShouldShowExtensionList() const149 bool NtpOverriddenBubbleDelegate::ShouldShowExtensionList() const {
150   return false;
151 }
152 
RestrictToSingleExtension(const std::string & extension_id)153 void NtpOverriddenBubbleDelegate::RestrictToSingleExtension(
154     const std::string& extension_id) {
155   extension_id_ = extension_id;
156 }
157 
LogExtensionCount(size_t count)158 void NtpOverriddenBubbleDelegate::LogExtensionCount(size_t count) {
159 }
160 
LogAction(ExtensionMessageBubbleController::BubbleAction action)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 
NtpOverriddenBubbleController(Profile * profile)176 NtpOverriddenBubbleController::NtpOverriddenBubbleController(Profile* profile)
177     : ExtensionMessageBubbleController(
178           new NtpOverriddenBubbleDelegate(
179               ExtensionSystem::Get(profile)->extension_service(),
180               profile),
181           profile),
182       profile_(profile) {}
183 
~NtpOverriddenBubbleController()184 NtpOverriddenBubbleController::~NtpOverriddenBubbleController() {}
185 
ShouldShow(const std::string & extension_id)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 
CloseOnDeactivate()195 bool NtpOverriddenBubbleController::CloseOnDeactivate() {
196   return true;
197 }
198 
199 }  // namespace extensions
200