Chromium Code Reviews| 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" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 #include "extensions/common/feature_switch.h" | 30 #include "extensions/common/feature_switch.h" |
| 31 | 31 |
| 32 namespace extensions { | 32 namespace extensions { |
| 33 | 33 |
| 34 namespace { | 34 namespace { |
| 35 | 35 |
| 36 // The key into the Extension prefs for an Extension's specific reporting | 36 // The key into the Extension prefs for an Extension's specific reporting |
| 37 // settings. | 37 // settings. |
| 38 const char kStoreExtensionErrorsPref[] = "store_extension_errors"; | 38 const char kStoreExtensionErrorsPref[] = "store_extension_errors"; |
| 39 | 39 |
| 40 // The default mask (for the time being) is to report everything. | 40 // This is the default mask for which errors to report. That is, if an extension |
| 41 const int32 kDefaultMask = (1 << ExtensionError::MANIFEST_ERROR) | | 41 // does not have specific preference set, this will be used instead. |
| 42 (1 << ExtensionError::RUNTIME_ERROR); | 42 const int32 kDefaultMask = 0; |
| 43 | 43 |
| 44 const char kAppsDeveloperToolsExtensionId[] = | 44 const char kAppsDeveloperToolsExtensionId[] = |
| 45 "ohmmkhmmmpcnpikjeljgnaoabkaalbgc"; | 45 "ohmmkhmmmpcnpikjeljgnaoabkaalbgc"; |
| 46 | 46 |
| 47 } // namespace | 47 } // namespace |
| 48 | 48 |
| 49 void ErrorConsole::Observer::OnErrorConsoleDestroyed() { | 49 void ErrorConsole::Observer::OnErrorConsoleDestroyed() { |
| 50 } | 50 } |
| 51 | 51 |
| 52 ErrorConsole::ErrorConsole(Profile* profile) | 52 ErrorConsole::ErrorConsole(Profile* profile) |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 78 return ExtensionSystem::Get(profile)->error_console(); | 78 return ExtensionSystem::Get(profile)->error_console(); |
| 79 } | 79 } |
| 80 | 80 |
| 81 void ErrorConsole::SetReportingForExtension(const std::string& extension_id, | 81 void ErrorConsole::SetReportingForExtension(const std::string& extension_id, |
| 82 ExtensionError::Type type, | 82 ExtensionError::Type type, |
| 83 bool enabled) { | 83 bool enabled) { |
| 84 DCHECK(thread_checker_.CalledOnValidThread()); | 84 DCHECK(thread_checker_.CalledOnValidThread()); |
| 85 if (!enabled_ || !Extension::IdIsValid(extension_id)) | 85 if (!enabled_ || !Extension::IdIsValid(extension_id)) |
| 86 return; | 86 return; |
| 87 | 87 |
| 88 ErrorPreferenceMap::iterator pref = pref_map_.find(extension_id); | 88 int mask = default_mask_; |
| 89 // This call can fail if the preference isn't set, but we don't really care | |
| 90 // if it does, because we just use the default mask instead. | |
| 91 ExtensionPrefs::Get(profile_)->ReadPrefAsInteger( | |
| 92 extension_id, kStoreExtensionErrorsPref, &mask); | |
|
not at google - send to devlin
2014/04/17 00:15:53
write a GetPref() method? TBH the "extension" in S
| |
| 93 if (enabled) | |
| 94 mask |= 1 << type; | |
| 95 else | |
| 96 mask &= ~(1 << type); | |
| 89 | 97 |
| 90 if (pref == pref_map_.end()) { | 98 SetExtensionPref(extension_id, mask); |
| 91 pref = pref_map_.insert( | 99 } |
| 92 std::pair<std::string, int32>(extension_id, default_mask_)).first; | |
| 93 } | |
| 94 | 100 |
| 95 pref->second = | 101 void ErrorConsole::SetReportingAllForExtension( |
| 96 enabled ? pref->second | (1 << type) : pref->second &~(1 << type); | 102 const std::string& extension_id, bool enabled) { |
| 103 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 104 if (!enabled_ || !Extension::IdIsValid(extension_id)) | |
| 105 return; | |
| 97 | 106 |
| 98 ExtensionPrefs::Get(profile_)->UpdateExtensionPref( | 107 int32 mask = 0; |
| 99 extension_id, | 108 if (enabled) |
| 100 kStoreExtensionErrorsPref, | 109 mask = (1 << ExtensionError::NUM_ERROR_TYPES) - 1; |
| 101 base::Value::CreateIntegerValue(pref->second)); | 110 |
| 111 SetExtensionPref(extension_id, mask); | |
| 112 } | |
| 113 | |
| 114 bool ErrorConsole::IsReportingEnabledForExtension( | |
| 115 const std::string& extension_id) const { | |
| 116 int mask = default_mask_; | |
| 117 // This call can fail if the preference isn't set, but we don't really care | |
| 118 // if it does, because we just use the default mask instead. | |
| 119 ExtensionPrefs::Get(profile_)->ReadPrefAsInteger( | |
| 120 extension_id, kStoreExtensionErrorsPref, &mask); | |
| 121 return mask != 0; | |
| 102 } | 122 } |
| 103 | 123 |
| 104 void ErrorConsole::UseDefaultReportingForExtension( | 124 void ErrorConsole::UseDefaultReportingForExtension( |
| 105 const std::string& extension_id) { | 125 const std::string& extension_id) { |
| 106 DCHECK(thread_checker_.CalledOnValidThread()); | 126 DCHECK(thread_checker_.CalledOnValidThread()); |
| 107 if (!enabled_ || !Extension::IdIsValid(extension_id)) | 127 if (!enabled_ || !Extension::IdIsValid(extension_id)) |
| 108 return; | 128 return; |
| 109 | 129 |
| 110 pref_map_.erase(extension_id); | |
| 111 ExtensionPrefs::Get(profile_)->UpdateExtensionPref( | 130 ExtensionPrefs::Get(profile_)->UpdateExtensionPref( |
| 112 extension_id, | 131 extension_id, |
| 113 kStoreExtensionErrorsPref, | 132 kStoreExtensionErrorsPref, |
| 114 NULL); | 133 NULL); |
| 115 } | 134 } |
| 116 | 135 |
| 117 void ErrorConsole::ReportError(scoped_ptr<ExtensionError> error) { | 136 void ErrorConsole::ReportError(scoped_ptr<ExtensionError> error) { |
| 118 DCHECK(thread_checker_.CalledOnValidThread()); | 137 DCHECK(thread_checker_.CalledOnValidThread()); |
| 119 if (!enabled_ || !Extension::IdIsValid(error->extension_id())) | 138 if (!enabled_ || |
| 120 return; | 139 !Extension::IdIsValid(error->extension_id()) || |
| 121 | 140 !ShouldReportErrorForExtension(error->extension_id(), error->type())) { |
| 122 ErrorPreferenceMap::const_iterator pref = | |
| 123 pref_map_.find(error->extension_id()); | |
| 124 // Check the mask to see if we report the error. If we don't have a specific | |
| 125 // entry, use the default mask. | |
| 126 if ((pref == pref_map_.end() && | |
| 127 ((default_mask_ & (1 << error->type())) == 0)) || | |
| 128 (pref != pref_map_.end() && (pref->second & (1 << error->type())) == 0)) { | |
| 129 return; | 141 return; |
| 130 } | 142 } |
| 131 | 143 |
| 132 const ExtensionError* weak_error = errors_.AddError(error.Pass()); | 144 const ExtensionError* weak_error = errors_.AddError(error.Pass()); |
| 133 FOR_EACH_OBSERVER(Observer, observers_, OnErrorAdded(weak_error)); | 145 FOR_EACH_OBSERVER(Observer, observers_, OnErrorAdded(weak_error)); |
| 134 } | 146 } |
| 135 | 147 |
| 136 const ErrorList& ErrorConsole::GetErrorsForExtension( | 148 const ErrorList& ErrorConsole::GetErrorsForExtension( |
| 137 const std::string& extension_id) const { | 149 const std::string& extension_id) const { |
| 138 return errors_.GetErrorsForExtension(extension_id); | 150 return errors_.GetErrorsForExtension(extension_id); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 177 content::NotificationService::AllBrowserContextsAndSources()); | 189 content::NotificationService::AllBrowserContextsAndSources()); |
| 178 notification_registrar_.Add( | 190 notification_registrar_.Add( |
| 179 this, | 191 this, |
| 180 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, | 192 chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
| 181 content::Source<Profile>(profile_)); | 193 content::Source<Profile>(profile_)); |
| 182 notification_registrar_.Add( | 194 notification_registrar_.Add( |
| 183 this, | 195 this, |
| 184 chrome::NOTIFICATION_EXTENSION_INSTALLED, | 196 chrome::NOTIFICATION_EXTENSION_INSTALLED, |
| 185 content::Source<Profile>(profile_)); | 197 content::Source<Profile>(profile_)); |
| 186 | 198 |
| 187 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); | |
| 188 const ExtensionSet& extensions = | 199 const ExtensionSet& extensions = |
| 189 ExtensionRegistry::Get(profile_)->enabled_extensions(); | 200 ExtensionRegistry::Get(profile_)->enabled_extensions(); |
| 190 for (ExtensionSet::const_iterator iter = extensions.begin(); | 201 for (ExtensionSet::const_iterator iter = extensions.begin(); |
| 191 iter != extensions.end(); | 202 iter != extensions.end(); |
| 192 ++iter) { | 203 ++iter) { |
| 193 int mask = 0; | |
| 194 if (prefs->ReadPrefAsInteger(iter->get()->id(), | |
| 195 kStoreExtensionErrorsPref, | |
| 196 &mask)) { | |
| 197 pref_map_[iter->get()->id()] = mask; | |
| 198 } | |
| 199 AddManifestErrorsForExtension(iter->get()); | 204 AddManifestErrorsForExtension(iter->get()); |
| 200 } | 205 } |
| 201 } | 206 } |
| 202 | 207 |
| 203 void ErrorConsole::Disable() { | 208 void ErrorConsole::Disable() { |
| 204 notification_registrar_.RemoveAll(); | 209 notification_registrar_.RemoveAll(); |
| 205 errors_.RemoveAllErrors(); | 210 errors_.RemoveAllErrors(); |
| 206 enabled_ = false; | 211 enabled_ = false; |
| 207 } | 212 } |
| 208 | 213 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 ExtensionError::MANIFEST_ERROR); | 267 ExtensionError::MANIFEST_ERROR); |
| 263 | 268 |
| 264 AddManifestErrorsForExtension(info->extension); | 269 AddManifestErrorsForExtension(info->extension); |
| 265 break; | 270 break; |
| 266 } | 271 } |
| 267 default: | 272 default: |
| 268 NOTREACHED(); | 273 NOTREACHED(); |
| 269 } | 274 } |
| 270 } | 275 } |
| 271 | 276 |
| 277 void ErrorConsole::SetExtensionPref(const std::string& extension_id, | |
| 278 int32 mask) { | |
| 279 ExtensionPrefs::Get(profile_)->UpdateExtensionPref( | |
| 280 extension_id, | |
| 281 kStoreExtensionErrorsPref, | |
| 282 base::Value::CreateIntegerValue(mask)); | |
| 283 } | |
| 284 | |
| 285 bool ErrorConsole::ShouldReportErrorForExtension( | |
| 286 const std::string& extension_id, ExtensionError::Type type) const { | |
| 287 // Registered preferences take priority over everything else. | |
| 288 int pref = 0; | |
| 289 if (ExtensionPrefs::Get(profile_)->ReadPrefAsInteger( | |
| 290 extension_id, kStoreExtensionErrorsPref, &pref)) { | |
| 291 return (pref & (1 << type)) != 0; | |
| 292 } | |
| 293 | |
| 294 // If the default mask says to report the error, do so. | |
| 295 if ((default_mask_ & (1 << type)) != 0) | |
| 296 return true; | |
| 297 | |
| 298 // One last check: If the extension is unpacked, we report all errors by | |
| 299 // default. | |
| 300 const Extension* extension = | |
| 301 ExtensionRegistry::Get(profile_)->GetExtensionById( | |
| 302 extension_id, ExtensionRegistry::EVERYTHING); | |
| 303 if (extension && extension->location() == Manifest::UNPACKED) | |
| 304 return true; | |
| 305 | |
| 306 return false; | |
| 307 } | |
| 308 | |
| 272 } // namespace extensions | 309 } // namespace extensions |
| OLD | NEW |