Merge pull request #20159 from brave/android-tab-p3a-metrics

Add Android tab usage metrics
This commit is contained in:
Darnell Andries
2023-11-10 12:55:00 -08:00
committed by GitHub
19 changed files with 419 additions and 21 deletions
@@ -27,6 +27,7 @@ import android.widget.TextView;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat;
@@ -97,6 +98,7 @@ import org.chromium.chrome.browser.brave_stats.BraveStatsUtil;
import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
import org.chromium.chrome.browser.browsing_data.TimePeriod;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome;
import org.chromium.chrome.browser.crypto_wallet.AssetRatioServiceFactory;
import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory;
import org.chromium.chrome.browser.crypto_wallet.BraveWalletServiceFactory;
@@ -676,6 +678,23 @@ public abstract class BraveActivity extends ChromeActivity
});
}
@Override
public boolean onOptionsItemSelected(int itemId, @Nullable Bundle menuItemData) {
if (itemId == R.id.new_tab_menu_id) {
LayoutManagerChrome layoutManager =
(LayoutManagerChrome)
BraveReflectionUtil.getField(
ChromeTabbedActivity.class, "mLayoutManager", this);
if (layoutManager != null
&& layoutManager.getOverviewLayout() != null
&& !layoutManager.getOverviewLayout().isActive()
&& mMiscAndroidMetrics != null) {
mMiscAndroidMetrics.recordAppMenuNewTab();
}
}
return super.onOptionsItemSelected(itemId, menuItemData);
}
@Override
public void onVerifyPurchaseToken(String jsonResponse, boolean isSuccess) {
if (isSuccess) {
@@ -11,25 +11,42 @@ import androidx.annotation.NonNull;
import org.chromium.base.BraveReflectionUtil;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.components.omnibox.AutocompleteMatch;
import org.chromium.components.omnibox.OmniboxSuggestionType;
import org.chromium.misc_metrics.mojom.MiscAndroidMetrics;
import org.chromium.url.GURL;
class BraveAutocompleteMediatorBase {
void loadUrlForOmniboxMatch(int matchIndex, @NonNull AutocompleteMatch suggestion,
@NonNull GURL url, long inputStart, boolean inVisibleSuggestionList,
boolean openInNewTab) {
Context context =
(Context)
BraveReflectionUtil.getField(AutocompleteMediator.class, "mContext", this);
LocationBarDataProvider dataProvider =
(LocationBarDataProvider)
BraveReflectionUtil.getField(
AutocompleteMediator.class, "mDataProvider", this);
if (dataProvider != null
&& !dataProvider.isIncognito()
&& context != null
&& context instanceof BraveActivity) {
MiscAndroidMetrics miscAndroidMetrics =
((BraveActivity) context).getMiscAndroidMetrics();
if (miscAndroidMetrics != null) {
boolean isNewTab = dataProvider.getNewTabPageDelegate().isCurrentlyVisible();
boolean isSearchQuery =
suggestion.getType() == OmniboxSuggestionType.SEARCH_WHAT_YOU_TYPED
|| suggestion.getType() == OmniboxSuggestionType.SEARCH_SUGGEST;
miscAndroidMetrics.recordLocationBarChange(isNewTab, isSearchQuery);
}
}
BraveReflectionUtil.InvokeMethod(AutocompleteMediator.class, this, "loadUrlForOmniboxMatch",
int.class, matchIndex, AutocompleteMatch.class, suggestion, GURL.class, url,
long.class, inputStart, boolean.class, inVisibleSuggestionList, boolean.class,
openInNewTab);
if (suggestion.getType() == OmniboxSuggestionType.SEARCH_WHAT_YOU_TYPED
|| suggestion.getType() == OmniboxSuggestionType.SEARCH_SUGGEST) {
Context context = (Context) BraveReflectionUtil.getField(
AutocompleteMediator.class, "mContext", this);
if (context != null && context instanceof BraveActivity) {
((BraveActivity) context).getMiscAndroidMetrics().recordLocationBarQuery();
}
}
}
}
@@ -71,6 +71,7 @@ import org.chromium.chrome.features.start_surface.StartSurface;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.components.omnibox.action.OmniboxActionDelegate;
import org.chromium.misc_metrics.mojom.MiscAndroidMetrics;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modaldialog.ModalDialogManager;
@@ -244,8 +245,18 @@ public class BraveToolbarManager extends ToolbarManager {
OnClickListener tabSwitcherClickHandler, OnClickListener newTabClickHandler,
OnClickListener bookmarkClickHandler, OnClickListener customTabsBackClickHandler,
Supplier<Boolean> showStartSurfaceSupplier) {
super.initializeWithNative(layoutManager, tabSwitcherClickHandler, newTabClickHandler,
bookmarkClickHandler, customTabsBackClickHandler, showStartSurfaceSupplier);
OnClickListener wrappedNewTabClickHandler =
v -> {
recordNewTabClick();
newTabClickHandler.onClick(v);
};
super.initializeWithNative(
layoutManager,
tabSwitcherClickHandler,
wrappedNewTabClickHandler,
bookmarkClickHandler,
customTabsBackClickHandler,
showStartSurfaceSupplier);
if (isToolbarPhone() && BottomToolbarConfiguration.isBottomToolbarEnabled()) {
enableBottomControls();
@@ -256,10 +267,16 @@ public class BraveToolbarManager extends ToolbarManager {
assert (mBottomControlsCoordinatorSupplier.get()
instanceof BraveBottomControlsCoordinator);
((BraveBottomControlsCoordinator) mBottomControlsCoordinatorSupplier.get())
.initializeWithNative(mActivity, mCompositorViewHolder.getResourceManager(),
mCompositorViewHolder.getLayoutManager(), tabSwitcherClickHandler,
newTabClickHandler, mWindowAndroid, mTabCountProvider,
mIncognitoStateProvider, mActivity.findViewById(R.id.control_container),
.initializeWithNative(
mActivity,
mCompositorViewHolder.getResourceManager(),
mCompositorViewHolder.getLayoutManager(),
tabSwitcherClickHandler,
wrappedNewTabClickHandler,
mWindowAndroid,
mTabCountProvider,
mIncognitoStateProvider,
mActivity.findViewById(R.id.control_container),
closeAllTabsAction);
mLocationBar.getContainerView().setAccessibilityTraversalBefore(R.id.bottom_toolbar);
}
@@ -285,6 +302,18 @@ public class BraveToolbarManager extends ToolbarManager {
}
}
private void recordNewTabClick() {
if (!mIncognitoStateProvider.isIncognitoSelected()) {
if (mActivity instanceof BraveActivity) {
MiscAndroidMetrics miscAndroidMetrics =
((BraveActivity) mActivity).getMiscAndroidMetrics();
if (miscAndroidMetrics != null) {
miscAndroidMetrics.recordTabSwitcherNewTab();
}
}
}
}
protected void onOrientationChange(int newOrientation) {
if (mActionModeController != null) mActionModeController.showControlsOnOrientationChange();
+2
View File
@@ -6,6 +6,7 @@
# Add methods for invocation below
-keep class org.chromium.chrome.browser.ChromeTabbedActivity {
*** mLayoutManager;
*** hideOverview(...);
*** maybeHandleUrlIntent(...);
}
@@ -16,6 +17,7 @@
-keep class org.chromium.chrome.browser.omnibox.suggestions.AutocompleteMediator {
*** mContext;
*** mDataProvider;
*** loadUrlForOmniboxMatch(...);
}
@@ -958,6 +958,8 @@ public class BytecodeTest {
"org/chromium/chrome/browser/feed/FeedSurfaceMediator", "mSnapScrollHelper"));
Assert.assertTrue(fieldExists(
"org/chromium/chrome/browser/ntp/NewTabPage", "mBrowserControlsStateProvider"));
Assert.assertTrue(
fieldExists("org/chromium/chrome/browser/ChromeTabbedActivity", "mLayoutManager"));
Assert.assertTrue(
fieldExists("org/chromium/chrome/browser/ntp/NewTabPage", "mNewTabPageLayout"));
Assert.assertTrue(
@@ -1119,6 +1121,10 @@ public class BytecodeTest {
fieldExists(
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
"mDropdownViewInfoListBuilder"));
Assert.assertTrue(
fieldExists(
"org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
"mDataProvider"));
Assert.assertTrue(
fieldExists("org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator",
"mContext"));
+15 -2
View File
@@ -8,6 +8,7 @@
#include "brave/browser/misc_metrics/uptime_monitor.h"
#include "brave/browser/search_engines/search_engine_tracker.h"
#include "brave/components/misc_metrics/privacy_hub_metrics.h"
#include "brave/components/misc_metrics/tab_metrics.h"
namespace misc_metrics {
@@ -34,8 +35,20 @@ void MiscAndroidMetrics::RecordPrivacyHubEnabledStatus(bool is_enabled) {
misc_metrics_->privacy_hub_metrics()->RecordEnabledStatus(is_enabled);
}
void MiscAndroidMetrics::RecordLocationBarQuery() {
search_engine_tracker_->RecordLocationBarQuery();
void MiscAndroidMetrics::RecordLocationBarChange(bool is_new_tab,
bool is_search_query) {
if (is_search_query) {
search_engine_tracker_->RecordLocationBarQuery();
}
misc_metrics_->tab_metrics()->RecordLocationBarChange(is_new_tab);
}
void MiscAndroidMetrics::RecordAppMenuNewTab() {
misc_metrics_->tab_metrics()->RecordAppMenuNewTab();
}
void MiscAndroidMetrics::RecordTabSwitcherNewTab() {
misc_metrics_->tab_metrics()->RecordTabSwitcherNewTab();
}
void MiscAndroidMetrics::RecordBrowserUsageDuration(base::TimeDelta duration) {
+3 -1
View File
@@ -33,8 +33,10 @@ class MiscAndroidMetrics : public KeyedService,
// mojom::MiscAndroidMetrics:
void RecordPrivacyHubView() override;
void RecordPrivacyHubEnabledStatus(bool is_enabled) override;
void RecordLocationBarQuery() override;
void RecordBrowserUsageDuration(base::TimeDelta duration) override;
void RecordLocationBarChange(bool is_new_tab, bool is_search_query) override;
void RecordAppMenuNewTab() override;
void RecordTabSwitcherNewTab() override;
private:
raw_ptr<ProcessMiscMetrics> misc_metrics_;
@@ -15,6 +15,7 @@
#include "brave/components/misc_metrics/menu_metrics.h"
#else
#include "brave/components/misc_metrics/privacy_hub_metrics.h"
#include "brave/components/misc_metrics/tab_metrics.h"
#endif
#if BUILDFLAG(ENABLE_AI_CHAT)
#include "brave/components/ai_chat/core/browser/ai_chat_metrics.h"
@@ -29,6 +30,7 @@ ProcessMiscMetrics::ProcessMiscMetrics(PrefService* local_state) {
#else
privacy_hub_metrics_ =
std::make_unique<misc_metrics::PrivacyHubMetrics>(local_state);
tab_metrics_ = std::make_unique<misc_metrics::TabMetrics>(local_state);
#endif
#if BUILDFLAG(ENABLE_AI_CHAT)
ai_chat_metrics_ = std::make_unique<ai_chat::AIChatMetrics>(local_state);
@@ -55,6 +57,10 @@ PrivacyHubMetrics* ProcessMiscMetrics::privacy_hub_metrics() {
UptimeMonitor* ProcessMiscMetrics::uptime_monitor() {
return uptime_monitor_.get();
}
TabMetrics* ProcessMiscMetrics::tab_metrics() {
return tab_metrics_.get();
}
#endif
#if BUILDFLAG(ENABLE_AI_CHAT)
@@ -69,6 +75,7 @@ void ProcessMiscMetrics::RegisterPrefs(PrefRegistrySimple* registry) {
VerticalTabMetrics::RegisterPrefs(registry);
#else
PrivacyHubMetrics::RegisterPrefs(registry);
TabMetrics::RegisterPrefs(registry);
#endif
#if BUILDFLAG(ENABLE_AI_CHAT)
ai_chat::AIChatMetrics::RegisterPrefs(registry);
+4 -1
View File
@@ -27,6 +27,7 @@ class MenuMetrics;
class VerticalTabMetrics;
#else
class PrivacyHubMetrics;
class TabMetrics;
#endif
class DohMetrics;
class UptimeMonitor;
@@ -46,8 +47,9 @@ class ProcessMiscMetrics {
VerticalTabMetrics* vertical_tab_metrics();
#else
PrivacyHubMetrics* privacy_hub_metrics();
#endif
TabMetrics* tab_metrics();
UptimeMonitor* uptime_monitor();
#endif
#if BUILDFLAG(ENABLE_AI_CHAT)
ai_chat::AIChatMetrics* ai_chat_metrics();
#endif
@@ -58,6 +60,7 @@ class ProcessMiscMetrics {
std::unique_ptr<VerticalTabMetrics> vertical_tab_metrics_;
#else
std::unique_ptr<PrivacyHubMetrics> privacy_hub_metrics_;
std::unique_ptr<TabMetrics> tab_metrics_;
#endif
#if BUILDFLAG(ENABLE_AI_CHAT)
std::unique_ptr<ai_chat::AIChatMetrics> ai_chat_metrics_;
@@ -19,6 +19,7 @@ public class BraveAutocompleteMediatorBaseClassAdapter extends BraveClassVisitor
changeSuperName(sAutocompleteMediator, sBraveAutocompleteMediatorBase);
makeProtectedField(sAutocompleteMediator, "mContext");
makeProtectedField(sAutocompleteMediator, "mDataProvider");
changeMethodOwner(
sAutocompleteMediator, "loadUrlForOmniboxMatch", sBraveAutocompleteMediatorBase);
}
@@ -54,5 +54,6 @@ public class BraveTabbedActivityClassAdapter extends BraveClassVisitor {
makePublicMethod(sChromeTabbedActivityClassName, "maybeHandleUrlIntent");
changeMethodOwner(
sChromeTabbedActivityClassName, "maybeHandleUrlIntent", sBraveActivityClassName);
makeProtectedField(sChromeTabbedActivityClassName, "mLayoutManager");
}
}
+3
View File
@@ -15,6 +15,8 @@ static_library("misc_metrics") {
"pref_names.h",
"privacy_hub_metrics.cc",
"privacy_hub_metrics.h",
"tab_metrics.cc",
"tab_metrics.h",
]
deps = [
@@ -37,6 +39,7 @@ source_set("unit_tests") {
"general_browser_usage_unittest.cc",
"menu_metrics_unittest.cc",
"privacy_hub_metrics_unittest.cc",
"tab_metrics_unittest.cc",
]
deps = [
@@ -15,9 +15,17 @@ interface MiscAndroidMetrics {
// Records enabled status of Privacy Hub report.
RecordPrivacyHubEnabledStatus(bool isEnabled);
// Records a location bar search query event, for measuring "queries before churn".
RecordLocationBarQuery();
// Records browser usage duration, for measuring usage time per day.
RecordBrowserUsageDuration(mojo_base.mojom.TimeDelta duration);
// Records a location bar change (search query or direct URL entry), and
// whether the change was made on a new tab.
RecordLocationBarChange(bool isNewTab, bool isSearchQuery);
// Records the creation of a new tab via the tab app menu.
RecordAppMenuNewTab();
// Records the creation of a new tab via the bottom toolbar button
// in the tab switcher.
RecordTabSwitcherNewTab();
};
+9
View File
@@ -27,6 +27,7 @@ const char kMiscMetricsSearchSwitchedAwayFromBrave[] =
"brave.misc_metrics.search_switched_from_brave";
const char kMiscMetricsSearchBraveQueryCount[] =
"brave.misc_metrics.search_brave_query_count";
const char kMiscMetricsTotalDnsRequestStorage[] =
"brave.misc_metrics.total_dns_requests";
const char kMiscMetricsUpgradedDnsRequestStorage[] =
@@ -37,4 +38,12 @@ const char kDailyUptimeSumPrefName[] = "brave.misc_metrics.uptime_sum";
const char kDailyUptimeFrameStartTimePrefName[] =
"brave.misc_metrics.uptime_frame_start_time";
const char kMiscMetricsTabSwitcherNewTabsStorage[] =
"brave.misc_metrics.tab_switcher_new_tabs_storage";
const char kMiscMetricsTotalNewTabsStorage[] =
"brave.misc_metrics.total_new_tabs_storage";
const char kMiscMetricsNewTabLocationBarEntriesStorage[] =
"brave.misc_metrics.new_tab_location_bar_entries_storage";
const char kMiscMetricsTotalLocationBarEntriesStorage[] =
"brave.misc_metrics.total_location_bar_entries_storage";
} // namespace misc_metrics
+5
View File
@@ -22,6 +22,7 @@ extern const char kMiscMetricsPinnedTabsStorage[];
extern const char kMiscMetricsSearchSwitchedAwayFromBrave[];
extern const char kMiscMetricsSearchBraveQueryCount[];
extern const char kMiscMetricsTotalDnsRequestStorage[];
extern const char kMiscMetricsUpgradedDnsRequestStorage[];
@@ -29,6 +30,10 @@ extern const char kDailyUptimesListPrefName[]; // DEPRECATED
extern const char kDailyUptimeSumPrefName[];
extern const char kDailyUptimeFrameStartTimePrefName[];
extern const char kMiscMetricsTabSwitcherNewTabsStorage[];
extern const char kMiscMetricsTotalNewTabsStorage[];
extern const char kMiscMetricsNewTabLocationBarEntriesStorage[];
extern const char kMiscMetricsTotalLocationBarEntriesStorage[];
} // namespace misc_metrics
#endif // BRAVE_COMPONENTS_MISC_METRICS_PREF_NAMES_H_
+105
View File
@@ -0,0 +1,105 @@
/* Copyright (c) 2023 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/components/misc_metrics/tab_metrics.h"
#include "base/metrics/histogram_macros.h"
#include "brave/components/misc_metrics/pref_names.h"
#include "brave/components/p3a_utils/bucket.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
namespace misc_metrics {
namespace {
const int kPercentBucketValues[] = {25, 50, 75};
} // namespace
const char kLocationNewEntriesHistogramName[] = "Brave.Core.LocationNewEntries";
const char kNewTabMethodsHistogramName[] = "Brave.Core.NewTabMethods";
const base::TimeDelta kReportUpdateInterval = base::Days(1);
TabMetrics::TabMetrics(PrefService* local_state)
: tab_switcher_new_tabs_storage_(local_state,
kMiscMetricsTabSwitcherNewTabsStorage),
total_new_tabs_storage_(local_state, kMiscMetricsTotalNewTabsStorage),
new_tab_location_bar_entries_storage_(
local_state,
kMiscMetricsNewTabLocationBarEntriesStorage),
total_location_bar_entries_storage_(
local_state,
kMiscMetricsTotalLocationBarEntriesStorage) {
UpdateMetrics();
}
TabMetrics::~TabMetrics() = default;
void TabMetrics::RegisterPrefs(PrefRegistrySimple* registry) {
registry->RegisterListPref(kMiscMetricsTabSwitcherNewTabsStorage);
registry->RegisterListPref(kMiscMetricsTotalNewTabsStorage);
registry->RegisterListPref(kMiscMetricsNewTabLocationBarEntriesStorage);
registry->RegisterListPref(kMiscMetricsTotalLocationBarEntriesStorage);
}
void TabMetrics::RecordLocationBarChange(bool is_new_tab) {
if (is_new_tab) {
new_tab_location_bar_entries_storage_.AddDelta(1u);
}
total_location_bar_entries_storage_.AddDelta(1u);
RecordLocationEntries();
}
void TabMetrics::RecordAppMenuNewTab() {
total_new_tabs_storage_.AddDelta(1);
RecordNewTabMethods();
}
void TabMetrics::RecordTabSwitcherNewTab() {
tab_switcher_new_tabs_storage_.AddDelta(1);
total_new_tabs_storage_.AddDelta(1);
RecordNewTabMethods();
}
void TabMetrics::RecordLocationEntries() {
auto total = total_location_bar_entries_storage_.GetWeeklySum();
if (total == 0) {
return;
}
int percent = static_cast<int>(
static_cast<double>(
new_tab_location_bar_entries_storage_.GetWeeklySum()) /
total * 100);
p3a_utils::RecordToHistogramBucket(kLocationNewEntriesHistogramName,
kPercentBucketValues, percent);
}
void TabMetrics::RecordNewTabMethods() {
auto total = total_new_tabs_storage_.GetWeeklySum();
if (total == 0) {
return;
}
int percent = static_cast<int>(
static_cast<double>(tab_switcher_new_tabs_storage_.GetWeeklySum()) /
total * 100);
p3a_utils::RecordToHistogramBucket(kNewTabMethodsHistogramName,
kPercentBucketValues, percent);
}
void TabMetrics::UpdateMetrics() {
RecordLocationEntries();
RecordNewTabMethods();
SetUpTimer();
}
void TabMetrics::SetUpTimer() {
report_timer_.Start(
FROM_HERE, base::Time::Now() + kReportUpdateInterval,
base::BindOnce(&TabMetrics::UpdateMetrics, base::Unretained(this)));
}
} // namespace misc_metrics
+53
View File
@@ -0,0 +1,53 @@
/* Copyright (c) 2023 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_COMPONENTS_MISC_METRICS_TAB_METRICS_H_
#define BRAVE_COMPONENTS_MISC_METRICS_TAB_METRICS_H_
#include "base/timer/wall_clock_timer.h"
#include "brave/components/time_period_storage/weekly_storage.h"
class PrefRegistrySimple;
class PrefService;
namespace misc_metrics {
extern const char kLocationNewEntriesHistogramName[];
extern const char kNewTabMethodsHistogramName[];
class TabMetrics {
public:
explicit TabMetrics(PrefService* local_state);
~TabMetrics();
TabMetrics(const TabMetrics&) = delete;
TabMetrics& operator=(const TabMetrics&) = delete;
static void RegisterPrefs(PrefRegistrySimple* registry);
void RecordLocationBarChange(bool is_new_tab);
void RecordAppMenuNewTab();
void RecordTabSwitcherNewTab();
private:
void RecordLocationEntries();
void RecordNewTabMethods();
void UpdateMetrics();
void SetUpTimer();
WeeklyStorage tab_switcher_new_tabs_storage_;
WeeklyStorage total_new_tabs_storage_;
WeeklyStorage new_tab_location_bar_entries_storage_;
WeeklyStorage total_location_bar_entries_storage_;
base::WallClockTimer report_timer_;
};
} // namespace misc_metrics
#endif // BRAVE_COMPONENTS_MISC_METRICS_TAB_METRICS_H_
@@ -0,0 +1,113 @@
/* Copyright (c) 2023 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 <memory>
#include "base/test/metrics/histogram_tester.h"
#include "brave/components/misc_metrics/tab_metrics.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace misc_metrics {
class TabMetricsUnitTest : public testing::Test {
public:
TabMetricsUnitTest()
: task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
void SetUp() override {
misc_metrics::TabMetrics::RegisterPrefs(local_state_.registry());
tab_metrics_ = std::make_unique<TabMetrics>(&local_state_);
}
protected:
content::BrowserTaskEnvironment task_environment_;
TestingPrefServiceSimple local_state_;
base::HistogramTester histogram_tester_;
std::unique_ptr<TabMetrics> tab_metrics_;
};
TEST_F(TabMetricsUnitTest, NewTabMethods) {
histogram_tester_.ExpectTotalCount(kNewTabMethodsHistogramName, 0);
for (size_t i = 0; i < 6; i++) {
tab_metrics_->RecordAppMenuNewTab();
}
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 0, 6);
for (size_t i = 0; i < 2; i++) {
tab_metrics_->RecordTabSwitcherNewTab();
}
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 0, 8);
tab_metrics_->RecordTabSwitcherNewTab();
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 1, 1);
for (size_t i = 0; i < 4; i++) {
tab_metrics_->RecordTabSwitcherNewTab();
}
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 2, 1);
for (size_t i = 0; i < 12; i++) {
tab_metrics_->RecordTabSwitcherNewTab();
}
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 3, 1);
task_environment_.FastForwardBy(base::Days(7));
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 3, 7);
task_environment_.FastForwardBy(base::Days(3));
histogram_tester_.ExpectBucketCount(kNewTabMethodsHistogramName, 3, 7);
}
TEST_F(TabMetricsUnitTest, LocationNewEntries) {
histogram_tester_.ExpectTotalCount(kLocationNewEntriesHistogramName, 0);
for (size_t i = 0; i < 6; i++) {
tab_metrics_->RecordLocationBarChange(false);
}
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 0, 6);
for (size_t i = 0; i < 2; i++) {
tab_metrics_->RecordLocationBarChange(true);
}
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 0, 8);
tab_metrics_->RecordLocationBarChange(true);
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 1, 1);
for (size_t i = 0; i < 4; i++) {
tab_metrics_->RecordLocationBarChange(true);
}
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 2, 1);
for (size_t i = 0; i < 12; i++) {
tab_metrics_->RecordLocationBarChange(true);
}
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 3, 1);
task_environment_.FastForwardBy(base::Days(7));
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 3, 7);
task_environment_.FastForwardBy(base::Days(3));
histogram_tester_.ExpectBucketCount(kLocationNewEntriesHistogramName, 3, 7);
}
} // namespace misc_metrics
+2
View File
@@ -36,6 +36,8 @@ constexpr inline auto kCollectedTypicalHistograms =
"Brave.Core.DomainsLoaded",
"Brave.Core.IsDefault",
"Brave.Core.LastTimeIncognitoUsed",
"Brave.Core.LocationNewEntries",
"Brave.Core.NewTabMethods",
"Brave.Core.NumberOfExtensions",
"Brave.Core.PagesLoaded",
"Brave.Core.TabCount",