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 |