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 Reset(); | 27 Reset(); |
23 } | 28 } |
24 | 29 |
25 ExtensionManagement::GlobalSettings::~GlobalSettings() { | 30 ExtensionManagement::GlobalSettings::~GlobalSettings() { |
26 } | 31 } |
27 | 32 |
28 void ExtensionManagement::GlobalSettings::Reset() { | 33 void ExtensionManagement::GlobalSettings::Reset() { |
29 has_restricted_install_sources = false; | 34 has_restricted_install_sources = false; |
30 install_sources.ClearPatterns(); | 35 install_sources.ClearPatterns(); |
31 has_restricted_allowed_types = false; | 36 has_restricted_allowed_types = false; |
32 allowed_types.clear(); | 37 allowed_types.clear(); |
33 } | 38 } |
34 | 39 |
35 ExtensionManagement::ExtensionManagement(PrefService* pref_service) | 40 ExtensionManagement::ExtensionManagement(PrefService* pref_service) |
36 : pref_service_(pref_service) { | 41 : pref_service_(pref_service) { |
| 42 pref_change_registrar_.Init(pref_service_); |
| 43 base::Closure pref_change_callback = base::Bind( |
| 44 &ExtensionManagement::OnExtensionPrefChanged, base::Unretained(this)); |
| 45 pref_change_registrar_.Add(pref_names::kInstallAllowList, |
| 46 pref_change_callback); |
| 47 pref_change_registrar_.Add(pref_names::kInstallDenyList, |
| 48 pref_change_callback); |
| 49 pref_change_registrar_.Add(pref_names::kInstallForceList, |
| 50 pref_change_callback); |
| 51 pref_change_registrar_.Add(pref_names::kAllowedInstallSites, |
| 52 pref_change_callback); |
| 53 pref_change_registrar_.Add(pref_names::kAllowedTypes, pref_change_callback); |
| 54 Refresh(); |
| 55 provider_.reset(new StandardManagementPolicyProvider(this)); |
37 } | 56 } |
38 | 57 |
39 ExtensionManagement::~ExtensionManagement() { | 58 ExtensionManagement::~ExtensionManagement() { |
40 } | 59 } |
41 | 60 |
| 61 void ExtensionManagement::AddObserver(Observer* observer) { |
| 62 observer_list_.AddObserver(observer); |
| 63 } |
| 64 |
| 65 void ExtensionManagement::RemoveObserver(Observer* observer) { |
| 66 observer_list_.RemoveObserver(observer); |
| 67 } |
| 68 |
| 69 ManagementPolicy::Provider* ExtensionManagement::GetProvider() { |
| 70 return provider_.get(); |
| 71 } |
| 72 |
| 73 bool ExtensionManagement::BlacklistedByDefault() { |
| 74 return default_settings_.installation_mode == INSTALLATION_BLOCKED; |
| 75 } |
| 76 |
| 77 const ExtensionManagement::IndividualSettings& ExtensionManagement::ReadById( |
| 78 const ExtensionId& id) const { |
| 79 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; |
| 80 SettingsIdMap::const_iterator it = settings_by_id_.find(id); |
| 81 if (it != settings_by_id_.end()) |
| 82 return it->second; |
| 83 return default_settings_; |
| 84 } |
| 85 |
| 86 const ExtensionManagement::GlobalSettings& |
| 87 ExtensionManagement::ReadGlobalSettings() const { |
| 88 return global_settings_; |
| 89 } |
| 90 |
42 void ExtensionManagement::Refresh() { | 91 void ExtensionManagement::Refresh() { |
43 // Load all extension management settings preferences. | 92 // Load all extension management settings preferences. |
44 const base::ListValue* allowed_list_pref = | 93 const base::ListValue* allowed_list_pref = |
45 static_cast<const base::ListValue*>(LoadPreference( | 94 static_cast<const base::ListValue*>(LoadPreference( |
46 pref_names::kInstallAllowList, true, base::Value::TYPE_LIST)); | 95 pref_names::kInstallAllowList, true, base::Value::TYPE_LIST)); |
47 // Allow user to use preference to block certain extensions. Note that policy | 96 // Allow user to use preference to block certain extensions. Note that policy |
48 // managed forcelist or whitelist will always override this. | 97 // managed forcelist or whitelist will always override this. |
49 const base::ListValue* denied_list_pref = | 98 const base::ListValue* denied_list_pref = |
50 static_cast<const base::ListValue*>(LoadPreference( | 99 static_cast<const base::ListValue*>(LoadPreference( |
51 pref_names::kInstallDenyList, false, base::Value::TYPE_LIST)); | 100 pref_names::kInstallDenyList, false, base::Value::TYPE_LIST)); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 global_settings_.allowed_types.push_back( | 184 global_settings_.allowed_types.push_back( |
136 static_cast<Manifest::Type>(int_value)); | 185 static_cast<Manifest::Type>(int_value)); |
137 } | 186 } |
138 } | 187 } |
139 } | 188 } |
140 | 189 |
141 // TODO(binjin): Add parsing of new ExtensionManagement preference after the | 190 // TODO(binjin): Add parsing of new ExtensionManagement preference after the |
142 // new ExtensionManagement policy is added. | 191 // new ExtensionManagement policy is added. |
143 } | 192 } |
144 | 193 |
145 const ExtensionManagement::IndividualSettings& ExtensionManagement::ReadById( | |
146 const ExtensionId& id) const { | |
147 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; | |
148 SettingsIdMap::const_iterator it = settings_by_id_.find(id); | |
149 if (it != settings_by_id_.end()) | |
150 return it->second; | |
151 return default_settings_; | |
152 } | |
153 | |
154 const ExtensionManagement::GlobalSettings& | |
155 ExtensionManagement::ReadGlobalSettings() const { | |
156 return global_settings_; | |
157 } | |
158 | |
159 const base::Value* ExtensionManagement::LoadPreference( | 194 const base::Value* ExtensionManagement::LoadPreference( |
160 const char* pref_name, | 195 const char* pref_name, |
161 bool force_managed, | 196 bool force_managed, |
162 base::Value::Type expected_type) { | 197 base::Value::Type expected_type) { |
163 const PrefService::Preference* pref = | 198 const PrefService::Preference* pref = |
164 pref_service_->FindPreference(pref_name); | 199 pref_service_->FindPreference(pref_name); |
165 if (pref && !pref->IsDefaultValue() && | 200 if (pref && !pref->IsDefaultValue() && |
166 (!force_managed || pref->IsManaged())) { | 201 (!force_managed || pref->IsManaged())) { |
167 const base::Value* value = pref->GetValue(); | 202 const base::Value* value = pref->GetValue(); |
168 if (value && value->IsType(expected_type)) | 203 if (value && value->IsType(expected_type)) |
169 return value; | 204 return value; |
170 } | 205 } |
171 return NULL; | 206 return NULL; |
172 } | 207 } |
173 | 208 |
| 209 void ExtensionManagement::OnExtensionPrefChanged() { |
| 210 Refresh(); |
| 211 NotifyExtensionManagementPrefChanged(); |
| 212 } |
| 213 |
| 214 void ExtensionManagement::NotifyExtensionManagementPrefChanged() { |
| 215 FOR_EACH_OBSERVER( |
| 216 Observer, observer_list_, OnExtensionManagementSettingsChanged()); |
| 217 } |
| 218 |
174 ExtensionManagement::IndividualSettings* ExtensionManagement::AccessById( | 219 ExtensionManagement::IndividualSettings* ExtensionManagement::AccessById( |
175 const ExtensionId& id) { | 220 const ExtensionId& id) { |
176 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; | 221 DCHECK(crx_file::id_util::IdIsValid(id)) << "Invalid ID: " << id; |
177 SettingsIdMap::iterator it = settings_by_id_.find(id); | 222 SettingsIdMap::iterator it = settings_by_id_.find(id); |
178 if (it == settings_by_id_.end()) | 223 if (it == settings_by_id_.end()) |
179 it = settings_by_id_.insert(std::make_pair(id, default_settings_)).first; | 224 it = settings_by_id_.insert(std::make_pair(id, default_settings_)).first; |
180 return &it->second; | 225 return &it->second; |
181 } | 226 } |
182 | 227 |
| 228 ExtensionManagement* ExtensionManagementFactory::GetForBrowserContext( |
| 229 content::BrowserContext* context) { |
| 230 return static_cast<ExtensionManagement*>( |
| 231 GetInstance()->GetServiceForBrowserContext(context, true)); |
| 232 } |
| 233 |
| 234 ExtensionManagementFactory* ExtensionManagementFactory::GetInstance() { |
| 235 return Singleton<ExtensionManagementFactory>::get(); |
| 236 } |
| 237 |
| 238 ExtensionManagementFactory::ExtensionManagementFactory() |
| 239 : BrowserContextKeyedServiceFactory( |
| 240 "ExtensionManagement", |
| 241 BrowserContextDependencyManager::GetInstance()) { |
| 242 } |
| 243 |
| 244 ExtensionManagementFactory::~ExtensionManagementFactory() { |
| 245 } |
| 246 |
| 247 KeyedService* ExtensionManagementFactory::BuildServiceInstanceFor( |
| 248 content::BrowserContext* context) const { |
| 249 return new ExtensionManagement( |
| 250 Profile::FromBrowserContext(context)->GetPrefs()); |
| 251 } |
| 252 |
183 } // namespace extensions | 253 } // namespace extensions |
OLD | NEW |