Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(643)

Side by Side Diff: chrome/browser/supervised_user/supervised_user_settings_service.cc

Issue 835683003: [NOT FOR REVIEW] only for running build bots only Testing Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 PersistentPrefStore* store = new JsonPrefStore( 71 PersistentPrefStore* store = new JsonPrefStore(
72 path, sequenced_task_runner, scoped_ptr<PrefFilter>()); 72 path, sequenced_task_runner, scoped_ptr<PrefFilter>());
73 Init(store); 73 Init(store);
74 if (load_synchronously) { 74 if (load_synchronously) {
75 store_->ReadPrefs(); 75 store_->ReadPrefs();
76 // TODO(bauerb): Temporary CHECK while investigating 76 // TODO(bauerb): Temporary CHECK while investigating
77 // https://crbug.com/425785. Remove (or change to DCHECK) once the bug 77 // https://crbug.com/425785. Remove (or change to DCHECK) once the bug
78 // is fixed. 78 // is fixed.
79 CHECK(store_->IsInitializationComplete()); 79 CHECK(store_->IsInitializationComplete());
80 } else { 80 } else {
81 store_->ReadPrefsAsync(NULL); 81 store_->ReadPrefsAsync(nullptr);
82 } 82 }
83 } 83 }
84 84
85 void SupervisedUserSettingsService::Init( 85 void SupervisedUserSettingsService::Init(
86 scoped_refptr<PersistentPrefStore> store) { 86 scoped_refptr<PersistentPrefStore> store) {
87 DCHECK(!store_.get()); 87 DCHECK(!store_.get());
88 store_ = store; 88 store_ = store;
89 store_->AddObserver(this); 89 store_->AddObserver(this);
90 } 90 }
91 91
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 const std::string& prefix, 127 const std::string& prefix,
128 const std::string& key) { 128 const std::string& key) {
129 return prefix + kSplitSettingKeySeparator + key; 129 return prefix + kSplitSettingKeySeparator + key;
130 } 130 }
131 131
132 void SupervisedUserSettingsService::UploadItem(const std::string& key, 132 void SupervisedUserSettingsService::UploadItem(const std::string& key,
133 scoped_ptr<base::Value> value) { 133 scoped_ptr<base::Value> value) {
134 DCHECK(!SettingShouldApplyToPrefs(key)); 134 DCHECK(!SettingShouldApplyToPrefs(key));
135 135
136 std::string key_suffix = key; 136 std::string key_suffix = key;
137 base::DictionaryValue* dict = NULL; 137 base::DictionaryValue* dict = nullptr;
138 if (sync_processor_) { 138 if (sync_processor_) {
139 content::RecordAction(UserMetricsAction("ManagedUsers_UploadItem_Syncing")); 139 content::RecordAction(UserMetricsAction("ManagedUsers_UploadItem_Syncing"));
140 dict = GetDictionaryAndSplitKey(&key_suffix); 140 dict = GetDictionaryAndSplitKey(&key_suffix);
141 DCHECK(GetQueuedItems()->empty()); 141 DCHECK(GetQueuedItems()->empty());
142 SyncChangeList change_list; 142 SyncChangeList change_list;
143 SyncData data = CreateSyncDataForSetting(key, *value); 143 SyncData data = CreateSyncDataForSetting(key, *value);
144 SyncChange::SyncChangeType change_type = 144 SyncChange::SyncChangeType change_type =
145 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE 145 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE
146 : SyncChange::ACTION_ADD; 146 : SyncChange::ACTION_ADD;
147 change_list.push_back(SyncChange(FROM_HERE, change_type, data)); 147 change_list.push_back(SyncChange(FROM_HERE, change_type, data));
148 SyncError error = 148 SyncError error =
149 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); 149 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list);
150 DCHECK(!error.IsSet()) << error.ToString(); 150 DCHECK(!error.IsSet()) << error.ToString();
151 } else { 151 } else {
152 // Queue the item up to be uploaded when we start syncing 152 // Queue the item up to be uploaded when we start syncing
153 // (in MergeDataAndStartSyncing()). 153 // (in MergeDataAndStartSyncing()).
154 content::RecordAction(UserMetricsAction("ManagedUsers_UploadItem_Queued")); 154 content::RecordAction(UserMetricsAction("ManagedUsers_UploadItem_Queued"));
155 dict = GetQueuedItems(); 155 dict = GetQueuedItems();
156 } 156 }
157 dict->SetWithoutPathExpansion(key_suffix, value.release()); 157 dict->SetWithoutPathExpansion(key_suffix, value.release());
158 } 158 }
159 159
160 void SupervisedUserSettingsService::SetLocalSetting( 160 void SupervisedUserSettingsService::SetLocalSetting(
161 const std::string& key, 161 const std::string& key,
162 scoped_ptr<base::Value> value) { 162 scoped_ptr<base::Value> value) {
163 if (value) 163 if (value)
164 local_settings_->SetWithoutPathExpansion(key, value.release()); 164 local_settings_->SetWithoutPathExpansion(key, value.release());
165 else 165 else
166 local_settings_->RemoveWithoutPathExpansion(key, NULL); 166 local_settings_->RemoveWithoutPathExpansion(key, nullptr);
167 167
168 InformSubscribers(); 168 InformSubscribers();
169 } 169 }
170 170
171 // static 171 // static
172 SyncData SupervisedUserSettingsService::CreateSyncDataForSetting( 172 SyncData SupervisedUserSettingsService::CreateSyncDataForSetting(
173 const std::string& name, 173 const std::string& name,
174 const base::Value& value) { 174 const base::Value& value) {
175 std::string json_value; 175 std::string json_value;
176 base::JSONWriter::Write(value, &json_value); 176 base::JSONWriter::Write(value, &json_value);
177 ::sync_pb::EntitySpecifics specifics; 177 ::sync_pb::EntitySpecifics specifics;
178 specifics.mutable_managed_user_setting()->set_name(name); 178 specifics.mutable_managed_user_setting()->set_name(name);
179 specifics.mutable_managed_user_setting()->set_value(json_value); 179 specifics.mutable_managed_user_setting()->set_value(json_value);
180 return SyncData::CreateLocalData(name, name, specifics); 180 return SyncData::CreateLocalData(name, name, specifics);
181 } 181 }
182 182
183 void SupervisedUserSettingsService::Shutdown() { 183 void SupervisedUserSettingsService::Shutdown() {
184 store_->RemoveObserver(this); 184 store_->RemoveObserver(this);
185 } 185 }
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, const base::Value*> seen_keys;
197 int num_before_association = GetAtomicSettings()->size();
198 for (base::DictionaryValue::Iterator it(*GetAtomicSettings()); !it.IsAtEnd();
199 it.Advance()) {
200 seen_keys[it.key()] = &it.value();
201 }
202 for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd();
203 it.Advance()) {
204 const base::DictionaryValue* dict = nullptr;
205 it.value().GetAsDictionary(&dict);
206 num_before_association += dict->size();
207 for (base::DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd();
208 jt.Advance()) {
209 seen_keys[MakeSplitSettingKey(it.key(), jt.key())] = &jt.value();
210 }
211 }
212
213 LOG(ERROR) << "Deepak num_before_association:" << num_before_association;
214 for (std::map<std::string, const base::Value*>::iterator it =
215 seen_keys.begin();
216 it != seen_keys.end(); it++) {
217 LOG(ERROR) << "Deepak key:" << it->first;
218 std::string json_value;
219 base::JSONWriter::Write(*(it->second), &json_value);
220 LOG(ERROR) << "Deepak " << json_value;
221 }
196 // Clear all atomic and split settings, then recreate them from Sync data. 222 // Clear all atomic and split settings, then recreate them from Sync data.
197 Clear(); 223 Clear();
224 int num_added = 0;
225 int num_modified = 0;
198 for (const SyncData& sync_data : initial_sync_data) { 226 for (const SyncData& sync_data : initial_sync_data) {
199 DCHECK_EQ(SUPERVISED_USER_SETTINGS, sync_data.GetDataType()); 227 DCHECK_EQ(SUPERVISED_USER_SETTINGS, sync_data.GetDataType());
200 const ::sync_pb::ManagedUserSettingSpecifics& supervised_user_setting = 228 const ::sync_pb::ManagedUserSettingSpecifics& supervised_user_setting =
201 sync_data.GetSpecifics().managed_user_setting(); 229 sync_data.GetSpecifics().managed_user_setting();
202 scoped_ptr<base::Value> value = 230 scoped_ptr<base::Value> value =
203 JSONReader::Read(supervised_user_setting.value()); 231 JSONReader::Read(supervised_user_setting.value());
204 std::string name_suffix = supervised_user_setting.name(); 232 std::string name_suffix = supervised_user_setting.name();
233 std::string name_key = name_suffix;
234 LOG(ERROR) << "Deepak name_suffix:" << name_suffix;
205 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&name_suffix); 235 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&name_suffix);
206 dict->SetWithoutPathExpansion(name_suffix, value.release()); 236 dict->SetWithoutPathExpansion(name_suffix, value.release());
237 LOG(ERROR) << "Deepak " << supervised_user_setting.value();
238 std::map<std::string, const base::Value*>::iterator it =
239 seen_keys.find(name_key);
240 if (it == seen_keys.end()) {
241 LOG(ERROR) << "Deepak Item Added:" << name_suffix;
242 num_added++;
243 } else {
244 LOG(ERROR) << "Deepak for checking item modification";
245 if (it->second != value.get()) {
246 LOG(ERROR) << "Deepak modifying item";
247 num_modified++;
248 }
249 /* for (DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd();
250 jt.Advance()) {
251 std::string json_value;
252 base::JSONWriter::Write(jt.value(), &json_value);
253 LOG(ERROR) << "Deepak " << json_value;
254 if (seen_keys[name_key] != &jt.value()) {
255 LOG(ERROR) << "Deepak Item modified:" << name_key;
256 num_modified++;
257 }
258 }
259 */
260 }
207 } 261 }
262
263 LOG(ERROR) << "Deepak added:" << num_added << "modified:" << num_modified;
208 store_->ReportValueChanged(kAtomicSettings, 264 store_->ReportValueChanged(kAtomicSettings,
209 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); 265 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
210 store_->ReportValueChanged(kSplitSettings, 266 store_->ReportValueChanged(kSplitSettings,
211 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); 267 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
212 InformSubscribers(); 268 InformSubscribers();
213 269
214 // Upload all the queued up items (either with an ADD or an UPDATE action, 270 // 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. 271 // depending on whether they already exist) and move them to split settings.
216 SyncChangeList change_list; 272 SyncChangeList change_list;
217 base::DictionaryValue* queued_items = GetQueuedItems(); 273 base::DictionaryValue* queued_items = GetQueuedItems();
218 for (base::DictionaryValue::Iterator it(*queued_items); !it.IsAtEnd(); 274 for (base::DictionaryValue::Iterator it(*queued_items); !it.IsAtEnd();
219 it.Advance()) { 275 it.Advance()) {
220 std::string key_suffix = it.key(); 276 std::string key_suffix = it.key();
277 std::string name_key = key_suffix;
221 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key_suffix); 278 base::DictionaryValue* dict = GetDictionaryAndSplitKey(&key_suffix);
222 SyncData data = CreateSyncDataForSetting(it.key(), it.value()); 279 SyncData data = CreateSyncDataForSetting(it.key(), it.value());
223 SyncChange::SyncChangeType change_type = 280 SyncChange::SyncChangeType change_type =
224 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE 281 dict->HasKey(key_suffix) ? SyncChange::ACTION_UPDATE
225 : SyncChange::ACTION_ADD; 282 : SyncChange::ACTION_ADD;
226 change_list.push_back(SyncChange(FROM_HERE, change_type, data)); 283 change_list.push_back(SyncChange(FROM_HERE, change_type, data));
227 dict->SetWithoutPathExpansion(key_suffix, it.value().DeepCopy()); 284 dict->SetWithoutPathExpansion(key_suffix, it.value().DeepCopy());
285 if (seen_keys.find(name_key) == seen_keys.end()) {
286 LOG(ERROR) << "Deepak adding";
287 num_added++;
288 } else {
289 for (DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd(); jt.Advance()) {
290 if (seen_keys[name_key] != &jt.value()) {
291 LOG(ERROR) << "Deepak modifying";
292 num_modified++;
293 }
294 }
295 }
228 } 296 }
229 queued_items->Clear(); 297 queued_items->Clear();
298 LOG(ERROR) << "Deepak added:" << num_added << "modified:" << num_modified;
230 299
231 SyncMergeResult result(SUPERVISED_USER_SETTINGS); 300 SyncMergeResult result(SUPERVISED_USER_SETTINGS);
232 // Process all the accumulated changes from the queued items. 301 // Process all the accumulated changes from the queued items.
233 if (change_list.size() > 0) { 302 if (change_list.size() > 0) {
234 store_->ReportValueChanged(kQueuedItems, 303 store_->ReportValueChanged(kQueuedItems,
235 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); 304 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
236 result.set_error( 305 result.set_error(
237 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); 306 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list));
238 } 307 }
239 308
240 // TODO(bauerb): Statistics? 309 // Calculating number of items after association.
310 int num_after_association = GetAtomicSettings()->size();
311 for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd();
312 it.Advance()) {
313 const base::DictionaryValue* dict = nullptr;
314 it.value().GetAsDictionary(&dict);
315 num_after_association += dict->size();
316 }
317
318 LOG(ERROR) << "Deepak added:" << num_added;
319 LOG(ERROR) << "Deepak modified:" << num_modified;
320 LOG(ERROR) << "Deepak deleted:" << num_before_association - num_modified;
321 LOG(ERROR) << "Deepak beforeAssociation:" << num_before_association;
322 LOG(ERROR) << "Deepak afterAssociation:" << num_after_association;
323
324 result.set_num_items_added(num_added);
325 result.set_num_items_modified(num_modified);
326 result.set_num_items_deleted(num_before_association - num_modified);
327 result.set_num_items_before_association(num_before_association);
328 result.set_num_items_after_association(num_after_association);
241 return result; 329 return result;
242 } 330 }
243 331
244 void SupervisedUserSettingsService::StopSyncing(ModelType type) { 332 void SupervisedUserSettingsService::StopSyncing(ModelType type) {
245 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type); 333 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type);
246 sync_processor_.reset(); 334 sync_processor_.reset();
247 error_handler_.reset(); 335 error_handler_.reset();
248 } 336 }
249 337
250 SyncDataList SupervisedUserSettingsService::GetAllSyncData( 338 SyncDataList SupervisedUserSettingsService::GetAllSyncData(
251 ModelType type) const { 339 ModelType type) const {
252 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type); 340 DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type);
253 SyncDataList data; 341 SyncDataList data;
254 for (base::DictionaryValue::Iterator it(*GetAtomicSettings()); !it.IsAtEnd(); 342 for (base::DictionaryValue::Iterator it(*GetAtomicSettings()); !it.IsAtEnd();
255 it.Advance()) { 343 it.Advance()) {
256 data.push_back(CreateSyncDataForSetting(it.key(), it.value())); 344 data.push_back(CreateSyncDataForSetting(it.key(), it.value()));
257 } 345 }
258 for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd(); 346 for (base::DictionaryValue::Iterator it(*GetSplitSettings()); !it.IsAtEnd();
259 it.Advance()) { 347 it.Advance()) {
260 const base::DictionaryValue* dict = NULL; 348 const base::DictionaryValue* dict = nullptr;
261 it.value().GetAsDictionary(&dict); 349 it.value().GetAsDictionary(&dict);
262 for (base::DictionaryValue::Iterator jt(*dict); 350 for (base::DictionaryValue::Iterator jt(*dict);
263 !jt.IsAtEnd(); jt.Advance()) { 351 !jt.IsAtEnd(); jt.Advance()) {
264 data.push_back(CreateSyncDataForSetting( 352 data.push_back(CreateSyncDataForSetting(
265 MakeSplitSettingKey(it.key(), jt.key()), jt.value())); 353 MakeSplitSettingKey(it.key(), jt.key()), jt.value()));
266 } 354 }
267 } 355 }
268 DCHECK_EQ(0u, GetQueuedItems()->size()); 356 DCHECK_EQ(0u, GetQueuedItems()->size());
269 return data; 357 return data;
270 } 358 }
(...skipping 20 matching lines...) Expand all
291 } else { 379 } else {
292 DLOG_IF(WARNING, change_type == SyncChange::ACTION_UPDATE) 380 DLOG_IF(WARNING, change_type == SyncChange::ACTION_UPDATE)
293 << "Value for key " << key << " doesn't exist yet"; 381 << "Value for key " << key << " doesn't exist yet";
294 } 382 }
295 dict->SetWithoutPathExpansion(key, value.release()); 383 dict->SetWithoutPathExpansion(key, value.release());
296 break; 384 break;
297 } 385 }
298 case SyncChange::ACTION_DELETE: { 386 case SyncChange::ACTION_DELETE: {
299 DLOG_IF(WARNING, !dict->HasKey(key)) << "Trying to delete nonexistent " 387 DLOG_IF(WARNING, !dict->HasKey(key)) << "Trying to delete nonexistent "
300 << "key " << key; 388 << "key " << key;
301 dict->RemoveWithoutPathExpansion(key, NULL); 389 dict->RemoveWithoutPathExpansion(key, nullptr);
302 break; 390 break;
303 } 391 }
304 case SyncChange::ACTION_INVALID: { 392 case SyncChange::ACTION_INVALID: {
305 NOTREACHED(); 393 NOTREACHED();
306 break; 394 break;
307 } 395 }
308 } 396 }
309 } 397 }
310 store_->ReportValueChanged(kAtomicSettings, 398 store_->ReportValueChanged(kAtomicSettings,
311 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); 399 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
(...skipping 18 matching lines...) Expand all
330 } 418 }
331 419
332 // TODO(bauerb): Temporary CHECK while investigating https://crbug.com/425785. 420 // TODO(bauerb): Temporary CHECK while investigating https://crbug.com/425785.
333 // Remove (or change back to DCHECK) once the bug is fixed. 421 // Remove (or change back to DCHECK) once the bug is fixed.
334 CHECK(IsReady()); 422 CHECK(IsReady());
335 InformSubscribers(); 423 InformSubscribers();
336 } 424 }
337 425
338 base::DictionaryValue* SupervisedUserSettingsService::GetOrCreateDictionary( 426 base::DictionaryValue* SupervisedUserSettingsService::GetOrCreateDictionary(
339 const std::string& key) const { 427 const std::string& key) const {
340 base::Value* value = NULL; 428 base::Value* value = nullptr;
341 base::DictionaryValue* dict = NULL; 429 base::DictionaryValue* dict = nullptr;
342 if (store_->GetMutableValue(key, &value)) { 430 if (store_->GetMutableValue(key, &value)) {
343 bool success = value->GetAsDictionary(&dict); 431 bool success = value->GetAsDictionary(&dict);
344 DCHECK(success); 432 DCHECK(success);
345 } else { 433 } else {
346 dict = new base::DictionaryValue; 434 dict = new base::DictionaryValue;
347 store_->SetValue(key, make_scoped_ptr(dict), 435 store_->SetValue(key, make_scoped_ptr(dict),
348 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); 436 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
349 } 437 }
350 438
351 return dict; 439 return dict;
(...skipping 13 matching lines...) Expand all
365 } 453 }
366 454
367 base::DictionaryValue* SupervisedUserSettingsService::GetDictionaryAndSplitKey( 455 base::DictionaryValue* SupervisedUserSettingsService::GetDictionaryAndSplitKey(
368 std::string* key) const { 456 std::string* key) const {
369 size_t pos = key->find_first_of(kSplitSettingKeySeparator); 457 size_t pos = key->find_first_of(kSplitSettingKeySeparator);
370 if (pos == std::string::npos) 458 if (pos == std::string::npos)
371 return GetAtomicSettings(); 459 return GetAtomicSettings();
372 460
373 base::DictionaryValue* split_settings = GetSplitSettings(); 461 base::DictionaryValue* split_settings = GetSplitSettings();
374 std::string prefix = key->substr(0, pos); 462 std::string prefix = key->substr(0, pos);
375 base::DictionaryValue* dict = NULL; 463 base::DictionaryValue* dict = nullptr;
376 if (!split_settings->GetDictionary(prefix, &dict)) { 464 if (!split_settings->GetDictionary(prefix, &dict)) {
377 dict = new base::DictionaryValue; 465 dict = new base::DictionaryValue;
378 DCHECK(!split_settings->HasKey(prefix)); 466 DCHECK(!split_settings->HasKey(prefix));
379 split_settings->Set(prefix, dict); 467 split_settings->Set(prefix, dict);
380 } 468 }
381 key->erase(0, pos + 1); 469 key->erase(0, pos + 1);
382 return dict; 470 return dict;
383 } 471 }
384 472
385 scoped_ptr<base::DictionaryValue> SupervisedUserSettingsService::GetSettings() { 473 scoped_ptr<base::DictionaryValue> SupervisedUserSettingsService::GetSettings() {
(...skipping 24 matching lines...) Expand all
410 return settings; 498 return settings;
411 } 499 }
412 500
413 void SupervisedUserSettingsService::InformSubscribers() { 501 void SupervisedUserSettingsService::InformSubscribers() {
414 if (!IsReady()) 502 if (!IsReady())
415 return; 503 return;
416 504
417 scoped_ptr<base::DictionaryValue> settings = GetSettings(); 505 scoped_ptr<base::DictionaryValue> settings = GetSettings();
418 callback_list_.Notify(settings.get()); 506 callback_list_.Notify(settings.get());
419 } 507 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698