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" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h" 9bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/metrics/histogram.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 11bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/prefs/pref_service.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/browser_process.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/metrics/rappor/sampling.h" 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/pref_service_syncable.h" 17fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "chrome/browser/prefs/session_startup_pref.h" 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/synced_pref_change_registrar.h" 19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/browser/profiles/incognito_helpers.h" 20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/browser/profiles/profile.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_codec.h" 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/common/pref_names.h" 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/url_constants.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h" 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_prepopulate_data.h" 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/browser_url_handler.h" 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "crypto/hmac.h" 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst int kSessionStartupPrefValueMax = SessionStartupPref::kPrefValueMax; 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Record a sample for the Settings.NewTabPage rappor metric. 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SampleNewTabPageURL(Profile* profile) { 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL ntp_url(chrome::kChromeUINewTabURL); 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool reverse_on_redirect = false; 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &ntp_url, 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile, 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &reverse_on_redirect); 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ntp_url.is_valid()) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) rappor::SampleDomainAndRegistryFromGURL("Settings.NewTabPage", ntp_url); 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 49bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::PrefMetricsService(Profile* profile) 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : profile_(profile), 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) prefs_(profile_->GetPrefs()), 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) local_state_(g_browser_process->local_state()), 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) weak_factory_(this) { 54bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RecordLaunchPrefs(); 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch synced_pref_change_registrar_.reset(new SyncedPrefChangeRegistrar(prefs)); 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterSyncedPrefObservers(); 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// For unit testing only. 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PrefMetricsService::PrefMetricsService(Profile* profile, 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefService* local_state) 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : profile_(profile), 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) prefs_(profile->GetPrefs()), 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) local_state_(local_state), 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) weak_factory_(this) { 69bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 70bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 71bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::~PrefMetricsService() { 72bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 73bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 74bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid PrefMetricsService::RecordLaunchPrefs() { 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool show_home_button = prefs_->GetBoolean(prefs::kShowHomeButton); 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool home_page_is_ntp = prefs_->GetBoolean(prefs::kHomePageIsNewTabPage); 773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton", show_home_button); 783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (show_home_button) { 793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.GivenShowHomeButton_HomePageIsNewTabPage", 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) home_page_is_ntp); 813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // For non-NTP homepages, see if the URL comes from the same TLD+1 as a known 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // search engine. Note that this is only an approximation of search engine 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // use, due to both false negatives (pages that come from unknown TLD+1 X but 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // consist of a search box that sends to known TLD+1 Y) and false positives 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // (pages that share a TLD+1 with a known engine but aren't actually search 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // pages, e.g. plus.google.com). Additionally, record the TLD+1 of non-NTP 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // homepages through the privacy-preserving Rappor service. 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!home_page_is_ntp) { 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL homepage_url(prefs_->GetString(prefs::kHomePage)); 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (homepage_url.is_valid()) { 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "Settings.HomePageEngineType", 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TemplateURLPrepopulateData::GetEngineType(homepage_url), 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SEARCH_ENGINE_MAX); 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) rappor::SampleDomainAndRegistryFromGURL("Settings.HomePage2", 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) homepage_url); 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SampleNewTabPageURL(profile_); 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int restore_on_startup = prefs_->GetInteger(prefs::kRestoreOnStartup); 105fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch UMA_HISTOGRAM_ENUMERATION("Settings.StartupPageLoadSettings", 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) restore_on_startup, kSessionStartupPrefValueMax); 107fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch if (restore_on_startup == SessionStartupPref::kPrefValueURLs) { 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* url_list = 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->GetList(prefs::kURLsToRestoreOnStartup); 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Settings.StartupPageLoadURLs", 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) url_list->GetSize(), 1, 50, 20); 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Similarly, check startup pages for known search engine TLD+1s. 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string url_text; 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < url_list->GetSize(); ++i) { 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (url_list->GetString(i, &url_text)) { 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GURL start_url(url_text); 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (start_url.is_valid()) { 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "Settings.StartupPageEngineTypes", 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TemplateURLPrepopulateData::GetEngineType(start_url), 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SEARCH_ENGINE_MAX); 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (i == 0) { 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) rappor::SampleDomainAndRegistryFromGURL("Settings.FirstStartupPage", 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) start_url); 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 129fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch } 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_ANDROID) 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartupTabs startup_tabs = PinnedTabCodec::ReadPinnedTabs(profile_); 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Settings.PinnedTabs", 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) startup_tabs.size(), 1, 50, 20); 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < startup_tabs.size(); ++i) { 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL start_url(startup_tabs.at(i).url); 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (start_url.is_valid()) { 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "Settings.PinnedTabEngineTypes", 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TemplateURLPrepopulateData::GetEngineType(start_url), 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SEARCH_ENGINE_MAX); 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::RegisterSyncedPrefObservers() { 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogHistogramValueCallback booleanHandler = base::Bind( 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &PrefMetricsService::LogBooleanPrefChange, base::Unretained(this)); 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kShowHomeButton, "ShowHomeButton", booleanHandler); 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kHomePageIsNewTabPage, "HomePageIsNewTabPage", 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch booleanHandler); 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kRestoreOnStartup, "StartupPageLoadSettings", 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&PrefMetricsService::LogIntegerPrefChange, 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Unretained(this), 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch kSessionStartupPrefValueMax)); 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::AddPrefObserver( 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& path, 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name_prefix, 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const LogHistogramValueCallback& callback) { 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch synced_pref_change_registrar_->Add(path.c_str(), 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&PrefMetricsService::OnPrefChanged, 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Unretained(this), 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name_prefix, callback)); 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::OnPrefChanged( 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name_prefix, 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const LogHistogramValueCallback& callback, 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& path, 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool from_sync) { 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); 177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const PrefService::Preference* pref = prefs->FindPreference(path.c_str()); 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(pref); 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string source_name( 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch from_sync ? ".PulledFromSync" : ".PushedToSync"); 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string histogram_name("Settings." + histogram_name_prefix + source_name); 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback.Run(histogram_name, pref->GetValue()); 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::LogBooleanPrefChange(const std::string& histogram_name, 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value* value) { 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool boolean_value = false; 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!value->GetAsBoolean(&boolean_value)) 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase* histogram = base::BooleanHistogram::FactoryGet( 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name, base::HistogramBase::kUmaTargetedHistogramFlag); 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram->Add(boolean_value); 193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::LogIntegerPrefChange(int boundary_value, 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name, 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value* value) { 198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int integer_value = 0; 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!value->GetAsInteger(&integer_value)) 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( 202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name, 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1, 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch boundary_value, 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch boundary_value + 1, 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase::kUmaTargetedHistogramFlag); 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram->Add(integer_value); 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 210bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 211bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory* PrefMetricsService::Factory::GetInstance() { 212bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return Singleton<PrefMetricsService::Factory>::get(); 213bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 214bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 215bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 216bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService* PrefMetricsService::Factory::GetForProfile( 217bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Profile* profile) { 218bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return static_cast<PrefMetricsService*>( 219bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetInstance()->GetServiceForBrowserContext(profile, true)); 220bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 221bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 222bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory::Factory() 223bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : BrowserContextKeyedServiceFactory( 224bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "PrefMetricsService", 225bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BrowserContextDependencyManager::GetInstance()) { 226bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 227bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 228bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory::~Factory() { 229bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 230bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* PrefMetricsService::Factory::BuildServiceInstanceFor( 232bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch content::BrowserContext* profile) const { 233bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return new PrefMetricsService(static_cast<Profile*>(profile)); 234bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 235bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 236bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PrefMetricsService::Factory::ServiceIsCreatedWithBrowserContext() const { 237bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return true; 238bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 239bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 240bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const { 241bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return false; 242bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 243bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 244bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochcontent::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse( 245bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch content::BrowserContext* context) const { 246bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return chrome::GetBrowserContextRedirectedInIncognito(context); 247bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 248