| Index: chrome/browser/prefs/pref_metrics_service.cc
|
| diff --git a/chrome/browser/prefs/pref_metrics_service.cc b/chrome/browser/prefs/pref_metrics_service.cc
|
| index bcac81817db093c1ce75ec64fce142892c0ac309..a437c8c6db9b1bbd69f797558fe156d6d62959bc 100644
|
| --- a/chrome/browser/prefs/pref_metrics_service.cc
|
| +++ b/chrome/browser/prefs/pref_metrics_service.cc
|
| @@ -4,17 +4,39 @@
|
|
|
| #include "chrome/browser/prefs/pref_metrics_service.h"
|
|
|
| +#include "base/bind.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/prefs/pref_service.h"
|
| +#include "chrome/browser/prefs/pref_service_syncable.h"
|
| #include "chrome/browser/prefs/session_startup_pref.h"
|
| +#include "chrome/browser/prefs/synced_pref_change_registrar.h"
|
| #include "chrome/browser/profiles/incognito_helpers.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
|
| +#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
|
| +
|
| +namespace {
|
| +
|
| +// Converts a host name into a domain name for easier matching.
|
| +std::string GetDomainFromHost(const std::string& host) {
|
| + return net::registry_controlled_domains::GetDomainAndRegistry(
|
| + host,
|
| + net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES);
|
| +}
|
| +
|
| +const int kSessionStartupPrefValueMax = SessionStartupPref::kPrefValueMax;
|
| +
|
| +} // namespace
|
|
|
| PrefMetricsService::PrefMetricsService(Profile* profile)
|
| : profile_(profile) {
|
| RecordLaunchPrefs();
|
| +
|
| + PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
|
| + synced_pref_change_registrar_.reset(new SyncedPrefChangeRegistrar(prefs));
|
| +
|
| + RegisterSyncedPrefObservers();
|
| }
|
|
|
| PrefMetricsService::~PrefMetricsService() {
|
| @@ -31,7 +53,7 @@ void PrefMetricsService::RecordLaunchPrefs() {
|
| }
|
| int restore_on_startup = prefs->GetInteger(prefs::kRestoreOnStartup);
|
| UMA_HISTOGRAM_ENUMERATION("Settings.StartupPageLoadSettings",
|
| - restore_on_startup, SessionStartupPref::kPrefValueMax);
|
| + restore_on_startup, kSessionStartupPrefValueMax);
|
| if (restore_on_startup == SessionStartupPref::kPrefValueURLs) {
|
| const int url_list_size = prefs->GetList(
|
| prefs::kURLsToRestoreOnStartup)->GetSize();
|
| @@ -40,6 +62,83 @@ void PrefMetricsService::RecordLaunchPrefs() {
|
| }
|
| }
|
|
|
| +void PrefMetricsService::RegisterSyncedPrefObservers() {
|
| + LogHistogramValueCallback booleanHandler = base::Bind(
|
| + &PrefMetricsService::LogBooleanPrefChange, base::Unretained(this));
|
| +
|
| + AddPrefObserver(prefs::kShowHomeButton, "ShowHomeButton", booleanHandler);
|
| + AddPrefObserver(prefs::kHomePageIsNewTabPage, "HomePageIsNewTabPage",
|
| + booleanHandler);
|
| +
|
| + AddPrefObserver(prefs::kRestoreOnStartup, "StartupPageLoadSettings",
|
| + base::Bind(&PrefMetricsService::LogIntegerPrefChange,
|
| + base::Unretained(this),
|
| + kSessionStartupPrefValueMax));
|
| +}
|
| +
|
| +void PrefMetricsService::AddPrefObserver(
|
| + const std::string& path,
|
| + const std::string& histogram_name_prefix,
|
| + const LogHistogramValueCallback& callback) {
|
| + synced_pref_change_registrar_->Add(path.c_str(),
|
| + base::Bind(&PrefMetricsService::OnPrefChanged,
|
| + base::Unretained(this),
|
| + histogram_name_prefix, callback));
|
| +}
|
| +
|
| +void PrefMetricsService::OnPrefChanged(
|
| + const std::string& histogram_name_prefix,
|
| + const LogHistogramValueCallback& callback,
|
| + const std::string& path,
|
| + bool from_sync) {
|
| + PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_);
|
| + const PrefService::Preference* pref = prefs->FindPreference(path.c_str());
|
| + DCHECK(pref);
|
| + std::string source_name(
|
| + from_sync ? ".PulledFromSync" : ".PushedToSync");
|
| + std::string histogram_name("Settings." + histogram_name_prefix + source_name);
|
| + callback.Run(histogram_name, pref->GetValue());
|
| +};
|
| +
|
| +void PrefMetricsService::LogBooleanPrefChange(const std::string& histogram_name,
|
| + const Value* value) {
|
| + bool boolean_value = false;
|
| + if (!value->GetAsBoolean(&boolean_value))
|
| + return;
|
| + base::HistogramBase* histogram = base::BooleanHistogram::FactoryGet(
|
| + histogram_name, base::HistogramBase::kUmaTargetedHistogramFlag);
|
| + histogram->Add(boolean_value);
|
| +}
|
| +
|
| +void PrefMetricsService::LogIntegerPrefChange(int boundary_value,
|
| + const std::string& histogram_name,
|
| + const Value* value) {
|
| + int integer_value = 0;
|
| + if (!value->GetAsInteger(&integer_value))
|
| + return;
|
| + base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
|
| + histogram_name,
|
| + 1,
|
| + boundary_value,
|
| + boundary_value + 1,
|
| + base::HistogramBase::kUmaTargetedHistogramFlag);
|
| + histogram->Add(integer_value);
|
| +}
|
| +
|
| +void PrefMetricsService::LogListPrefChange(
|
| + const LogHistogramValueCallback& item_callback,
|
| + const std::string& histogram_name,
|
| + const Value* value) {
|
| + const ListValue* items = NULL;
|
| + if (!value->GetAsList(&items))
|
| + return;
|
| + for (size_t i = 0; i < items->GetSize(); ++i) {
|
| + const Value *item_value = NULL;
|
| + if (items->Get(i, &item_value))
|
| + item_callback.Run(histogram_name, item_value);
|
| + }
|
| +}
|
| +
|
| // static
|
| PrefMetricsService::Factory* PrefMetricsService::Factory::GetInstance() {
|
| return Singleton<PrefMetricsService::Factory>::get();
|
|
|