#ifndef CHROME_BROWSER_UI_TASK_MANAGER_TASK_MANAGER_TABLE_MODEL_H_
#define CHROME_BROWSER_UI_TASK_MANAGER_TASK_MANAGER_TABLE_MODEL_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <string_view>
#include <unordered_set>
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/task_manager/providers/task.h"
#include "chrome/browser/task_manager/task_manager_observer.h"
#include "ui/base/models/table_model.h"
namespace content {
class WebContents;
}
namespace task_manager {
enum class DisplayCategory : uint8_t {
kAll = 0,
kTabsAndExtensions = 1,
kSystem = 2,
kMax = kSystem
};
class TaskManagerValuesStringifier;
struct TableSortDescriptor {
TableSortDescriptor();
TableSortDescriptor(int col_id, bool ascending);
int sorted_column_id;
bool is_ascending;
};
class TableViewDelegate {
public:
TableViewDelegate() = default;
TableViewDelegate(const TableViewDelegate&) = delete;
TableViewDelegate& operator=(const TableViewDelegate&) = delete;
virtual ~TableViewDelegate() = default;
virtual bool IsColumnVisible(int column_id) const = 0;
virtual bool SetColumnVisibility(int column_id, bool new_visibility) = 0;
virtual bool IsTableSorted() const = 0;
virtual TableSortDescriptor GetSortDescriptor() const = 0;
virtual void SetSortDescriptor(
const TableSortDescriptor& sort_descriptor) = 0;
};
class TaskManagerTableModel : public TaskManagerObserver,
public ui::TableModel {
public:
static constexpr DisplayCategory kDefaultCategory =
DisplayCategory::kTabsAndExtensions;
explicit TaskManagerTableModel(
TableViewDelegate* delegate,
DisplayCategory initial_display_category = DisplayCategory::kAll);
TaskManagerTableModel(const TaskManagerTableModel&) = delete;
TaskManagerTableModel& operator=(const TaskManagerTableModel&) = delete;
~TaskManagerTableModel() override;
size_t RowCount() override;
std::u16string GetText(size_t row, int column) override;
ui::ImageModel GetIcon(size_t row) override;
void SetObserver(ui::TableModelObserver* observer) override;
int CompareValues(size_t row1, size_t row2, int column_id) override;
std::u16string GetAXNameForHeader(
const std::vector<std::u16string>& visible_column_titles,
const std::vector<std::u16string>& visible_column_sortable) override;
std::u16string GetAXNameForHeaderCell(
const std::u16string& visible_column_title,
const std::u16string& visible_column_sortable) override;
std::u16string GetAXNameForRow(
size_t row,
const std::vector<int>& visible_column_ids) override;
static std::u16string FormatListToString(
base::span<const std::u16string> items);
void FilterTaskList(TaskIdList& tasks);
void OnTaskAdded(TaskId id) override;
void OnTaskToBeRemoved(TaskId id) override;
void OnTasksRefreshed(const TaskIdList& task_ids) override;
void OnTasksRefreshedWithBackgroundCalculations(
const TaskIdList& task_ids) override;
void GetRowsGroupRange(size_t row_index,
size_t* out_start,
size_t* out_length);
void ActivateTask(size_t row_index);
bool KillTask(size_t row_index);
void UpdateRefreshTypes(int column_id, bool visibility);
bool IsTaskKillable(size_t row_index) const;
void RetrieveSavedColumnsSettingsAndUpdateTable(
bool default_sorted_column_to_cpu = false);
void StoreColumnsSettings();
void ToggleColumnVisibility(int column_id);
std::optional<size_t> GetRowForWebContents(
content::WebContents* web_contents);
void UpdateOldTabTime(DisplayCategory old_category);
void StartNewTabTime(DisplayCategory new_category);
bool UpdateModel(const DisplayCategory display_category,
std::u16string_view search_term);
private:
friend class TaskManagerTester;
void StartUpdating();
void StopUpdating();
void OnRefresh(const TaskIdList& task_ids);
bool IsTaskFirstInGroup(size_t row_index) const;
bool FetchTaskTypes(TaskId child_task_id,
Task::Type& out_type,
Task::SubType& out_subtype) const;
bool ShouldKeepTaskForSupportedType(TaskId task_id) const;
bool ShouldKeepTask(TaskId task_id) const;
bool HasMatchInTasksSharingSameProcess(TaskId task_id) const;
void UpdateMatchedProcessSet();
void UpdateMatchedProcessSetById(TaskId task_id);
raw_ptr<TableViewDelegate> table_view_delegate_;
base::Value::Dict columns_settings_;
raw_ptr<ui::TableModelObserver> table_model_observer_;
std::vector<TaskId> tasks_;
std::unique_ptr<TaskManagerValuesStringifier> stringifier_;
DisplayCategory display_category_;
std::u16string search_terms_;
std::unordered_set<base::ProcessId> matched_process_set_;
base::TimeTicks tabs_and_ex_start_time_ = base::TimeTicks::Now();
base::TimeTicks system_start_time_ = base::TimeTicks::Now();
base::TimeTicks all_start_time_ = base::TimeTicks::Now();
base::TimeDelta tabs_and_ex_total_time_;
base::TimeDelta system_total_time_;
base::TimeDelta all_total_time_;
};
}
#endif