Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1227)

Unified Diff: chrome/browser/ui/views/new_task_manager_view.cc

Issue 1367673003: Expose all reusable task manager view code so it can be used by Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/new_task_manager_view.cc
diff --git a/chrome/browser/ui/views/new_task_manager_view.cc b/chrome/browser/ui/views/new_task_manager_view.cc
index fbcdc1e75fd7cdb3f6c30f4840be11ac4a91a97d..81f5918a18ec5ea8b2789155cb1154cd94c13feb 100644
--- a/chrome/browser/ui/views/new_task_manager_view.cc
+++ b/chrome/browser/ui/views/new_task_manager_view.cc
@@ -4,32 +4,22 @@
#include "chrome/browser/ui/views/new_task_manager_view.h"
-#include <map>
-
-#include "base/i18n/number_formatting.h"
#include "base/prefs/pref_service.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_window.h"
-#include "chrome/browser/task_management/task_manager_interface.h"
#include "chrome/browser/task_management/task_manager_observer.h"
+#include "chrome/browser/ui/task_manager/task_manager_columns.h"
+#include "chrome/browser/ui/task_manager/task_manager_table_model.h"
#include "chrome/browser/ui/user_manager.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
-#include "components/nacl/browser/nacl_browser.h"
-#include "content/public/common/result_codes.h"
-#include "third_party/WebKit/public/web/WebCache.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/table_model_observer.h"
-#include "ui/base/text/bytes_formatting.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/link.h"
-#include "ui/views/controls/table/table_grouper.h"
#include "ui/views/controls/table/table_view.h"
#include "ui/views/layout/layout_constants.h"
#include "ui/views/view.h"
@@ -53,40 +43,6 @@ namespace {
NewTaskManagerView* g_task_manager_view = nullptr;
-#if defined(OS_MACOSX)
-// Match Activity Monitor's default refresh rate.
-const int64 kRefreshTimeMS = 2000;
-
-// Activity Monitor shows %cpu with one decimal digit -- be consistent with
-// that.
-const char kCpuTextFormatString[] = "%.1f";
-#else
-const int64 kRefreshTimeMS = 1000;
-const char kCpuTextFormatString[] = "%.0f";
-#endif // defined(OS_MACOSX)
-
-// The columns that are shared by a group will show the value of the column
-// only once per group.
-bool IsSharedByGroup(int column_id) {
- switch (column_id) {
- case IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN:
- case IDS_TASK_MANAGER_SHARED_MEM_COLUMN:
- case IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN:
- case IDS_TASK_MANAGER_CPU_COLUMN:
- case IDS_TASK_MANAGER_PROCESS_ID_COLUMN:
- case IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN:
- case IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN:
- case IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN:
- case IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN:
- case IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN:
- case IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN:
- case IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN:
- return true;
- default:
- return false;
- }
-}
-
// Opens the "about:memory" for the "stats for nerds" link.
void OpenAboutMemory(chrome::HostDesktopType desktop_type) {
Profile* profile = ProfileManager::GetLastUsedProfileAllowedByPolicy();
@@ -107,718 +63,67 @@ void OpenAboutMemory(chrome::HostDesktopType desktop_type) {
chrome::Navigate(&params);
}
-// Used to sort various column values.
-template <class T>
-int ValueCompare(T value1, T value2) {
- if (value1 == value2)
- return 0;
- return value1 < value2 ? -1 : 1;
-}
-
-// Used when one or both of the results to compare are unavailable.
-int OrderUnavailableValue(bool v1, bool v2) {
- if (!v1 && !v2)
- return 0;
- return v1 ? 1 : -1;
-}
-
-// A class to stringify the task manager's values into string16s and to
-// cache the common strings that will be reused many times like "N/A" and so on.
-class TaskManagerValuesStringifier {
- public:
- TaskManagerValuesStringifier()
- : n_a_string_(l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT)),
- zero_string_(base::ASCIIToUTF16("0")),
- asterisk_string_(base::ASCIIToUTF16("*")),
- unknown_string_(l10n_util::GetStringUTF16(
- IDS_TASK_MANAGER_UNKNOWN_VALUE_TEXT)) {
- }
-
- ~TaskManagerValuesStringifier() {}
-
- base::string16 GetCpuUsageText(double cpu_usage) {
- return base::UTF8ToUTF16(base::StringPrintf(kCpuTextFormatString,
- cpu_usage));
- }
-
- base::string16 GetMemoryUsageText(int64 memory_usage, bool has_duplicates) {
- if (memory_usage == -1)
- return n_a_string_;
-
-#if defined(OS_MACOSX)
- // System expectation is to show "100 kB", "200 MB", etc.
- // TODO(thakis): [This TODO has been taken as is from the old task manager]:
- // Switch to metric units (as opposed to powers of two).
- base::string16 memory_text = ui::FormatBytes(memory_usage);
-#else
- base::string16 memory_text = base::FormatNumber(memory_usage / 1024);
- // Adjust number string if necessary.
- base::i18n::AdjustStringForLocaleDirection(&memory_text);
- memory_text = l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_MEM_CELL_TEXT,
- memory_text);
-#endif // defined(OS_MACOSX)
-
- if (has_duplicates)
- memory_text += asterisk_string_;
-
- return memory_text;
- }
-
- base::string16 GetIdleWakeupsText(int idle_wakeups) {
- if (idle_wakeups == -1)
- return n_a_string_;
-
- return base::FormatNumber(idle_wakeups);
- }
-
- base::string16 GetNaClPortText(int nacl_port) {
- if (nacl_port == nacl::kGdbDebugStubPortUnused)
- return n_a_string_;
-
- if (nacl_port == nacl::kGdbDebugStubPortUnknown)
- return unknown_string_;
-
- return base::IntToString16(nacl_port);
- }
-
- base::string16 GetWindowsHandlesText(int64 current, int64 peak) {
- return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_HANDLES_CELL_TEXT,
- base::Int64ToString16(current),
- base::Int64ToString16(peak));
- }
-
- base::string16 GetNetworkUsageText(int64 network_usage) {
- if (network_usage == -1)
- return n_a_string_;
-
- if (network_usage == 0)
- return zero_string_;
-
- base::string16 net_byte = ui::FormatSpeed(network_usage);
- // Force number string to have LTR directionality.
- return base::i18n::GetDisplayStringInLTRDirectionality(net_byte);
- }
-
- base::string16 GetProcessIdText(base::ProcessId proc_id) {
- return base::IntToString16(proc_id);
- }
-
- base::string16 FormatAllocatedAndUsedMemory(int64 allocated, int64 used) {
- return l10n_util::GetStringFUTF16(
- IDS_TASK_MANAGER_CACHE_SIZE_CELL_TEXT,
- ui::FormatBytesWithUnits(allocated, ui::DATA_UNITS_KIBIBYTE, false),
- ui::FormatBytesWithUnits(used, ui::DATA_UNITS_KIBIBYTE, false));
- }
-
- base::string16 GetWebCacheStatText(
- const blink::WebCache::ResourceTypeStat& stat) {
- return FormatAllocatedAndUsedMemory(stat.size, stat.liveSize);
- }
-
- const base::string16& n_a_string() const { return n_a_string_; }
- const base::string16& zero_string() const { return zero_string_; }
- const base::string16& asterisk_string() const { return asterisk_string_; }
- const base::string16& unknown_string() const { return unknown_string_; }
-
- private:
- // The localized string "N/A".
- const base::string16 n_a_string_;
-
- // The value 0 as a string "0".
- const base::string16 zero_string_;
-
- // The string "*" that is used to show that there exists duplicates in the
- // GPU memory.
- const base::string16 asterisk_string_;
-
- // The string "Unknown".
- const base::string16 unknown_string_;
-
- DISALLOW_COPY_AND_ASSIGN(TaskManagerValuesStringifier);
-};
-
} // namespace
-////////////////////////////////////////////////////////////////////////////////
-
-// IMPORTANT: Do NOT change the below list without changing the COLUMN_LIST
-// macro below.
-const TableColumnData kColumns[] = {
- { IDS_TASK_MANAGER_TASK_COLUMN, ui::TableColumn::LEFT, -1, 1, true, true,
- true },
- { IDS_TASK_MANAGER_PROFILE_NAME_COLUMN, ui::TableColumn::LEFT, -1, 0, true,
- true, false },
- { IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- false, true },
- { IDS_TASK_MANAGER_SHARED_MEM_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- false, false },
- { IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- false, false },
- { IDS_TASK_MANAGER_CPU_COLUMN, ui::TableColumn::RIGHT, -1, 0, true, false,
- true },
- { IDS_TASK_MANAGER_NET_COLUMN, ui::TableColumn::RIGHT, -1, 0, true, false,
- true },
- { IDS_TASK_MANAGER_PROCESS_ID_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- true, true },
-
-#if defined(OS_WIN)
- { IDS_TASK_MANAGER_GDI_HANDLES_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- false, false },
- { IDS_TASK_MANAGER_USER_HANDLES_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- false, false },
-#endif
-
- { IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN, ui::TableColumn::RIGHT, -1, 0,
- true, false, false },
- { IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN, ui::TableColumn::RIGHT, -1,
- 0, true, false, false },
- { IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, ui::TableColumn::RIGHT, -1, 0,
- true, false, false },
- { IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- false, false },
- { IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN, ui::TableColumn::RIGHT, -1, 0,
- true, false, false },
-
-#if !defined(DISABLE_NACL)
- { IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN, ui::TableColumn::RIGHT, -1, 0,
- true, true, false },
-#endif // !defined(DISABLE_NACL)
-
- { IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN, ui::TableColumn::RIGHT,
- -1, 0, true, false, false },
-
-#if defined(OS_MACOSX) || defined(OS_LINUX)
- // TODO(port): Port the idle wakeups per second to platforms other than Linux
- // and MacOS (http://crbug.com/120488).
- { IDS_TASK_MANAGER_IDLE_WAKEUPS_COLUMN, ui::TableColumn::RIGHT, -1, 0, true,
- false, false },
-#endif // defined(OS_MACOSX) || defined(OS_LINUX)
-};
-
-const size_t kColumnsSize = arraysize(kColumns);
-
-const char kSortColumnIdKey[] = "sort_column_id";
-const char kSortIsAscendingKey[] = "sort_is_ascending";
-
-// We can't use the integer IDs of the columns converted to strings as session
-// restore keys. These integer values can change from one build to another as
-// they are generated. Instead we use the literal string value of the column
-// ID symbol (i.e. for the ID IDS_TASK_MANAGER_TASK_COLUMN, we use the literal
-// string "IDS_TASK_MANAGER_TASK_COLUMN". The following macros help us
-// efficiently get the literal ID for the integer value.
-#define COLUMNS_LITS(def) \
- def(IDS_TASK_MANAGER_TASK_COLUMN) \
- def(IDS_TASK_MANAGER_PROFILE_NAME_COLUMN) \
- def(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN) \
- def(IDS_TASK_MANAGER_SHARED_MEM_COLUMN) \
- def(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN) \
- def(IDS_TASK_MANAGER_CPU_COLUMN) \
- def(IDS_TASK_MANAGER_NET_COLUMN) \
- def(IDS_TASK_MANAGER_PROCESS_ID_COLUMN) \
- def(IDS_TASK_MANAGER_GDI_HANDLES_COLUMN) \
- def(IDS_TASK_MANAGER_USER_HANDLES_COLUMN) \
- def(IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN) \
- def(IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN) \
- def(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN) \
- def(IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN) \
- def(IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN) \
- def(IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN) \
- def(IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN) \
- def(IDS_TASK_MANAGER_IDLE_WAKEUPS_COLUMN)
-// Add to the above list in the macro any new IDs added in the future. Also
-// remove the removed ones.
-
-#define COLUMN_ID_AS_STRING(col_id) case col_id: return std::string(#col_id);
-
-std::string GetColumnIdAsString(int column_id) {
- switch (column_id) {
- COLUMNS_LITS(COLUMN_ID_AS_STRING)
- default:
- NOTREACHED();
- return std::string();
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-// The table model of the task manager table view that will observe the
-// task manager backend and adapt its interface to match the requirements of the
-// TableView.
-class NewTaskManagerView::TableModel
- : public TaskManagerObserver,
- public ui::TableModel,
- public views::TableGrouper {
+// The Aura views TableView delegate of the TaskManagerTableModel.
+class NewTaskManagerView::ViewsTableDelegate : public TableViewDelegate {
Lei Zhang 2015/09/24 05:33:58 Can NewTaskManagerView itself implement the TableV
afakhry 2015/09/25 16:39:49 Done.
public:
- explicit TableModel(int64 refresh_flags);
- ~TableModel() 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;
-
- // views::TableGrouper:
- void GetGroupRange(int model_index, views::GroupRange* range) override;
-
- // task_management::TaskManagerObserver:
- void OnTaskAdded(TaskId id) override;
- void OnTaskToBeRemoved(TaskId id) override;
- void OnTasksRefreshed(const TaskIdList& task_ids) override;
+ explicit ViewsTableDelegate(views::TableView* table);
+ ~ViewsTableDelegate() override;
- // Start / stop observing the task manager.
- void StartUpdating();
- void StopUpdating();
-
- // 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. Multiple columns can map to the same
- // refresh type, for that we need |table| to determine if any is visible.
- void UpdateRefreshTypes(views::TableView* table,
- int column_id,
- bool visibility);
-
-
- // Checks if the task at |row_index| is running on the browser process.
- bool IsBrowserProcess(int row_index) const;
+ // task_management::TableViewDelegate:
+ bool IsColumnVisible(int column_id) const override;
+ void SetColumnVisibility(int column_id, bool new_visibility) override;
+ bool IsTableSorted() const override;
+ TableSortDescriptor GetSortDescriptor() const override;
+ void ToggleSortOrder(int visible_column_index) override;
private:
- 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;
+ views::TableView* table_;
- // 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.
- TaskManagerValuesStringifier stringifier_;
-
- DISALLOW_COPY_AND_ASSIGN(TableModel);
+ DISALLOW_COPY_AND_ASSIGN(ViewsTableDelegate);
};
////////////////////////////////////////////////////////////////////////////////
-// NewTaskManagerView::TableModel Implementation:
+// ViewsTableDelegate Implementation:
////////////////////////////////////////////////////////////////////////////////
-NewTaskManagerView::TableModel::TableModel(int64 refresh_flags)
- : TaskManagerObserver(base::TimeDelta::FromMilliseconds(kRefreshTimeMS),
- refresh_flags),
- table_model_observer_(nullptr) {
+NewTaskManagerView::ViewsTableDelegate::ViewsTableDelegate(
+ views::TableView* table) : table_(table) {
+ DCHECK(table);
}
-NewTaskManagerView::TableModel::~TableModel() {
+NewTaskManagerView::ViewsTableDelegate::~ViewsTableDelegate() {
}
-int NewTaskManagerView::TableModel::RowCount() {
- return static_cast<int>(tasks_.size());
+// task_management::TableViewDelegate:
+bool NewTaskManagerView::ViewsTableDelegate::IsColumnVisible(
+ int column_id) const {
+ return table_->IsColumnVisible(column_id);
}
-base::string16 NewTaskManagerView::TableModel::GetText(int row, int column) {
- if (IsSharedByGroup(column) && !IsTaskFirstInGroup(row))
- return base::string16();
-
- switch (column) {
- case IDS_TASK_MANAGER_TASK_COLUMN:
- return observed_task_manager()->GetTitle(tasks_[row]);
-
- case IDS_TASK_MANAGER_PROFILE_NAME_COLUMN:
- return observed_task_manager()->GetProfileName(tasks_[row]);
-
- case IDS_TASK_MANAGER_NET_COLUMN:
- return stringifier_.GetNetworkUsageText(
- observed_task_manager()->GetNetworkUsage(tasks_[row]));
-
- case IDS_TASK_MANAGER_CPU_COLUMN:
- return stringifier_.GetCpuUsageText(
- observed_task_manager()->GetCpuUsage(tasks_[row]));
-
- case IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN:
- return stringifier_.GetMemoryUsageText(
- observed_task_manager()->GetPrivateMemoryUsage(tasks_[row]), false);
-
- case IDS_TASK_MANAGER_SHARED_MEM_COLUMN:
- return stringifier_.GetMemoryUsageText(
- observed_task_manager()->GetSharedMemoryUsage(tasks_[row]), false);
-
- case IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN:
- return stringifier_.GetMemoryUsageText(
- observed_task_manager()->GetPhysicalMemoryUsage(tasks_[row]), false);
-
- case IDS_TASK_MANAGER_PROCESS_ID_COLUMN:
- return stringifier_.GetProcessIdText(
- observed_task_manager()->GetProcessId(tasks_[row]));
-
- case IDS_TASK_MANAGER_GDI_HANDLES_COLUMN: {
- int64 current, peak;
- observed_task_manager()->GetGDIHandles(tasks_[row], &current, &peak);
- return stringifier_.GetWindowsHandlesText(current, peak);
- }
-
- case IDS_TASK_MANAGER_USER_HANDLES_COLUMN: {
- int64 current, peak;
- observed_task_manager()->GetUSERHandles(tasks_[row], &current, &peak);
- return stringifier_.GetWindowsHandlesText(current, peak);
- }
-
- case IDS_TASK_MANAGER_IDLE_WAKEUPS_COLUMN:
- return stringifier_.GetIdleWakeupsText(
- observed_task_manager()->GetIdleWakeupsPerSecond(tasks_[row]));
-
- case IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN: {
- blink::WebCache::ResourceTypeStats stats;
- if (observed_task_manager()->GetWebCacheStats(tasks_[row], &stats))
- return stringifier_.GetWebCacheStatText(stats.images);
- return stringifier_.n_a_string();
- }
-
- case IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN: {
- blink::WebCache::ResourceTypeStats stats;
- if (observed_task_manager()->GetWebCacheStats(tasks_[row], &stats))
- return stringifier_.GetWebCacheStatText(stats.scripts);
- return stringifier_.n_a_string();
- }
-
- case IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN: {
- blink::WebCache::ResourceTypeStats stats;
- if (observed_task_manager()->GetWebCacheStats(tasks_[row], &stats))
- return stringifier_.GetWebCacheStatText(stats.cssStyleSheets);
- return stringifier_.n_a_string();
- }
-
- case IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN: {
- bool has_duplicates = false;
- return stringifier_.GetMemoryUsageText(
- observed_task_manager()->GetGpuMemoryUsage(tasks_[row],
- &has_duplicates),
- has_duplicates);
- }
-
- case IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN:
- return stringifier_.GetMemoryUsageText(
- observed_task_manager()->GetSqliteMemoryUsed(tasks_[row]), false);
-
- case IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN: {
- int64 v8_allocated, v8_used;
- if (observed_task_manager()->GetV8Memory(tasks_[row],
- &v8_allocated,
- &v8_used)) {
- return stringifier_.FormatAllocatedAndUsedMemory(v8_allocated,
- v8_used);
- }
- return stringifier_.n_a_string();
- }
-
- case IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN:
- return stringifier_.GetNaClPortText(
- observed_task_manager()->GetNaClDebugStubPort(tasks_[row]));
-
- default:
- NOTREACHED();
- return base::string16();
- }
-}
-
-gfx::ImageSkia NewTaskManagerView::TableModel::GetIcon(int row) {
- return observed_task_manager()->GetIcon(tasks_[row]);
-}
-
-void NewTaskManagerView::TableModel::SetObserver(
- ui::TableModelObserver* observer) {
- table_model_observer_ = observer;
-}
-
-int NewTaskManagerView::TableModel::CompareValues(int row1,
- int row2,
- int column_id) {
- switch (column_id) {
- case IDS_TASK_MANAGER_TASK_COLUMN:
- case IDS_TASK_MANAGER_PROFILE_NAME_COLUMN:
- return ui::TableModel::CompareValues(row1, row2, column_id);
-
- case IDS_TASK_MANAGER_NET_COLUMN:
- return ValueCompare(
- observed_task_manager()->GetNetworkUsage(tasks_[row1]),
- observed_task_manager()->GetNetworkUsage(tasks_[row2]));
-
- case IDS_TASK_MANAGER_CPU_COLUMN:
- return ValueCompare(observed_task_manager()->GetCpuUsage(tasks_[row1]),
- observed_task_manager()->GetCpuUsage(tasks_[row2]));
-
- case IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN:
- return ValueCompare(
- observed_task_manager()->GetPrivateMemoryUsage(tasks_[row1]),
- observed_task_manager()->GetPrivateMemoryUsage(tasks_[row2]));
-
- case IDS_TASK_MANAGER_SHARED_MEM_COLUMN:
- return ValueCompare(
- observed_task_manager()->GetSharedMemoryUsage(tasks_[row1]),
- observed_task_manager()->GetSharedMemoryUsage(tasks_[row2]));
-
- case IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN:
- return ValueCompare(
- observed_task_manager()->GetPhysicalMemoryUsage(tasks_[row1]),
- observed_task_manager()->GetPhysicalMemoryUsage(tasks_[row2]));
-
- case IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN:
- return ValueCompare(
- observed_task_manager()->GetNaClDebugStubPort(tasks_[row1]),
- observed_task_manager()->GetNaClDebugStubPort(tasks_[row2]));
-
- case IDS_TASK_MANAGER_PROCESS_ID_COLUMN:
- return ValueCompare(observed_task_manager()->GetProcessId(tasks_[row1]),
- observed_task_manager()->GetProcessId(tasks_[row2]));
-
- case IDS_TASK_MANAGER_GDI_HANDLES_COLUMN: {
- int64 current1, peak1, current2, peak2;
- observed_task_manager()->GetGDIHandles(tasks_[row1], &current1, &peak1);
- observed_task_manager()->GetGDIHandles(tasks_[row2], &current2, &peak2);
- return ValueCompare(current1, current2);
- }
-
- case IDS_TASK_MANAGER_USER_HANDLES_COLUMN: {
- int64 current1, peak1, current2, peak2;
- observed_task_manager()->GetUSERHandles(tasks_[row1], &current1, &peak1);
- observed_task_manager()->GetUSERHandles(tasks_[row2], &current2, &peak2);
- return ValueCompare(current1, current2);
- }
-
- case IDS_TASK_MANAGER_IDLE_WAKEUPS_COLUMN:
- return ValueCompare(
- observed_task_manager()->GetIdleWakeupsPerSecond(tasks_[row1]),
- observed_task_manager()->GetIdleWakeupsPerSecond(tasks_[row2]));
-
- case IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN:
- case IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN:
- case IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN: {
- blink::WebCache::ResourceTypeStats stats1;
- blink::WebCache::ResourceTypeStats stats2;
- bool row1_stats_valid =
- observed_task_manager()->GetWebCacheStats(tasks_[row1], &stats1);
- bool row2_stats_valid =
- observed_task_manager()->GetWebCacheStats(tasks_[row2], &stats2);
- if (!row1_stats_valid || !row2_stats_valid)
- return OrderUnavailableValue(row1_stats_valid, row2_stats_valid);
-
- switch (column_id) {
- case IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN:
- return ValueCompare(stats1.images.size, stats2.images.size);
- case IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN:
- return ValueCompare(stats1.scripts.size, stats2.scripts.size);
- case IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN:
- return ValueCompare(stats1.cssStyleSheets.size,
- stats2.cssStyleSheets.size);
- default:
- NOTREACHED();
- return 0;
- }
- }
-
- case IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN: {
- bool has_duplicates;
- return ValueCompare(
- observed_task_manager()->GetGpuMemoryUsage(tasks_[row1],
- &has_duplicates),
- observed_task_manager()->GetGpuMemoryUsage(tasks_[row2],
- &has_duplicates));
- }
-
- case IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN: {
- int64 allocated1, allocated2, used1, used2;
- observed_task_manager()->GetV8Memory(tasks_[row1], &allocated1, &used1);
- observed_task_manager()->GetV8Memory(tasks_[row2], &allocated2, &used2);
- return ValueCompare(allocated1, allocated2);
- }
-
- case IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN:
- return ValueCompare(
- observed_task_manager()->GetSqliteMemoryUsed(tasks_[row1]),
- observed_task_manager()->GetSqliteMemoryUsed(tasks_[row2]));
-
- default:
- NOTREACHED();
- return 0;
- }
-}
-
-void NewTaskManagerView::TableModel::GetGroupRange(int model_index,
- views::GroupRange* range) {
- int i = model_index;
- for ( ; i >= 0; --i) {
- if (IsTaskFirstInGroup(i))
- break;
- }
-
- CHECK_GE(i, 0);
-
- range->start = i;
- range->length = observed_task_manager()->GetNumberOfTasksOnSameProcess(
- tasks_[model_index]);
-}
-
-void NewTaskManagerView::TableModel::OnTaskAdded(TaskId id) {
- // For the table view scrollbar to behave correctly we must inform it that
- // a new task has been added.
-
- // We will get a newly sorted list from the task manager as opposed to just
- // adding |id| to |tasks_| because we want to keep |tasks_| sorted by proc IDs
- // and then by Task IDs.
- tasks_ = observed_task_manager()->GetTaskIdsList();
- if (table_model_observer_)
- table_model_observer_->OnItemsAdded(RowCount() - 1, 1);
-}
-
-void NewTaskManagerView::TableModel::OnTaskToBeRemoved(TaskId id) {
- auto index = std::find(tasks_.begin(), tasks_.end(), id);
- if (index == tasks_.end())
- return;
- auto removed_index = index - tasks_.begin();
- tasks_.erase(index);
- if (table_model_observer_)
- table_model_observer_->OnItemsRemoved(removed_index, 1);
-}
-
-void NewTaskManagerView::TableModel::OnTasksRefreshed(
- const TaskIdList& task_ids) {
- tasks_ = task_ids;
- OnRefresh();
-}
-
-void NewTaskManagerView::TableModel::StartUpdating() {
- TaskManagerInterface::GetTaskManager()->AddObserver(this);
- tasks_ = observed_task_manager()->GetTaskIdsList();
- OnRefresh();
+void NewTaskManagerView::ViewsTableDelegate::SetColumnVisibility(
+ int column_id,
+ bool new_visibility) {
+ table_->SetColumnVisibility(column_id, new_visibility);
}
-void NewTaskManagerView::TableModel::StopUpdating() {
- observed_task_manager()->RemoveObserver(this);
-}
-
-void NewTaskManagerView::TableModel::ActivateTask(int row_index) {
- observed_task_manager()->ActivateTask(tasks_[row_index]);
-}
-
-void NewTaskManagerView::TableModel::KillTask(int row_index) {
- base::ProcessId proc_id = observed_task_manager()->GetProcessId(
- tasks_[row_index]);
-
- DCHECK_NE(proc_id, base::GetCurrentProcId());
-
- base::Process process = base::Process::Open(proc_id);
- process.Terminate(content::RESULT_CODE_KILLED, false);
-}
-
-void NewTaskManagerView::TableModel::UpdateRefreshTypes(views::TableView* table,
- int column_id,
- bool visibility) {
- bool new_visibility = visibility;
- RefreshType type = REFRESH_TYPE_NONE;
- switch (column_id) {
- case IDS_TASK_MANAGER_PROFILE_NAME_COLUMN:
- case IDS_TASK_MANAGER_TASK_COLUMN:
- case IDS_TASK_MANAGER_PROCESS_ID_COLUMN:
- return; // The data is these columns do not change.
-
- case IDS_TASK_MANAGER_NET_COLUMN:
- type = REFRESH_TYPE_NETWORK_USAGE;
- break;
-
- case IDS_TASK_MANAGER_CPU_COLUMN:
- type = REFRESH_TYPE_CPU;
- break;
-
- case IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN:
- case IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN:
- case IDS_TASK_MANAGER_SHARED_MEM_COLUMN:
- type = REFRESH_TYPE_MEMORY;
- if (table->IsColumnVisible(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN) ||
- table->IsColumnVisible(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN) ||
- table->IsColumnVisible(IDS_TASK_MANAGER_SHARED_MEM_COLUMN)) {
- new_visibility = true;
- }
- break;
-
- case IDS_TASK_MANAGER_GDI_HANDLES_COLUMN:
- case IDS_TASK_MANAGER_USER_HANDLES_COLUMN:
- type = REFRESH_TYPE_HANDLES;
- if (table->IsColumnVisible(IDS_TASK_MANAGER_GDI_HANDLES_COLUMN) ||
- table->IsColumnVisible(IDS_TASK_MANAGER_USER_HANDLES_COLUMN)) {
- new_visibility = true;
- }
- break;
-
- case IDS_TASK_MANAGER_IDLE_WAKEUPS_COLUMN:
- type = REFRESH_TYPE_IDLE_WAKEUPS;
- break;
-
- case IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN:
- case IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN:
- case IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN:
- type = REFRESH_TYPE_WEBCACHE_STATS;
- if (table->IsColumnVisible(IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN) ||
- table->IsColumnVisible(
- IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN) ||
- table->IsColumnVisible(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN)) {
- new_visibility = true;
- }
- break;
-
- case IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN:
- type = REFRESH_TYPE_GPU_MEMORY;
- break;
-
- case IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN:
- type = REFRESH_TYPE_SQLITE_MEMORY;
- break;
-
- case IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN:
- type = REFRESH_TYPE_V8_MEMORY;
- break;
-
- case IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN:
- type = REFRESH_TYPE_NACL;
- break;
-
- default:
- NOTREACHED();
- return;
- }
-
- if (new_visibility)
- AddRefreshType(type);
- else
- RemoveRefreshType(type);
+bool NewTaskManagerView::ViewsTableDelegate::IsTableSorted() const {
+ return table_->is_sorted();
}
-bool NewTaskManagerView::TableModel::IsBrowserProcess(int row_index) const {
- return observed_task_manager()->GetProcessId(tasks_[row_index]) ==
- base::GetCurrentProcId();
-}
+TableSortDescriptor
+NewTaskManagerView::ViewsTableDelegate::GetSortDescriptor() const {
+ if (!IsTableSorted())
+ return TableSortDescriptor();
-void NewTaskManagerView::TableModel::OnRefresh() {
- if (table_model_observer_)
- table_model_observer_->OnItemsChanged(0, RowCount());
+ const auto& descriptor = table_->sort_descriptors().front();
+ return TableSortDescriptor(descriptor.column_id, descriptor.ascending);
}
-bool NewTaskManagerView::TableModel::IsTaskFirstInGroup(int row_index) const {
- if (row_index == 0)
- return true;
-
- return observed_task_manager()->GetProcessId(tasks_[row_index - 1]) !=
- observed_task_manager()->GetProcessId(tasks_[row_index]);
+void NewTaskManagerView::ViewsTableDelegate::ToggleSortOrder(
+ int visible_column_index) {
+ table_->ToggleSortOrder(visible_column_index);
}
////////////////////////////////////////////////////////////////////////////////
@@ -998,7 +303,7 @@ void NewTaskManagerView::WindowClosing() {
// owned by the Views hierarchy.
g_task_manager_view = nullptr;
}
- StoreColumnsSettings();
+ table_model_->StoreColumnsSettings();
table_model_->StopUpdating();
}
@@ -1006,6 +311,11 @@ bool NewTaskManagerView::UseNewStyleForThisDialog() const {
return false;
}
+void NewTaskManagerView::GetGroupRange(int model_index,
+ views::GroupRange* range) {
+ table_model_->GetRowsGroupRange(model_index, &range->start, &range->length);
+}
+
void NewTaskManagerView::OnSelectionChanged() {
const ui::ListSelectionModel::SelectedIndices& selections(
tab_table_->selection_model().selected_indices());
@@ -1073,15 +383,11 @@ bool NewTaskManagerView::GetAcceleratorForCommandId(
}
void NewTaskManagerView::ExecuteCommand(int id, int event_flags) {
- ToggleColumnVisibility(id);
+ table_model_->ToggleColumnVisibility(id);
}
NewTaskManagerView::NewTaskManagerView(chrome::HostDesktopType desktop_type)
- : table_model_(
- new NewTaskManagerView::TableModel(REFRESH_TYPE_CPU |
- REFRESH_TYPE_MEMORY |
- REFRESH_TYPE_NETWORK_USAGE)),
- kill_button_(nullptr),
+ : kill_button_(nullptr),
about_memory_link_(nullptr),
tab_table_(nullptr),
tab_table_parent_(nullptr),
@@ -1096,8 +402,6 @@ NewTaskManagerView* NewTaskManagerView::GetInstanceForTests() {
}
void NewTaskManagerView::Init() {
- columns_settings_.reset(new base::DictionaryValue);
-
// Create the table columns.
for (size_t i = 0; i < kColumnsSize; ++i) {
const auto& col_data = kColumns[i];
@@ -1108,15 +412,21 @@ void NewTaskManagerView::Init() {
col_data.initial_sort_is_ascending;
}
- // Create the table view.
- tab_table_ = new views::TableView(
- table_model_.get(), columns_, views::ICON_AND_TEXT, false);
- tab_table_->SetGrouper(table_model_.get());
+ // Create in this order: the table view, the table delegate, the table model.
+ tab_table_ = new views::TableView(nullptr, columns_, views::ICON_AND_TEXT,
+ false);
+ table_delegate_.reset(new ViewsTableDelegate(tab_table_));
+ table_model_.reset(new TaskManagerTableModel(REFRESH_TYPE_CPU |
+ REFRESH_TYPE_MEMORY |
+ REFRESH_TYPE_NETWORK_USAGE,
+ table_delegate_.get()));
+ tab_table_->SetModel(table_model_.get());
+ tab_table_->SetGrouper(this);
tab_table_->SetObserver(this);
tab_table_->set_context_menu_controller(this);
set_context_menu_controller(this);
- RetrieveSavedColumnsSettingsAndUpdateTable();
+ table_model_->RetrieveSavedColumnsSettingsAndUpdateTable();
kill_button_ = new views::LabelButton(this,
l10n_util::GetStringUTF16(IDS_TASK_MANAGER_KILL));
@@ -1155,91 +465,4 @@ void NewTaskManagerView::RetriveSavedAlwaysOnTopState() {
dictionary->GetBoolean("always_on_top", &is_always_on_top_);
}
-void NewTaskManagerView::RetrieveSavedColumnsSettingsAndUpdateTable() {
- if (!g_browser_process->local_state())
- return;
-
- const base::DictionaryValue* dictionary =
- g_browser_process->local_state()->GetDictionary(
- prefs::kTaskManagerColumnVisibility);
- if (!dictionary)
- return;
-
- // Do a best effort of retrieving the correct settings from the local state.
- // Use the default settings of the value if it fails to be retrieved.
- std::string sorted_col_id;
- bool sort_is_ascending = true;
- dictionary->GetString(kSortColumnIdKey, &sorted_col_id);
- dictionary->GetBoolean(kSortIsAscendingKey, &sort_is_ascending);
-
- int current_visible_column_index = 0;
- for (size_t i = 0; i < kColumnsSize; ++i) {
- const int col_id = kColumns[i].id;
- const std::string col_id_key(GetColumnIdAsString(col_id));
-
- if (col_id_key.empty())
- continue;
-
- bool col_visibility = kColumns[i].default_visibility;
- dictionary->GetBoolean(col_id_key, &col_visibility);
-
- // If the above GetBoolean() fails, the |col_visibility| remains at the
- // default visibility.
- columns_settings_->SetBoolean(col_id_key, col_visibility);
- tab_table_->SetColumnVisibility(col_id, col_visibility);
- table_model_->UpdateRefreshTypes(tab_table_, col_id, col_visibility);
-
- if (col_visibility) {
- if (sorted_col_id == col_id_key) {
- if (sort_is_ascending == kColumns[i].initial_sort_is_ascending) {
- tab_table_->ToggleSortOrder(current_visible_column_index);
- } else {
- // Unfortunately the API of ui::TableView doesn't provide a clean way
- // to sort by a particular column ID and a sort direction. If the
- // retrieved sort direction is different than the initial one, we have
- // to toggle the sort order twice!
- // Note that the function takes the visible_column_index rather than
- // a column ID.
- tab_table_->ToggleSortOrder(current_visible_column_index);
- tab_table_->ToggleSortOrder(current_visible_column_index);
- }
- }
-
- ++current_visible_column_index;
- }
- }
-}
-
-void NewTaskManagerView::StoreColumnsSettings() {
- PrefService* local_state = g_browser_process->local_state();
- if (!local_state)
- return;
-
- DictionaryPrefUpdate dict_update(local_state,
- prefs::kTaskManagerColumnVisibility);
-
- base::DictionaryValue::Iterator it(*columns_settings_);
- while (!it.IsAtEnd()) {
- dict_update->Set(it.key(), it.value().CreateDeepCopy());
- it.Advance();
- }
-
- // Store the current sort status to be restored again at startup.
- if (tab_table_->sort_descriptors().empty()) {
- dict_update->SetString(kSortColumnIdKey, "");
- } else {
- const auto& sort_descriptor = tab_table_->sort_descriptors().front();
- dict_update->SetString(kSortColumnIdKey,
- GetColumnIdAsString(sort_descriptor.column_id));
- dict_update->SetBoolean(kSortIsAscendingKey, sort_descriptor.ascending);
- }
-}
-
-void NewTaskManagerView::ToggleColumnVisibility(int column_id) {
- bool new_visibility = !tab_table_->IsColumnVisible(column_id);
- tab_table_->SetColumnVisibility(column_id, new_visibility);
- columns_settings_->SetBoolean(GetColumnIdAsString(column_id), new_visibility);
- table_model_->UpdateRefreshTypes(tab_table_, column_id, new_visibility);
-}
-
} // namespace task_management

Powered by Google App Engine
This is Rietveld 408576698