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

Unified Diff: chrome/browser/policy/cloud_policy_provider_impl.cc

Issue 7147015: Move user cloud policy to BrowserProcess (was 6979011) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cut a circular startup dependency 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/cloud_policy_provider_impl.cc
diff --git a/chrome/browser/policy/cloud_policy_provider_impl.cc b/chrome/browser/policy/cloud_policy_provider_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a4d595e0314faa544377045be5c8b8022d4a3d54
--- /dev/null
+++ b/chrome/browser/policy/cloud_policy_provider_impl.cc
@@ -0,0 +1,145 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/policy/cloud_policy_provider_impl.h"
+
+#include <set>
+
+#include "base/values.h"
+#include "chrome/browser/policy/configuration_policy_pref_store.h"
+#include "chrome/browser/policy/policy_notifier.h"
+
+namespace policy {
+
+CloudPolicyProviderImpl::CloudPolicyProviderImpl(
+ const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list,
+ CloudPolicyCacheBase::PolicyLevel level)
+ : CloudPolicyProvider(policy_list),
+ level_(level) {}
+
+CloudPolicyProviderImpl::~CloudPolicyProviderImpl() {
+ for (ListType::iterator i = caches_.begin(); i != caches_.end(); ++i)
+ (*i)->RemoveObserver(this);
+
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
+ observer_list_, OnProviderGoingAway());
+}
+
+bool CloudPolicyProviderImpl::Provide(
+ ConfigurationPolicyStoreInterface* store) {
+ ApplyPolicyMap(&combined_, store);
+ return true;
+}
+
+bool CloudPolicyProviderImpl::IsInitializationComplete() const {
+ // If we would return false when we don't have policy, that would block the
+ // profile from being initialized. On the other hand, in case of user
+ // policies, the first policy fetch is delayed until after the profile is
+ // initialized.
Mattias Nissler (ping if slow) 2011/06/21 20:09:56 I must say I don't particularly like this. I think
gfeher 2011/06/22 19:18:34 Me neither. We could trigger the policy fetch for
+ return true;
+}
+
+void CloudPolicyProviderImpl::AddObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.AddObserver(observer);
+}
+
+void CloudPolicyProviderImpl::RemoveObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.RemoveObserver(observer);
+}
+
+void CloudPolicyProviderImpl::OnCacheUpdate(CloudPolicyCacheBase* cache) {
+ RecombineCachesAndMaybeTriggerUpdate();
+}
+
+void CloudPolicyProviderImpl::OnCacheGoingAway(CloudPolicyCacheBase* cache) {
+ cache->RemoveObserver(this);
+ for (ListType::iterator i = caches_.begin(); i != caches_.end(); ++i) {
+ if (*i == cache) {
+ caches_.erase(i);
+ break;
+ }
+ }
+
+ RecombineCachesAndMaybeTriggerUpdate();
+}
+
+void CloudPolicyProviderImpl::AppendCache(CloudPolicyCacheBase* cache) {
+ cache->AddObserver(this);
+ caches_.push_back(cache);
+ RecombineCachesAndMaybeTriggerUpdate();
+}
+
+void CloudPolicyProviderImpl::PrependCache(CloudPolicyCacheBase* cache) {
+ cache->AddObserver(this);
+ caches_.insert(caches_.begin(), cache);
+ RecombineCachesAndMaybeTriggerUpdate();
+}
+
+// static
+ConfigurationPolicyType CloudPolicyProviderImpl::proxy_policies[] = {
+ kPolicyProxyMode,
+ kPolicyProxyServerMode,
+ kPolicyProxyServer,
+ kPolicyProxyPacUrl,
+ kPolicyProxyBypassList };
Mattias Nissler (ping if slow) 2011/06/21 20:09:56 closing brace goes on next line.
gfeher 2011/06/22 19:18:34 Done.
+
+// static
+bool CloudPolicyProviderImpl::is_proxy_policy(ConfigurationPolicyType policy) {
+ const unsigned int n = arraysize(proxy_policies);
+ for (unsigned int i = 0; i < n; ++i)
Mattias Nissler (ping if slow) 2011/06/21 20:09:56 need curlies
gfeher 2011/06/22 19:18:34 Done.
+ if (proxy_policies[i] == policy)
+ return true;
+ return false;
+}
+
+// static
+unsigned int CloudPolicyProviderImpl::proxy_policy_count() {
+ return arraysize(CloudPolicyProviderImpl::proxy_policies);
+}
+
+void CloudPolicyProviderImpl::CombineTwoPolicyMaps(const PolicyMap& base,
+ const PolicyMap& overlay,
+ PolicyMap* out_map) {
+ bool added_proxy_policy = false;
+ out_map->Clear();
+
+ for (PolicyMap::const_iterator i = base.begin(); i != base.end(); ++i) {
+ out_map->Set(i->first, i->second->DeepCopy());
+ added_proxy_policy = added_proxy_policy || is_proxy_policy(i->first);
+ }
+
+ // Add every entry of |overlay| which has not been added by |base|. Only add
+ // proxy policies if none of them was added by |base|.
+ for (PolicyMap::const_iterator i = overlay.begin(); i != overlay.end(); ++i) {
+ if (is_proxy_policy(i->first)) {
+ if (!added_proxy_policy) {
+ out_map->Set(i->first, i->second->DeepCopy());
+ }
+ } else if (!out_map->Get(i->first)) {
+ out_map->Set(i->first, i->second->DeepCopy());
+ }
+ }
+}
+
+void CloudPolicyProviderImpl::RecombineCachesAndMaybeTriggerUpdate() {
+ PolicyMap newly_combined;
+ for (ListType::iterator i = caches_.begin(); i != caches_.end(); ++i) {
+ if (!(*i)->initialization_complete())
+ continue;
+ PolicyMap tmp_map;
+ CombineTwoPolicyMaps(newly_combined, *(*i)->policy(level_), &tmp_map);
+ newly_combined.Swap(&tmp_map);
+ }
+ if (newly_combined.Equals(combined_))
+ return;
+
+ // Trigger a notification if there was a change.
+ combined_.Swap(&newly_combined);
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
+ observer_list_, OnUpdatePolicy());
+}
+
+} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698