OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/error_console/error_console.h" | 5 #include "chrome/browser/extensions/error_console/error_console.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
13 #include "base/prefs/pref_service.h" | 13 #include "base/prefs/pref_service.h" |
14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
16 #include "chrome/browser/chrome_notification_types.h" | 16 #include "chrome/browser/chrome_notification_types.h" |
17 #include "chrome/browser/extensions/extension_service.h" | 17 #include "chrome/browser/extensions/extension_service.h" |
18 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
19 #include "chrome/common/chrome_version_info.h" | |
19 #include "chrome/common/pref_names.h" | 20 #include "chrome/common/pref_names.h" |
20 #include "content/public/browser/notification_details.h" | 21 #include "content/public/browser/notification_details.h" |
21 #include "content/public/browser/notification_service.h" | 22 #include "content/public/browser/notification_service.h" |
22 #include "content/public/browser/notification_source.h" | 23 #include "content/public/browser/notification_source.h" |
24 #include "extensions/browser/extension_registry.h" | |
23 #include "extensions/browser/extension_system.h" | 25 #include "extensions/browser/extension_system.h" |
24 #include "extensions/common/constants.h" | 26 #include "extensions/common/constants.h" |
25 #include "extensions/common/extension.h" | 27 #include "extensions/common/extension.h" |
26 #include "extensions/common/extension_set.h" | 28 #include "extensions/common/extension_set.h" |
27 #include "extensions/common/feature_switch.h" | 29 #include "extensions/common/feature_switch.h" |
28 | 30 |
29 namespace extensions { | 31 namespace extensions { |
30 | 32 |
31 namespace { | 33 namespace { |
34 | |
32 // The key into the Extension prefs for an Extension's specific reporting | 35 // The key into the Extension prefs for an Extension's specific reporting |
33 // settings. | 36 // settings. |
34 const char kStoreExtensionErrorsPref[] = "store_extension_errors"; | 37 const char kStoreExtensionErrorsPref[] = "store_extension_errors"; |
35 | 38 |
36 // The default mask (for the time being) is to report everything. | 39 // The default mask (for the time being) is to report everything. |
37 const int32 kDefaultMask = (1 << ExtensionError::MANIFEST_ERROR) | | 40 const int32 kDefaultMask = (1 << ExtensionError::MANIFEST_ERROR) | |
38 (1 << ExtensionError::RUNTIME_ERROR); | 41 (1 << ExtensionError::RUNTIME_ERROR); |
39 } | 42 |
43 const char kAppsDeveloperToolsExtensionId[] = | |
44 "ohmmkhmmmpcnpikjeljgnaoabkaalbgc"; | |
45 | |
46 } // namespace | |
40 | 47 |
41 void ErrorConsole::Observer::OnErrorConsoleDestroyed() { | 48 void ErrorConsole::Observer::OnErrorConsoleDestroyed() { |
42 } | 49 } |
43 | 50 |
44 ErrorConsole::ErrorConsole(Profile* profile, | 51 ErrorConsole::ErrorConsole(Profile* profile, |
45 ExtensionService* extension_service) | 52 ExtensionService* extension_service) |
not at google - send to devlin
2014/03/31 18:52:43
this constructor argument isn't used
Devlin
2014/03/31 21:18:24
Done.
| |
46 : enabled_(false), default_mask_(kDefaultMask), profile_(profile) { | 53 : enabled_(false), default_mask_(kDefaultMask), profile_(profile) { |
47 // TODO(rdevlin.cronin): Remove once crbug.com/159265 is fixed. | 54 // TODO(rdevlin.cronin): Remove once crbug.com/159265 is fixed. |
48 #if !defined(ENABLE_EXTENSIONS) | 55 #if !defined(ENABLE_EXTENSIONS) |
49 return; | 56 return; |
50 #endif | 57 #endif |
51 | 58 |
52 // If we don't have the necessary FeatureSwitch enabled, then return | |
53 // immediately. Since we never register for any notifications, this ensures | |
54 // the ErrorConsole will never be enabled. | |
55 if (!FeatureSwitch::error_console()->IsEnabled()) | |
56 return; | |
57 | |
58 pref_registrar_.Init(profile_->GetPrefs()); | 59 pref_registrar_.Init(profile_->GetPrefs()); |
59 pref_registrar_.Add(prefs::kExtensionsUIDeveloperMode, | 60 pref_registrar_.Add(prefs::kExtensionsUIDeveloperMode, |
60 base::Bind(&ErrorConsole::OnPrefChanged, | 61 base::Bind(&ErrorConsole::OnPrefChanged, |
61 base::Unretained(this))); | 62 base::Unretained(this))); |
62 | 63 |
63 if (profile_->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode)) | 64 ExtensionRegistry::Get(profile_)->AddObserver(this); |
not at google - send to devlin
2014/03/31 18:52:43
use ScopedObserver so that you don't need to remov
Devlin
2014/03/31 21:18:24
Done.
| |
64 Enable(extension_service); | 65 |
66 CheckEnabled(); | |
65 } | 67 } |
66 | 68 |
67 ErrorConsole::~ErrorConsole() { | 69 ErrorConsole::~ErrorConsole() { |
68 FOR_EACH_OBSERVER(Observer, observers_, OnErrorConsoleDestroyed()); | 70 FOR_EACH_OBSERVER(Observer, observers_, OnErrorConsoleDestroyed()); |
71 ExtensionRegistry::Get(profile_)->RemoveObserver(this); | |
69 } | 72 } |
70 | 73 |
71 // static | 74 // static |
72 ErrorConsole* ErrorConsole::Get(Profile* profile) { | 75 ErrorConsole* ErrorConsole::Get(Profile* profile) { |
73 return ExtensionSystem::Get(profile)->error_console(); | 76 return ExtensionSystem::Get(profile)->error_console(); |
74 } | 77 } |
75 | 78 |
76 void ErrorConsole::SetReportingForExtension(const std::string& extension_id, | 79 void ErrorConsole::SetReportingForExtension(const std::string& extension_id, |
77 ExtensionError::Type type, | 80 ExtensionError::Type type, |
78 bool enabled) { | 81 bool enabled) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 void ErrorConsole::AddObserver(Observer* observer) { | 139 void ErrorConsole::AddObserver(Observer* observer) { |
137 DCHECK(thread_checker_.CalledOnValidThread()); | 140 DCHECK(thread_checker_.CalledOnValidThread()); |
138 observers_.AddObserver(observer); | 141 observers_.AddObserver(observer); |
139 } | 142 } |
140 | 143 |
141 void ErrorConsole::RemoveObserver(Observer* observer) { | 144 void ErrorConsole::RemoveObserver(Observer* observer) { |
142 DCHECK(thread_checker_.CalledOnValidThread()); | 145 DCHECK(thread_checker_.CalledOnValidThread()); |
143 observers_.RemoveObserver(observer); | 146 observers_.RemoveObserver(observer); |
144 } | 147 } |
145 | 148 |
146 void ErrorConsole::OnPrefChanged() { | 149 bool ErrorConsole::IsEnabledForChromeExtensionsPage() const { |
147 bool developer_mode = | 150 return profile_->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode) && |
148 profile_->GetPrefs()->GetBoolean(prefs::kExtensionsUIDeveloperMode); | 151 (FeatureSwitch::error_console()->IsEnabled() || |
152 chrome::VersionInfo::GetChannel() <= | |
not at google - send to devlin
2014/03/31 18:52:43
maybe use FeatureChannel::GetCurrentChannel() here
Devlin
2014/03/31 21:18:24
Done.
| |
153 chrome::VersionInfo::CHANNEL_DEV); | |
154 } | |
149 | 155 |
150 if (developer_mode && !enabled_) | 156 bool ErrorConsole::IsEnabledForAppsDeveloperTools() const { |
157 return ExtensionRegistry::Get(profile_)->enabled_extensions() | |
158 .Contains(kAppsDeveloperToolsExtensionId); | |
159 } | |
160 | |
161 void ErrorConsole::CheckEnabled() { | |
162 bool should_be_enabled = IsEnabledForChromeExtensionsPage() || | |
163 IsEnabledForAppsDeveloperTools(); | |
164 if (should_be_enabled && !enabled_) | |
151 Enable(ExtensionSystem::Get(profile_)->extension_service()); | 165 Enable(ExtensionSystem::Get(profile_)->extension_service()); |
not at google - send to devlin
2014/03/31 18:52:43
just let Enable() fetch the ExtensionService from
Devlin
2014/03/31 21:18:24
Done.
| |
152 else if (!developer_mode && enabled_) | 166 if (!should_be_enabled && enabled_) |
153 Disable(); | 167 Disable(); |
154 } | 168 } |
155 | 169 |
156 void ErrorConsole::Enable(ExtensionService* extension_service) { | 170 void ErrorConsole::Enable(ExtensionService* extension_service) { |
157 enabled_ = true; | 171 enabled_ = true; |
158 | 172 |
159 notification_registrar_.Add( | 173 notification_registrar_.Add( |
160 this, | 174 this, |
161 chrome::NOTIFICATION_PROFILE_DESTROYED, | 175 chrome::NOTIFICATION_PROFILE_DESTROYED, |
162 content::NotificationService::AllBrowserContextsAndSources()); | 176 content::NotificationService::AllBrowserContextsAndSources()); |
163 notification_registrar_.Add( | 177 notification_registrar_.Add( |
164 this, | 178 this, |
165 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, | 179 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
166 content::Source<Profile>(profile_)); | 180 content::Source<Profile>(profile_)); |
167 notification_registrar_.Add( | 181 notification_registrar_.Add( |
168 this, | 182 this, |
169 chrome::NOTIFICATION_EXTENSION_INSTALLED, | 183 chrome::NOTIFICATION_EXTENSION_INSTALLED, |
170 content::Source<Profile>(profile_)); | 184 content::Source<Profile>(profile_)); |
171 | 185 |
172 if (extension_service) { | 186 if (extension_service) { |
173 const ExtensionSet* extensions = extension_service->extensions(); | 187 const ExtensionSet* extensions = extension_service->extensions(); |
not at google - send to devlin
2014/03/31 18:52:43
actually all you need is an ExtensionRegistry, not
Devlin
2014/03/31 21:18:24
Done.
| |
174 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); | 188 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); |
175 for (ExtensionSet::const_iterator iter = extensions->begin(); | 189 for (ExtensionSet::const_iterator iter = extensions->begin(); |
176 iter != extensions->end(); ++iter) { | 190 iter != extensions->end(); ++iter) { |
177 int mask = 0; | 191 int mask = 0; |
178 if (prefs->ReadPrefAsInteger(iter->get()->id(), | 192 if (prefs->ReadPrefAsInteger(iter->get()->id(), |
179 kStoreExtensionErrorsPref, | 193 kStoreExtensionErrorsPref, |
180 &mask)) { | 194 &mask)) { |
181 pref_map_[iter->get()->id()] = mask; | 195 pref_map_[iter->get()->id()] = mask; |
182 } | 196 } |
183 AddManifestErrorsForExtension(iter->get()); | 197 AddManifestErrorsForExtension(iter->get()); |
184 } | 198 } |
185 } | 199 } |
186 } | 200 } |
187 | 201 |
188 void ErrorConsole::Disable() { | 202 void ErrorConsole::Disable() { |
189 notification_registrar_.RemoveAll(); | 203 notification_registrar_.RemoveAll(); |
190 errors_.RemoveAllErrors(); | 204 errors_.RemoveAllErrors(); |
191 enabled_ = false; | 205 enabled_ = false; |
192 } | 206 } |
193 | 207 |
208 void ErrorConsole::OnPrefChanged() { | |
209 CheckEnabled(); | |
210 } | |
211 | |
212 void ErrorConsole::OnExtensionUnloaded(const Extension* extension) { | |
213 CheckEnabled(); | |
214 } | |
215 | |
216 void ErrorConsole::OnExtensionLoaded(const Extension* extension) { | |
217 CheckEnabled(); | |
218 } | |
219 | |
194 void ErrorConsole::AddManifestErrorsForExtension(const Extension* extension) { | 220 void ErrorConsole::AddManifestErrorsForExtension(const Extension* extension) { |
195 const std::vector<InstallWarning>& warnings = | 221 const std::vector<InstallWarning>& warnings = |
196 extension->install_warnings(); | 222 extension->install_warnings(); |
197 for (std::vector<InstallWarning>::const_iterator iter = warnings.begin(); | 223 for (std::vector<InstallWarning>::const_iterator iter = warnings.begin(); |
198 iter != warnings.end(); ++iter) { | 224 iter != warnings.end(); ++iter) { |
199 ReportError(scoped_ptr<ExtensionError>(new ManifestError( | 225 ReportError(scoped_ptr<ExtensionError>(new ManifestError( |
200 extension->id(), | 226 extension->id(), |
201 base::UTF8ToUTF16(iter->message), | 227 base::UTF8ToUTF16(iter->message), |
202 base::UTF8ToUTF16(iter->key), | 228 base::UTF8ToUTF16(iter->key), |
203 base::UTF8ToUTF16(iter->specific)))); | 229 base::UTF8ToUTF16(iter->specific)))); |
(...skipping 30 matching lines...) Expand all Loading... | |
234 | 260 |
235 AddManifestErrorsForExtension(info->extension); | 261 AddManifestErrorsForExtension(info->extension); |
236 break; | 262 break; |
237 } | 263 } |
238 default: | 264 default: |
239 NOTREACHED(); | 265 NOTREACHED(); |
240 } | 266 } |
241 } | 267 } |
242 | 268 |
243 } // namespace extensions | 269 } // namespace extensions |
OLD | NEW |