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

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: Rebased, addressed comments, fixed ManagedStorageDisabled test Created 8 years, 5 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));
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
OLDNEW
« no previous file with comments | « chrome/browser/extensions/settings/managed_value_store_cache.h ('k') | chrome/browser/extensions/settings/settings_apitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698