Index: chrome/browser/policy/policy_service_impl.cc |
diff --git a/chrome/browser/policy/policy_service_impl.cc b/chrome/browser/policy/policy_service_impl.cc |
deleted file mode 100644 |
index 6515cf9017a9b77a2acfc5ae4c7bd0ad597a5de2..0000000000000000000000000000000000000000 |
--- a/chrome/browser/policy/policy_service_impl.cc |
+++ /dev/null |
@@ -1,222 +0,0 @@ |
-// Copyright (c) 2012 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/policy_service_impl.h" |
- |
-#include <algorithm> |
- |
-#include "base/bind.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/stl_util.h" |
-#include "components/policy/core/common/policy_bundle.h" |
-#include "components/policy/core/common/policy_map.h" |
- |
-namespace policy { |
- |
-typedef PolicyServiceImpl::Providers::const_iterator Iterator; |
- |
-PolicyServiceImpl::PolicyServiceImpl( |
- const Providers& providers, |
- const PreprocessCallback& preprocess_callback) |
- : preprocess_callback_(preprocess_callback), |
- update_task_ptr_factory_(this) { |
- for (int domain = 0; domain < POLICY_DOMAIN_SIZE; ++domain) |
- initialization_complete_[domain] = true; |
- providers_ = providers; |
- for (Iterator it = providers.begin(); it != providers.end(); ++it) { |
- ConfigurationPolicyProvider* provider = *it; |
- provider->AddObserver(this); |
- for (int domain = 0; domain < POLICY_DOMAIN_SIZE; ++domain) { |
- initialization_complete_[domain] &= |
- provider->IsInitializationComplete(static_cast<PolicyDomain>(domain)); |
- } |
- } |
- // There are no observers yet, but calls to GetPolicies() should already get |
- // the processed policy values. |
- MergeAndTriggerUpdates(); |
-} |
- |
-PolicyServiceImpl::~PolicyServiceImpl() { |
- for (Iterator it = providers_.begin(); it != providers_.end(); ++it) |
- (*it)->RemoveObserver(this); |
- STLDeleteValues(&observers_); |
-} |
- |
-void PolicyServiceImpl::AddObserver(PolicyDomain domain, |
- PolicyService::Observer* observer) { |
- Observers*& list = observers_[domain]; |
- if (!list) |
- list = new Observers(); |
- list->AddObserver(observer); |
-} |
- |
-void PolicyServiceImpl::RemoveObserver(PolicyDomain domain, |
- PolicyService::Observer* observer) { |
- ObserverMap::iterator it = observers_.find(domain); |
- if (it == observers_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- it->second->RemoveObserver(observer); |
- if (!it->second->might_have_observers()) { |
- delete it->second; |
- observers_.erase(it); |
- } |
-} |
- |
-const PolicyMap& PolicyServiceImpl::GetPolicies( |
- const PolicyNamespace& ns) const { |
- return policy_bundle_.Get(ns); |
-} |
- |
-bool PolicyServiceImpl::IsInitializationComplete(PolicyDomain domain) const { |
- DCHECK(domain >= 0 && domain < POLICY_DOMAIN_SIZE); |
- return initialization_complete_[domain]; |
-} |
- |
-void PolicyServiceImpl::RefreshPolicies(const base::Closure& callback) { |
- if (!callback.is_null()) |
- refresh_callbacks_.push_back(callback); |
- |
- if (providers_.empty()) { |
- // Refresh is immediately complete if there are no providers. See the note |
- // on OnUpdatePolicy() about why this is a posted task. |
- update_task_ptr_factory_.InvalidateWeakPtrs(); |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&PolicyServiceImpl::MergeAndTriggerUpdates, |
- update_task_ptr_factory_.GetWeakPtr())); |
- } else { |
- // Some providers might invoke OnUpdatePolicy synchronously while handling |
- // RefreshPolicies. Mark all as pending before refreshing. |
- for (Iterator it = providers_.begin(); it != providers_.end(); ++it) |
- refresh_pending_.insert(*it); |
- for (Iterator it = providers_.begin(); it != providers_.end(); ++it) |
- (*it)->RefreshPolicies(); |
- } |
-} |
- |
-void PolicyServiceImpl::OnUpdatePolicy(ConfigurationPolicyProvider* provider) { |
- DCHECK_EQ(1, std::count(providers_.begin(), providers_.end(), provider)); |
- refresh_pending_.erase(provider); |
- |
- // Note: a policy change may trigger further policy changes in some providers. |
- // For example, disabling SigninAllowed would cause the CloudPolicyManager to |
- // drop all its policies, which makes this method enter again for that |
- // provider. |
- // |
- // Therefore this update is posted asynchronously, to prevent reentrancy in |
- // MergeAndTriggerUpdates. Also, cancel a pending update if there is any, |
- // since both will produce the same PolicyBundle. |
- update_task_ptr_factory_.InvalidateWeakPtrs(); |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&PolicyServiceImpl::MergeAndTriggerUpdates, |
- update_task_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void PolicyServiceImpl::NotifyNamespaceUpdated( |
- const PolicyNamespace& ns, |
- const PolicyMap& previous, |
- const PolicyMap& current) { |
- ObserverMap::iterator iterator = observers_.find(ns.domain); |
- if (iterator != observers_.end()) { |
- FOR_EACH_OBSERVER(PolicyService::Observer, |
- *iterator->second, |
- OnPolicyUpdated(ns, previous, current)); |
- } |
-} |
- |
-void PolicyServiceImpl::MergeAndTriggerUpdates() { |
- // Merge from each provider in their order of priority. |
- PolicyBundle bundle; |
- for (Iterator it = providers_.begin(); it != providers_.end(); ++it) { |
- PolicyBundle provided_bundle; |
- provided_bundle.CopyFrom((*it)->policies()); |
- if (!preprocess_callback_.is_null()) |
- preprocess_callback_.Run(&provided_bundle); |
- bundle.MergeFrom(provided_bundle); |
- } |
- |
- // Swap first, so that observers that call GetPolicies() see the current |
- // values. |
- policy_bundle_.Swap(&bundle); |
- |
- // Only notify observers of namespaces that have been modified. |
- const PolicyMap kEmpty; |
- PolicyBundle::const_iterator it_new = policy_bundle_.begin(); |
- PolicyBundle::const_iterator end_new = policy_bundle_.end(); |
- PolicyBundle::const_iterator it_old = bundle.begin(); |
- PolicyBundle::const_iterator end_old = bundle.end(); |
- while (it_new != end_new && it_old != end_old) { |
- if (it_new->first < it_old->first) { |
- // A new namespace is available. |
- NotifyNamespaceUpdated(it_new->first, kEmpty, *it_new->second); |
- ++it_new; |
- } else if (it_old->first < it_new->first) { |
- // A previously available namespace is now gone. |
- NotifyNamespaceUpdated(it_old->first, *it_old->second, kEmpty); |
- ++it_old; |
- } else { |
- if (!it_new->second->Equals(*it_old->second)) { |
- // An existing namespace's policies have changed. |
- NotifyNamespaceUpdated(it_new->first, *it_old->second, *it_new->second); |
- } |
- ++it_new; |
- ++it_old; |
- } |
- } |
- |
- // Send updates for the remaining new namespaces, if any. |
- for (; it_new != end_new; ++it_new) |
- NotifyNamespaceUpdated(it_new->first, kEmpty, *it_new->second); |
- |
- // Sends updates for the remaining removed namespaces, if any. |
- for (; it_old != end_old; ++it_old) |
- NotifyNamespaceUpdated(it_old->first, *it_old->second, kEmpty); |
- |
- CheckInitializationComplete(); |
- CheckRefreshComplete(); |
-} |
- |
-void PolicyServiceImpl::CheckInitializationComplete() { |
- // Check if all the providers just became initialized for each domain; if so, |
- // notify that domain's observers. |
- for (int domain = 0; domain < POLICY_DOMAIN_SIZE; ++domain) { |
- if (initialization_complete_[domain]) |
- continue; |
- |
- PolicyDomain policy_domain = static_cast<PolicyDomain>(domain); |
- |
- bool all_complete = true; |
- for (Iterator it = providers_.begin(); it != providers_.end(); ++it) { |
- if (!(*it)->IsInitializationComplete(policy_domain)) { |
- all_complete = false; |
- break; |
- } |
- } |
- if (all_complete) { |
- initialization_complete_[domain] = true; |
- ObserverMap::iterator iter = observers_.find(policy_domain); |
- if (iter != observers_.end()) { |
- FOR_EACH_OBSERVER(PolicyService::Observer, |
- *iter->second, |
- OnPolicyServiceInitialized(policy_domain)); |
- } |
- } |
- } |
-} |
- |
-void PolicyServiceImpl::CheckRefreshComplete() { |
- // Invoke all the callbacks if a refresh has just fully completed. |
- if (refresh_pending_.empty() && !refresh_callbacks_.empty()) { |
- std::vector<base::Closure> callbacks; |
- callbacks.swap(refresh_callbacks_); |
- std::vector<base::Closure>::iterator it; |
- for (it = callbacks.begin(); it != callbacks.end(); ++it) |
- it->Run(); |
- } |
-} |
- |
-} // namespace policy |