| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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(¤t_thread_id)); | 435 CHECK(BrowserThread::GetCurrentThreadIdentifier(¤t_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 } |
| OLD | NEW |