| Index: chrome/browser/supervised_user/supervised_user_settings_service.cc
|
| diff --git a/chrome/browser/supervised_user/supervised_user_settings_service.cc b/chrome/browser/supervised_user/supervised_user_settings_service.cc
|
| index 0577ab8d88316da6aa94e89c3aa6e9583ccfb48f..783af6e78f4e73df5f04cbf39e9381b0719181f6 100644
|
| --- a/chrome/browser/supervised_user/supervised_user_settings_service.cc
|
| +++ b/chrome/browser/supervised_user/supervised_user_settings_service.cc
|
| @@ -78,7 +78,7 @@ void SupervisedUserSettingsService::Init(
|
| // is fixed.
|
| CHECK(store_->IsInitializationComplete());
|
| } else {
|
| - store_->ReadPrefsAsync(NULL);
|
| + store_->ReadPrefsAsync(nullptr);
|
| }
|
| }
|
|
|
| @@ -134,7 +134,7 @@ void SupervisedUserSettingsService::UploadItem(const std::string& key,
|
| DCHECK(!SettingShouldApplyToPrefs(key));
|
|
|
| std::string key_suffix = key;
|
| - base::DictionaryValue* dict = NULL;
|
| + base::DictionaryValue* dict = nullptr;
|
| if (sync_processor_) {
|
| content::RecordAction(UserMetricsAction("ManagedUsers_UploadItem_Syncing"));
|
| dict = GetDictionaryAndSplitKey(&key_suffix);
|
| @@ -163,7 +163,7 @@ void SupervisedUserSettingsService::SetLocalSetting(
|
| if (value)
|
| local_settings_->SetWithoutPathExpansion(key, value.release());
|
| else
|
| - local_settings_->RemoveWithoutPathExpansion(key, NULL);
|
| + local_settings_->RemoveWithoutPathExpansion(key, nullptr);
|
|
|
| InformSubscribers();
|
| }
|
| @@ -193,8 +193,36 @@ SyncMergeResult SupervisedUserSettingsService::MergeDataAndStartSyncing(
|
| sync_processor_ = std::move(sync_processor);
|
| error_handler_ = std::move(error_handler);
|
|
|
| + std::set<std::string> seen_keys;
|
| + int num_before_association = 0;
|
| + // Getting number of atomic setting items.
|
| + num_before_association = GetAtomicSettings()->size();
|
| + for (base::DictionaryValue::Iterator it(*GetAtomicSettings()); !it.IsAtEnd();
|
| + it.Advance()) {
|
| + seen_keys.insert(it.key());
|
| + }
|
| + // Getting number of split setting items.
|
| + for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd();
|
| + it.Advance()) {
|
| + const base::DictionaryValue* dict = nullptr;
|
| + it.value().GetAsDictionary(&dict);
|
| + num_before_association += dict->size();
|
| + for (base::DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd();
|
| + jt.Advance()) {
|
| + seen_keys.insert(MakeSplitSettingKey(it.key(), jt.key()));
|
| + }
|
| + }
|
| +
|
| + int num_deleted = num_before_association;
|
| + // Getting number of queued items.
|
| + base::DictionaryValue* queued_items = GetQueuedItems();
|
| + num_before_association += queued_items->size();
|
| +
|
| // Clear all atomic and split settings, then recreate them from Sync data.
|
| Clear();
|
| + int num_added = 0;
|
| + int num_modified = 0;
|
| + std::set<std::string> added_sync_keys;
|
| for (const SyncData& sync_data : initial_sync_data) {
|
| DCHECK_EQ(SUPERVISED_USER_SETTINGS, sync_data.GetDataType());
|
| const ::sync_pb::ManagedUserSettingSpecifics& supervised_user_setting =
|
| @@ -202,9 +230,19 @@ SyncMergeResult SupervisedUserSettingsService::MergeDataAndStartSyncing(
|
| scoped_ptr<base::Value> value =
|
| JSONReader::Read(supervised_user_setting.value());
|
| std::string name_suffix = supervised_user_setting.name();
|
| + std::string name_key = name_suffix;
|
| base::DictionaryValue* dict = GetDictionaryAndSplitKey(&name_suffix);
|
| dict->SetWithoutPathExpansion(name_suffix, value.release());
|
| + if (seen_keys.find(name_key) == seen_keys.end()) {
|
| + added_sync_keys.insert(name_key);
|
| + num_added++;
|
| + } else {
|
| + num_modified++;
|
| + }
|
| }
|
| +
|
| + num_deleted -= num_modified;
|
| +
|
| store_->ReportValueChanged(kAtomicSettings,
|
| WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
|
| store_->ReportValueChanged(kSplitSettings,
|
| @@ -214,10 +252,10 @@ SyncMergeResult SupervisedUserSettingsService::MergeDataAndStartSyncing(
|
| // Upload all the queued up items (either with an ADD or an UPDATE action,
|
| // depending on whether they already exist) and move them to split settings.
|
| SyncChangeList change_list;
|
| - base::DictionaryValue* queued_items = GetQueuedItems();
|
| for (base::DictionaryValue::Iterator it(*queued_items); !it.IsAtEnd();
|
| it.Advance()) {
|
| std::string key_suffix = it.key();
|
| + std::string name_key = key_suffix;
|
| base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key_suffix);
|
| SyncData data = CreateSyncDataForSetting(it.key(), it.value());
|
| SyncChange::SyncChangeType change_type =
|
| @@ -225,6 +263,9 @@ SyncMergeResult SupervisedUserSettingsService::MergeDataAndStartSyncing(
|
| : SyncChange::ACTION_ADD;
|
| change_list.push_back(SyncChange(FROM_HERE, change_type, data));
|
| dict->SetWithoutPathExpansion(key_suffix, it.value().DeepCopy());
|
| + if (added_sync_keys.find(name_key) != added_sync_keys.end()) {
|
| + num_added--;
|
| + }
|
| }
|
| queued_items->Clear();
|
|
|
| @@ -237,7 +278,26 @@ SyncMergeResult SupervisedUserSettingsService::MergeDataAndStartSyncing(
|
| sync_processor_->ProcessSyncChanges(FROM_HERE, change_list));
|
| }
|
|
|
| - // TODO(bauerb): Statistics?
|
| + // Calculating number of items after association.
|
| + int num_after_association = 0;
|
| + // Getting number of atomic setting items.
|
| + num_after_association = GetAtomicSettings()->size();
|
| + // Getting number of split setting items.
|
| + for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd();
|
| + it.Advance()) {
|
| + const base::DictionaryValue* dict = nullptr;
|
| + it.value().GetAsDictionary(&dict);
|
| + num_after_association += dict->size();
|
| + }
|
| + // Getting number of queued items.
|
| + queued_items = GetQueuedItems();
|
| + num_after_association += queued_items->size();
|
| +
|
| + result.set_num_items_added(num_added);
|
| + result.set_num_items_modified(num_modified);
|
| + result.set_num_items_deleted(num_deleted);
|
| + result.set_num_items_before_association(num_before_association);
|
| + result.set_num_items_after_association(num_after_association);
|
| return result;
|
| }
|
|
|
| @@ -257,7 +317,7 @@ SyncDataList SupervisedUserSettingsService::GetAllSyncData(
|
| }
|
| for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd();
|
| it.Advance()) {
|
| - const base::DictionaryValue* dict = NULL;
|
| + const base::DictionaryValue* dict = nullptr;
|
| it.value().GetAsDictionary(&dict);
|
| for (base::DictionaryValue::Iterator jt(*dict);
|
| !jt.IsAtEnd(); jt.Advance()) {
|
| @@ -298,7 +358,7 @@ SyncError SupervisedUserSettingsService::ProcessSyncChanges(
|
| case SyncChange::ACTION_DELETE: {
|
| DLOG_IF(WARNING, !dict->HasKey(key)) << "Trying to delete nonexistent "
|
| << "key " << key;
|
| - dict->RemoveWithoutPathExpansion(key, NULL);
|
| + dict->RemoveWithoutPathExpansion(key, nullptr);
|
| break;
|
| }
|
| case SyncChange::ACTION_INVALID: {
|
| @@ -337,8 +397,8 @@ void SupervisedUserSettingsService::OnInitializationCompleted(bool success) {
|
|
|
| base::DictionaryValue* SupervisedUserSettingsService::GetOrCreateDictionary(
|
| const std::string& key) const {
|
| - base::Value* value = NULL;
|
| - base::DictionaryValue* dict = NULL;
|
| + base::Value* value = nullptr;
|
| + base::DictionaryValue* dict = nullptr;
|
| if (store_->GetMutableValue(key, &value)) {
|
| bool success = value->GetAsDictionary(&dict);
|
| DCHECK(success);
|
| @@ -372,7 +432,7 @@ base::DictionaryValue* SupervisedUserSettingsService::GetDictionaryAndSplitKey(
|
|
|
| base::DictionaryValue* split_settings = GetSplitSettings();
|
| std::string prefix = key->substr(0, pos);
|
| - base::DictionaryValue* dict = NULL;
|
| + base::DictionaryValue* dict = nullptr;
|
| if (!split_settings->GetDictionary(prefix, &dict)) {
|
| dict = new base::DictionaryValue;
|
| DCHECK(!split_settings->HasKey(prefix));
|
|
|