Index: chrome/browser/policy/async_policy_provider.cc |
diff --git a/chrome/browser/policy/async_policy_provider.cc b/chrome/browser/policy/async_policy_provider.cc |
deleted file mode 100644 |
index 3f38960039a8a66b596834e28f04e3d095edf19f..0000000000000000000000000000000000000000 |
--- a/chrome/browser/policy/async_policy_provider.cc |
+++ /dev/null |
@@ -1,134 +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/async_policy_provider.h" |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/location.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/message_loop/message_loop_proxy.h" |
-#include "base/sequenced_task_runner.h" |
-#include "chrome/browser/policy/async_policy_loader.h" |
-#include "components/policy/core/common/policy_bundle.h" |
-#include "components/policy/core/common/schema_registry.h" |
- |
-namespace policy { |
- |
-AsyncPolicyProvider::AsyncPolicyProvider( |
- SchemaRegistry* registry, |
- scoped_ptr<AsyncPolicyLoader> loader) |
- : loader_(loader.release()), |
- weak_factory_(this) { |
- // Make an immediate synchronous load on startup. |
- OnLoaderReloaded(loader_->InitialLoad(registry->schema_map())); |
-} |
- |
-AsyncPolicyProvider::~AsyncPolicyProvider() { |
- DCHECK(CalledOnValidThread()); |
- // Shutdown() must have been called before. |
- DCHECK(!loader_); |
-} |
- |
-void AsyncPolicyProvider::Init(SchemaRegistry* registry) { |
- DCHECK(CalledOnValidThread()); |
- ConfigurationPolicyProvider::Init(registry); |
- |
- if (!loader_) |
- return; |
- |
- AsyncPolicyLoader::UpdateCallback callback = |
- base::Bind(&AsyncPolicyProvider::LoaderUpdateCallback, |
- base::MessageLoopProxy::current(), |
- weak_factory_.GetWeakPtr()); |
- bool post = loader_->task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&AsyncPolicyLoader::Init, |
- base::Unretained(loader_), |
- callback)); |
- DCHECK(post) << "AsyncPolicyProvider::Init() called with threads not running"; |
-} |
- |
-void AsyncPolicyProvider::Shutdown() { |
- DCHECK(CalledOnValidThread()); |
- // Note on the lifetime of |loader_|: |
- // The |loader_| lives on the background thread, and is deleted from here. |
- // This means that posting tasks on the |loader_| to the background thread |
- // from the AsyncPolicyProvider is always safe, since a potential DeleteSoon() |
- // is only posted from here. The |loader_| posts back to the |
- // AsyncPolicyProvider through the |update_callback_|, which has a WeakPtr to |
- // |this|. |
- if (!loader_->task_runner()->DeleteSoon(FROM_HERE, loader_)) { |
- // The background thread doesn't exist; this only happens on unit tests. |
- delete loader_; |
- } |
- loader_ = NULL; |
- ConfigurationPolicyProvider::Shutdown(); |
-} |
- |
-void AsyncPolicyProvider::RefreshPolicies() { |
- DCHECK(CalledOnValidThread()); |
- |
- // Subtle: RefreshPolicies() has a contract that requires the next policy |
- // update notification (triggered from UpdatePolicy()) to reflect any changes |
- // made before this call. So if a caller has modified the policy settings and |
- // invoked RefreshPolicies(), then by the next notification these policies |
- // should already be provided. |
- // However, it's also possible that an asynchronous Reload() is in progress |
- // and just posted OnLoaderReloaded(). Therefore a task is posted to the |
- // background thread before posting the next Reload, to prevent a potential |
- // concurrent Reload() from triggering a notification too early. If another |
- // refresh task has been posted, it is invalidated now. |
- if (!loader_) |
- return; |
- refresh_callback_.Reset( |
- base::Bind(&AsyncPolicyProvider::ReloadAfterRefreshSync, |
- weak_factory_.GetWeakPtr())); |
- loader_->task_runner()->PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(base::DoNothing), |
- refresh_callback_.callback()); |
-} |
- |
-void AsyncPolicyProvider::ReloadAfterRefreshSync() { |
- DCHECK(CalledOnValidThread()); |
- // This task can only enter if it was posted from RefreshPolicies(), and it |
- // hasn't been cancelled meanwhile by another call to RefreshPolicies(). |
- DCHECK(!refresh_callback_.IsCancelled()); |
- // There can't be another refresh callback pending now, since its creation |
- // in RefreshPolicies() would have cancelled the current execution. So it's |
- // safe to cancel the |refresh_callback_| now, so that OnLoaderReloaded() |
- // sees that there is no refresh pending. |
- refresh_callback_.Cancel(); |
- |
- if (!loader_) |
- return; |
- |
- loader_->task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&AsyncPolicyLoader::RefreshPolicies, |
- base::Unretained(loader_), |
- schema_map())); |
-} |
- |
-void AsyncPolicyProvider::OnLoaderReloaded(scoped_ptr<PolicyBundle> bundle) { |
- DCHECK(CalledOnValidThread()); |
- // Only propagate policy updates if there are no pending refreshes, and if |
- // Shutdown() hasn't been called yet. |
- if (refresh_callback_.IsCancelled() && loader_) |
- UpdatePolicy(bundle.Pass()); |
-} |
- |
-// static |
-void AsyncPolicyProvider::LoaderUpdateCallback( |
- scoped_refptr<base::MessageLoopProxy> loop, |
- base::WeakPtr<AsyncPolicyProvider> weak_this, |
- scoped_ptr<PolicyBundle> bundle) { |
- loop->PostTask(FROM_HERE, |
- base::Bind(&AsyncPolicyProvider::OnLoaderReloaded, |
- weak_this, |
- base::Passed(&bundle))); |
-} |
- |
-} // namespace policy |