diff --git a/browser/misc_metrics/BUILD.gn b/browser/misc_metrics/BUILD.gn index ffcf6bb9a163..147c151da81a 100644 --- a/browser/misc_metrics/BUILD.gn +++ b/browser/misc_metrics/BUILD.gn @@ -94,6 +94,7 @@ source_set("unit_tests") { if (!is_android) { sources += [ "extension_metrics_unittest.cc", + "profile_new_tab_metrics_unittest.cc", "theme_metrics_unittest.cc", ] diff --git a/browser/misc_metrics/profile_misc_metrics_service.cc b/browser/misc_metrics/profile_misc_metrics_service.cc index b6b9c4436831..535dde94f787 100644 --- a/browser/misc_metrics/profile_misc_metrics_service.cc +++ b/browser/misc_metrics/profile_misc_metrics_service.cc @@ -7,6 +7,7 @@ #include "base/metrics/histogram_macros.h" #include "brave/browser/brave_stats/first_run_util.h" +#include "brave/browser/misc_metrics/profile_new_tab_metrics.h" #include "brave/browser/misc_metrics/theme_metrics.h" #include "brave/components/misc_metrics/autofill_metrics.h" #include "brave/components/misc_metrics/language_metrics.h" @@ -74,6 +75,7 @@ ProfileMiscMetricsService::ProfileMiscMetricsService( theme_metrics_ = std::make_unique(theme_service); } if (profile_prefs_) { + new_tab_metrics_ = std::make_unique(profile_prefs_); pref_change_registrar_.Add( prefs::kSearchSuggestEnabled, base::BindRepeating(&ProfileMiscMetricsService::ReportSimpleMetrics, diff --git a/browser/misc_metrics/profile_misc_metrics_service.h b/browser/misc_metrics/profile_misc_metrics_service.h index be05189868fe..6cdebb5b9d69 100644 --- a/browser/misc_metrics/profile_misc_metrics_service.h +++ b/browser/misc_metrics/profile_misc_metrics_service.h @@ -24,6 +24,7 @@ namespace misc_metrics { class MiscAndroidMetrics; #else class ExtensionMetrics; +class ProfileNewTabMetrics; class ThemeMetrics; #endif class AutofillMetrics; @@ -63,6 +64,7 @@ class ProfileMiscMetricsService : public KeyedService { #else std::unique_ptr extension_metrics_ = nullptr; std::unique_ptr theme_metrics_ = nullptr; + std::unique_ptr new_tab_metrics_ = nullptr; #endif }; diff --git a/browser/misc_metrics/profile_new_tab_metrics.cc b/browser/misc_metrics/profile_new_tab_metrics.cc new file mode 100644 index 000000000000..5992ed31d348 --- /dev/null +++ b/browser/misc_metrics/profile_new_tab_metrics.cc @@ -0,0 +1,69 @@ +/* Copyright (c) 2025 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "brave/browser/misc_metrics/profile_new_tab_metrics.h" + +#include + +#include "base/containers/contains.h" +#include "base/metrics/histogram_macros.h" +#include "brave/browser/new_tab/new_tab_shows_options.h" +#include "brave/components/constants/pref_names.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/pref_service.h" +#include "url/gurl.h" + +namespace misc_metrics { + +ProfileNewTabMetrics::ProfileNewTabMetrics(PrefService* profile_prefs) + : profile_prefs_(profile_prefs) { + pref_change_registrar_.Init(profile_prefs_); + + auto callback = base::BindRepeating( + &ProfileNewTabMetrics::ReportNewTabPageDefault, base::Unretained(this)); + pref_change_registrar_.Add(kNewTabPageShowsOptions, callback); + pref_change_registrar_.Add(prefs::kHomePage, callback); + pref_change_registrar_.Add(prefs::kHomePageIsNewTabPage, callback); + + // Report the initial state + ReportNewTabPageDefault(); +} + +ProfileNewTabMetrics::~ProfileNewTabMetrics() = default; + +void ProfileNewTabMetrics::ReportNewTabPageDefault() { + std::optional type; + brave::NewTabPageShowsOptions option = + static_cast( + profile_prefs_->GetInteger(kNewTabPageShowsOptions)); + + if (option == brave::NewTabPageShowsOptions::kDashboard) { + type = NewTabPageDefaultType::kDashboard; + } else if (option == brave::NewTabPageShowsOptions::kHomepage) { + if (profile_prefs_->GetBoolean(prefs::kHomePageIsNewTabPage)) { + type = NewTabPageDefaultType::kDashboard; + } else { + GURL homepage_url(profile_prefs_->GetString(prefs::kHomePage)); + + if (homepage_url.host() == "search.brave.com") { + type = NewTabPageDefaultType::kHomepageBraveSearch; + } else if (base::Contains(homepage_url.host(), "google")) { + type = NewTabPageDefaultType::kHomepageGoogle; + } else if (base::Contains(homepage_url.host(), "duckduckgo")) { + type = NewTabPageDefaultType::kHomepageDuckDuckGo; + } else { + type = NewTabPageDefaultType::kHomepageOther; + } + } + } else if (option == brave::NewTabPageShowsOptions::kBlankpage) { + type = NewTabPageDefaultType::kBlank; + } + + if (type) { + UMA_HISTOGRAM_ENUMERATION(kNewTabPageDefaultHistogramName, *type); + } +} + +} // namespace misc_metrics diff --git a/browser/misc_metrics/profile_new_tab_metrics.h b/browser/misc_metrics/profile_new_tab_metrics.h new file mode 100644 index 000000000000..3fa81155da74 --- /dev/null +++ b/browser/misc_metrics/profile_new_tab_metrics.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2025 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_BROWSER_MISC_METRICS_PROFILE_NEW_TAB_METRICS_H_ +#define BRAVE_BROWSER_MISC_METRICS_PROFILE_NEW_TAB_METRICS_H_ + +#include "components/prefs/pref_change_registrar.h" + +class PrefService; + +namespace misc_metrics { + +inline constexpr char kNewTabPageDefaultHistogramName[] = + "Brave.NTP.DefaultPage"; + +enum class NewTabPageDefaultType { + kDashboard = 0, + kBlank = 1, + kHomepageBraveSearch = 2, + kHomepageGoogle = 3, + kHomepageDuckDuckGo = 4, + kHomepageOther = 5, + kMaxValue = kHomepageOther +}; + +class ProfileNewTabMetrics { + public: + explicit ProfileNewTabMetrics(PrefService* profile_prefs); + ~ProfileNewTabMetrics(); + + ProfileNewTabMetrics(const ProfileNewTabMetrics&) = delete; + ProfileNewTabMetrics& operator=(const ProfileNewTabMetrics&) = delete; + + private: + void ReportNewTabPageDefault(); + + raw_ptr profile_prefs_; + PrefChangeRegistrar pref_change_registrar_; +}; + +} // namespace misc_metrics + +#endif // BRAVE_BROWSER_MISC_METRICS_PROFILE_NEW_TAB_METRICS_H_ diff --git a/browser/misc_metrics/profile_new_tab_metrics_unittest.cc b/browser/misc_metrics/profile_new_tab_metrics_unittest.cc new file mode 100644 index 000000000000..a2864d5d8504 --- /dev/null +++ b/browser/misc_metrics/profile_new_tab_metrics_unittest.cc @@ -0,0 +1,92 @@ +/* Copyright (c) 2025 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "brave/browser/misc_metrics/profile_new_tab_metrics.h" + +#include "base/test/metrics/histogram_tester.h" +#include "brave/browser/new_tab/new_tab_shows_options.h" +#include "brave/components/constants/pref_names.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace misc_metrics { + +class ProfileNewTabMetricsTest : public testing::Test { + public: + ProfileNewTabMetricsTest() = default; + + void SetUp() override { + pref_service_.registry()->RegisterIntegerPref( + kNewTabPageShowsOptions, + static_cast(brave::NewTabPageShowsOptions::kDashboard)); + pref_service_.registry()->RegisterStringPref(prefs::kHomePage, ""); + pref_service_.registry()->RegisterBooleanPref(prefs::kHomePageIsNewTabPage, + false); + } + + protected: + TestingPrefServiceSimple pref_service_; + base::HistogramTester histogram_tester_; +}; + +TEST_F(ProfileNewTabMetricsTest, TestDashboardOption) { + pref_service_.SetInteger( + kNewTabPageShowsOptions, + static_cast(brave::NewTabPageShowsOptions::kDashboard)); + + ProfileNewTabMetrics metrics(&pref_service_); + + histogram_tester_.ExpectUniqueSample(kNewTabPageDefaultHistogramName, 0, 1); +} + +TEST_F(ProfileNewTabMetricsTest, TestBlankOption) { + pref_service_.SetInteger( + kNewTabPageShowsOptions, + static_cast(brave::NewTabPageShowsOptions::kBlankpage)); + + ProfileNewTabMetrics metrics(&pref_service_); + + histogram_tester_.ExpectUniqueSample(kNewTabPageDefaultHistogramName, 1, 1); +} + +TEST_F(ProfileNewTabMetricsTest, TestHomepageOptions) { + pref_service_.SetInteger( + kNewTabPageShowsOptions, + static_cast(brave::NewTabPageShowsOptions::kHomepage)); + + pref_service_.SetBoolean(prefs::kHomePageIsNewTabPage, true); + + ProfileNewTabMetrics metrics(&pref_service_); + + histogram_tester_.ExpectUniqueSample(kNewTabPageDefaultHistogramName, 0, 1); + + histogram_tester_.ExpectTotalCount(kNewTabPageDefaultHistogramName, 1); + + pref_service_.SetBoolean(prefs::kHomePageIsNewTabPage, false); + + histogram_tester_.ExpectBucketCount(kNewTabPageDefaultHistogramName, 5, 1); + + pref_service_.SetString(prefs::kHomePage, "https://search.brave.com"); + + histogram_tester_.ExpectBucketCount(kNewTabPageDefaultHistogramName, 2, 1); + + pref_service_.SetString(prefs::kHomePage, "https://www.google.com"); + + histogram_tester_.ExpectBucketCount(kNewTabPageDefaultHistogramName, 3, 1); + + pref_service_.SetString(prefs::kHomePage, "https://duckduckgo.com"); + + histogram_tester_.ExpectBucketCount(kNewTabPageDefaultHistogramName, 4, 1); + + pref_service_.SetString(prefs::kHomePage, "https://example.com"); + + histogram_tester_.ExpectBucketCount(kNewTabPageDefaultHistogramName, 5, 2); + + histogram_tester_.ExpectTotalCount(kNewTabPageDefaultHistogramName, 6); +} + +} // namespace misc_metrics diff --git a/browser/misc_metrics/sources.gni b/browser/misc_metrics/sources.gni index 7bc742e1d001..b5361506be43 100644 --- a/browser/misc_metrics/sources.gni +++ b/browser/misc_metrics/sources.gni @@ -22,6 +22,13 @@ brave_browser_misc_metrics_deps = [ "//content/public/browser", ] +if (!is_android) { + brave_browser_misc_metrics_sources += [ + "//brave/browser/misc_metrics/profile_new_tab_metrics.cc", + "//brave/browser/misc_metrics/profile_new_tab_metrics.h", + ] +} + brave_browser_misc_metrics_android_sources = [ "//brave/browser/misc_metrics/misc_android_metrics.cc", "//brave/browser/misc_metrics/misc_android_metrics_factory_android.cc", diff --git a/components/p3a/metric_names.h b/components/p3a/metric_names.h index 0bfcfd667837..a44dcbc3c639 100644 --- a/components/p3a/metric_names.h +++ b/components/p3a/metric_names.h @@ -72,6 +72,7 @@ inline constexpr auto kCollectedTypicalHistograms = {"Brave.Importer.ImporterSource.2", {}}, {"Brave.NTP.CustomizeUsageStatus.2", {}}, + {"Brave.NTP.DefaultPage", {}}, {"Brave.NTP.NewTabsCreated.3", {}}, {"Brave.NTP.SponsoredMediaType", {}}, {"Brave.Omnibox.SearchCount.3", {}},