Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: chrome/browser/policy/cloud_policy_provider.cc

Issue 6979011: Move user cloud policy to BrowserProcess. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments by mnissler. Added unittest. Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/policy/cloud_policy_provider.h"
6
7 #include <set>
8
9 #include "base/values.h"
10 #include "chrome/browser/policy/configuration_policy_pref_store.h"
11 #include "chrome/browser/policy/policy_notifier.h"
12
13 namespace policy {
14
15 CloudPolicyProvider::CloudPolicyProvider(
16 const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list,
17 CloudPolicyCacheBase::PolicyLevel level)
18 : ConfigurationPolicyProvider(policy_list),
19 cache_(NULL),
20 level_(level) {}
21
22 CloudPolicyProvider::~CloudPolicyProvider() {
23 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
24 observer_list_, OnProviderGoingAway());
25 if (cache_)
26 cache_->RemoveObserver(this);
27 }
28
29 void CloudPolicyProvider::set_cache(CloudPolicyCacheBase* cache) {
30 cache_ = cache;
31 cache_->AddObserver(this);
Joao da Silva 2011/05/31 14:50:23 If this can replace a previous cache, shouldn't it
sfeuz 2011/06/03 08:30:35 Good point. However in the new design caches can't
32 }
33
34 bool CloudPolicyProvider::Provide(ConfigurationPolicyStoreInterface* store) {
35 if (!cache_)
36 return false;
37 if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_MANDATORY)
38 ApplyPolicyMap(cache_->mandatory_policy(), store);
39 else if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED)
40 ApplyPolicyMap(cache_->recommended_policy(), store);
41 return true;
42 }
43
44 bool CloudPolicyProvider::IsInitializationComplete() const {
45 return cache_ && cache_->initialization_complete();
Joao da Silva 2011/05/31 14:50:23 It would be nicer to have consistent naming for th
sfeuz 2011/06/03 08:30:35 I followed the convention that initialization_comp
46 }
47
48 void CloudPolicyProvider::AddObserver(
49 ConfigurationPolicyProvider::Observer* observer) {
50 observer_list_.AddObserver(observer);
51 }
52 void CloudPolicyProvider::RemoveObserver(
53 ConfigurationPolicyProvider::Observer* observer) {
54 observer_list_.RemoveObserver(observer);
55 }
56
57 void CloudPolicyProvider::OnCacheUpdate() {
58 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
59 observer_list_, OnUpdatePolicy());
60 }
61
62 void CloudPolicyProvider::OnCacheGoingAway() {
63 cache_->RemoveObserver(this);
64 cache_ = NULL;
65 }
66
67 PolicyMap* CloudPolicyProvider::policy_map() {
Joao da Silva 2011/05/31 14:50:23 Return const here?
sfeuz 2011/06/03 08:30:35 Obsolete.
68 if (!cache_)
69 return NULL;
70 if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_MANDATORY)
71 return cache_->mandatory_policy();
72 else if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED)
73 return cache_->recommended_policy();
74 NOTREACHED();
75 return NULL;
76 }
77
78 CombiningCloudPolicyProvider::CombiningCloudPolicyProvider(
79 const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list)
80 : ConfigurationPolicyProvider(policy_list) {}
81
82 CombiningCloudPolicyProvider::~CombiningCloudPolicyProvider() {
83 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
84 observer_list_, OnProviderGoingAway());
85 }
86
87 void CombiningCloudPolicyProvider::AddCloudPolicyProvider(
88 CloudPolicyProvider* cloud_policy_provider) {
89 cloud_policy_providers_.push_back(
90 new CloudPolicyProviderWithObserver(this,
91 cloud_policy_provider));
92 }
93
94 bool CombiningCloudPolicyProvider::Provide(
95 ConfigurationPolicyStoreInterface* store) {
96 typedef std::set<ConfigurationPolicyType> PolicySet;
97 PolicySet already_applied;
98 PolicySet newly_applied;
99 for (ListType::iterator i = cloud_policy_providers_.begin();
100 i != cloud_policy_providers_.end(); ++i) {
101 if ((*i)->cloud_policy_provider() &&
102 (*i)->cloud_policy_provider()->IsInitializationComplete()) {
Joao da Silva 2011/05/31 14:50:23 How about this to save one level of nesting and so
sfeuz 2011/06/03 08:30:35 Obsolete.
103 PolicyMap* policy_map = (*i)->cloud_policy_provider()->policy_map();
104 if (policy_map) {
Joao da Silva 2011/05/31 14:50:23 Same: if (!policy_map) continue;
sfeuz 2011/06/03 08:30:35 Obsolete.
105 const PolicyDefinitionList* policy_list(policy_definition_list());
Joao da Silva 2011/05/31 14:50:23 This can be moved outside the loop.
sfeuz 2011/06/03 08:30:35 Obsolete.
106 for (const PolicyDefinitionList::Entry* j = policy_list->begin;
107 j != policy_list->end; ++j) {
108 // Already applied by a CloudProvider which takes precedence.
109 if (already_applied.find(j->policy_type)!=already_applied.end())
Joao da Silva 2011/05/31 14:50:23 Nit: spaces around != ?
sfeuz 2011/06/03 08:30:35 Obsolete.
110 continue;
111 const Value* value = policy_map->Get(j->policy_type);
112 if (value && value->IsType(j->value_type)) {
113 newly_applied.insert(j->policy_type);
114 store->Apply(j->policy_type, value->DeepCopy());
115 }
116 }
117 // Update the already_applied PolicySet
118 for (PolicySet::iterator policy = newly_applied.begin();
119 policy != newly_applied.end(); ++policy) {
120 already_applied.insert(*policy);
121 // In case that one Proxy Policy got applied, we want to set all of
122 // them as applied. We need that in order not to end up with an
123 // inconsistend Proxy-state in case that the different Policy-related
124 // Policies got set by different CloudPolicyProviders.
125 if (*policy == kPolicyProxyMode ||
126 *policy == kPolicyProxyServerMode ||
127 *policy == kPolicyProxyServer ||
128 *policy == kPolicyProxyPacUrl ||
129 *policy == kPolicyProxyBypassList) {
130 already_applied.insert(kPolicyProxyMode);
131 already_applied.insert(kPolicyProxyServerMode);
132 already_applied.insert(kPolicyProxyServer);
133 already_applied.insert(kPolicyProxyPacUrl);
134 already_applied.insert(kPolicyProxyBypassList);
135 }
136 }
137 }
138 }
139 }
Mattias Nissler (ping if slow) 2011/05/31 14:14:19 6 levels of nesting? Compared to the existing merg
Joao da Silva 2011/05/31 14:50:23 We should discuss this code. The original only me
sfeuz 2011/06/03 08:30:35 I think we can not do much better than adding a sp
140 // Return true if we could apply at least one policy.
141 return !already_applied.empty();
142 }
143
144 bool CombiningCloudPolicyProvider::IsInitializationComplete() const {
145 bool initialization_complete = false;
146 for (ListType::const_iterator i = cloud_policy_providers_.begin();
147 i != cloud_policy_providers_.end(); ++i) {
148 initialization_complete = initialization_complete ||
Joao da Silva 2011/05/31 14:50:23 This means that initialization is complete once *a
sfeuz 2011/06/03 08:30:35 See comments above about what to return here.
149 ((*i)->cloud_policy_provider() &&
150 (*i)->cloud_policy_provider()->IsInitializationComplete());
151 }
152 return initialization_complete;
153 }
154
155 void CombiningCloudPolicyProvider::AddObserver(
156 ConfigurationPolicyProvider::Observer* observer) {
157 observer_list_.AddObserver(observer);
158 }
159
160 void CombiningCloudPolicyProvider::RemoveObserver(
161 ConfigurationPolicyProvider::Observer* observer) {
162 observer_list_.RemoveObserver(observer);
163 }
164
165 // Note: we are triggering updates even though the change might not actually be
166 // visible to the outside.
167 void CombiningCloudPolicyProvider::OnUpdatePolicy(
168 CloudPolicyProvider* cloud_policy_provider) {
169 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
170 observer_list_, OnUpdatePolicy());
171 }
172
173 // Removes the going-away CloudPolicyProvider from |cloud_policy_providers_|.
174 void CombiningCloudPolicyProvider::OnProviderGoingAway(
175 CloudPolicyProvider* cloud_policy_provider) {
176 ListType::iterator i;
177 for (i = cloud_policy_providers_.begin();
178 i != cloud_policy_providers_.end(); ++i) {
179 if ((*i)->cloud_policy_provider() == cloud_policy_provider) {
180 cloud_policy_providers_.erase(i);
181 return;
182 }
183 }
184 }
185
186 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698