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