Index: chrome/browser/policy/cloud/component_cloud_policy_service.cc |
diff --git a/chrome/browser/policy/cloud/component_cloud_policy_service.cc b/chrome/browser/policy/cloud/component_cloud_policy_service.cc |
index c27215159428a1e9b096c0aeaac7cd7e27b28a74..c66f37a3859ae4c0de7b58209d57bfc99a73f8a5 100644 |
--- a/chrome/browser/policy/cloud/component_cloud_policy_service.cc |
+++ b/chrome/browser/policy/cloud/component_cloud_policy_service.cc |
@@ -15,6 +15,7 @@ |
#include "chrome/browser/policy/cloud/component_cloud_policy_store.h" |
#include "chrome/browser/policy/cloud/component_cloud_policy_updater.h" |
#include "chrome/browser/policy/cloud/resource_cache.h" |
+#include "chrome/browser/policy/policy_domain_descriptor.h" |
#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h" |
#include "content/public/browser/browser_thread.h" |
#include "net/url_request/url_request_context_getter.h" |
@@ -23,6 +24,19 @@ namespace em = enterprise_management; |
namespace policy { |
+namespace { |
+ |
+void GetComponentIds(scoped_refptr<const PolicyDomainDescriptor>& descriptor, |
+ std::set<std::string>* set) { |
+ const PolicyDomainDescriptor::SchemaMap& map = descriptor->components(); |
+ for (PolicyDomainDescriptor::SchemaMap::const_iterator it = map.begin(); |
+ it != map.end(); ++it) { |
+ set->insert(it->first); |
+ } |
+} |
+ |
+} // namespace |
+ |
const char ComponentCloudPolicyService::kComponentNamespaceCache[] = |
"component-namespace-cache"; |
@@ -63,11 +77,15 @@ class ComponentCloudPolicyService::Backend |
// ComponentCloudPolicyStore::Delegate implementation: |
virtual void OnComponentCloudPolicyStoreUpdated() OVERRIDE; |
- // Passes the current list of components in |domain|, so that the disk cache |
+ // Passes the current descriptor of a domain, so that the disk cache |
// can purge components that aren't being tracked anymore. |
- void SetCurrentComponents(PolicyDomain domain, const StringSet* components); |
+ void RegisterPolicyDomain( |
+ scoped_refptr<const PolicyDomainDescriptor> descriptor); |
private: |
+ typedef std::map<PolicyDomain, scoped_refptr<const PolicyDomainDescriptor> > |
+ DomainMap; |
+ |
scoped_ptr<ComponentMap> ReadCachedComponents(); |
base::WeakPtr<ComponentCloudPolicyService> service_; |
@@ -75,6 +93,7 @@ class ComponentCloudPolicyService::Backend |
scoped_ptr<ResourceCache> cache_; |
scoped_ptr<ComponentCloudPolicyStore> store_; |
scoped_ptr<ComponentCloudPolicyUpdater> updater_; |
+ DomainMap domain_map_; |
DISALLOW_COPY_AND_ASSIGN(Backend); |
}; |
@@ -95,7 +114,7 @@ void ComponentCloudPolicyService::Backend::Init() { |
} |
void ComponentCloudPolicyService::Backend::FinalizeInit() { |
- // Read the components that were cached in the last SetCurrentComponents() |
+ // Read the components that were cached in the last RegisterPolicyDomain() |
// calls for each domain. |
scoped_ptr<ComponentMap> components = ReadCachedComponents(); |
@@ -138,6 +157,11 @@ void ComponentCloudPolicyService::Backend:: |
OnComponentCloudPolicyStoreUpdated() { |
scoped_ptr<PolicyBundle> bundle(new PolicyBundle); |
bundle->CopyFrom(store_->policy()); |
+ for (DomainMap::iterator it = domain_map_.begin(); |
+ it != domain_map_.end(); ++it) { |
+ it->second->FilterBundle(bundle.get()); |
+ } |
+ |
content::BrowserThread::PostTask( |
content::BrowserThread::UI, FROM_HERE, |
base::Bind(&ComponentCloudPolicyService::OnPolicyUpdated, |
@@ -145,25 +169,27 @@ void ComponentCloudPolicyService::Backend:: |
base::Passed(&bundle))); |
} |
-void ComponentCloudPolicyService::Backend::SetCurrentComponents( |
- PolicyDomain domain, |
- const StringSet* components) { |
+void ComponentCloudPolicyService::Backend::RegisterPolicyDomain( |
+ scoped_refptr<const PolicyDomainDescriptor> descriptor) { |
// Store the current list of components in the cache. |
+ StringSet ids; |
std::string policy_type; |
- if (ComponentCloudPolicyStore::GetPolicyType(domain, &policy_type)) { |
+ if (ComponentCloudPolicyStore::GetPolicyType(descriptor->domain(), |
+ &policy_type)) { |
+ GetComponentIds(descriptor, &ids); |
Pickle pickle; |
- for (StringSet::const_iterator it = components->begin(); |
- it != components->end(); ++it) { |
+ for (StringSet::const_iterator it = ids.begin(); it != ids.end(); ++it) |
pickle.WriteString(*it); |
- } |
std::string data(reinterpret_cast<const char*>(pickle.data()), |
pickle.size()); |
cache_->Store(kComponentNamespaceCache, policy_type, data); |
} |
+ domain_map_[descriptor->domain()] = descriptor; |
+ |
// Purge any components that have been removed. |
if (store_) |
- store_->Purge(domain, *components); |
+ store_->Purge(descriptor->domain(), ids); |
} |
scoped_ptr<ComponentCloudPolicyService::ComponentMap> |
@@ -262,25 +288,27 @@ void ComponentCloudPolicyService::Disconnect() { |
} |
void ComponentCloudPolicyService::RegisterPolicyDomain( |
- PolicyDomain domain, |
- const std::set<std::string>& current_ids) { |
+ scoped_refptr<const PolicyDomainDescriptor> descriptor) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- DCHECK(SupportsDomain(domain)); |
+ DCHECK(SupportsDomain(descriptor->domain())); |
- // Send the new set to the backend, to purge the cache. |
- backend_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&Backend::SetCurrentComponents, |
- base::Unretained(backend_), |
- domain, |
- base::Owned(new StringSet(current_ids)))); |
+ // Send the new descriptor to the backend, to purge the cache. |
+ backend_task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&Backend::RegisterPolicyDomain, |
+ base::Unretained(backend_), |
+ descriptor)); |
// Register the current list of components for |domain| at the |client_|. |
- StringSet& registered_ids = registered_components_[domain]; |
+ StringSet current_ids; |
+ GetComponentIds(descriptor, ¤t_ids); |
+ StringSet& registered_ids = registered_components_[descriptor->domain()]; |
if (client_ && is_initialized()) { |
- if (UpdateClientNamespaces(domain, registered_ids, current_ids)) |
+ if (UpdateClientNamespaces( |
+ descriptor->domain(), registered_ids, current_ids)) { |
delegate_->OnComponentCloudPolicyRefreshNeeded(); |
+ } |
} |
+ |
registered_ids = current_ids; |
} |