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

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

Issue 109743002: Move policy code into components/policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: moar fixes Created 7 years 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
« no previous file with comments | « chrome/browser/policy/policy_service_impl.h ('k') | chrome/browser/policy/policy_service_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « chrome/browser/policy/policy_service_impl.h ('k') | chrome/browser/policy/policy_service_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698