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