OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/managed_mode/managed_user_settings_service.h" | 5 #include "chrome/browser/managed_mode/managed_user_settings_service.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/prefs/json_pref_store.h" | 10 #include "base/prefs/json_pref_store.h" |
11 #include "base/prefs/pref_filter.h" | 11 #include "base/prefs/pref_filter.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "base/threading/sequenced_worker_pool.h" | 13 #include "base/threading/sequenced_worker_pool.h" |
14 #include "chrome/browser/managed_mode/managed_mode_url_filter.h" | 14 #include "chrome/browser/managed_mode/managed_mode_url_filter.h" |
15 #include "chrome/common/chrome_constants.h" | 15 #include "chrome/common/chrome_constants.h" |
16 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
17 #include "content/public/browser/user_metrics.h" | 17 #include "content/public/browser/user_metrics.h" |
18 #include "sync/api/sync_change.h" | 18 #include "sync/api/sync_change.h" |
19 #include "sync/api/sync_error_factory.h" | 19 #include "sync/api/sync_error_factory.h" |
20 #include "sync/protocol/sync.pb.h" | 20 #include "sync/protocol/sync.pb.h" |
21 | 21 |
22 using base::DictionaryValue; | 22 using base::DictionaryValue; |
23 using base::JSONReader; | 23 using base::JSONReader; |
24 using base::UserMetricsAction; | 24 using base::UserMetricsAction; |
25 using base::Value; | 25 using base::Value; |
26 using content::BrowserThread; | 26 using content::BrowserThread; |
27 using syncer::MANAGED_USER_SETTINGS; | 27 using syncer::SUPERVISED_USER_SETTINGS; |
28 using syncer::ModelType; | 28 using syncer::ModelType; |
29 using syncer::SyncChange; | 29 using syncer::SyncChange; |
30 using syncer::SyncChangeList; | 30 using syncer::SyncChangeList; |
31 using syncer::SyncChangeProcessor; | 31 using syncer::SyncChangeProcessor; |
32 using syncer::SyncData; | 32 using syncer::SyncData; |
33 using syncer::SyncDataList; | 33 using syncer::SyncDataList; |
34 using syncer::SyncError; | 34 using syncer::SyncError; |
35 using syncer::SyncErrorFactory; | 35 using syncer::SyncErrorFactory; |
36 using syncer::SyncMergeResult; | 36 using syncer::SyncMergeResult; |
37 | 37 |
(...skipping 14 matching lines...) Expand all Loading... |
52 ManagedUserSettingsService::ManagedUserSettingsService() | 52 ManagedUserSettingsService::ManagedUserSettingsService() |
53 : active_(false), local_settings_(new base::DictionaryValue) {} | 53 : active_(false), local_settings_(new base::DictionaryValue) {} |
54 | 54 |
55 ManagedUserSettingsService::~ManagedUserSettingsService() {} | 55 ManagedUserSettingsService::~ManagedUserSettingsService() {} |
56 | 56 |
57 void ManagedUserSettingsService::Init( | 57 void ManagedUserSettingsService::Init( |
58 base::FilePath profile_path, | 58 base::FilePath profile_path, |
59 base::SequencedTaskRunner* sequenced_task_runner, | 59 base::SequencedTaskRunner* sequenced_task_runner, |
60 bool load_synchronously) { | 60 bool load_synchronously) { |
61 base::FilePath path = | 61 base::FilePath path = |
62 profile_path.Append(chrome::kManagedUserSettingsFilename); | 62 profile_path.Append(chrome::kSupervisedUserSettingsFilename); |
63 PersistentPrefStore* store = new JsonPrefStore( | 63 PersistentPrefStore* store = new JsonPrefStore( |
64 path, sequenced_task_runner, scoped_ptr<PrefFilter>()); | 64 path, sequenced_task_runner, scoped_ptr<PrefFilter>()); |
65 Init(store); | 65 Init(store); |
66 if (load_synchronously) | 66 if (load_synchronously) |
67 store_->ReadPrefs(); | 67 store_->ReadPrefs(); |
68 else | 68 else |
69 store_->ReadPrefsAsync(NULL); | 69 store_->ReadPrefsAsync(NULL); |
70 } | 70 } |
71 | 71 |
72 void ManagedUserSettingsService::Init( | 72 void ManagedUserSettingsService::Init( |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 | 159 |
160 void ManagedUserSettingsService::Shutdown() { | 160 void ManagedUserSettingsService::Shutdown() { |
161 store_->RemoveObserver(this); | 161 store_->RemoveObserver(this); |
162 } | 162 } |
163 | 163 |
164 SyncMergeResult ManagedUserSettingsService::MergeDataAndStartSyncing( | 164 SyncMergeResult ManagedUserSettingsService::MergeDataAndStartSyncing( |
165 ModelType type, | 165 ModelType type, |
166 const SyncDataList& initial_sync_data, | 166 const SyncDataList& initial_sync_data, |
167 scoped_ptr<SyncChangeProcessor> sync_processor, | 167 scoped_ptr<SyncChangeProcessor> sync_processor, |
168 scoped_ptr<SyncErrorFactory> error_handler) { | 168 scoped_ptr<SyncErrorFactory> error_handler) { |
169 DCHECK_EQ(MANAGED_USER_SETTINGS, type); | 169 DCHECK_EQ(SUPERVISED_USER_SETTINGS, type); |
170 sync_processor_ = sync_processor.Pass(); | 170 sync_processor_ = sync_processor.Pass(); |
171 error_handler_ = error_handler.Pass(); | 171 error_handler_ = error_handler.Pass(); |
172 | 172 |
173 // Clear all atomic and split settings, then recreate them from Sync data. | 173 // Clear all atomic and split settings, then recreate them from Sync data. |
174 Clear(); | 174 Clear(); |
175 for (SyncDataList::const_iterator it = initial_sync_data.begin(); | 175 for (SyncDataList::const_iterator it = initial_sync_data.begin(); |
176 it != initial_sync_data.end(); ++it) { | 176 it != initial_sync_data.end(); ++it) { |
177 DCHECK_EQ(MANAGED_USER_SETTINGS, it->GetDataType()); | 177 DCHECK_EQ(SUPERVISED_USER_SETTINGS, it->GetDataType()); |
178 const ::sync_pb::ManagedUserSettingSpecifics& managed_user_setting = | 178 const ::sync_pb::ManagedUserSettingSpecifics& managed_user_setting = |
179 it->GetSpecifics().managed_user_setting(); | 179 it->GetSpecifics().managed_user_setting(); |
180 scoped_ptr<base::Value> value( | 180 scoped_ptr<base::Value> value( |
181 JSONReader::Read(managed_user_setting.value())); | 181 JSONReader::Read(managed_user_setting.value())); |
182 std::string name_suffix = managed_user_setting.name(); | 182 std::string name_suffix = managed_user_setting.name(); |
183 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&name_suffix); | 183 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&name_suffix); |
184 dict->SetWithoutPathExpansion(name_suffix, value.release()); | 184 dict->SetWithoutPathExpansion(name_suffix, value.release()); |
185 } | 185 } |
186 store_->ReportValueChanged(kAtomicSettings); | 186 store_->ReportValueChanged(kAtomicSettings); |
187 store_->ReportValueChanged(kSplitSettings); | 187 store_->ReportValueChanged(kSplitSettings); |
188 InformSubscribers(); | 188 InformSubscribers(); |
189 | 189 |
190 // Upload all the queued up items (either with an ADD or an UPDATE action, | 190 // Upload all the queued up items (either with an ADD or an UPDATE action, |
191 // depending on whether they already exist) and move them to split settings. | 191 // depending on whether they already exist) and move them to split settings. |
192 SyncChangeList change_list; | 192 SyncChangeList change_list; |
193 base::DictionaryValue* queued_items = GetQueuedItems(); | 193 base::DictionaryValue* queued_items = GetQueuedItems(); |
194 for (base::DictionaryValue::Iterator it(*queued_items); !it.IsAtEnd(); | 194 for (base::DictionaryValue::Iterator it(*queued_items); !it.IsAtEnd(); |
195 it.Advance()) { | 195 it.Advance()) { |
196 std::string key_suffix = it.key(); | 196 std::string key_suffix = it.key(); |
197 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key_suffix); | 197 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key_suffix); |
198 SyncData data = CreateSyncDataForSetting(it.key(), it.value()); | 198 SyncData data = CreateSyncDataForSetting(it.key(), it.value()); |
199 SyncChange::SyncChangeType change_type = | 199 SyncChange::SyncChangeType change_type = |
200 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE | 200 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE |
201 : SyncChange::ACTION_ADD; | 201 : SyncChange::ACTION_ADD; |
202 change_list.push_back(SyncChange(FROM_HERE, change_type, data)); | 202 change_list.push_back(SyncChange(FROM_HERE, change_type, data)); |
203 dict->SetWithoutPathExpansion(key_suffix, it.value().DeepCopy()); | 203 dict->SetWithoutPathExpansion(key_suffix, it.value().DeepCopy()); |
204 } | 204 } |
205 queued_items->Clear(); | 205 queued_items->Clear(); |
206 | 206 |
207 SyncMergeResult result(MANAGED_USER_SETTINGS); | 207 SyncMergeResult result(SUPERVISED_USER_SETTINGS); |
208 // Process all the accumulated changes from the queued items. | 208 // Process all the accumulated changes from the queued items. |
209 if (change_list.size() > 0) { | 209 if (change_list.size() > 0) { |
210 store_->ReportValueChanged(kQueuedItems); | 210 store_->ReportValueChanged(kQueuedItems); |
211 result.set_error( | 211 result.set_error( |
212 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); | 212 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); |
213 } | 213 } |
214 | 214 |
215 // TODO(bauerb): Statistics? | 215 // TODO(bauerb): Statistics? |
216 return result; | 216 return result; |
217 } | 217 } |
218 | 218 |
219 void ManagedUserSettingsService::StopSyncing(ModelType type) { | 219 void ManagedUserSettingsService::StopSyncing(ModelType type) { |
220 DCHECK_EQ(syncer::MANAGED_USER_SETTINGS, type); | 220 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type); |
221 sync_processor_.reset(); | 221 sync_processor_.reset(); |
222 error_handler_.reset(); | 222 error_handler_.reset(); |
223 } | 223 } |
224 | 224 |
225 SyncDataList ManagedUserSettingsService::GetAllSyncData( | 225 SyncDataList ManagedUserSettingsService::GetAllSyncData( |
226 ModelType type) const { | 226 ModelType type) const { |
227 DCHECK_EQ(syncer::MANAGED_USER_SETTINGS, type); | 227 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type); |
228 SyncDataList data; | 228 SyncDataList data; |
229 for (base::DictionaryValue::Iterator it(*GetAtomicSettings()); !it.IsAtEnd(); | 229 for (base::DictionaryValue::Iterator it(*GetAtomicSettings()); !it.IsAtEnd(); |
230 it.Advance()) { | 230 it.Advance()) { |
231 data.push_back(CreateSyncDataForSetting(it.key(), it.value())); | 231 data.push_back(CreateSyncDataForSetting(it.key(), it.value())); |
232 } | 232 } |
233 for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd(); | 233 for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd(); |
234 it.Advance()) { | 234 it.Advance()) { |
235 const base::DictionaryValue* dict = NULL; | 235 const base::DictionaryValue* dict = NULL; |
236 it.value().GetAsDictionary(&dict); | 236 it.value().GetAsDictionary(&dict); |
237 for (base::DictionaryValue::Iterator jt(*dict); | 237 for (base::DictionaryValue::Iterator jt(*dict); |
238 !jt.IsAtEnd(); jt.Advance()) { | 238 !jt.IsAtEnd(); jt.Advance()) { |
239 data.push_back(CreateSyncDataForSetting( | 239 data.push_back(CreateSyncDataForSetting( |
240 MakeSplitSettingKey(it.key(), jt.key()), jt.value())); | 240 MakeSplitSettingKey(it.key(), jt.key()), jt.value())); |
241 } | 241 } |
242 } | 242 } |
243 DCHECK_EQ(0u, GetQueuedItems()->size()); | 243 DCHECK_EQ(0u, GetQueuedItems()->size()); |
244 return data; | 244 return data; |
245 } | 245 } |
246 | 246 |
247 SyncError ManagedUserSettingsService::ProcessSyncChanges( | 247 SyncError ManagedUserSettingsService::ProcessSyncChanges( |
248 const tracked_objects::Location& from_here, | 248 const tracked_objects::Location& from_here, |
249 const SyncChangeList& change_list) { | 249 const SyncChangeList& change_list) { |
250 for (SyncChangeList::const_iterator it = change_list.begin(); | 250 for (SyncChangeList::const_iterator it = change_list.begin(); |
251 it != change_list.end(); ++it) { | 251 it != change_list.end(); ++it) { |
252 SyncData data = it->sync_data(); | 252 SyncData data = it->sync_data(); |
253 DCHECK_EQ(MANAGED_USER_SETTINGS, data.GetDataType()); | 253 DCHECK_EQ(SUPERVISED_USER_SETTINGS, data.GetDataType()); |
254 const ::sync_pb::ManagedUserSettingSpecifics& managed_user_setting = | 254 const ::sync_pb::ManagedUserSettingSpecifics& managed_user_setting = |
255 data.GetSpecifics().managed_user_setting(); | 255 data.GetSpecifics().managed_user_setting(); |
256 std::string key = managed_user_setting.name(); | 256 std::string key = managed_user_setting.name(); |
257 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key); | 257 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key); |
258 switch (it->change_type()) { | 258 switch (it->change_type()) { |
259 case SyncChange::ACTION_ADD: | 259 case SyncChange::ACTION_ADD: |
260 case SyncChange::ACTION_UPDATE: { | 260 case SyncChange::ACTION_UPDATE: { |
261 scoped_ptr<base::Value> value( | 261 scoped_ptr<base::Value> value( |
262 JSONReader::Read(managed_user_setting.value())); | 262 JSONReader::Read(managed_user_setting.value())); |
263 if (dict->HasKey(key)) { | 263 if (dict->HasKey(key)) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 void ManagedUserSettingsService::InformSubscribers() { | 374 void ManagedUserSettingsService::InformSubscribers() { |
375 if (!IsReady()) | 375 if (!IsReady()) |
376 return; | 376 return; |
377 | 377 |
378 scoped_ptr<base::DictionaryValue> settings = GetSettings(); | 378 scoped_ptr<base::DictionaryValue> settings = GetSettings(); |
379 for (std::vector<SettingsCallback>::iterator it = subscribers_.begin(); | 379 for (std::vector<SettingsCallback>::iterator it = subscribers_.begin(); |
380 it != subscribers_.end(); ++it) { | 380 it != subscribers_.end(); ++it) { |
381 it->Run(settings.get()); | 381 it->Run(settings.get()); |
382 } | 382 } |
383 } | 383 } |
OLD | NEW |