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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_PREFS_PREF_METRICS_SERVICE_H_ 6 #define CHROME_BROWSER_PREFS_PREF_METRICS_SERVICE_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/singleton.h" 13 #include "base/memory/weak_ptr.h" 14 #include "base/prefs/pref_change_registrar.h" 15 #include "chrome/browser/prefs/synced_pref_change_registrar.h" 16 #include "chrome/browser/profiles/profile.h" 17 #include "components/browser_context_keyed_service/browser_context_keyed_service.h" 18 #include "components/browser_context_keyed_service/browser_context_keyed_service_factory.h" 19 20 class PrefRegistrySimple; 21 22 // PrefMetricsService is responsible for recording prefs-related UMA stats. 23 class PrefMetricsService : public BrowserContextKeyedService { 24 public: 25 enum HashedPrefStyle { 26 HASHED_PREF_STYLE_NEW, 27 HASHED_PREF_STYLE_DEPRECATED, 28 }; 29 30 explicit PrefMetricsService(Profile* profile); 31 virtual ~PrefMetricsService(); 32 33 class Factory : public BrowserContextKeyedServiceFactory { 34 public: 35 static Factory* GetInstance(); 36 static PrefMetricsService* GetForProfile(Profile* profile); 37 private: 38 friend struct DefaultSingletonTraits<Factory>; 39 40 Factory(); 41 virtual ~Factory(); 42 43 // BrowserContextKeyedServiceFactory implementation 44 virtual BrowserContextKeyedService* BuildServiceInstanceFor( 45 content::BrowserContext* profile) const OVERRIDE; 46 virtual bool ServiceIsCreatedWithBrowserContext() const OVERRIDE; 47 virtual bool ServiceIsNULLWhileTesting() const OVERRIDE; 48 virtual content::BrowserContext* GetBrowserContextToUse( 49 content::BrowserContext* context) const OVERRIDE; 50 }; 51 52 // Registers preferences in local state. 53 static void RegisterPrefs(PrefRegistrySimple* registry); 54 55 private: 56 friend class PrefMetricsServiceTest; 57 58 // Function to log a Value to a histogram 59 typedef base::Callback<void(const std::string&, const Value*)> 60 LogHistogramValueCallback; 61 62 // For unit testing only. 63 PrefMetricsService(Profile* profile, 64 PrefService* local_settings, 65 const std::string& device_id, 66 const char** tracked_pref_paths, 67 int tracked_pref_path_count); 68 69 // Record prefs state on browser context creation. 70 void RecordLaunchPrefs(); 71 72 // Register callbacks for synced pref changes. 73 void RegisterSyncedPrefObservers(); 74 75 // Registers a histogram logging callback for a synced pref change. 76 void AddPrefObserver(const std::string& path, 77 const std::string& histogram_name_prefix, 78 const LogHistogramValueCallback& callback); 79 80 // Generic callback to observe a synced pref change. 81 void OnPrefChanged(const std::string& histogram_name_prefix, 82 const LogHistogramValueCallback& callback, 83 const std::string& path, 84 bool from_sync); 85 86 // Callback for a boolean pref change histogram. 87 void LogBooleanPrefChange(const std::string& histogram_name, 88 const Value* value); 89 90 // Callback for an integer pref change histogram. 91 void LogIntegerPrefChange(int boundary_value, 92 const std::string& histogram_name, 93 const Value* value); 94 95 // Callback to receive a unique device_id. 96 void GetDeviceIdCallback(const std::string& device_id); 97 98 // Checks the tracked preferences against their last known values and reports 99 // any discrepancies. This must be called after |device_id| has been set. 100 void CheckTrackedPreferences(); 101 102 // Updates the hash of the tracked preference in local state. This must be 103 // called after |device_id| has been set. 104 void UpdateTrackedPreference(const char* path); 105 106 // Computes an MD5 hash for the given preference value. |value| can be 107 // NULL which will result in the unique hash representing NULL for the pref 108 // at |path|. 109 std::string GetHashedPrefValue( 110 const char* path, 111 const base::Value* value, 112 HashedPrefStyle desired_style); 113 114 void InitializePrefObservers(); 115 116 Profile* profile_; 117 PrefService* prefs_; 118 PrefService* local_state_; 119 std::string profile_name_; 120 std::string pref_hash_seed_; 121 std::string device_id_; 122 const char** tracked_pref_paths_; 123 const int tracked_pref_path_count_; 124 125 // TODO(gab): preprocessor define this member out on builds that don't use 126 // DCHECKs (http://crbug.com/322713). 127 bool checked_tracked_prefs_; 128 129 PrefChangeRegistrar pref_registrar_; 130 scoped_ptr<SyncedPrefChangeRegistrar> synced_pref_change_registrar_; 131 132 base::WeakPtrFactory<PrefMetricsService> weak_factory_; 133 134 DISALLOW_COPY_AND_ASSIGN(PrefMetricsService); 135 }; 136 137 #endif // CHROME_BROWSER_PREFS_PREF_METRICS_SERVICE_H_ 138