blob: eb73c04210468402ee3ebb40021ee157601d9a7d [file] [log] [blame]
// Copyright 2015 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.
#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 "base/macros.h"
#include "base/values.h"
#include "chrome/browser/task_manager/task_manager_observer.h"
#include "ui/base/models/table_model.h"
namespace content {
class WebContents;
}
namespace task_manager {
class TaskManagerValuesStringifier;
// Describes how the platform specific table view is sorted.
struct TableSortDescriptor {
TableSortDescriptor();
TableSortDescriptor(int col_id, bool ascending);
// The ID of the sorted column, -1 if the table is not sorted.
int sorted_column_id;
// True if the column is sorted ascending.
bool is_ascending;
};
// An interface to be able to communicate with the platform-specific table view
// (Either views::TableView or NSTableView on the Mac).
class TableViewDelegate {
public:
TableViewDelegate() {}
virtual ~TableViewDelegate() {}
virtual bool IsColumnVisible(int column_id) const = 0;
virtual void 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;
private:
DISALLOW_COPY_AND_ASSIGN(TableViewDelegate);
};
class TaskManagerTableModel
: public TaskManagerObserver,
public ui::TableModel {
public:
explicit TaskManagerTableModel(TableViewDelegate* delegate);
~TaskManagerTableModel() override;
// ui::TableModel:
int RowCount() override;
base::string16 GetText(int row, int column) override;
gfx::ImageSkia GetIcon(int row) override;
void SetObserver(ui::TableModelObserver* observer) override;
int CompareValues(int row1, int row2, int column_id) override;
// task_manager::TaskManagerObserver:
void OnTaskAdded(TaskId id) override;
void OnTaskToBeRemoved(TaskId id) override;
void OnTasksRefreshed(const TaskIdList& task_ids) override;
// Gets the start index and length of the group to which the task at
// |row_index| belongs.
void GetRowsGroupRange(int row_index, int* out_start, int* out_length);
// Activates the browser tab associated with the process in the specified
// |row_index|.
void ActivateTask(int row_index);
// Kills the process on which the task at |row_index| is running.
void KillTask(int row_index);
// Based on the given |visibility| and the |column_id|, a particular refresh
// type will be enabled or disabled.
void UpdateRefreshTypes(int column_id, bool visibility);
// Checks if the task at |row_index| is killable.
bool IsTaskKillable(int row_index) const;
// Restores the saved columns settings from a previous session into
// |columns_settings_| and updates the table view.
void RetrieveSavedColumnsSettingsAndUpdateTable();
// Stores the current values in |column_settings_| to the user prefs so that
// it can be restored later next time the task manager view is opened.
void StoreColumnsSettings();
void ToggleColumnVisibility(int column_id);
// Returns the row index corresponding to a particular WebContents. Returns -1
// if |web_contents| is nullptr, or is not currently found in the model (for
// example, if the tab is currently crashed).
int GetRowForWebContents(content::WebContents* web_contents);
private:
friend class TaskManagerTester;
// Start / stop observing the task manager.
void StartUpdating();
void StopUpdating();
void OnRefresh();
// Checks whether the task at |row_index| is the first task in its process
// group of tasks.
bool IsTaskFirstInGroup(int row_index) const;
// The delegate that will be used to communicate with the platform-specific
// TableView.
TableViewDelegate* table_view_delegate_;
// Contains either the column settings retrieved from user preferences if it
// exists, or the default column settings.
// The columns settings are the visible columns and the last sorted column
// and the direction of the sort.
std::unique_ptr<base::DictionaryValue> columns_settings_;
// The table model observer that will be set by the table view of the task
// manager.
ui::TableModelObserver* table_model_observer_;
// The sorted list of task IDs by process ID then by task ID.
std::vector<TaskId> tasks_;
// The owned task manager values stringifier that will be used to convert the
// values to string16.
std::unique_ptr<TaskManagerValuesStringifier> stringifier_;
// The status of the flag #enable-nacl-debug.
bool is_nacl_debugging_flag_enabled_;
DISALLOW_COPY_AND_ASSIGN(TaskManagerTableModel);
};
} // namespace task_manager
#endif // CHROME_BROWSER_UI_TASK_MANAGER_TASK_MANAGER_TABLE_MODEL_H_