Index: chrome/browser/prefs/pref_value_store.cc |
diff --git a/chrome/browser/prefs/pref_value_store.cc b/chrome/browser/prefs/pref_value_store.cc |
index dd3085a6f81139f0195fb2ae83720ecef1e3148a..537aa6adbb466abb0f9c2b97339ab9b39a6fbad4 100644 |
--- a/chrome/browser/prefs/pref_value_store.cc |
+++ b/chrome/browser/prefs/pref_value_store.cc |
@@ -40,6 +40,7 @@ PrefValueStore* PrefValueStore::CreatePrefValueStore( |
bool user_only) { |
using policy::ConfigurationPolicyPrefStore; |
ConfigurationPolicyPrefStore* managed = NULL; |
+ ConfigurationPolicyPrefStore* device_management = NULL; |
ExtensionPrefStore* extension = NULL; |
CommandLinePrefStore* command_line = NULL; |
ConfigurationPolicyPrefStore* recommended = NULL; |
@@ -50,14 +51,17 @@ PrefValueStore* PrefValueStore::CreatePrefValueStore( |
DefaultPrefStore* default_store = new DefaultPrefStore(); |
if (!user_only) { |
- managed = ConfigurationPolicyPrefStore::CreateManagedPolicyPrefStore(); |
+ managed = |
+ ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore(); |
+ device_management = |
+ ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore(); |
extension = new ExtensionPrefStore(profile, PrefNotifier::EXTENSION_STORE); |
command_line = new CommandLinePrefStore(CommandLine::ForCurrentProcess()); |
recommended = |
ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore(); |
} |
- return new PrefValueStore(managed, extension, command_line, user, |
- recommended, default_store); |
+ return new PrefValueStore(managed, device_management, extension, |
+ command_line, user, recommended, default_store); |
} |
PrefValueStore::~PrefValueStore() {} |
@@ -191,8 +195,12 @@ bool PrefValueStore::RemoveUserPrefValue(const char* name) { |
return false; |
} |
-bool PrefValueStore::PrefValueInManagedStore(const char* name) const { |
- return PrefValueInStore(name, PrefNotifier::MANAGED_STORE); |
+bool PrefValueStore::PrefValueInManagedPlatformStore(const char* name) const { |
+ return PrefValueInStore(name, PrefNotifier::MANAGED_PLATFORM_STORE); |
+} |
+ |
+bool PrefValueStore::PrefValueInDeviceManagementStore(const char* name) const { |
+ return PrefValueInStore(name, PrefNotifier::DEVICE_MANAGEMENT_STORE); |
} |
bool PrefValueStore::PrefValueInExtensionStore(const char* name) const { |
@@ -287,59 +295,35 @@ bool PrefValueStore::GetValueFromStore( |
return false; |
} |
-void PrefValueStore::RefreshPolicyPrefsCompletion( |
- PrefStore* new_managed_pref_store, |
- PrefStore* new_recommended_pref_store, |
- AfterRefreshCallback* callback_pointer) { |
- scoped_ptr<AfterRefreshCallback> callback(callback_pointer); |
- DictionaryValue* managed_prefs_before( |
- pref_stores_[PrefNotifier::MANAGED_STORE]->prefs()); |
- DictionaryValue* managed_prefs_after(new_managed_pref_store->prefs()); |
- DictionaryValue* recommended_prefs_before( |
- pref_stores_[PrefNotifier::RECOMMENDED_STORE]->prefs()); |
- DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs()); |
- |
- std::vector<std::string> changed_managed_paths; |
- managed_prefs_before->GetDifferingPaths(managed_prefs_after, |
- &changed_managed_paths); |
- |
- std::vector<std::string> changed_recommended_paths; |
- recommended_prefs_before->GetDifferingPaths(recommended_prefs_after, |
- &changed_recommended_paths); |
- |
- std::vector<std::string> changed_paths(changed_managed_paths.size() + |
- changed_recommended_paths.size()); |
- std::vector<std::string>::iterator last_insert = |
- std::merge(changed_managed_paths.begin(), |
- changed_managed_paths.end(), |
- changed_recommended_paths.begin(), |
- changed_recommended_paths.end(), |
- changed_paths.begin()); |
- changed_paths.resize(last_insert - changed_paths.begin()); |
- |
- pref_stores_[PrefNotifier::MANAGED_STORE].reset(new_managed_pref_store); |
- pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset( |
- new_recommended_pref_store); |
- callback->Run(changed_paths); |
-} |
- |
void PrefValueStore::RefreshPolicyPrefsOnFileThread( |
BrowserThread::ID calling_thread_id, |
- PrefStore* new_managed_pref_store, |
+ PrefStore* new_managed_platform_pref_store, |
+ PrefStore* new_device_management_pref_store, |
PrefStore* new_recommended_pref_store, |
AfterRefreshCallback* callback_pointer) { |
scoped_ptr<AfterRefreshCallback> callback(callback_pointer); |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- scoped_ptr<PrefStore> managed_pref_store(new_managed_pref_store); |
+ scoped_ptr<PrefStore> managed_platform_pref_store( |
+ new_managed_platform_pref_store); |
+ scoped_ptr<PrefStore> device_management_pref_store( |
+ new_device_management_pref_store); |
scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store); |
- PrefStore::PrefReadError read_error = new_managed_pref_store->ReadPrefs(); |
+ PrefStore::PrefReadError read_error = |
+ new_managed_platform_pref_store->ReadPrefs(); |
if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
LOG(ERROR) << "refresh of managed policy failed: PrefReadError = " |
<< read_error; |
return; |
} |
+ read_error = new_device_management_pref_store->ReadPrefs(); |
+ if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
+ LOG(ERROR) << "refresh of device management policy failed: " |
+ << "PrefReadError = " << read_error; |
+ return; |
+ } |
+ |
read_error = new_recommended_pref_store->ReadPrefs(); |
if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = " |
@@ -351,11 +335,86 @@ void PrefValueStore::RefreshPolicyPrefsOnFileThread( |
calling_thread_id, FROM_HERE, |
NewRunnableMethod(this, |
&PrefValueStore::RefreshPolicyPrefsCompletion, |
- managed_pref_store.release(), |
+ managed_platform_pref_store.release(), |
+ device_management_pref_store.release(), |
recommended_pref_store.release(), |
callback.release())); |
} |
+void PrefValueStore::RefreshPolicyPrefsCompletion( |
+ PrefStore* new_managed_platform_pref_store, |
+ PrefStore* new_device_management_pref_store, |
+ PrefStore* new_recommended_pref_store, |
+ AfterRefreshCallback* callback_pointer) { |
+ scoped_ptr<AfterRefreshCallback> callback(callback_pointer); |
+ |
+ // Determine the paths of all the changed preferences values in the three |
+ // policy-related stores (managed platform, device management and |
+ // recommended). |
+ DictionaryValue* managed_platform_prefs_before( |
+ pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE]->prefs()); |
+ DictionaryValue* managed_platform_prefs_after( |
+ new_managed_platform_pref_store->prefs()); |
+ DictionaryValue* device_management_prefs_before( |
+ pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE]->prefs()); |
+ DictionaryValue* device_management_prefs_after( |
+ new_device_management_pref_store->prefs()); |
+ DictionaryValue* recommended_prefs_before( |
+ pref_stores_[PrefNotifier::RECOMMENDED_STORE]->prefs()); |
+ DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs()); |
+ |
+ std::vector<std::string> changed_managed_platform_paths; |
+ managed_platform_prefs_before->GetDifferingPaths(managed_platform_prefs_after, |
+ &changed_managed_platform_paths); |
+ |
+ std::vector<std::string> changed_device_management_paths; |
+ device_management_prefs_before->GetDifferingPaths( |
+ device_management_prefs_after, |
+ &changed_device_management_paths); |
+ |
+ std::vector<std::string> changed_recommended_paths; |
+ recommended_prefs_before->GetDifferingPaths(recommended_prefs_after, |
+ &changed_recommended_paths); |
+ |
+ // Merge all three vectors of changed value paths together, filtering |
+ // duplicates in a post-processing step. |
+ std::vector<std::string> all_changed_managed_platform_paths( |
+ changed_managed_platform_paths.size() + |
+ changed_device_management_paths.size()); |
+ |
+ std::vector<std::string>::iterator last_insert = |
+ std::merge(changed_managed_platform_paths.begin(), |
+ changed_managed_platform_paths.end(), |
+ changed_device_management_paths.begin(), |
+ changed_device_management_paths.end(), |
+ all_changed_managed_platform_paths.begin()); |
+ all_changed_managed_platform_paths.resize( |
+ last_insert - all_changed_managed_platform_paths.begin()); |
+ |
+ std::vector<std::string> changed_paths( |
+ all_changed_managed_platform_paths.size() + |
+ changed_recommended_paths.size()); |
+ last_insert = std::merge(all_changed_managed_platform_paths.begin(), |
+ all_changed_managed_platform_paths.end(), |
+ changed_recommended_paths.begin(), |
+ changed_recommended_paths.end(), |
+ changed_paths.begin()); |
+ changed_paths.resize(last_insert - changed_paths.begin()); |
+ |
+ last_insert = unique(changed_paths.begin(), changed_paths.end()); |
+ changed_paths.resize(last_insert - changed_paths.begin()); |
+ |
+ // Replace the old stores with the new and send notification of the changed |
+ // preferences. |
+ pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE].reset( |
+ new_managed_platform_pref_store); |
+ pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE].reset( |
+ new_device_management_pref_store); |
+ pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset( |
+ new_recommended_pref_store); |
+ callback->Run(changed_paths); |
+} |
+ |
void PrefValueStore::RefreshPolicyPrefs( |
AfterRefreshCallback* callback) { |
using policy::ConfigurationPolicyPrefStore; |
@@ -366,8 +425,10 @@ void PrefValueStore::RefreshPolicyPrefs( |
// created and the refreshed policy read into them. The new stores |
// are swapped with the old from a Task on the UI thread after the |
// load is complete. |
- PrefStore* new_managed_pref_store( |
- ConfigurationPolicyPrefStore::CreateManagedPolicyPrefStore()); |
+ PrefStore* new_managed_platform_pref_store( |
+ ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore()); |
+ PrefStore* new_device_management_pref_store( |
+ ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore()); |
PrefStore* new_recommended_pref_store( |
ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore()); |
BrowserThread::ID current_thread_id; |
@@ -377,7 +438,8 @@ void PrefValueStore::RefreshPolicyPrefs( |
NewRunnableMethod(this, |
&PrefValueStore::RefreshPolicyPrefsOnFileThread, |
current_thread_id, |
- new_managed_pref_store, |
+ new_managed_platform_pref_store, |
+ new_device_management_pref_store, |
new_recommended_pref_store, |
callback)); |
} |
@@ -388,7 +450,8 @@ bool PrefValueStore::HasPolicyConflictingUserProxySettings() { |
ConfigurationPolicyPrefStore::GetProxyPreferenceSet(&proxy_prefs); |
ConfigurationPolicyPrefStore::ProxyPreferenceSet::const_iterator i; |
for (i = proxy_prefs.begin(); i != proxy_prefs.end(); ++i) { |
- if (PrefValueInManagedStore(*i) && |
+ if ((PrefValueInManagedPlatformStore(*i) || |
+ PrefValueInDeviceManagementStore(*i)) && |
PrefValueInStoreRange(*i, |
PrefNotifier::COMMAND_LINE_STORE, |
PrefNotifier::USER_STORE)) |
@@ -397,7 +460,8 @@ bool PrefValueStore::HasPolicyConflictingUserProxySettings() { |
return false; |
} |
-PrefValueStore::PrefValueStore(PrefStore* managed_prefs, |
+PrefValueStore::PrefValueStore(PrefStore* managed_platform_prefs, |
+ PrefStore* device_management_prefs, |
PrefStore* extension_prefs, |
PrefStore* command_line_prefs, |
PrefStore* user_prefs, |
@@ -406,7 +470,10 @@ PrefValueStore::PrefValueStore(PrefStore* managed_prefs, |
// NULL default pref store is usually bad, but may be OK for some unit tests. |
if (!default_prefs) |
LOG(WARNING) << "default pref store is null"; |
- pref_stores_[PrefNotifier::MANAGED_STORE].reset(managed_prefs); |
+ pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE].reset( |
+ managed_platform_prefs); |
+ pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE].reset( |
+ device_management_prefs); |
pref_stores_[PrefNotifier::EXTENSION_STORE].reset(extension_prefs); |
pref_stores_[PrefNotifier::COMMAND_LINE_STORE].reset(command_line_prefs); |
pref_stores_[PrefNotifier::USER_STORE].reset(user_prefs); |