OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/settings/managed_value_store_cache.h" | 5 #include "chrome/browser/extensions/settings/managed_value_store_cache.h" |
6 | 6 |
| 7 #include <set> |
| 8 |
7 #include "base/logging.h" | 9 #include "base/logging.h" |
8 #include "base/message_loop_proxy.h" | 10 #include "base/message_loop_proxy.h" |
9 #include "base/sequenced_task_runner.h" | 11 #include "base/sequenced_task_runner.h" |
10 #include "chrome/browser/policy/policy_service.h" | |
11 #include "chrome/browser/value_store/policy_value_store.h" | 12 #include "chrome/browser/value_store/policy_value_store.h" |
| 13 #include "chrome/browser/value_store/value_store_change.h" |
12 #include "chrome/common/extensions/extension.h" | 14 #include "chrome/common/extensions/extension.h" |
13 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
14 | 16 |
15 using content::BrowserThread; | 17 using content::BrowserThread; |
16 | 18 |
17 namespace extensions { | 19 namespace extensions { |
18 | 20 |
19 ManagedValueStoreCache::ManagedValueStoreCache( | 21 ManagedValueStoreCache::ManagedValueStoreCache( |
20 policy::PolicyService* policy_service) | 22 policy::PolicyService* policy_service, |
21 : policy_service_(policy_service) {} | 23 scoped_refptr<SettingsObserverList> observers) |
| 24 : policy_service_(policy_service), |
| 25 observers_(observers) { |
| 26 policy_service_->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this); |
| 27 } |
22 | 28 |
23 ManagedValueStoreCache::~ManagedValueStoreCache() { | 29 ManagedValueStoreCache::~ManagedValueStoreCache() { |
24 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 30 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
25 } | 31 } |
26 | 32 |
| 33 void ManagedValueStoreCache::ShutdownOnUI() { |
| 34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 35 policy_service_->RemoveObserver(policy::POLICY_DOMAIN_EXTENSIONS, this); |
| 36 } |
| 37 |
27 scoped_refptr<base::MessageLoopProxy> | 38 scoped_refptr<base::MessageLoopProxy> |
28 ManagedValueStoreCache::GetMessageLoop() const { | 39 ManagedValueStoreCache::GetMessageLoop() const { |
29 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); | 40 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |
30 } | 41 } |
31 | 42 |
32 void ManagedValueStoreCache::RunWithValueStoreForExtension( | 43 void ManagedValueStoreCache::RunWithValueStoreForExtension( |
33 const StorageCallback& callback, | 44 const StorageCallback& callback, |
34 scoped_refptr<const Extension> extension) { | 45 scoped_refptr<const Extension> extension) { |
35 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 46 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
36 const policy::PolicyMap& policies = policy_service_->GetPolicies( | 47 const policy::PolicyMap& policies = policy_service_->GetPolicies( |
37 policy::POLICY_DOMAIN_EXTENSIONS, extension->id()); | 48 policy::POLICY_DOMAIN_EXTENSIONS, extension->id()); |
38 PolicyValueStore store(&policies); | 49 PolicyValueStore store(&policies); |
39 callback.Run(&store); | 50 callback.Run(&store); |
40 } | 51 } |
41 | 52 |
42 void ManagedValueStoreCache::DeleteStorageSoon( | 53 void ManagedValueStoreCache::DeleteStorageSoon( |
43 const std::string& extension_id) { | 54 const std::string& extension_id) { |
44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 55 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
45 // There's no real storage backing this cache, so this is a nop. | 56 // There's no real storage backing this cache, so this is a nop. |
46 } | 57 } |
47 | 58 |
| 59 void ManagedValueStoreCache::OnPolicyUpdated(policy::PolicyDomain domain, |
| 60 const std::string& component_id, |
| 61 const policy::PolicyMap& previous, |
| 62 const policy::PolicyMap& current) { |
| 63 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 64 ValueStoreChangeList changes; |
| 65 std::set<std::string> changed_keys; |
| 66 previous.GetDifferingKeys(current, &changed_keys); |
| 67 for (std::set<std::string>::iterator it = changed_keys.begin(); |
| 68 it != changed_keys.end(); ++it) { |
| 69 // A policy might've changed only its scope or level, while the value |
| 70 // stayed the same. Events should be triggered only for mandatory values |
| 71 // that have changed. |
| 72 const policy::PolicyMap::Entry* old_entry = previous.Get(*it); |
| 73 const policy::PolicyMap::Entry* new_entry = current.Get(*it); |
| 74 scoped_ptr<base::Value> old_value; |
| 75 scoped_ptr<base::Value> new_value; |
| 76 if (old_entry && old_entry->level == policy::POLICY_LEVEL_MANDATORY) |
| 77 old_value.reset(old_entry->value->DeepCopy()); |
| 78 if (new_entry && new_entry->level == policy::POLICY_LEVEL_MANDATORY) |
| 79 new_value.reset(new_entry->value->DeepCopy()); |
| 80 if (!base::Value::Equals(old_value.get(), new_value.get())) { |
| 81 changes.push_back( |
| 82 ValueStoreChange(*it, old_value.release(), new_value.release())); |
| 83 } |
| 84 } |
| 85 observers_->Notify( |
| 86 &SettingsObserver::OnSettingsChanged, |
| 87 component_id, |
| 88 settings_namespace::MANAGED, |
| 89 ValueStoreChange::ToJson(changes)); |
| 90 } |
| 91 |
48 } // namespace extensions | 92 } // namespace extensions |
OLD | NEW |