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

Side by Side Diff: chrome/browser/prefs/pref_metrics_service.cc

Issue 81683002: Prevent GetDeviceId from invoking its callback multiple times in failure cases. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: non-static based check Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 73
74 } // namespace 74 } // namespace
75 75
76 PrefMetricsService::PrefMetricsService(Profile* profile) 76 PrefMetricsService::PrefMetricsService(Profile* profile)
77 : profile_(profile), 77 : profile_(profile),
78 prefs_(profile_->GetPrefs()), 78 prefs_(profile_->GetPrefs()),
79 local_state_(g_browser_process->local_state()), 79 local_state_(g_browser_process->local_state()),
80 profile_name_(profile_->GetPath().AsUTF8Unsafe()), 80 profile_name_(profile_->GetPath().AsUTF8Unsafe()),
81 tracked_pref_paths_(kTrackedPrefs), 81 tracked_pref_paths_(kTrackedPrefs),
82 tracked_pref_path_count_(arraysize(kTrackedPrefs)), 82 tracked_pref_path_count_(arraysize(kTrackedPrefs)),
83 #if defined(ENABLE_DCHECK)
83 checked_tracked_prefs_(false), 84 checked_tracked_prefs_(false),
85 #endif
84 weak_factory_(this) { 86 weak_factory_(this) {
85 pref_hash_seed_ = ResourceBundle::GetSharedInstance().GetRawDataResource( 87 pref_hash_seed_ = ResourceBundle::GetSharedInstance().GetRawDataResource(
86 IDR_PREF_HASH_SEED_BIN).as_string(); 88 IDR_PREF_HASH_SEED_BIN).as_string();
87 89
88 RecordLaunchPrefs(); 90 RecordLaunchPrefs();
89 91
90 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); 92 PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
91 synced_pref_change_registrar_.reset(new SyncedPrefChangeRegistrar(prefs)); 93 synced_pref_change_registrar_.reset(new SyncedPrefChangeRegistrar(prefs));
92 94
93 RegisterSyncedPrefObservers(); 95 RegisterSyncedPrefObservers();
(...skipping 17 matching lines...) Expand all
111 const char** tracked_pref_paths, 113 const char** tracked_pref_paths,
112 int tracked_pref_path_count) 114 int tracked_pref_path_count)
113 : profile_(profile), 115 : profile_(profile),
114 prefs_(profile->GetPrefs()), 116 prefs_(profile->GetPrefs()),
115 local_state_(local_state), 117 local_state_(local_state),
116 profile_name_(profile_->GetPath().AsUTF8Unsafe()), 118 profile_name_(profile_->GetPath().AsUTF8Unsafe()),
117 pref_hash_seed_(kSHA256DigestSize, 0), 119 pref_hash_seed_(kSHA256DigestSize, 0),
118 device_id_(device_id), 120 device_id_(device_id),
119 tracked_pref_paths_(tracked_pref_paths), 121 tracked_pref_paths_(tracked_pref_paths),
120 tracked_pref_path_count_(tracked_pref_path_count), 122 tracked_pref_path_count_(tracked_pref_path_count),
123 #if defined(ENABLE_DCHECK)
121 checked_tracked_prefs_(false), 124 checked_tracked_prefs_(false),
125 #endif
122 weak_factory_(this) { 126 weak_factory_(this) {
123 CheckTrackedPreferences(); 127 CheckTrackedPreferences();
124 } 128 }
125 129
126 PrefMetricsService::~PrefMetricsService() { 130 PrefMetricsService::~PrefMetricsService() {
127 } 131 }
128 132
129 void PrefMetricsService::RecordLaunchPrefs() { 133 void PrefMetricsService::RecordLaunchPrefs() {
130 bool show_home_button = prefs_->GetBoolean(prefs::kShowHomeButton); 134 bool show_home_button = prefs_->GetBoolean(prefs::kShowHomeButton);
131 bool home_page_is_ntp = prefs_->GetBoolean(prefs::kHomePageIsNewTabPage); 135 bool home_page_is_ntp = prefs_->GetBoolean(prefs::kHomePageIsNewTabPage);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( 257 base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
254 histogram_name, 258 histogram_name,
255 1, 259 1,
256 boundary_value, 260 boundary_value,
257 boundary_value + 1, 261 boundary_value + 1,
258 base::HistogramBase::kUmaTargetedHistogramFlag); 262 base::HistogramBase::kUmaTargetedHistogramFlag);
259 histogram->Add(integer_value); 263 histogram->Add(integer_value);
260 } 264 }
261 265
262 void PrefMetricsService::GetDeviceIdCallback(const std::string& device_id) { 266 void PrefMetricsService::GetDeviceIdCallback(const std::string& device_id) {
267 #if !defined(OS_WIN) || defined(ENABLE_RLZ)
268 // A device_id is expected in all scenarios except when RLZ is disabled on
269 // Windows.
270 DCHECK(!device_id.empty());
271 #endif
272
263 device_id_ = device_id; 273 device_id_ = device_id;
264 // On Aura, this seems to be called twice. 274 CheckTrackedPreferences();
265 if (!checked_tracked_prefs_)
266 CheckTrackedPreferences();
267 } 275 }
268 276
269 // To detect changes to Preferences that happen outside of Chrome, we hash 277 // To detect changes to Preferences that happen outside of Chrome, we hash
270 // selected pref values and save them in local state. CheckTrackedPreferences 278 // selected pref values and save them in local state. CheckTrackedPreferences
271 // compares the saved values to the values observed in the profile's prefs. A 279 // compares the saved values to the values observed in the profile's prefs. A
272 // dictionary of dictionaries in local state holds the hashed values, grouped by 280 // dictionary of dictionaries in local state holds the hashed values, grouped by
273 // profile. To make the system more resistant to spoofing, pref values are 281 // profile. To make the system more resistant to spoofing, pref values are
274 // hashed with the pref path and the device id. 282 // hashed with the pref path and the device id.
275 void PrefMetricsService::CheckTrackedPreferences() { 283 void PrefMetricsService::CheckTrackedPreferences() {
284 #if defined(ENABLE_DCHECK)
285 // Make sure this is only called once per instance of this service.
276 DCHECK(!checked_tracked_prefs_); 286 DCHECK(!checked_tracked_prefs_);
287 checked_tracked_prefs_ = true;
288 #endif
277 289
278 const base::DictionaryValue* pref_hash_dicts = 290 const base::DictionaryValue* pref_hash_dicts =
279 local_state_->GetDictionary(prefs::kProfilePreferenceHashes); 291 local_state_->GetDictionary(prefs::kProfilePreferenceHashes);
280 // Get the hashed prefs dictionary if it exists. If it doesn't, it will be 292 // Get the hashed prefs dictionary if it exists. If it doesn't, it will be
281 // created if we set preference values below. 293 // created if we set preference values below.
282 const base::DictionaryValue* hashed_prefs = NULL; 294 const base::DictionaryValue* hashed_prefs = NULL;
283 pref_hash_dicts->GetDictionaryWithoutPathExpansion(profile_name_, 295 pref_hash_dicts->GetDictionaryWithoutPathExpansion(profile_name_,
284 &hashed_prefs); 296 &hashed_prefs);
285 for (int i = 0; i < tracked_pref_path_count_; ++i) { 297 for (int i = 0; i < tracked_pref_path_count_; ++i) {
286 // Skip prefs that haven't been registered. 298 // Skip prefs that haven't been registered.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 } 342 }
331 } else { 343 } else {
332 // Record that we haven't tracked this preference yet, or the hash in 344 // Record that we haven't tracked this preference yet, or the hash in
333 // local state was removed. 345 // local state was removed.
334 UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceInitialized", 346 UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceInitialized",
335 i, tracked_pref_path_count_); 347 i, tracked_pref_path_count_);
336 UpdateTrackedPreference(tracked_pref_paths_[i]); 348 UpdateTrackedPreference(tracked_pref_paths_[i]);
337 } 349 }
338 } 350 }
339 351
340 checked_tracked_prefs_ = true;
341
342 // Now that we've checked the incoming preferences, register for change 352 // Now that we've checked the incoming preferences, register for change
343 // notifications, unless this is test code. 353 // notifications, unless this is test code.
344 // TODO(bbudge) Fix failing browser_tests and so we can remove this test. 354 // TODO(bbudge) Fix failing browser_tests and so we can remove this test.
345 // Several tests fail when they shutdown before they can write local state. 355 // Several tests fail when they shutdown before they can write local state.
346 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType) && 356 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType) &&
347 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeFrame)) { 357 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeFrame)) {
348 InitializePrefObservers(); 358 InitializePrefObservers();
349 } 359 }
350 } 360 }
351 361
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 } 465 }
456 466
457 bool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const { 467 bool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const {
458 return false; 468 return false;
459 } 469 }
460 470
461 content::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse( 471 content::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse(
462 content::BrowserContext* context) const { 472 content::BrowserContext* context) const {
463 return chrome::GetBrowserContextRedirectedInIncognito(context); 473 return chrome::GetBrowserContextRedirectedInIncognito(context);
464 } 474 }
OLDNEW
« chrome/browser/prefs/pref_metrics_service.h ('K') | « chrome/browser/prefs/pref_metrics_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698