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

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

Issue 4876002: Create additional PrefStore for Device Management policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review feedback Created 10 years, 1 month 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) 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/prefs/pref_value_store.h" 5 #include "chrome/browser/prefs/pref_value_store.h"
6 6
7 #include "chrome/browser/browser_thread.h" 7 #include "chrome/browser/browser_thread.h"
8 #include "chrome/browser/extensions/extension_pref_store.h" 8 #include "chrome/browser/extensions/extension_pref_store.h"
9 #include "chrome/browser/policy/configuration_policy_pref_store.h" 9 #include "chrome/browser/policy/configuration_policy_pref_store.h"
10 #include "chrome/browser/prefs/command_line_pref_store.h" 10 #include "chrome/browser/prefs/command_line_pref_store.h"
(...skipping 22 matching lines...) Expand all
33 33
34 } // namespace 34 } // namespace
35 35
36 // static 36 // static
37 PrefValueStore* PrefValueStore::CreatePrefValueStore( 37 PrefValueStore* PrefValueStore::CreatePrefValueStore(
38 const FilePath& pref_filename, 38 const FilePath& pref_filename,
39 Profile* profile, 39 Profile* profile,
40 bool user_only) { 40 bool user_only) {
41 using policy::ConfigurationPolicyPrefStore; 41 using policy::ConfigurationPolicyPrefStore;
42 ConfigurationPolicyPrefStore* managed = NULL; 42 ConfigurationPolicyPrefStore* managed = NULL;
43 ConfigurationPolicyPrefStore* device_management = NULL;
43 ExtensionPrefStore* extension = NULL; 44 ExtensionPrefStore* extension = NULL;
44 CommandLinePrefStore* command_line = NULL; 45 CommandLinePrefStore* command_line = NULL;
45 ConfigurationPolicyPrefStore* recommended = NULL; 46 ConfigurationPolicyPrefStore* recommended = NULL;
46 47
47 JsonPrefStore* user = new JsonPrefStore( 48 JsonPrefStore* user = new JsonPrefStore(
48 pref_filename, 49 pref_filename,
49 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); 50 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
50 DefaultPrefStore* default_store = new DefaultPrefStore(); 51 DefaultPrefStore* default_store = new DefaultPrefStore();
51 52
52 if (!user_only) { 53 if (!user_only) {
53 managed = ConfigurationPolicyPrefStore::CreateManagedPolicyPrefStore(); 54 managed =
55 ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore();
56 device_management =
57 ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore();
54 extension = new ExtensionPrefStore(profile, PrefNotifier::EXTENSION_STORE); 58 extension = new ExtensionPrefStore(profile, PrefNotifier::EXTENSION_STORE);
55 command_line = new CommandLinePrefStore(CommandLine::ForCurrentProcess()); 59 command_line = new CommandLinePrefStore(CommandLine::ForCurrentProcess());
56 recommended = 60 recommended =
57 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore(); 61 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore();
58 } 62 }
59 return new PrefValueStore(managed, extension, command_line, user, 63 return new PrefValueStore(managed, device_management, extension,
60 recommended, default_store); 64 command_line, user, recommended, default_store);
61 } 65 }
62 66
63 PrefValueStore::~PrefValueStore() {} 67 PrefValueStore::~PrefValueStore() {}
64 68
65 bool PrefValueStore::GetValue(const std::string& name, 69 bool PrefValueStore::GetValue(const std::string& name,
66 Value** out_value) const { 70 Value** out_value) const {
67 // Check the |PrefStore|s in order of their priority from highest to lowest 71 // Check the |PrefStore|s in order of their priority from highest to lowest
68 // to find the value of the preference described by the given preference name. 72 // to find the value of the preference described by the given preference name.
69 for (size_t i = 0; i <= PrefNotifier::PREF_STORE_TYPE_MAX; ++i) { 73 for (size_t i = 0; i <= PrefNotifier::PREF_STORE_TYPE_MAX; ++i) {
70 if (GetValueFromStore(name.c_str(), 74 if (GetValueFromStore(name.c_str(),
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 return pref_stores_[PrefNotifier::USER_STORE]->ReadOnly(); 188 return pref_stores_[PrefNotifier::USER_STORE]->ReadOnly();
185 } 189 }
186 190
187 bool PrefValueStore::RemoveUserPrefValue(const char* name) { 191 bool PrefValueStore::RemoveUserPrefValue(const char* name) {
188 if (pref_stores_[PrefNotifier::USER_STORE].get()) { 192 if (pref_stores_[PrefNotifier::USER_STORE].get()) {
189 return pref_stores_[PrefNotifier::USER_STORE]->prefs()->Remove(name, NULL); 193 return pref_stores_[PrefNotifier::USER_STORE]->prefs()->Remove(name, NULL);
190 } 194 }
191 return false; 195 return false;
192 } 196 }
193 197
194 bool PrefValueStore::PrefValueInManagedStore(const char* name) const { 198 bool PrefValueStore::PrefValueInManagedPlatformStore(const char* name) const {
195 return PrefValueInStore(name, PrefNotifier::MANAGED_STORE); 199 return PrefValueInStore(name, PrefNotifier::MANAGED_PLATFORM_STORE);
200 }
201
202 bool PrefValueStore::PrefValueInDeviceManagementStore(const char* name) const {
203 return PrefValueInStore(name, PrefNotifier::DEVICE_MANAGEMENT_STORE);
196 } 204 }
197 205
198 bool PrefValueStore::PrefValueInExtensionStore(const char* name) const { 206 bool PrefValueStore::PrefValueInExtensionStore(const char* name) const {
199 return PrefValueInStore(name, PrefNotifier::EXTENSION_STORE); 207 return PrefValueInStore(name, PrefNotifier::EXTENSION_STORE);
200 } 208 }
201 209
202 bool PrefValueStore::PrefValueInUserStore(const char* name) const { 210 bool PrefValueStore::PrefValueInUserStore(const char* name) const {
203 return PrefValueInStore(name, PrefNotifier::USER_STORE); 211 return PrefValueInStore(name, PrefNotifier::USER_STORE);
204 } 212 }
205 213
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 store = PrefNotifier::DEFAULT_STORE; 288 store = PrefNotifier::DEFAULT_STORE;
281 } 289 }
282 if (IsValidType(GetRegisteredType(name), (*out_value)->GetType(), store)) 290 if (IsValidType(GetRegisteredType(name), (*out_value)->GetType(), store))
283 return true; 291 return true;
284 } 292 }
285 // No valid value found for the given preference name: set the return false. 293 // No valid value found for the given preference name: set the return false.
286 *out_value = NULL; 294 *out_value = NULL;
287 return false; 295 return false;
288 } 296 }
289 297
290 void PrefValueStore::RefreshPolicyPrefsCompletion(
291 PrefStore* new_managed_pref_store,
292 PrefStore* new_recommended_pref_store,
293 AfterRefreshCallback* callback_pointer) {
294 scoped_ptr<AfterRefreshCallback> callback(callback_pointer);
295 DictionaryValue* managed_prefs_before(
296 pref_stores_[PrefNotifier::MANAGED_STORE]->prefs());
297 DictionaryValue* managed_prefs_after(new_managed_pref_store->prefs());
298 DictionaryValue* recommended_prefs_before(
299 pref_stores_[PrefNotifier::RECOMMENDED_STORE]->prefs());
300 DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs());
301
302 std::vector<std::string> changed_managed_paths;
303 managed_prefs_before->GetDifferingPaths(managed_prefs_after,
304 &changed_managed_paths);
305
306 std::vector<std::string> changed_recommended_paths;
307 recommended_prefs_before->GetDifferingPaths(recommended_prefs_after,
308 &changed_recommended_paths);
309
310 std::vector<std::string> changed_paths(changed_managed_paths.size() +
311 changed_recommended_paths.size());
312 std::vector<std::string>::iterator last_insert =
313 std::merge(changed_managed_paths.begin(),
314 changed_managed_paths.end(),
315 changed_recommended_paths.begin(),
316 changed_recommended_paths.end(),
317 changed_paths.begin());
318 changed_paths.resize(last_insert - changed_paths.begin());
319
320 pref_stores_[PrefNotifier::MANAGED_STORE].reset(new_managed_pref_store);
321 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset(
322 new_recommended_pref_store);
323 callback->Run(changed_paths);
324 }
325
326 void PrefValueStore::RefreshPolicyPrefsOnFileThread( 298 void PrefValueStore::RefreshPolicyPrefsOnFileThread(
327 BrowserThread::ID calling_thread_id, 299 BrowserThread::ID calling_thread_id,
328 PrefStore* new_managed_pref_store, 300 PrefStore* new_managed_platform_pref_store,
301 PrefStore* new_device_management_pref_store,
329 PrefStore* new_recommended_pref_store, 302 PrefStore* new_recommended_pref_store,
330 AfterRefreshCallback* callback_pointer) { 303 AfterRefreshCallback* callback_pointer) {
331 scoped_ptr<AfterRefreshCallback> callback(callback_pointer); 304 scoped_ptr<AfterRefreshCallback> callback(callback_pointer);
332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 305 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
333 scoped_ptr<PrefStore> managed_pref_store(new_managed_pref_store); 306 scoped_ptr<PrefStore> managed_platform_pref_store(
307 new_managed_platform_pref_store);
308 scoped_ptr<PrefStore> device_management_pref_store(
309 new_device_management_pref_store);
334 scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store); 310 scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store);
335 311
336 PrefStore::PrefReadError read_error = new_managed_pref_store->ReadPrefs(); 312 PrefStore::PrefReadError read_error =
313 new_managed_platform_pref_store->ReadPrefs();
337 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { 314 if (read_error != PrefStore::PREF_READ_ERROR_NONE) {
338 LOG(ERROR) << "refresh of managed policy failed: PrefReadError = " 315 LOG(ERROR) << "refresh of managed policy failed: PrefReadError = "
339 << read_error; 316 << read_error;
340 return; 317 return;
341 } 318 }
342 319
320 read_error = new_device_management_pref_store->ReadPrefs();
321 if (read_error != PrefStore::PREF_READ_ERROR_NONE) {
322 LOG(ERROR) << "refresh of device management policy failed: "
323 << "PrefReadError = " << read_error;
324 return;
325 }
326
343 read_error = new_recommended_pref_store->ReadPrefs(); 327 read_error = new_recommended_pref_store->ReadPrefs();
344 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { 328 if (read_error != PrefStore::PREF_READ_ERROR_NONE) {
345 LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = " 329 LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = "
346 << read_error; 330 << read_error;
347 return; 331 return;
348 } 332 }
349 333
350 BrowserThread::PostTask( 334 BrowserThread::PostTask(
351 calling_thread_id, FROM_HERE, 335 calling_thread_id, FROM_HERE,
352 NewRunnableMethod(this, 336 NewRunnableMethod(this,
353 &PrefValueStore::RefreshPolicyPrefsCompletion, 337 &PrefValueStore::RefreshPolicyPrefsCompletion,
354 managed_pref_store.release(), 338 managed_platform_pref_store.release(),
339 device_management_pref_store.release(),
355 recommended_pref_store.release(), 340 recommended_pref_store.release(),
356 callback.release())); 341 callback.release()));
357 } 342 }
358 343
344 void PrefValueStore::RefreshPolicyPrefsCompletion(
345 PrefStore* new_managed_platform_pref_store,
346 PrefStore* new_device_management_pref_store,
347 PrefStore* new_recommended_pref_store,
348 AfterRefreshCallback* callback_pointer) {
349 scoped_ptr<AfterRefreshCallback> callback(callback_pointer);
350
351 // Determine the paths of all the changed preferences values in the three
352 // policy-related stores (managed platform, device management and
353 // recommended).
354 DictionaryValue* managed_platform_prefs_before(
355 pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE]->prefs());
356 DictionaryValue* managed_platform_prefs_after(
357 new_managed_platform_pref_store->prefs());
358 DictionaryValue* device_management_prefs_before(
359 pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE]->prefs());
360 DictionaryValue* device_management_prefs_after(
361 new_device_management_pref_store->prefs());
362 DictionaryValue* recommended_prefs_before(
363 pref_stores_[PrefNotifier::RECOMMENDED_STORE]->prefs());
364 DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs());
365
366 std::vector<std::string> changed_managed_platform_paths;
367 managed_platform_prefs_before->GetDifferingPaths(managed_platform_prefs_after,
368 &changed_managed_platform_paths);
369
370 std::vector<std::string> changed_device_management_paths;
371 device_management_prefs_before->GetDifferingPaths(
372 device_management_prefs_after,
373 &changed_device_management_paths);
374
375 std::vector<std::string> changed_recommended_paths;
376 recommended_prefs_before->GetDifferingPaths(recommended_prefs_after,
377 &changed_recommended_paths);
378
379 // Merge all three vectors of changed value paths together, filtering
380 // duplicates in a post-processing step.
381 std::vector<std::string> all_changed_managed_platform_paths(
382 changed_managed_platform_paths.size() +
383 changed_device_management_paths.size());
384
385 std::vector<std::string>::iterator last_insert =
386 std::merge(changed_managed_platform_paths.begin(),
387 changed_managed_platform_paths.end(),
388 changed_device_management_paths.begin(),
389 changed_device_management_paths.end(),
390 all_changed_managed_platform_paths.begin());
391 all_changed_managed_platform_paths.resize(
392 last_insert - all_changed_managed_platform_paths.begin());
393
394 std::vector<std::string> changed_paths(
395 all_changed_managed_platform_paths.size() +
396 changed_recommended_paths.size());
397 last_insert = std::merge(all_changed_managed_platform_paths.begin(),
398 all_changed_managed_platform_paths.end(),
399 changed_recommended_paths.begin(),
400 changed_recommended_paths.end(),
401 changed_paths.begin());
402 changed_paths.resize(last_insert - changed_paths.begin());
403
404 last_insert = unique(changed_paths.begin(), changed_paths.end());
405 changed_paths.resize(last_insert - changed_paths.begin());
406
407 // Replace the old stores with the new and send notification of the changed
408 // preferences.
409 pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE].reset(
410 new_managed_platform_pref_store);
411 pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE].reset(
412 new_device_management_pref_store);
413 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset(
414 new_recommended_pref_store);
415 callback->Run(changed_paths);
416 }
417
359 void PrefValueStore::RefreshPolicyPrefs( 418 void PrefValueStore::RefreshPolicyPrefs(
360 AfterRefreshCallback* callback) { 419 AfterRefreshCallback* callback) {
361 using policy::ConfigurationPolicyPrefStore; 420 using policy::ConfigurationPolicyPrefStore;
362 // Because loading of policy information must happen on the FILE 421 // Because loading of policy information must happen on the FILE
363 // thread, it's not possible to just replace the contents of the 422 // thread, it's not possible to just replace the contents of the
364 // managed and recommended stores in place due to possible 423 // managed and recommended stores in place due to possible
365 // concurrent access from the UI thread. Instead, new stores are 424 // concurrent access from the UI thread. Instead, new stores are
366 // created and the refreshed policy read into them. The new stores 425 // created and the refreshed policy read into them. The new stores
367 // are swapped with the old from a Task on the UI thread after the 426 // are swapped with the old from a Task on the UI thread after the
368 // load is complete. 427 // load is complete.
369 PrefStore* new_managed_pref_store( 428 PrefStore* new_managed_platform_pref_store(
370 ConfigurationPolicyPrefStore::CreateManagedPolicyPrefStore()); 429 ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore());
430 PrefStore* new_device_management_pref_store(
431 ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore());
371 PrefStore* new_recommended_pref_store( 432 PrefStore* new_recommended_pref_store(
372 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore()); 433 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore());
373 BrowserThread::ID current_thread_id; 434 BrowserThread::ID current_thread_id;
374 CHECK(BrowserThread::GetCurrentThreadIdentifier(&current_thread_id)); 435 CHECK(BrowserThread::GetCurrentThreadIdentifier(&current_thread_id));
375 BrowserThread::PostTask( 436 BrowserThread::PostTask(
376 BrowserThread::FILE, FROM_HERE, 437 BrowserThread::FILE, FROM_HERE,
377 NewRunnableMethod(this, 438 NewRunnableMethod(this,
378 &PrefValueStore::RefreshPolicyPrefsOnFileThread, 439 &PrefValueStore::RefreshPolicyPrefsOnFileThread,
379 current_thread_id, 440 current_thread_id,
380 new_managed_pref_store, 441 new_managed_platform_pref_store,
442 new_device_management_pref_store,
381 new_recommended_pref_store, 443 new_recommended_pref_store,
382 callback)); 444 callback));
383 } 445 }
384 446
385 bool PrefValueStore::HasPolicyConflictingUserProxySettings() { 447 bool PrefValueStore::HasPolicyConflictingUserProxySettings() {
386 using policy::ConfigurationPolicyPrefStore; 448 using policy::ConfigurationPolicyPrefStore;
387 ConfigurationPolicyPrefStore::ProxyPreferenceSet proxy_prefs; 449 ConfigurationPolicyPrefStore::ProxyPreferenceSet proxy_prefs;
388 ConfigurationPolicyPrefStore::GetProxyPreferenceSet(&proxy_prefs); 450 ConfigurationPolicyPrefStore::GetProxyPreferenceSet(&proxy_prefs);
389 ConfigurationPolicyPrefStore::ProxyPreferenceSet::const_iterator i; 451 ConfigurationPolicyPrefStore::ProxyPreferenceSet::const_iterator i;
390 for (i = proxy_prefs.begin(); i != proxy_prefs.end(); ++i) { 452 for (i = proxy_prefs.begin(); i != proxy_prefs.end(); ++i) {
391 if (PrefValueInManagedStore(*i) && 453 if ((PrefValueInManagedPlatformStore(*i) ||
454 PrefValueInDeviceManagementStore(*i)) &&
392 PrefValueInStoreRange(*i, 455 PrefValueInStoreRange(*i,
393 PrefNotifier::COMMAND_LINE_STORE, 456 PrefNotifier::COMMAND_LINE_STORE,
394 PrefNotifier::USER_STORE)) 457 PrefNotifier::USER_STORE))
395 return true; 458 return true;
396 } 459 }
397 return false; 460 return false;
398 } 461 }
399 462
400 PrefValueStore::PrefValueStore(PrefStore* managed_prefs, 463 PrefValueStore::PrefValueStore(PrefStore* managed_platform_prefs,
464 PrefStore* device_management_prefs,
401 PrefStore* extension_prefs, 465 PrefStore* extension_prefs,
402 PrefStore* command_line_prefs, 466 PrefStore* command_line_prefs,
403 PrefStore* user_prefs, 467 PrefStore* user_prefs,
404 PrefStore* recommended_prefs, 468 PrefStore* recommended_prefs,
405 PrefStore* default_prefs) { 469 PrefStore* default_prefs) {
406 // NULL default pref store is usually bad, but may be OK for some unit tests. 470 // NULL default pref store is usually bad, but may be OK for some unit tests.
407 if (!default_prefs) 471 if (!default_prefs)
408 LOG(WARNING) << "default pref store is null"; 472 LOG(WARNING) << "default pref store is null";
409 pref_stores_[PrefNotifier::MANAGED_STORE].reset(managed_prefs); 473 pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE].reset(
474 managed_platform_prefs);
475 pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE].reset(
476 device_management_prefs);
410 pref_stores_[PrefNotifier::EXTENSION_STORE].reset(extension_prefs); 477 pref_stores_[PrefNotifier::EXTENSION_STORE].reset(extension_prefs);
411 pref_stores_[PrefNotifier::COMMAND_LINE_STORE].reset(command_line_prefs); 478 pref_stores_[PrefNotifier::COMMAND_LINE_STORE].reset(command_line_prefs);
412 pref_stores_[PrefNotifier::USER_STORE].reset(user_prefs); 479 pref_stores_[PrefNotifier::USER_STORE].reset(user_prefs);
413 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset(recommended_prefs); 480 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset(recommended_prefs);
414 pref_stores_[PrefNotifier::DEFAULT_STORE].reset(default_prefs); 481 pref_stores_[PrefNotifier::DEFAULT_STORE].reset(default_prefs);
415 } 482 }
OLDNEW
« no previous file with comments | « chrome/browser/prefs/pref_value_store.h ('k') | chrome/browser/prefs/pref_value_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698