| Index: chrome/browser/extensions/settings/managed_value_store_cache.cc
|
| diff --git a/chrome/browser/extensions/settings/managed_value_store_cache.cc b/chrome/browser/extensions/settings/managed_value_store_cache.cc
|
| index 9327e859ffc5bac36c6c8bd0201faf6ffa780c6a..06f786857e18c545abdb8bcb4997a2bfc75f0dd9 100644
|
| --- a/chrome/browser/extensions/settings/managed_value_store_cache.cc
|
| +++ b/chrome/browser/extensions/settings/managed_value_store_cache.cc
|
| @@ -4,11 +4,13 @@
|
|
|
| #include "chrome/browser/extensions/settings/managed_value_store_cache.h"
|
|
|
| +#include <set>
|
| +
|
| #include "base/logging.h"
|
| #include "base/message_loop_proxy.h"
|
| #include "base/sequenced_task_runner.h"
|
| -#include "chrome/browser/policy/policy_service.h"
|
| #include "chrome/browser/value_store/policy_value_store.h"
|
| +#include "chrome/browser/value_store/value_store_change.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "content/public/browser/browser_thread.h"
|
|
|
| @@ -17,13 +19,22 @@ using content::BrowserThread;
|
| namespace extensions {
|
|
|
| ManagedValueStoreCache::ManagedValueStoreCache(
|
| - policy::PolicyService* policy_service)
|
| - : policy_service_(policy_service) {}
|
| + policy::PolicyService* policy_service,
|
| + scoped_refptr<SettingsObserverList> observers)
|
| + : policy_service_(policy_service),
|
| + observers_(observers) {
|
| + policy_service_->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
|
| +}
|
|
|
| ManagedValueStoreCache::~ManagedValueStoreCache() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| }
|
|
|
| +void ManagedValueStoreCache::ShutdownOnUI() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + policy_service_->RemoveObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
|
| +}
|
| +
|
| scoped_refptr<base::MessageLoopProxy>
|
| ManagedValueStoreCache::GetMessageLoop() const {
|
| return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
|
| @@ -45,4 +56,37 @@ void ManagedValueStoreCache::DeleteStorageSoon(
|
| // There's no real storage backing this cache, so this is a nop.
|
| }
|
|
|
| +void ManagedValueStoreCache::OnPolicyUpdated(policy::PolicyDomain domain,
|
| + const std::string& component_id,
|
| + const policy::PolicyMap& previous,
|
| + const policy::PolicyMap& current) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + ValueStoreChangeList changes;
|
| + std::set<std::string> changed_keys;
|
| + previous.GetDifferingKeys(current, &changed_keys);
|
| + for (std::set<std::string>::iterator it = changed_keys.begin();
|
| + it != changed_keys.end(); ++it) {
|
| + // A policy might've changed only its scope or level, while the value
|
| + // stayed the same. Events should be triggered only for mandatory values
|
| + // that have changed.
|
| + const policy::PolicyMap::Entry* old_entry = previous.Get(*it);
|
| + const policy::PolicyMap::Entry* new_entry = current.Get(*it);
|
| + scoped_ptr<base::Value> old_value;
|
| + scoped_ptr<base::Value> new_value;
|
| + if (old_entry && old_entry->level == policy::POLICY_LEVEL_MANDATORY)
|
| + old_value.reset(old_entry->value->DeepCopy());
|
| + if (new_entry && new_entry->level == policy::POLICY_LEVEL_MANDATORY)
|
| + new_value.reset(new_entry->value->DeepCopy());
|
| + if (!base::Value::Equals(old_value.get(), new_value.get())) {
|
| + changes.push_back(
|
| + ValueStoreChange(*it, old_value.release(), new_value.release()));
|
| + }
|
| + }
|
| + observers_->Notify(
|
| + &SettingsObserver::OnSettingsChanged,
|
| + component_id,
|
| + settings_namespace::MANAGED,
|
| + ValueStoreChange::ToJson(changes));
|
| +}
|
| +
|
| } // namespace extensions
|
|
|