Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/supervised_user/supervised_user_settings_service.h" | 5 #include "chrome/browser/supervised_user/supervised_user_settings_service.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 186 | 186 |
| 187 SyncMergeResult SupervisedUserSettingsService::MergeDataAndStartSyncing( | 187 SyncMergeResult SupervisedUserSettingsService::MergeDataAndStartSyncing( |
| 188 ModelType type, | 188 ModelType type, |
| 189 const SyncDataList& initial_sync_data, | 189 const SyncDataList& initial_sync_data, |
| 190 scoped_ptr<SyncChangeProcessor> sync_processor, | 190 scoped_ptr<SyncChangeProcessor> sync_processor, |
| 191 scoped_ptr<SyncErrorFactory> error_handler) { | 191 scoped_ptr<SyncErrorFactory> error_handler) { |
| 192 DCHECK_EQ(SUPERVISED_USER_SETTINGS, type); | 192 DCHECK_EQ(SUPERVISED_USER_SETTINGS, type); |
| 193 sync_processor_ = std::move(sync_processor); | 193 sync_processor_ = std::move(sync_processor); |
| 194 error_handler_ = std::move(error_handler); | 194 error_handler_ = std::move(error_handler); |
| 195 | 195 |
| 196 std::map<std::string, std::string> seen_keys; | |
| 197 int num_before_association = GetAtomicSettings()->size(); | |
| 198 for (base::DictionaryValue::Iterator it(*GetAtomicSettings()); !it.IsAtEnd(); | |
| 199 it.Advance()) { | |
| 200 std::string json_value; | |
| 201 base::JSONWriter::Write(it.value(), &json_value); | |
| 202 seen_keys[it.key()] = json_value; | |
| 203 } | |
| 204 for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd(); | |
| 205 it.Advance()) { | |
| 206 const base::DictionaryValue* dict = nullptr; | |
| 207 it.value().GetAsDictionary(&dict); | |
| 208 num_before_association += dict->size(); | |
| 209 for (base::DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd(); | |
| 210 jt.Advance()) { | |
| 211 std::string json_value; | |
| 212 base::JSONWriter::Write(jt.value(), &json_value); | |
|
Bernhard Bauer
2016/01/08 16:04:46
You serialize the values and then compare them bel
Deepak
2016/01/11 10:38:36
Done.
| |
| 213 seen_keys[MakeSplitSettingKey(it.key(), jt.key())] = json_value; | |
| 214 } | |
| 215 } | |
| 216 | |
| 196 // Clear all atomic and split settings, then recreate them from Sync data. | 217 // Clear all atomic and split settings, then recreate them from Sync data. |
| 197 Clear(); | 218 Clear(); |
| 219 int num_added = 0; | |
| 220 int num_modified = 0; | |
| 198 for (const SyncData& sync_data : initial_sync_data) { | 221 for (const SyncData& sync_data : initial_sync_data) { |
| 199 DCHECK_EQ(SUPERVISED_USER_SETTINGS, sync_data.GetDataType()); | 222 DCHECK_EQ(SUPERVISED_USER_SETTINGS, sync_data.GetDataType()); |
| 200 const ::sync_pb::ManagedUserSettingSpecifics& supervised_user_setting = | 223 const ::sync_pb::ManagedUserSettingSpecifics& supervised_user_setting = |
| 201 sync_data.GetSpecifics().managed_user_setting(); | 224 sync_data.GetSpecifics().managed_user_setting(); |
| 202 scoped_ptr<base::Value> value = | 225 scoped_ptr<base::Value> value = |
| 203 JSONReader::Read(supervised_user_setting.value()); | 226 JSONReader::Read(supervised_user_setting.value()); |
| 204 std::string name_suffix = supervised_user_setting.name(); | 227 std::string name_suffix = supervised_user_setting.name(); |
| 228 std::string name_key = name_suffix; | |
| 205 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&name_suffix); | 229 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&name_suffix); |
| 206 dict->SetWithoutPathExpansion(name_suffix, value.release()); | 230 dict->SetWithoutPathExpansion(name_suffix, value.release()); |
| 231 | |
| 232 if (seen_keys.find(name_key) == seen_keys.end()) { | |
| 233 num_added++; | |
| 234 } else { | |
| 235 for (DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd(); jt.Advance()) { | |
| 236 std::string json_value; | |
|
Bernhard Bauer
2016/01/08 16:04:46
This is identical to supervised_user_setting.value
Deepak
2016/01/11 10:38:36
Done.
| |
| 237 base::JSONWriter::Write(jt.value(), &json_value); | |
| 238 if (seen_keys[name_key] != json_value) | |
| 239 num_modified++; | |
| 240 } | |
| 241 } | |
| 207 } | 242 } |
| 243 | |
| 208 store_->ReportValueChanged(kAtomicSettings, | 244 store_->ReportValueChanged(kAtomicSettings, |
| 209 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 245 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); |
| 210 store_->ReportValueChanged(kSplitSettings, | 246 store_->ReportValueChanged(kSplitSettings, |
| 211 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 247 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); |
| 212 InformSubscribers(); | 248 InformSubscribers(); |
| 213 | 249 |
| 214 // Upload all the queued up items (either with an ADD or an UPDATE action, | 250 // Upload all the queued up items (either with an ADD or an UPDATE action, |
| 215 // depending on whether they already exist) and move them to split settings. | 251 // depending on whether they already exist) and move them to split settings. |
|
Bernhard Bauer
2016/01/08 16:04:46
As you mention in the CL message, you ignore queue
Deepak
2016/01/11 10:38:36
I thought that we should consider that things that
Bernhard Bauer
2016/01/18 17:56:56
That is the data from Sync. The number of items be
| |
| 216 SyncChangeList change_list; | 252 SyncChangeList change_list; |
| 217 base::DictionaryValue* queued_items = GetQueuedItems(); | 253 base::DictionaryValue* queued_items = GetQueuedItems(); |
| 218 for (base::DictionaryValue::Iterator it(*queued_items); !it.IsAtEnd(); | 254 for (base::DictionaryValue::Iterator it(*queued_items); !it.IsAtEnd(); |
| 219 it.Advance()) { | 255 it.Advance()) { |
| 220 std::string key_suffix = it.key(); | 256 std::string key_suffix = it.key(); |
| 221 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key_suffix); | 257 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key_suffix); |
| 222 SyncData data = CreateSyncDataForSetting(it.key(), it.value()); | 258 SyncData data = CreateSyncDataForSetting(it.key(), it.value()); |
| 223 SyncChange::SyncChangeType change_type = | 259 SyncChange::SyncChangeType change_type = |
| 224 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE | 260 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE |
| 225 : SyncChange::ACTION_ADD; | 261 : SyncChange::ACTION_ADD; |
| 226 change_list.push_back(SyncChange(FROM_HERE, change_type, data)); | 262 change_list.push_back(SyncChange(FROM_HERE, change_type, data)); |
| 227 dict->SetWithoutPathExpansion(key_suffix, it.value().DeepCopy()); | 263 dict->SetWithoutPathExpansion(key_suffix, it.value().DeepCopy()); |
| 228 } | 264 } |
| 229 queued_items->Clear(); | 265 queued_items->Clear(); |
| 230 | 266 |
| 231 SyncMergeResult result(SUPERVISED_USER_SETTINGS); | 267 SyncMergeResult result(SUPERVISED_USER_SETTINGS); |
| 232 // Process all the accumulated changes from the queued items. | 268 // Process all the accumulated changes from the queued items. |
| 233 if (change_list.size() > 0) { | 269 if (change_list.size() > 0) { |
| 234 store_->ReportValueChanged(kQueuedItems, | 270 store_->ReportValueChanged(kQueuedItems, |
| 235 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); | 271 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); |
| 236 result.set_error( | 272 result.set_error( |
| 237 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); | 273 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); |
| 238 } | 274 } |
| 239 | 275 |
| 240 // TODO(bauerb): Statistics? | 276 result.set_num_items_added(num_added); |
| 277 result.set_num_items_modified(num_modified); | |
| 278 result.set_num_items_deleted(num_before_association - num_modified); | |
| 279 result.set_num_items_before_association(num_before_association); | |
| 280 result.set_num_items_after_association(GetAllSyncData(type).size()); | |
|
Bernhard Bauer
2016/01/08 16:04:46
This is clever, but I'm a bit wary that this does
Deepak
2016/01/11 10:38:36
Done.
| |
| 241 return result; | 281 return result; |
| 242 } | 282 } |
| 243 | 283 |
| 244 void SupervisedUserSettingsService::StopSyncing(ModelType type) { | 284 void SupervisedUserSettingsService::StopSyncing(ModelType type) { |
| 245 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type); | 285 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type); |
| 246 sync_processor_.reset(); | 286 sync_processor_.reset(); |
| 247 error_handler_.reset(); | 287 error_handler_.reset(); |
| 248 } | 288 } |
| 249 | 289 |
| 250 SyncDataList SupervisedUserSettingsService::GetAllSyncData( | 290 SyncDataList SupervisedUserSettingsService::GetAllSyncData( |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 410 return settings; | 450 return settings; |
| 411 } | 451 } |
| 412 | 452 |
| 413 void SupervisedUserSettingsService::InformSubscribers() { | 453 void SupervisedUserSettingsService::InformSubscribers() { |
| 414 if (!IsReady()) | 454 if (!IsReady()) |
| 415 return; | 455 return; |
| 416 | 456 |
| 417 scoped_ptr<base::DictionaryValue> settings = GetSettings(); | 457 scoped_ptr<base::DictionaryValue> settings = GetSettings(); |
| 418 callback_list_.Notify(settings.get()); | 458 callback_list_.Notify(settings.get()); |
| 419 } | 459 } |
| OLD | NEW |