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

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

Issue 92263002: Move AsyncPolicyProvider, etc. to components/policy/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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
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
« no previous file with comments | « chrome/browser/policy/async_policy_provider.h ('k') | chrome/browser/policy/async_policy_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698