pref_metrics_service.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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" 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/pref_service_syncable.h" 16fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "chrome/browser/prefs/session_startup_pref.h" 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/synced_pref_change_registrar.h" 18bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/browser/profiles/incognito_helpers.h" 19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chrome/browser/profiles/profile.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_prepopulate_data.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" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/rappor/rappor_service.h" 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "crypto/hmac.h" 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst int kSessionStartupPrefValueMax = SessionStartupPref::kPrefValueMax; 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 34bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 35bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::PrefMetricsService(Profile* profile) 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : profile_(profile), 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) prefs_(profile_->GetPrefs()), 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) local_state_(g_browser_process->local_state()), 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) weak_factory_(this) { 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RecordLaunchPrefs(); 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch synced_pref_change_registrar_.reset(new SyncedPrefChangeRegistrar(prefs)); 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterSyncedPrefObservers(); 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// For unit testing only. 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PrefMetricsService::PrefMetricsService(Profile* profile, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrefService* local_state) 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : profile_(profile), 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) prefs_(profile->GetPrefs()), 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) local_state_(local_state), 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) weak_factory_(this) { 55bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::~PrefMetricsService() { 58bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 60bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid PrefMetricsService::RecordLaunchPrefs() { 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool show_home_button = prefs_->GetBoolean(prefs::kShowHomeButton); 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool home_page_is_ntp = prefs_->GetBoolean(prefs::kHomePageIsNewTabPage); 633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton", show_home_button); 643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (show_home_button) { 653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UMA_HISTOGRAM_BOOLEAN("Settings.GivenShowHomeButton_HomePageIsNewTabPage", 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) home_page_is_ntp); 673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // For non-NTP homepages, see if the URL comes from the same TLD+1 as a known 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // search engine. Note that this is only an approximation of search engine 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // use, due to both false negatives (pages that come from unknown TLD+1 X but 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // consist of a search box that sends to known TLD+1 Y) and false positives 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // (pages that share a TLD+1 with a known engine but aren't actually search 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // pages, e.g. plus.google.com). Additionally, record the TLD+1 of non-NTP 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // homepages through the privacy-preserving Rappor service. 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!home_page_is_ntp) { 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL homepage_url(prefs_->GetString(prefs::kHomePage)); 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (homepage_url.is_valid()) { 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "Settings.HomePageEngineType", 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TemplateURLPrepopulateData::GetEngineType(homepage_url), 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SEARCH_ENGINE_MAX); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (g_browser_process->rappor_service()) { 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_browser_process->rappor_service()->RecordSample( 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "Settings.HomePage", 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::registry_controlled_domains::GetDomainAndRegistry(homepage_url, 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int restore_on_startup = prefs_->GetInteger(prefs::kRestoreOnStartup); 94fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch UMA_HISTOGRAM_ENUMERATION("Settings.StartupPageLoadSettings", 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) restore_on_startup, kSessionStartupPrefValueMax); 96fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch if (restore_on_startup == SessionStartupPref::kPrefValueURLs) { 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* url_list = 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_->GetList(prefs::kURLsToRestoreOnStartup); 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Settings.StartupPageLoadURLs", 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) url_list->GetSize(), 1, 50, 20); 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Similarly, check startup pages for known search engine TLD+1s. 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string url_text; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < url_list->GetSize(); ++i) { 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (url_list->GetString(i, &url_text)) { 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GURL start_url(url_text); 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (start_url.is_valid()) { 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "Settings.StartupPageEngineTypes", 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TemplateURLPrepopulateData::GetEngineType(start_url), 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SEARCH_ENGINE_MAX); 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 114fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch } 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_ANDROID) 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartupTabs startup_tabs = PinnedTabCodec::ReadPinnedTabs(profile_); 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Settings.PinnedTabs", 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) startup_tabs.size(), 1, 50, 20); 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < startup_tabs.size(); ++i) { 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL start_url(startup_tabs.at(i).url); 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (start_url.is_valid()) { 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "Settings.PinnedTabEngineTypes", 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TemplateURLPrepopulateData::GetEngineType(start_url), 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SEARCH_ENGINE_MAX); 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::RegisterSyncedPrefObservers() { 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogHistogramValueCallback booleanHandler = base::Bind( 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &PrefMetricsService::LogBooleanPrefChange, base::Unretained(this)); 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kShowHomeButton, "ShowHomeButton", booleanHandler); 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kHomePageIsNewTabPage, "HomePageIsNewTabPage", 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch booleanHandler); 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddPrefObserver(prefs::kRestoreOnStartup, "StartupPageLoadSettings", 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&PrefMetricsService::LogIntegerPrefChange, 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Unretained(this), 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch kSessionStartupPrefValueMax)); 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::AddPrefObserver( 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& path, 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name_prefix, 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const LogHistogramValueCallback& callback) { 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch synced_pref_change_registrar_->Add(path.c_str(), 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&PrefMetricsService::OnPrefChanged, 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Unretained(this), 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name_prefix, callback)); 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::OnPrefChanged( 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name_prefix, 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const LogHistogramValueCallback& callback, 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& path, 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool from_sync) { 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile_); 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const PrefService::Preference* pref = prefs->FindPreference(path.c_str()); 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(pref); 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string source_name( 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch from_sync ? ".PulledFromSync" : ".PushedToSync"); 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string histogram_name("Settings." + histogram_name_prefix + source_name); 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback.Run(histogram_name, pref->GetValue()); 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::LogBooleanPrefChange(const std::string& histogram_name, 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value* value) { 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool boolean_value = false; 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!value->GetAsBoolean(&boolean_value)) 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase* histogram = base::BooleanHistogram::FactoryGet( 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name, base::HistogramBase::kUmaTargetedHistogramFlag); 177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram->Add(boolean_value); 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PrefMetricsService::LogIntegerPrefChange(int boundary_value, 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& histogram_name, 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value* value) { 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int integer_value = 0; 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!value->GetAsInteger(&integer_value)) 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram_name, 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1, 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch boundary_value, 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch boundary_value + 1, 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::HistogramBase::kUmaTargetedHistogramFlag); 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch histogram->Add(integer_value); 193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 195bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 196bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory* PrefMetricsService::Factory::GetInstance() { 197bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return Singleton<PrefMetricsService::Factory>::get(); 198bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 199bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 200bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 201bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService* PrefMetricsService::Factory::GetForProfile( 202bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Profile* profile) { 203bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return static_cast<PrefMetricsService*>( 204bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetInstance()->GetServiceForBrowserContext(profile, true)); 205bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 206bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 207bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory::Factory() 208bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch : BrowserContextKeyedServiceFactory( 209bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "PrefMetricsService", 210bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BrowserContextDependencyManager::GetInstance()) { 211bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 212bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 213bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochPrefMetricsService::Factory::~Factory() { 214bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 215bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* PrefMetricsService::Factory::BuildServiceInstanceFor( 217bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch content::BrowserContext* profile) const { 218bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return new PrefMetricsService(static_cast<Profile*>(profile)); 219bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 220bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 221bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PrefMetricsService::Factory::ServiceIsCreatedWithBrowserContext() const { 222bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return true; 223bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 224bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 225bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const { 226bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return false; 227bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 228bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 229bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochcontent::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse( 230bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch content::BrowserContext* context) const { 231bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return chrome::GetBrowserContextRedirectedInIncognito(context); 232bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 233