pref_metrics_service.cc revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
1bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// found in the LICENSE file. 4bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/browser/prefs/pref_metrics_service.h" 6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h" 8bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/metrics/histogram.h" 9bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/prefs/pref_service.h" 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/pref_service_syncable.h" 11fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "chrome/browser/prefs/session_startup_pref.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/synced_pref_change_registrar.h" 13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/browser/profiles/incognito_helpers.h" 14bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/browser/profiles/profile.h" 15bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/common/pref_names.h" 16bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "components/browser_context_keyed_service/browser_context_dependency_manager.h" 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Converts a host name into a domain name for easier matching. 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstd::string GetDomainFromHost(const std::string& host) { 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return net::registry_controlled_domains::GetDomainAndRegistry( 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch host, 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst int kSessionStartupPrefValueMax = SessionStartupPref::kPrefValueMax; 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 31bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::PrefMetricsService(Profile* profile) 33bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : profile_(profile) { 34bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RecordLaunchPrefs(); 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch synced_pref_change_registrar_.reset(new SyncedPrefChangeRegistrar(prefs)); 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterSyncedPrefObservers(); 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::~PrefMetricsService() { 43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid PrefMetricsService::RecordLaunchPrefs() { 463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PrefService* prefs = profile_->GetPrefs(); 473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool show_home_button = prefs->GetBoolean(prefs::kShowHomeButton); 483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool home_page_is_ntp = prefs->GetBoolean(prefs::kHomePageIsNewTabPage); 493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton", show_home_button); 503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (show_home_button) { 513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.GivenShowHomeButton_HomePageIsNewTabPage", 523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch home_page_is_ntp); 533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int restore_on_startup = prefs->GetInteger(prefs::kRestoreOnStartup); 55fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch UMA_HISTOGRAM_ENUMERATION("Settings.StartupPageLoadSettings", 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch restore_on_startup, kSessionStartupPrefValueMax); 57fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch if (restore_on_startup == SessionStartupPref::kPrefValueURLs) { 583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const int url_list_size = prefs->GetList( 59fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch prefs::kURLsToRestoreOnStartup)->GetSize(); 60fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch UMA_HISTOGRAM_CUSTOM_COUNTS( 61fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch "Settings.StartupPageLoadURLs", url_list_size, 1, 50, 20); 62fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch } 63bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 64bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::RegisterSyncedPrefObservers() { 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogHistogramValueCallback booleanHandler = base::Bind( 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &PrefMetricsService::LogBooleanPrefChange, base::Unretained(this)); 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kShowHomeButton, "ShowHomeButton", booleanHandler); 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kHomePageIsNewTabPage, "HomePageIsNewTabPage", 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch booleanHandler); 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kRestoreOnStartup, "StartupPageLoadSettings", 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&PrefMetricsService::LogIntegerPrefChange, 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Unretained(this), 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch kSessionStartupPrefValueMax)); 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::AddPrefObserver( 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& path, 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name_prefix, 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const LogHistogramValueCallback& callback) { 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch synced_pref_change_registrar_->Add(path.c_str(), 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&PrefMetricsService::OnPrefChanged, 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Unretained(this), 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name_prefix, callback)); 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::OnPrefChanged( 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name_prefix, 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const LogHistogramValueCallback& callback, 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& path, 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool from_sync) { 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const PrefService::Preference* pref = prefs->FindPreference(path.c_str()); 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(pref); 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string source_name( 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch from_sync ? ".PulledFromSync" : ".PushedToSync"); 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string histogram_name("Settings." + histogram_name_prefix + source_name); 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback.Run(histogram_name, pref->GetValue()); 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::LogBooleanPrefChange(const std::string& histogram_name, 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Value* value) { 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool boolean_value = false; 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!value->GetAsBoolean(&boolean_value)) 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase* histogram = base::BooleanHistogram::FactoryGet( 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name, base::HistogramBase::kUmaTargetedHistogramFlag); 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram->Add(boolean_value); 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::LogIntegerPrefChange(int boundary_value, 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name, 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Value* value) { 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int integer_value = 0; 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!value->GetAsInteger(&integer_value)) 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name, 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1, 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch boundary_value, 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch boundary_value + 1, 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase::kUmaTargetedHistogramFlag); 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram->Add(integer_value); 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::LogListPrefChange( 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const LogHistogramValueCallback& item_callback, 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name, 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Value* value) { 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const ListValue* items = NULL; 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!value->GetAsList(&items)) 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < items->GetSize(); ++i) { 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Value *item_value = NULL; 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (items->Get(i, &item_value)) 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch item_callback.Run(histogram_name, item_value); 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 142bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 143bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory* PrefMetricsService::Factory::GetInstance() { 144bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return Singleton<PrefMetricsService::Factory>::get(); 145bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 146bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 147bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 148bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService* PrefMetricsService::Factory::GetForProfile( 149bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Profile* profile) { 150bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return static_cast<PrefMetricsService*>( 151bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetInstance()->GetServiceForBrowserContext(profile, true)); 152bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 153bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 154bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory::Factory() 155bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : BrowserContextKeyedServiceFactory( 156bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "PrefMetricsService", 157bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BrowserContextDependencyManager::GetInstance()) { 158bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 159bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 160bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory::~Factory() { 161bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 162bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 163bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochBrowserContextKeyedService* 164bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory::BuildServiceInstanceFor( 165bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch content::BrowserContext* profile) const { 166bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return new PrefMetricsService(static_cast<Profile*>(profile)); 167bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 168bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 169bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PrefMetricsService::Factory::ServiceIsCreatedWithBrowserContext() const { 170bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return true; 171bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 172bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 173bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const { 174bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return false; 175bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 176bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 177bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochcontent::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse( 178bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch content::BrowserContext* context) const { 179bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return chrome::GetBrowserContextRedirectedInIncognito(context); 180bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 181