Chromium Code Reviews| 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); |
|
not at google - send to devlin
2012/07/25 00:49:02
Just FYI, there is ScopedObserver in base; a littl
Joao da Silva
2012/07/25 12:52:13
Can't be used here for 2 reasons: PolicyService::A
|
| +} |
| 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 |