| 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
|
|
|