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 1d683caeef0fb51f99691839ddbf69dd3e5af159..97dc45d5257dd4c4c3c45437cda7a9413f4d7e04 100644 |
--- a/chrome/browser/prefs/pref_metrics_service.cc |
+++ b/chrome/browser/prefs/pref_metrics_service.cc |
@@ -4,13 +4,91 @@ |
#include "chrome/browser/prefs/pref_metrics_service.h" |
+#include <map> |
+ |
#include "base/metrics/histogram.h" |
#include "base/prefs/pref_service.h" |
#include "chrome/browser/prefs/session_startup_pref.h" |
#include "chrome/browser/profiles/incognito_helpers.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/search_engines/template_url_prepopulate_data.h" |
+#include "chrome/browser/search_engines/template_url_service.h" |
+#include "chrome/browser/search_engines/template_url_service_factory.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" |
+ |
+using TemplateURLPrepopulateData::kMaxPrepopulatedEngineID; |
+ |
+namespace { |
+ |
+// Use a map to convert domains to their histogram identifiers. Ids are defined |
+// in tools/metrics/histograms/histograms.xml and (usually) also in |
+// chrome/browser/search_engines/prepopulated_engines.json. |
+typedef std::map<std::string, int> DomainIdMap; |
+ |
+// Converts a host name into a domain name for easier matching. |
+std::string GetDomain(const std::string& host) { |
+ return net::registry_controlled_domains::GetDomainAndRegistry( |
+ host, |
+ net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); |
+} |
+ |
+void AddDomain(const std::string& domain, |
+ int domain_id, |
+ DomainIdMap* domain_id_map) { |
+ domain_id_map->insert(std::make_pair(domain, domain_id)); |
+} |
+ |
+// Builds a map that associates domain name strings with histogram enum values, |
+// for prepopulated DSEs and select non-prepopulated ones. |
+void BuildDomainIdMap(Profile* profile, DomainIdMap* domain_id_map) { |
+ // Add prepopulated search engine hosts to the map. |
+ ScopedVector<TemplateURL> prepopulated_urls; |
+ size_t default_search_index; // unused |
+ TemplateURLPrepopulateData::GetPrepopulatedEngines(profile, |
+ &prepopulated_urls.get(), &default_search_index); |
+ for (size_t i = 0; i < prepopulated_urls.size(); ++i) { |
+ AddDomain(GetDomain(prepopulated_urls[i]->url_ref().GetHost()), |
+ prepopulated_urls[i]->prepopulate_id(), |
+ domain_id_map); |
+ } |
+ // Add some common search engine domains that are not prepopulated. Assign |
+ // these domains id numbers 102-114 which extend the prepopulated engines |
+ // histogram enum. |
+ AddDomain("searchnu.com", 102, domain_id_map); |
+ AddDomain("babylon.com", 103, domain_id_map); |
+ AddDomain("delta-search.com", 104, domain_id_map); |
+ AddDomain("iminent.com", 105, domain_id_map); |
+ AddDomain("hao123.com", 106, domain_id_map); |
+ AddDomain("sweetim.com", 107, domain_id_map); |
+ AddDomain("snap.do", 108, domain_id_map); |
+ AddDomain("snapdo.com", 109, domain_id_map); |
+ AddDomain("softonic.com", 110, domain_id_map); |
+ AddDomain("searchfunmoods.com", 111, domain_id_map); |
+ AddDomain("incredibar.com", 112, domain_id_map); |
+ AddDomain("sweetpacks.com", 113, domain_id_map); |
+ AddDomain("imesh.net", 114, domain_id_map); |
+ // IMPORTANT: If you add more domains here, be sure to update the |
+ // kMaxPrepopulatedEngineID and available ids in prepopulated_engines.json. |
+ |
+ // The following hosts may not be prepopulated, depending on the country |
+ // settings. Add them here, using their existing ids. See histograms.xml. |
+ AddDomain("conduit.com", 36, domain_id_map); |
+ AddDomain("avg.com", 50, domain_id_map); |
+ AddDomain("mail.ru", 83, domain_id_map); |
+} |
+ |
+// Maps a host name to a histogram enum value. The enum value '0' represents |
+// 'Unknown', i.e. an unrecognized host. |
+int MapHostToId(const DomainIdMap& domain_id_map, const std::string& host) { |
+ DomainIdMap::const_iterator it = domain_id_map.find(GetDomain(host)); |
+ if (it != domain_id_map.end()) |
+ return it->second; |
+ return 0; |
+} |
+ |
+} // namespace |
PrefMetricsService::PrefMetricsService(Profile* profile) |
: profile_(profile) { |
@@ -21,10 +99,12 @@ PrefMetricsService::~PrefMetricsService() { |
} |
void PrefMetricsService::RecordLaunchPrefs() { |
- UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton", |
- profile_->GetPrefs()->GetBoolean(prefs::kShowHomeButton)); |
- UMA_HISTOGRAM_BOOLEAN("Settings.HomePageIsNewTabPage", |
- profile_->GetPrefs()->GetBoolean(prefs::kHomePageIsNewTabPage)); |
+ PrefService* prefs = profile_->GetPrefs(); |
+ const bool show_home_button = prefs->GetBoolean(prefs::kShowHomeButton); |
+ const bool home_page_is_ntp = prefs->GetBoolean(prefs::kHomePageIsNewTabPage); |
+ |
+ UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton", show_home_button); |
+ UMA_HISTOGRAM_BOOLEAN("Settings.HomePageIsNewTabPage", home_page_is_ntp); |
int restore_on_startup = profile_->GetPrefs()->GetInteger( |
prefs::kRestoreOnStartup); |
@@ -36,6 +116,47 @@ void PrefMetricsService::RecordLaunchPrefs() { |
UMA_HISTOGRAM_CUSTOM_COUNTS( |
"Settings.StartupPageLoadURLs", url_list_size, 1, 50, 20); |
} |
+ |
+ DomainIdMap domain_id_map; |
+ BuildDomainIdMap(profile_, &domain_id_map); |
+ |
+ // Record the default search engine id. |
+ TemplateURLService* template_url_service = |
+ TemplateURLServiceFactory::GetForProfile(profile_); |
+ if (template_url_service) { |
+ TemplateURL* template_url = |
+ template_url_service->GetDefaultSearchProvider(); |
+ if (template_url) { |
+ const int domain_id = |
+ MapHostToId(domain_id_map, template_url->url_ref().GetHost()); |
+ UMA_HISTOGRAM_ENUMERATION("Settings.DefaultSearchProvider", |
+ domain_id, kMaxPrepopulatedEngineID); |
+ } |
+ } |
+ // If the home page isn't the NTP, record the home page domain id. |
+ if (!home_page_is_ntp) { |
+ GURL homepage_url(prefs->GetString(prefs::kHomePage)); |
+ if (homepage_url.is_valid()) { |
+ const int domain_id = MapHostToId(domain_id_map, homepage_url.host()); |
+ UMA_HISTOGRAM_ENUMERATION("Settings.HomePageDomain", |
+ domain_id, kMaxPrepopulatedEngineID); |
+ } |
+ } |
+ // If startup pages are set, record all startup page domain ids. |
+ if (restore_on_startup == SessionStartupPref::kPrefValueURLs) { |
+ const ListValue* url_list = prefs->GetList(prefs::kURLsToRestoreOnStartup); |
+ for (size_t i = 0; i < url_list->GetSize(); i++) { |
+ std::string url_text; |
+ if (url_list->GetString(i, &url_text)) { |
+ GURL start_url(url_text); |
+ if (start_url.is_valid()) { |
+ const int domain_id = MapHostToId(domain_id_map, start_url.host()); |
+ UMA_HISTOGRAM_ENUMERATION("Settings.StartupPageDomains", |
+ domain_id, kMaxPrepopulatedEngineID); |
+ } |
+ } |
+ } |
+ } |
} |
// static |
@@ -54,6 +175,7 @@ PrefMetricsService::Factory::Factory() |
: BrowserContextKeyedServiceFactory( |
"PrefMetricsService", |
BrowserContextDependencyManager::GetInstance()) { |
+ DependsOn(TemplateURLServiceFactory::GetInstance()); |
} |
PrefMetricsService::Factory::~Factory() { |