| Index: chrome/browser/policy/cloud/cloud_policy_manager.cc
|
| diff --git a/chrome/browser/policy/cloud/cloud_policy_manager.cc b/chrome/browser/policy/cloud/cloud_policy_manager.cc
|
| index 9f17ea1cd9be9a602b78773c8fdcaf251f627710..c58809c05e111148a4241d836f42e8e703eb3f7f 100644
|
| --- a/chrome/browser/policy/cloud/cloud_policy_manager.cc
|
| +++ b/chrome/browser/policy/cloud/cloud_policy_manager.cc
|
| @@ -6,20 +6,32 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| +#include "base/command_line.h"
|
| +#include "base/files/file_path.h"
|
| #include "base/logging.h"
|
| #include "base/prefs/pref_service.h"
|
| #include "chrome/browser/policy/cloud/cloud_policy_service.h"
|
| #include "components/policy/core/common/policy_bundle.h"
|
| #include "components/policy/core/common/policy_map.h"
|
| +#include "components/policy/core/common/policy_switches.h"
|
| +#include "net/url_request/url_request_context_getter.h"
|
| +
|
| +#if !defined(OS_ANDROID) && !defined(OS_IOS)
|
| +#include "chrome/browser/policy/cloud/resource_cache.h"
|
| +#endif
|
|
|
| namespace policy {
|
|
|
| CloudPolicyManager::CloudPolicyManager(
|
| const PolicyNamespaceKey& policy_ns_key,
|
| CloudPolicyStore* cloud_policy_store,
|
| - const scoped_refptr<base::SequencedTaskRunner>& task_runner)
|
| + const scoped_refptr<base::SequencedTaskRunner>& task_runner,
|
| + const scoped_refptr<base::SequencedTaskRunner>& file_task_runner,
|
| + const scoped_refptr<base::SequencedTaskRunner>& io_task_runner)
|
| : core_(policy_ns_key, cloud_policy_store, task_runner),
|
| - waiting_for_policy_refresh_(false) {
|
| + waiting_for_policy_refresh_(false),
|
| + file_task_runner_(file_task_runner),
|
| + io_task_runner_(io_task_runner) {
|
| store()->AddObserver(this);
|
|
|
| // If the underlying store is already initialized, publish the loaded
|
| @@ -33,6 +45,7 @@ CloudPolicyManager::CloudPolicyManager(
|
| CloudPolicyManager::~CloudPolicyManager() {}
|
|
|
| void CloudPolicyManager::Shutdown() {
|
| + component_policy_service_.reset();
|
| core_.Disconnect();
|
| store()->RemoveObserver(this);
|
| ConfigurationPolicyProvider::Shutdown();
|
| @@ -41,6 +54,10 @@ void CloudPolicyManager::Shutdown() {
|
| bool CloudPolicyManager::IsInitializationComplete(PolicyDomain domain) const {
|
| if (domain == POLICY_DOMAIN_CHROME)
|
| return store()->is_initialized();
|
| + if (ComponentCloudPolicyService::SupportsDomain(domain) &&
|
| + component_policy_service_) {
|
| + return component_policy_service_->is_initialized();
|
| + }
|
| return true;
|
| }
|
|
|
| @@ -68,18 +85,51 @@ void CloudPolicyManager::OnStoreError(CloudPolicyStore* cloud_policy_store) {
|
| CheckAndPublishPolicy();
|
| }
|
|
|
| +void CloudPolicyManager::OnComponentCloudPolicyUpdated() {
|
| + CheckAndPublishPolicy();
|
| +}
|
| +
|
| void CloudPolicyManager::CheckAndPublishPolicy() {
|
| if (IsInitializationComplete(POLICY_DOMAIN_CHROME) &&
|
| !waiting_for_policy_refresh_) {
|
| - UpdatePolicy(CreatePolicyBundle());
|
| + scoped_ptr<PolicyBundle> bundle(new PolicyBundle);
|
| + bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
|
| + .CopyFrom(store()->policy_map());
|
| + if (component_policy_service_)
|
| + bundle->MergeFrom(component_policy_service_->policy());
|
| + UpdatePolicy(bundle.Pass());
|
| }
|
| }
|
|
|
| -scoped_ptr<PolicyBundle> CloudPolicyManager::CreatePolicyBundle() {
|
| - scoped_ptr<PolicyBundle> bundle(new PolicyBundle);
|
| - bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
|
| - .CopyFrom(store()->policy_map());
|
| - return bundle.Pass();
|
| +void CloudPolicyManager::CreateComponentCloudPolicyService(
|
| + const base::FilePath& policy_cache_path,
|
| + const scoped_refptr<net::URLRequestContextGetter>& request_context) {
|
| +#if !defined(OS_ANDROID) && !defined(OS_IOS)
|
| + // Init() must have been called.
|
| + DCHECK(schema_registry());
|
| + // Called at most once.
|
| + DCHECK(!component_policy_service_);
|
| +
|
| + if (!CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableComponentCloudPolicy) ||
|
| + policy_cache_path.empty()) {
|
| + return;
|
| + }
|
| +
|
| + // TODO(joaodasilva): Move the |file_task_runner_| to the blocking pool.
|
| + // Currently it's not possible because the ComponentCloudPolicyStore is
|
| + // NonThreadSafe and doesn't support getting calls from different threads.
|
| + scoped_ptr<ResourceCache> resource_cache(
|
| + new ResourceCache(policy_cache_path, file_task_runner_));
|
| + component_policy_service_.reset(new ComponentCloudPolicyService(
|
| + this,
|
| + schema_registry(),
|
| + core(),
|
| + resource_cache.Pass(),
|
| + request_context,
|
| + file_task_runner_,
|
| + io_task_runner_));
|
| +#endif // !defined(OS_ANDROID) && !defined(OS_IOS)
|
| }
|
|
|
| void CloudPolicyManager::OnRefreshComplete(bool success) {
|
|
|