Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/extension_management.h" | 5 #include "chrome/browser/extensions/extension_management.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | |
| 8 #include "base/bind_helpers.h" | |
| 7 #include "base/logging.h" | 9 #include "base/logging.h" |
| 8 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| 9 #include "chrome/browser/extensions/external_provider_impl.h" | 11 #include "chrome/browser/extensions/external_provider_impl.h" |
| 12 #include "chrome/browser/extensions/standard_management_policy_provider.h" | |
| 13 #include "chrome/browser/profiles/profile.h" | |
| 10 #include "components/crx_file/id_util.h" | 14 #include "components/crx_file/id_util.h" |
| 15 #include "components/keyed_service/content/browser_context_dependency_manager.h" | |
| 11 #include "extensions/browser/pref_names.h" | 16 #include "extensions/browser/pref_names.h" |
| 12 #include "extensions/common/url_pattern.h" | 17 #include "extensions/common/url_pattern.h" |
| 13 | 18 |
| 14 namespace extensions { | 19 namespace extensions { |
| 15 | 20 |
| 16 void ExtensionManagement::IndividualSettings::Reset() { | 21 void ExtensionManagement::IndividualSettings::Reset() { |
| 17 installation_mode = ExtensionManagement::INSTALLATION_ALLOWED; | 22 installation_mode = ExtensionManagement::INSTALLATION_ALLOWED; |
| 18 update_url.clear(); | 23 update_url.clear(); |
| 19 } | 24 } |
| 20 | 25 |
| 21 ExtensionManagement::GlobalSettings::GlobalSettings() { | 26 ExtensionManagement::GlobalSettings::GlobalSettings() { |
| 22 } | 27 } |
| 23 | 28 |
| 24 ExtensionManagement::GlobalSettings::~GlobalSettings() { | 29 ExtensionManagement::GlobalSettings::~GlobalSettings() { |
| 25 } | 30 } |
| 26 | 31 |
| 27 void ExtensionManagement::GlobalSettings::Reset() { | 32 void ExtensionManagement::GlobalSettings::Reset() { |
| 28 has_restricted_install_sources = false; | 33 has_restricted_install_sources = false; |
| 29 install_sources.ClearPatterns(); | 34 install_sources.ClearPatterns(); |
| 30 has_restricted_allowed_types = false; | 35 has_restricted_allowed_types = false; |
| 31 allowed_types.clear(); | 36 allowed_types.clear(); |
| 32 } | 37 } |
| 33 | 38 |
| 34 ExtensionManagement::ExtensionManagement(PrefService* pref_service) | 39 ExtensionManagement::ExtensionManagement(PrefService* pref_service) |
| 35 : pref_service_(pref_service) { | 40 : pref_service_(pref_service) { |
| 41 pref_change_registrar_.Init(pref_service_); | |
| 42 pref_change_registrar_.Add( | |
| 43 pref_names::kInstallAllowList, | |
| 44 base::Bind(&ExtensionManagement::OnExtensionPrefChanged, | |
| 45 base::Unretained(this))); | |
| 46 pref_change_registrar_.Add( | |
| 47 pref_names::kInstallDenyList, | |
| 48 base::Bind(&ExtensionManagement::OnExtensionPrefChanged, | |
| 49 base::Unretained(this))); | |
| 50 pref_change_registrar_.Add( | |
| 51 pref_names::kInstallForceList, | |
| 52 base::Bind(&ExtensionManagement::OnExtensionPrefChanged, | |
| 53 base::Unretained(this))); | |
| 54 pref_change_registrar_.Add( | |
| 55 pref_names::kAllowedInstallSites, | |
| 56 base::Bind(&ExtensionManagement::OnExtensionPrefChanged, | |
| 57 base::Unretained(this))); | |
| 58 pref_change_registrar_.Add( | |
| 59 pref_names::kAllowedTypes, | |
| 60 base::Bind(&ExtensionManagement::OnExtensionPrefChanged, | |
| 61 base::Unretained(this))); | |
|
Joao da Silva
2014/09/03 11:52:54
Suggestion: all of these registrations use the sam
binjin
2014/09/03 15:31:36
Done.
| |
| 62 Refresh(); | |
| 63 provider_.reset(new StandardManagementPolicyProvider(this)); | |
| 36 } | 64 } |
| 37 | 65 |
| 38 ExtensionManagement::~ExtensionManagement() { | 66 ExtensionManagement::~ExtensionManagement() { |
| 39 } | 67 } |
| 40 | 68 |
| 69 void ExtensionManagement::AddObserver(Observer* obs) { | |
| 70 observer_list_.AddObserver(obs); | |
| 71 } | |
| 72 | |
| 73 void ExtensionManagement::RemoveObserver(Observer* obs) { | |
|
Joao da Silva
2014/09/03 11:52:54
Rename "obs" to "observer"
binjin
2014/09/03 15:31:36
Done.
| |
| 74 observer_list_.RemoveObserver(obs); | |
| 75 } | |
| 76 | |
| 77 ManagementPolicy::Provider* ExtensionManagement::GetProvider() { | |
| 78 return provider_.get(); | |
| 79 } | |
| 80 | |
| 81 bool ExtensionManagement::BlacklistedByDefault() { | |
| 82 return default_settings_.installation_mode == INSTALLATION_BLOCKED; | |
| 83 } | |
| 84 | |
| 85 const ExtensionManagement::IndividualSettings& ExtensionManagement::ReadById( | |
| 86 const ExtensionId& id) const { | |
| 87 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; | |
| 88 SettingsIdMap::const_iterator it = settings_by_id_.find(id); | |
| 89 if (it != settings_by_id_.end()) | |
| 90 return it->second; | |
| 91 return default_settings_; | |
| 92 } | |
| 93 | |
| 94 const ExtensionManagement::GlobalSettings& | |
| 95 ExtensionManagement::ReadGlobalSettings() const { | |
| 96 return global_settings_; | |
| 97 } | |
| 98 | |
| 41 void ExtensionManagement::Refresh() { | 99 void ExtensionManagement::Refresh() { |
| 42 // Load all extension management settings preferences. | 100 // Load all extension management settings preferences. |
| 43 const base::ListValue* allowed_list_pref = | 101 const base::ListValue* allowed_list_pref = |
| 44 static_cast<const base::ListValue*>(LoadPreference( | 102 static_cast<const base::ListValue*>(LoadPreference( |
| 45 pref_names::kInstallAllowList, true, base::Value::TYPE_LIST)); | 103 pref_names::kInstallAllowList, true, base::Value::TYPE_LIST)); |
| 46 const base::ListValue* denied_list_pref = | 104 const base::ListValue* denied_list_pref = |
| 47 static_cast<const base::ListValue*>(LoadPreference( | 105 static_cast<const base::ListValue*>(LoadPreference( |
| 48 pref_names::kInstallDenyList, false, base::Value::TYPE_LIST)); | 106 pref_names::kInstallDenyList, false, base::Value::TYPE_LIST)); |
| 49 const base::DictionaryValue* forced_list_pref = | 107 const base::DictionaryValue* forced_list_pref = |
| 50 static_cast<const base::DictionaryValue*>(LoadPreference( | 108 static_cast<const base::DictionaryValue*>(LoadPreference( |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 global_settings_.allowed_types.push_back( | 189 global_settings_.allowed_types.push_back( |
| 132 static_cast<Manifest::Type>(int_value)); | 190 static_cast<Manifest::Type>(int_value)); |
| 133 } | 191 } |
| 134 } | 192 } |
| 135 } | 193 } |
| 136 | 194 |
| 137 // TODO(binjin): Add parsing of new ExtensionManagement preference after the | 195 // TODO(binjin): Add parsing of new ExtensionManagement preference after the |
| 138 // new ExtensionManagement policy is added. | 196 // new ExtensionManagement policy is added. |
| 139 } | 197 } |
| 140 | 198 |
| 141 const ExtensionManagement::IndividualSettings& ExtensionManagement::ReadById( | |
| 142 const ExtensionId& id) const { | |
| 143 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; | |
| 144 SettingsIdMap::const_iterator it = settings_by_id_.find(id); | |
| 145 if (it != settings_by_id_.end()) | |
| 146 return it->second; | |
| 147 return default_settings_; | |
| 148 } | |
| 149 | |
| 150 const ExtensionManagement::GlobalSettings& | |
| 151 ExtensionManagement::ReadGlobalSettings() const { | |
| 152 return global_settings_; | |
| 153 } | |
| 154 | |
| 155 const base::Value* ExtensionManagement::LoadPreference( | 199 const base::Value* ExtensionManagement::LoadPreference( |
| 156 const char* pref_name, | 200 const char* pref_name, |
| 157 bool force_managed, | 201 bool force_managed, |
| 158 base::Value::Type expected_type) { | 202 base::Value::Type expected_type) { |
| 159 const PrefService::Preference* pref = | 203 const PrefService::Preference* pref = |
| 160 pref_service_->FindPreference(pref_name); | 204 pref_service_->FindPreference(pref_name); |
| 161 if (pref && !pref->IsDefaultValue() && | 205 if (pref && !pref->IsDefaultValue() && |
| 162 (!force_managed || pref->IsManaged())) { | 206 (!force_managed || pref->IsManaged())) { |
| 163 const base::Value* value = pref->GetValue(); | 207 const base::Value* value = pref->GetValue(); |
| 164 if (value && value->IsType(expected_type)) | 208 if (value && value->IsType(expected_type)) |
| 165 return value; | 209 return value; |
| 166 } | 210 } |
| 167 return NULL; | 211 return NULL; |
| 168 } | 212 } |
| 169 | 213 |
| 214 void ExtensionManagement::OnExtensionPrefChanged() { | |
| 215 Refresh(); | |
| 216 NotifyExtensionManagementPrefChanged(); | |
| 217 } | |
| 218 | |
| 219 void ExtensionManagement::NotifyExtensionManagementPrefChanged() { | |
| 220 FOR_EACH_OBSERVER( | |
| 221 Observer, observer_list_, OnExtensionManagementPrefChanged()); | |
| 222 } | |
| 223 | |
| 170 ExtensionManagement::IndividualSettings* ExtensionManagement::AccessById( | 224 ExtensionManagement::IndividualSettings* ExtensionManagement::AccessById( |
| 171 const ExtensionId& id) { | 225 const ExtensionId& id) { |
| 172 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; | 226 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; |
| 173 SettingsIdMap::iterator it = settings_by_id_.find(id); | 227 SettingsIdMap::iterator it = settings_by_id_.find(id); |
| 174 if (it == settings_by_id_.end()) | 228 if (it == settings_by_id_.end()) |
| 175 it = settings_by_id_.insert(std::make_pair(id, default_settings_)).first; | 229 it = settings_by_id_.insert(std::make_pair(id, default_settings_)).first; |
| 176 return &it->second; | 230 return &it->second; |
| 177 } | 231 } |
| 178 | 232 |
| 233 ExtensionManagement* ExtensionManagementFactory::GetForBrowserContext( | |
| 234 content::BrowserContext* context) { | |
| 235 return static_cast<ExtensionManagement*>( | |
| 236 GetInstance()->GetServiceForBrowserContext(context, true)); | |
| 237 } | |
| 238 | |
| 239 ExtensionManagementFactory* ExtensionManagementFactory::GetInstance() { | |
| 240 return Singleton<ExtensionManagementFactory>::get(); | |
| 241 } | |
| 242 | |
| 243 ExtensionManagementFactory::ExtensionManagementFactory() | |
| 244 : BrowserContextKeyedServiceFactory( | |
| 245 "ExtensionManagement", | |
| 246 BrowserContextDependencyManager::GetInstance()) { | |
| 247 } | |
| 248 | |
| 249 ExtensionManagementFactory::~ExtensionManagementFactory() { | |
| 250 } | |
| 251 | |
| 252 KeyedService* ExtensionManagementFactory::BuildServiceInstanceFor( | |
| 253 content::BrowserContext* context) const { | |
| 254 return new ExtensionManagement( | |
| 255 Profile::FromBrowserContext(context)->GetPrefs()); | |
| 256 } | |
| 257 | |
| 179 } // namespace extensions | 258 } // namespace extensions |
| OLD | NEW |