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