Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: chrome/browser/extensions/settings/managed_value_store_cache.cc

Issue 10807086: Trigger chrome.storage.onChanged events for policy updates on the 'managed' namespace. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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));
31 policy_service_->RemoveObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
25 } 32 }
26 33
27 scoped_refptr<base::MessageLoopProxy> 34 scoped_refptr<base::MessageLoopProxy>
28 ManagedValueStoreCache::GetMessageLoop() const { 35 ManagedValueStoreCache::GetMessageLoop() const {
29 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); 36 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
30 } 37 }
31 38
32 void ManagedValueStoreCache::RunWithValueStoreForExtension( 39 void ManagedValueStoreCache::RunWithValueStoreForExtension(
33 const StorageCallback& callback, 40 const StorageCallback& callback,
34 scoped_refptr<const Extension> extension) { 41 scoped_refptr<const Extension> extension) {
35 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 42 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
36 const policy::PolicyMap& policies = policy_service_->GetPolicies( 43 const policy::PolicyMap& policies = policy_service_->GetPolicies(
37 policy::POLICY_DOMAIN_EXTENSIONS, extension->id()); 44 policy::POLICY_DOMAIN_EXTENSIONS, extension->id());
38 PolicyValueStore store(&policies); 45 PolicyValueStore store(&policies);
39 callback.Run(&store); 46 callback.Run(&store);
40 } 47 }
41 48
42 void ManagedValueStoreCache::DeleteStorageSoon( 49 void ManagedValueStoreCache::DeleteStorageSoon(
43 const std::string& extension_id) { 50 const std::string& extension_id) {
44 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 51 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
45 // There's no real storage backing this cache, so this is a nop. 52 // There's no real storage backing this cache, so this is a nop.
46 } 53 }
47 54
55 void ManagedValueStoreCache::OnPolicyUpdated(policy::PolicyDomain domain,
56 const std::string& component_id,
57 const policy::PolicyMap& previous,
58 const policy::PolicyMap& current) {
59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
60 ValueStoreChangeList changes;
61 std::set<std::string> changed_keys;
62 previous.GetDifferingKeys(current, &changed_keys);
63 for (std::set<std::string>::iterator it = changed_keys.begin();
64 it != changed_keys.end(); ++it) {
65 // A policy might've changed only its scope or level, while the value
66 // stayed the same. Events should be triggered only for mandatory values
67 // that have changed.
68 const policy::PolicyMap::Entry* old_entry = previous.Get(*it);
69 const policy::PolicyMap::Entry* new_entry = current.Get(*it);
70 scoped_ptr<base::Value> old_value;
71 scoped_ptr<base::Value> new_value;
72 if (old_entry && old_entry->level == policy::POLICY_LEVEL_MANDATORY)
73 old_value.reset(old_entry->value->DeepCopy());
74 if (new_entry && new_entry->level == policy::POLICY_LEVEL_MANDATORY)
75 new_value.reset(new_entry->value->DeepCopy());
76 if (!base::Value::Equals(old_value.get(), new_value.get())) {
77 changes.push_back(
78 ValueStoreChange(*it, old_value.release(), new_value.release()));
79 }
80 }
81 observers_->Notify(
82 &SettingsObserver::OnSettingsChanged,
83 component_id,
84 settings_namespace::MANAGED,
85 ValueStoreChange::ToJson(changes));
86 }
87
48 } // namespace extensions 88 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698