1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/tabs/tab_creation_metrics_controller.h"
#include "base/metrics/histogram_functions.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/task_runner.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/tabs/new_tab_grouping_user_data.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "components/tab_groups/tab_group_id.h"
#include "components/tabs/public/tab_interface.h"
namespace {
scoped_refptr<base::SequencedTaskRunner>& GetTaskRunnerOverride() {
static base::NoDestructor<scoped_refptr<base::SequencedTaskRunner>>
task_runner;
return *task_runner;
}
} // namespace
namespace tabs {
void TabCreationMetricsController::SetTaskRunnerForTesting(
const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
GetTaskRunnerOverride() = task_runner;
}
TabCreationMetricsController::TabCreationMetricsController(TabInterface* tab)
: tab_(tab),
task_runner_(GetTaskRunnerOverride()
? GetTaskRunnerOverride()
: base::SequencedTaskRunner::GetCurrentDefault()) {
ScheduleRecordTabGroupingTransition();
}
TabCreationMetricsController::~TabCreationMetricsController() = default;
void TabCreationMetricsController::ScheduleRecordTabGroupingTransition() {
if (!tab_->GetBrowserWindowInterface()->GetTabStripModel()) {
return;
}
std::optional<tab_groups::TabGroupId> last_active_group_id;
if (Profile* profile =
tab_->GetBrowserWindowInterface()->GetTabStripModel()->profile()) {
if (auto* data = profile->GetUserData(
NewTabGroupingUserData::kNewTabGroupingUserDataKey)) {
last_active_group_id =
static_cast<NewTabGroupingUserData*>(data)->last_active_group_id();
}
}
if (!last_active_group_id.has_value()) {
last_active_group_id = tab_->GetBrowserWindowInterface()
->GetTabStripModel()
->GetActiveTabGroupId();
}
task_runner_->PostDelayedTask(
FROM_HERE,
base::BindOnce(&TabCreationMetricsController::RecordTabGroupingTransition,
weak_factory_.GetWeakPtr(), last_active_group_id),
kDelay);
}
void TabCreationMetricsController::RecordTabGroupingTransition(
std::optional<tab_groups::TabGroupId> last_active_group_id) {
if (!tab_) {
return;
}
TabStripModel* tab_strip_model =
tab_->GetBrowserWindowInterface()->GetTabStripModel();
int tab_index = tab_strip_model->GetIndexOfTab(tab_);
std::optional<tab_groups::TabGroupId> group_id =
tab_->GetBrowserWindowInterface()->GetTabStripModel()->GetTabGroupForTab(
tab_index);
TabGroupingTransitionType type = TabGroupingTransitionType::kUninitialized;
if (!last_active_group_id.has_value() && !group_id.has_value()) {
type = TabGroupingTransitionType::kUngroupedToUngrouped;
} else if (!last_active_group_id.has_value() && group_id.has_value()) {
type = TabGroupingTransitionType::kUngroupedToGrouped;
} else if (last_active_group_id.has_value() && !group_id.has_value()) {
type = TabGroupingTransitionType::kGroupedToUngrouped;
} else {
// last_active_group_id.has_value() && group_id.has_value()
if (last_active_group_id.value() == group_id.value()) {
type = TabGroupingTransitionType::kGroupedToInPreviousGroup;
} else {
type = TabGroupingTransitionType::kGroupedToOutsidePreviousGroup;
}
}
base::UmaHistogramEnumeration("Tab.GroupingTransition", type);
}
} // namespace tabs
|