• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 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/dev_mode_bubble_controller.h"
6 
7 #include "base/bind.h"
8 #include "base/metrics/histogram.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/chrome_notification_types.h"
11 #include "chrome/browser/extensions/extension_action_manager.h"
12 #include "chrome/browser/extensions/extension_message_bubble.h"
13 #include "chrome/browser/extensions/extension_prefs.h"
14 #include "chrome/browser/extensions/extension_service.h"
15 #include "chrome/browser/ui/browser.h"
16 #include "chrome/browser/ui/browser_finder.h"
17 #include "chrome/common/chrome_version_info.h"
18 #include "chrome/common/url_constants.h"
19 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/user_metrics.h"
21 #include "extensions/common/feature_switch.h"
22 #include "grit/chromium_strings.h"
23 #include "grit/generated_resources.h"
24 #include "ui/base/l10n/l10n_util.h"
25 
26 namespace {
27 
28 static base::LazyInstance<extensions::ProfileKeyedAPIFactory<
29     extensions::DevModeBubbleController> >
30 g_factory = LAZY_INSTANCE_INITIALIZER;
31 
32 }  // namespace
33 
34 namespace extensions {
35 
36 ////////////////////////////////////////////////////////////////////////////////
37 // DevModeBubbleController
38 
DevModeBubbleController(Profile * profile)39 DevModeBubbleController::DevModeBubbleController(
40     Profile* profile)
41     : ExtensionMessageBubbleController(this, profile),
42       service_(extensions::ExtensionSystem::Get(profile)->extension_service()),
43       profile_(profile) {
44 }
45 
~DevModeBubbleController()46 DevModeBubbleController::~DevModeBubbleController() {
47 }
48 
49 // static
50 ProfileKeyedAPIFactory<DevModeBubbleController>*
GetFactoryInstance()51 DevModeBubbleController::GetFactoryInstance() {
52   return &g_factory.Get();
53 }
54 
55 // static
Get(Profile * profile)56 DevModeBubbleController* DevModeBubbleController::Get(
57     Profile* profile) {
58   return ProfileKeyedAPIFactory<
59       DevModeBubbleController>::GetForProfile(profile);
60 }
61 
IsDevModeExtension(const Extension * extension) const62 bool DevModeBubbleController::IsDevModeExtension(
63     const Extension* extension) const {
64   if (!extensions::FeatureSwitch::force_dev_mode_highlighting()->IsEnabled()) {
65     if (chrome::VersionInfo::GetChannel() <
66             chrome::VersionInfo::CHANNEL_BETA)
67       return false;
68   }
69   return extension->location() == Manifest::UNPACKED ||
70          extension->location() == Manifest::COMMAND_LINE;
71 }
72 
ShouldIncludeExtension(const std::string & extension_id)73 bool DevModeBubbleController::ShouldIncludeExtension(
74     const std::string& extension_id) {
75   const Extension* extension = service_->GetExtensionById(extension_id, false);
76   if (!extension)
77     return false;
78   return IsDevModeExtension(extension);
79 }
80 
AcknowledgeExtension(const std::string & extension_id,ExtensionMessageBubbleController::BubbleAction user_action)81 void DevModeBubbleController::AcknowledgeExtension(
82     const std::string& extension_id,
83     ExtensionMessageBubbleController::BubbleAction user_action) {
84 }
85 
PerformAction(const ExtensionIdList & list)86 void DevModeBubbleController::PerformAction(
87     const ExtensionIdList& list) {
88   for (size_t i = 0; i < list.size(); ++i)
89     service_->DisableExtension(list[i], Extension::DISABLE_USER_ACTION);
90 }
91 
GetTitle() const92 string16 DevModeBubbleController::GetTitle() const {
93   return l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLE_DEVELOPER_MODE_TITLE);
94 }
95 
GetMessageBody() const96 string16 DevModeBubbleController::GetMessageBody() const {
97   return l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLE_DEVELOPER_MODE_BODY);
98 }
99 
GetOverflowText(const string16 & overflow_count) const100 string16 DevModeBubbleController::GetOverflowText(
101     const string16& overflow_count) const {
102   return l10n_util::GetStringFUTF16(
103             IDS_EXTENSIONS_SUSPICIOUS_DISABLED_AND_N_MORE,
104             overflow_count);
105 }
106 
GetLearnMoreLabel() const107 string16 DevModeBubbleController::GetLearnMoreLabel() const {
108   return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
109 }
110 
GetLearnMoreUrl() const111 GURL DevModeBubbleController::GetLearnMoreUrl() const {
112   return GURL(chrome::kChromeUIExtensionsURL);
113 }
114 
GetActionButtonLabel() const115 string16 DevModeBubbleController::GetActionButtonLabel() const {
116   return l10n_util::GetStringUTF16(IDS_DISABLE);
117 }
118 
GetDismissButtonLabel() const119 string16 DevModeBubbleController::GetDismissButtonLabel() const {
120   return l10n_util::GetStringUTF16(IDS_CANCEL);
121 }
122 
ShouldShowExtensionList() const123 bool DevModeBubbleController::ShouldShowExtensionList() const {
124   return false;
125 }
126 
GetExtensions()127 std::vector<string16> DevModeBubbleController::GetExtensions() {
128   return GetExtensionList();
129 }
130 
LogExtensionCount(size_t count)131 void DevModeBubbleController::LogExtensionCount(size_t count) {
132   UMA_HISTOGRAM_COUNTS_100(
133       "DevModeExtensionBubble.ExtensionsInDevModeCount", count);
134 }
135 
LogAction(ExtensionMessageBubbleController::BubbleAction action)136 void DevModeBubbleController::LogAction(
137     ExtensionMessageBubbleController::BubbleAction action) {
138   UMA_HISTOGRAM_ENUMERATION(
139       "DevModeExtensionBubble.UserSelection",
140       action, ExtensionMessageBubbleController::ACTION_BOUNDARY);
141 }
142 
143 template <>
144 void ProfileKeyedAPIFactory<
DeclareFactoryDependencies()145     DevModeBubbleController>::DeclareFactoryDependencies() {
146   DependsOn(extensions::ExtensionSystemFactory::GetInstance());
147 }
148 
149 }  // namespace extensions
150