Chromium Code Reviews| 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/prefs/pref_metrics_service.h" | 5 #include "chrome/browser/prefs/pref_metrics_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/json/json_string_value_serializer.h" | 9 #include "base/json/json_string_value_serializer.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 // profile. To make the system more resistant to spoofing, pref values are | 277 // profile. To make the system more resistant to spoofing, pref values are |
| 278 // hashed with the pref path and the device id. | 278 // hashed with the pref path and the device id. |
| 279 void PrefMetricsService::CheckTrackedPreferences() { | 279 void PrefMetricsService::CheckTrackedPreferences() { |
| 280 DCHECK(!checked_tracked_prefs_); | 280 DCHECK(!checked_tracked_prefs_); |
| 281 | 281 |
| 282 const base::DictionaryValue* pref_hash_dicts = | 282 const base::DictionaryValue* pref_hash_dicts = |
| 283 local_state_->GetDictionary(prefs::kProfilePreferenceHashes); | 283 local_state_->GetDictionary(prefs::kProfilePreferenceHashes); |
| 284 // Get the hashed prefs dictionary if it exists. If it doesn't, it will be | 284 // Get the hashed prefs dictionary if it exists. If it doesn't, it will be |
| 285 // created if we set preference values below. | 285 // created if we set preference values below. |
| 286 const base::DictionaryValue* hashed_prefs = NULL; | 286 const base::DictionaryValue* hashed_prefs = NULL; |
| 287 pref_hash_dicts->GetDictionary(profile_name_, &hashed_prefs); | 287 pref_hash_dicts->GetDictionaryWithoutPathExpansion(profile_name_, |
|
battre
2013/09/12 08:38:47
This is pretty error prone. Can you please update
michaelpg
2013/09/14 18:18:32
Done.
| |
| 288 &hashed_prefs); | |
| 288 for (int i = 0; i < tracked_pref_path_count_; ++i) { | 289 for (int i = 0; i < tracked_pref_path_count_; ++i) { |
| 289 // Skip prefs that haven't been registered. | 290 // Skip prefs that haven't been registered. |
| 290 if (!prefs_->FindPreference(tracked_pref_paths_[i])) | 291 if (!prefs_->FindPreference(tracked_pref_paths_[i])) |
| 291 continue; | 292 continue; |
| 292 | 293 |
| 293 bool changed = false; | 294 bool changed = false; |
| 294 const base::Value* value = prefs_->GetUserPrefValue(tracked_pref_paths_[i]); | 295 const base::Value* value = prefs_->GetUserPrefValue(tracked_pref_paths_[i]); |
| 295 if (value) { | 296 if (value) { |
| 296 std::string value_hash = | 297 std::string value_hash = |
| 297 GetHashedPrefValue(tracked_pref_paths_[i], value); | 298 GetHashedPrefValue(tracked_pref_paths_[i], value); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType) && | 338 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType) && |
| 338 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeFrame)) { | 339 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeFrame)) { |
| 339 InitializePrefObservers(); | 340 InitializePrefObservers(); |
| 340 } | 341 } |
| 341 } | 342 } |
| 342 | 343 |
| 343 void PrefMetricsService::UpdateTrackedPreference(const char* path) { | 344 void PrefMetricsService::UpdateTrackedPreference(const char* path) { |
| 344 const base::Value* value = prefs_->GetUserPrefValue(path); | 345 const base::Value* value = prefs_->GetUserPrefValue(path); |
| 345 if (value) { | 346 if (value) { |
| 346 DictionaryPrefUpdate update(local_state_, prefs::kProfilePreferenceHashes); | 347 DictionaryPrefUpdate update(local_state_, prefs::kProfilePreferenceHashes); |
| 347 update->SetString(GetHashedPrefPath(path), | 348 DictionaryValue* child_dictionary = NULL; |
| 348 GetHashedPrefValue(path, value)); | 349 |
| 350 // Get the dictionary corresponding to the profile name, | |
| 351 // which may have a . | |
|
xiyuan
2013/09/12 16:18:37
nit: which may have a '.'.
michaelpg
2013/09/14 18:18:32
Done.
| |
| 352 if (!update->GetDictionaryWithoutPathExpansion(profile_name_, | |
| 353 &child_dictionary)) { | |
| 354 child_dictionary = new DictionaryValue; | |
| 355 update->SetWithoutPathExpansion(profile_name_, child_dictionary); | |
| 356 } | |
| 357 child_dictionary->SetString(path, GetHashedPrefValue(path, value)); | |
| 349 } else { | 358 } else { |
| 350 RemoveTrackedPreference(path); | 359 RemoveTrackedPreference(path); |
| 351 } | 360 } |
| 352 } | 361 } |
| 353 | 362 |
| 354 bool PrefMetricsService::RemoveTrackedPreference(const char* path) { | 363 bool PrefMetricsService::RemoveTrackedPreference(const char* path) { |
| 355 DictionaryPrefUpdate update(local_state_, prefs::kProfilePreferenceHashes); | 364 DictionaryPrefUpdate update(local_state_, prefs::kProfilePreferenceHashes); |
| 356 return update->Remove(GetHashedPrefPath(path), NULL); | 365 DictionaryValue* child_dictionary = NULL; |
| 357 } | |
| 358 | 366 |
| 359 std::string PrefMetricsService::GetHashedPrefPath(const char* path) { | 367 if (!update->GetDictionaryWithoutPathExpansion(profile_name_, |
| 360 std::string hash_pref_path(profile_name_); | 368 &child_dictionary)) { |
| 361 hash_pref_path.append("."); | 369 return false; |
| 362 hash_pref_path.append(path); | 370 } |
| 363 return hash_pref_path; | 371 return child_dictionary->Remove(path, NULL); |
| 364 } | 372 } |
| 365 | 373 |
| 366 std::string PrefMetricsService::GetHashedPrefValue( | 374 std::string PrefMetricsService::GetHashedPrefValue( |
| 367 const char* path, | 375 const char* path, |
| 368 const base::Value* value) { | 376 const base::Value* value) { |
| 369 DCHECK(value); | 377 DCHECK(value); |
| 370 | 378 |
| 371 // Dictionary values may contain empty lists and sub-dictionaries. Create | 379 // Dictionary values may contain empty lists and sub-dictionaries. Create |
| 372 // a deep copy with those stripped to make the hash more stable. | 380 // a deep copy with those stripped to make the hash more stable. |
| 373 scoped_ptr<DictionaryValue> dict_value; | 381 scoped_ptr<DictionaryValue> dict_value; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 440 } | 448 } |
| 441 | 449 |
| 442 bool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const { | 450 bool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const { |
| 443 return false; | 451 return false; |
| 444 } | 452 } |
| 445 | 453 |
| 446 content::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse( | 454 content::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse( |
| 447 content::BrowserContext* context) const { | 455 content::BrowserContext* context) const { |
| 448 return chrome::GetBrowserContextRedirectedInIncognito(context); | 456 return chrome::GetBrowserContextRedirectedInIncognito(context); |
| 449 } | 457 } |
| OLD | NEW |