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

Side by Side Diff: chrome/browser/pref_value_store.cc

Issue 2858060: Changing policy while Chrome is running should refresh preferences without relaunching (Closed)
Patch Set: changed name of mock Created 10 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
« no previous file with comments | « chrome/browser/pref_value_store.h ('k') | chrome/browser/pref_value_store_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/pref_value_store.h" 5 #include "chrome/browser/pref_value_store.h"
6 #include "chrome/common/notification_service.h"
6 7
7 PrefValueStore::PrefValueStore(PrefStore* managed_prefs, 8 PrefValueStore::PrefValueStore(PrefStore* managed_prefs,
8 PrefStore* extension_prefs, 9 PrefStore* extension_prefs,
9 PrefStore* command_line_prefs, 10 PrefStore* command_line_prefs,
10 PrefStore* user_prefs, 11 PrefStore* user_prefs,
11 PrefStore* recommended_prefs) { 12 PrefStore* recommended_prefs) {
12 pref_stores_[MANAGED].reset(managed_prefs); 13 pref_stores_[MANAGED].reset(managed_prefs);
13 pref_stores_[EXTENSION].reset(extension_prefs); 14 pref_stores_[EXTENSION].reset(extension_prefs);
14 pref_stores_[COMMAND_LINE].reset(command_line_prefs); 15 pref_stores_[COMMAND_LINE].reset(command_line_prefs);
15 pref_stores_[USER].reset(user_prefs); 16 pref_stores_[USER].reset(user_prefs);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 bool PrefValueStore::PrefValueFromUserStore(const wchar_t* name) { 107 bool PrefValueStore::PrefValueFromUserStore(const wchar_t* name) {
107 return ControllingPrefStoreForPref(name) == USER; 108 return ControllingPrefStoreForPref(name) == USER;
108 } 109 }
109 110
110 bool PrefValueStore::PrefValueUserModifiable(const wchar_t* name) { 111 bool PrefValueStore::PrefValueUserModifiable(const wchar_t* name) {
111 PrefStoreType effective_store = ControllingPrefStoreForPref(name); 112 PrefStoreType effective_store = ControllingPrefStoreForPref(name);
112 return effective_store >= USER || effective_store == INVALID; 113 return effective_store >= USER || effective_store == INVALID;
113 } 114 }
114 115
115 bool PrefValueStore::PrefValueInStore(const wchar_t* name, PrefStoreType type) { 116 bool PrefValueStore::PrefValueInStore(const wchar_t* name, PrefStoreType type) {
116 if (pref_stores_[type].get() == NULL) { 117 if (!pref_stores_[type].get()) {
117 // No store of that type set, so this pref can't be in it. 118 // No store of that type set, so this pref can't be in it.
118 return false; 119 return false;
119 } 120 }
120 Value* tmp_value; 121 Value* tmp_value;
121 return pref_stores_[type]->prefs()->Get(name, &tmp_value); 122 return pref_stores_[type]->prefs()->Get(name, &tmp_value);
122 } 123 }
123 124
124 PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref( 125 PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref(
125 const wchar_t* name) { 126 const wchar_t* name) {
126 for (int i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { 127 for (int i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
127 if (PrefValueInStore(name, static_cast<PrefStoreType>(i))) 128 if (PrefValueInStore(name, static_cast<PrefStoreType>(i)))
128 return static_cast<PrefStoreType>(i); 129 return static_cast<PrefStoreType>(i);
129 } 130 }
130 return INVALID; 131 return INVALID;
131 } 132 }
133
134 void PrefValueStore::RefreshPolicyPrefsCompletion(
135 PrefStore* new_managed_pref_store,
136 PrefStore* new_recommended_pref_store,
137 AfterRefreshCallback callback) {
138
139 DictionaryValue* managed_prefs_before(pref_stores_[MANAGED]->prefs());
140 DictionaryValue* managed_prefs_after(new_managed_pref_store->prefs());
141 DictionaryValue* recommended_prefs_before(pref_stores_[RECOMMENDED]->prefs());
142 DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs());
143
144 std::vector<std::string> changed_managed_paths;
145 managed_prefs_before->GetDifferingPaths(managed_prefs_after,
146 &changed_managed_paths);
147
148 std::vector<std::string> changed_recommended_paths;
149 recommended_prefs_before->GetDifferingPaths(recommended_prefs_after,
150 &changed_recommended_paths);
151
152 std::vector<std::string> changed_paths(changed_managed_paths.size() +
153 changed_recommended_paths.size());
154 std::vector<std::string>::iterator last_insert =
155 std::merge(changed_managed_paths.begin(),
156 changed_managed_paths.end(),
157 changed_recommended_paths.begin(),
158 changed_recommended_paths.end(),
159 changed_paths.begin());
160 changed_paths.resize(last_insert - changed_paths.begin());
161
162 pref_stores_[MANAGED].reset(new_managed_pref_store);
163 pref_stores_[RECOMMENDED].reset(new_recommended_pref_store);
164 callback->Run(changed_paths);
165 }
166
167 void PrefValueStore::RefreshPolicyPrefsOnFileThread(
168 ChromeThread::ID calling_thread_id,
169 PrefStore* new_managed_pref_store,
170 PrefStore* new_recommended_pref_store,
171 AfterRefreshCallback callback) {
172 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
173 scoped_ptr<PrefStore> managed_pref_store(new_managed_pref_store);
174 scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store);
175
176 PrefStore::PrefReadError read_error = new_managed_pref_store->ReadPrefs();
177 if (read_error != PrefStore::PREF_READ_ERROR_NONE) {
178 LOG(ERROR) << "refresh of managed policy failed: PrefReadError = "
179 << read_error;
180 return;
181 }
182
183 read_error = new_recommended_pref_store->ReadPrefs();
184 if (read_error != PrefStore::PREF_READ_ERROR_NONE) {
185 LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = "
186 << read_error;
187 return;
188 }
189
190 ChromeThread::PostTask(
191 calling_thread_id, FROM_HERE,
192 NewRunnableMethod(this,
193 &PrefValueStore::RefreshPolicyPrefsCompletion,
194 managed_pref_store.release(),
195 recommended_pref_store.release(),
196 callback));
197 }
198
199 void PrefValueStore::RefreshPolicyPrefs(
200 PrefStore* new_managed_pref_store,
201 PrefStore* new_recommended_pref_store,
202 AfterRefreshCallback callback) {
203 ChromeThread::ID current_thread_id;
204 CHECK(ChromeThread::GetCurrentThreadIdentifier(&current_thread_id));
205 ChromeThread::PostTask(
206 ChromeThread::FILE, FROM_HERE,
207 NewRunnableMethod(this,
208 &PrefValueStore::RefreshPolicyPrefsOnFileThread,
209 current_thread_id,
210 new_managed_pref_store,
211 new_recommended_pref_store,
212 callback));
213 }
OLDNEW
« no previous file with comments | « chrome/browser/pref_value_store.h ('k') | chrome/browser/pref_value_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698