summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/prefs/pref_metrics_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/prefs/pref_metrics_service.cc')
-rw-r--r--chromium/chrome/browser/prefs/pref_metrics_service.cc189
1 files changed, 189 insertions, 0 deletions
diff --git a/chromium/chrome/browser/prefs/pref_metrics_service.cc b/chromium/chrome/browser/prefs/pref_metrics_service.cc
new file mode 100644
index 00000000000..f321fa5c75d
--- /dev/null
+++ b/chromium/chrome/browser/prefs/pref_metrics_service.cc
@@ -0,0 +1,189 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/prefs/pref_metrics_service.h"
+
+#include <string>
+
+#include "base/metrics/histogram_macros.h"
+#include "base/values.h"
+#include "build/build_config.h"
+#include "chrome/browser/browser_process.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_service_factory.h"
+#include "chrome/browser/ui/tabs/pinned_tab_codec.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/prefs/pref_service.h"
+#include "components/rappor/public/rappor_utils.h"
+#include "components/rappor/rappor_service_impl.h"
+#include "components/search_engines/template_url_prepopulate_data.h"
+#include "content/public/browser/browser_url_handler.h"
+#include "url/gurl.h"
+
+namespace {
+
+#if !defined(OS_ANDROID)
+// Record a sample for the Settings.NewTabPage rappor metric.
+void SampleNewTabPageURL(Profile* profile) {
+ GURL ntp_url(chrome::kChromeUINewTabURL);
+ bool reverse_on_redirect = false;
+ content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary(
+ &ntp_url,
+ profile,
+ &reverse_on_redirect);
+ if (ntp_url.is_valid()) {
+ rappor::SampleDomainAndRegistryFromGURL(g_browser_process->rappor_service(),
+ "Settings.NewTabPage", ntp_url);
+ }
+}
+#endif
+
+} // namespace
+
+PrefMetricsService::PrefMetricsService(Profile* profile)
+ : profile_(profile), prefs_(profile_->GetPrefs()) {
+ RecordLaunchPrefs();
+}
+
+PrefMetricsService::~PrefMetricsService() {
+}
+
+// static
+void PrefMetricsService::RecordHomePageLaunchMetrics(bool show_home_button,
+ bool homepage_is_ntp,
+ const GURL& homepage_url) {
+ UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton", show_home_button);
+ if (show_home_button) {
+ UMA_HISTOGRAM_BOOLEAN("Settings.GivenShowHomeButton_HomePageIsNewTabPage",
+ homepage_is_ntp);
+ }
+
+ // For non-NTP homepages, see if the URL comes from the same TLD+1 as a known
+ // search engine. Note that this is only an approximation of search engine
+ // use, due to both false negatives (pages that come from unknown TLD+1 X but
+ // consist of a search box that sends to known TLD+1 Y) and false positives
+ // (pages that share a TLD+1 with a known engine but aren't actually search
+ // pages, e.g. plus.google.com). Additionally, record the TLD+1 of non-NTP
+ // homepages through the privacy-preserving Rappor service.
+ if (!homepage_is_ntp) {
+ if (homepage_url.is_valid()) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "Settings.HomePageEngineType",
+ TemplateURLPrepopulateData::GetEngineType(homepage_url),
+ SEARCH_ENGINE_MAX);
+ rappor::SampleDomainAndRegistryFromGURL(
+ g_browser_process->rappor_service(), "Settings.HomePage2",
+ homepage_url);
+ }
+ }
+}
+
+void PrefMetricsService::RecordLaunchPrefs() {
+ // On Android, determining whether the homepage is enabled requires waiting
+ // for a response from a third party provider installed on the device. So,
+ // it will be logged later once all the dependent information is available.
+ // See DeferredStartupHandler.java.
+#if !defined(OS_ANDROID)
+ GURL homepage_url(prefs_->GetString(prefs::kHomePage));
+ RecordHomePageLaunchMetrics(prefs_->GetBoolean(prefs::kShowHomeButton),
+ prefs_->GetBoolean(prefs::kHomePageIsNewTabPage),
+ homepage_url);
+#endif
+
+ // Android does not support overriding the NTP URL.
+#if !defined(OS_ANDROID)
+ SampleNewTabPageURL(profile_);
+#endif
+
+ // Tab restoring is always done on Android, so these metrics are not
+ // applicable. Also, startup pages are not supported on Android
+#if !defined(OS_ANDROID)
+ int restore_on_startup = prefs_->GetInteger(prefs::kRestoreOnStartup);
+ UMA_HISTOGRAM_ENUMERATION(
+ "Settings.StartupPageLoadSettings", restore_on_startup,
+ static_cast<int>(SessionStartupPref::kPrefValueMax));
+ if (restore_on_startup == SessionStartupPref::kPrefValueURLs) {
+ const base::ListValue* url_list =
+ prefs_->GetList(prefs::kURLsToRestoreOnStartup);
+ // Similarly, check startup pages for known search engine TLD+1s.
+ std::string url_text;
+ for (size_t i = 0; i < url_list->GetSize(); ++i) {
+ if (url_list->GetString(i, &url_text)) {
+ GURL start_url(url_text);
+ if (start_url.is_valid()) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "Settings.StartupPageEngineTypes",
+ TemplateURLPrepopulateData::GetEngineType(start_url),
+ SEARCH_ENGINE_MAX);
+ if (i == 0) {
+ rappor::SampleDomainAndRegistryFromGURL(
+ g_browser_process->rappor_service(),
+ "Settings.FirstStartupPage", start_url);
+ }
+ }
+ }
+ }
+ }
+#endif
+
+ // Android does not support pinned tabs.
+#if !defined(OS_ANDROID)
+ StartupTabs startup_tabs = PinnedTabCodec::ReadPinnedTabs(profile_);
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Settings.PinnedTabs",
+ startup_tabs.size(), 1, 50, 20);
+ for (size_t i = 0; i < startup_tabs.size(); ++i) {
+ GURL start_url(startup_tabs.at(i).url);
+ if (start_url.is_valid()) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "Settings.PinnedTabEngineTypes",
+ TemplateURLPrepopulateData::GetEngineType(start_url),
+ SEARCH_ENGINE_MAX);
+ }
+ }
+#endif
+}
+
+// static
+PrefMetricsService::Factory* PrefMetricsService::Factory::GetInstance() {
+ return base::Singleton<PrefMetricsService::Factory>::get();
+}
+
+// static
+PrefMetricsService* PrefMetricsService::Factory::GetForProfile(
+ Profile* profile) {
+ return static_cast<PrefMetricsService*>(
+ GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+PrefMetricsService::Factory::Factory()
+ : BrowserContextKeyedServiceFactory(
+ "PrefMetricsService",
+ BrowserContextDependencyManager::GetInstance()) {
+ DependsOn(TemplateURLServiceFactory::GetInstance());
+}
+
+PrefMetricsService::Factory::~Factory() {
+}
+
+KeyedService* PrefMetricsService::Factory::BuildServiceInstanceFor(
+ content::BrowserContext* profile) const {
+ return new PrefMetricsService(static_cast<Profile*>(profile));
+}
+
+bool PrefMetricsService::Factory::ServiceIsCreatedWithBrowserContext() const {
+ return true;
+}
+
+bool PrefMetricsService::Factory::ServiceIsNULLWhileTesting() const {
+ return false;
+}
+
+content::BrowserContext* PrefMetricsService::Factory::GetBrowserContextToUse(
+ content::BrowserContext* context) const {
+ return chrome::GetBrowserContextRedirectedInIncognito(context);
+}