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 8afec24e23c09e84918d034f48d343c5880b56f0..6e07c9c5b8843fcec0ebb040de89472ff4e60622 100644 |
--- a/chrome/browser/ui/views/new_task_manager_view.cc |
+++ b/chrome/browser/ui/views/new_task_manager_view.cc |
@@ -241,106 +241,6 @@ |
//////////////////////////////////////////////////////////////////////////////// |
-// 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. |
@@ -378,13 +278,10 @@ |
// 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); |
- |
+ // Called when a column visibility is toggled from the context menu of the |
+ // table view. This will result in enabling or disabling some resources |
+ // refresh types in the task manager. |
+ void ToggleColumnVisibility(views::TableView* table, int column_id); |
// Checks if the task at |row_index| is running on the browser process. |
bool IsBrowserProcess(int row_index) const; |
@@ -721,17 +618,16 @@ |
process.Terminate(content::RESULT_CODE_KILLED, false); |
} |
-void NewTaskManagerView::TableModel::UpdateRefreshTypes(views::TableView* table, |
- int column_id, |
- bool visibility) { |
- bool new_visibility = visibility; |
+void NewTaskManagerView::TableModel::ToggleColumnVisibility( |
+ views::TableView* table, |
+ int column_id) { |
+ DCHECK(table); |
+ |
+ bool new_visibility = !table->IsColumnVisible(column_id); |
+ table->SetColumnVisibility(column_id, new_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; |
@@ -740,12 +636,12 @@ |
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: |
+ case IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN: |
type = REFRESH_TYPE_MEMORY; |
- if (table->IsColumnVisible(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN) || |
- table->IsColumnVisible(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN) || |
+ if (table->IsColumnVisible(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN) || |
+ table->IsColumnVisible(IDS_TASK_MANAGER_SHARED_MEM_COLUMN) || |
table->IsColumnVisible(IDS_TASK_MANAGER_SHARED_MEM_COLUMN)) { |
new_visibility = true; |
} |
@@ -998,7 +894,6 @@ |
// owned by the Views hierarchy. |
g_task_manager_view = nullptr; |
} |
- StoreColumnsSettings(); |
table_model_->StopUpdating(); |
} |
@@ -1073,7 +968,7 @@ |
} |
void NewTaskManagerView::ExecuteCommand(int id, int event_flags) { |
- ToggleColumnVisibility(id); |
+ table_model_->ToggleColumnVisibility(tab_table_, id); |
} |
NewTaskManagerView::NewTaskManagerView(chrome::HostDesktopType desktop_type) |
@@ -1081,42 +976,146 @@ |
new NewTaskManagerView::TableModel(REFRESH_TYPE_CPU | |
REFRESH_TYPE_MEMORY | |
REFRESH_TYPE_NETWORK_USAGE)), |
+ menu_runner_(nullptr), |
+ always_on_top_menu_text_(), |
kill_button_(nullptr), |
about_memory_link_(nullptr), |
tab_table_(nullptr), |
tab_table_parent_(nullptr), |
+ columns_(), |
desktop_type_(desktop_type), |
is_always_on_top_(false) { |
Init(); |
} |
-// static |
-NewTaskManagerView* NewTaskManagerView::GetInstanceForTests() { |
- return g_task_manager_view; |
-} |
- |
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]; |
- columns_.push_back(ui::TableColumn(col_data.id, col_data.align, |
- col_data.width, col_data.percent)); |
- columns_.back().sortable = col_data.sortable; |
- columns_.back().initial_sort_is_ascending = |
- col_data.initial_sort_is_ascending; |
- } |
- |
- // Create the table view. |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_TASK_COLUMN, |
+ ui::TableColumn::LEFT, -1, 1)); |
+ columns_.back().sortable = true; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_PROFILE_NAME_COLUMN, |
+ ui::TableColumn::LEFT, -1, 0)); |
+ columns_.back().sortable = true; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_CPU_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_NET_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_PROCESS_ID_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ |
+#if defined(OS_WIN) |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_GDI_HANDLES_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_USER_HANDLES_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+#endif |
+ |
+ columns_.push_back(ui::TableColumn( |
+ IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn( |
+ IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+ |
+#if !defined(DISABLE_NACL) |
+ columns_.push_back(ui::TableColumn( |
+ IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+#endif // !defined(DISABLE_NACL) |
+ |
+ columns_.push_back( |
+ ui::TableColumn(IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = 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). |
+ columns_.push_back(ui::TableColumn(IDS_TASK_MANAGER_IDLE_WAKEUPS_COLUMN, |
+ ui::TableColumn::RIGHT, -1, 0)); |
+ columns_.back().sortable = true; |
+ columns_.back().initial_sort_is_ascending = false; |
+#endif // defined(OS_MACOSX) || defined(OS_LINUX) |
+ |
tab_table_ = new views::TableView( |
table_model_.get(), columns_, views::ICON_AND_TEXT, false); |
tab_table_->SetGrouper(table_model_.get()); |
+ |
+ // Hide some columns by default |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PROFILE_NAME_COLUMN, false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_SHARED_MEM_COLUMN, false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN, false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN, |
+ false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN, |
+ false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, |
+ false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN, |
+ false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN, |
+ false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_NACL_DEBUG_STUB_PORT_COLUMN, |
+ false); |
+ tab_table_->SetColumnVisibility( |
+ IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN, |
+ false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_GDI_HANDLES_COLUMN, false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_USER_HANDLES_COLUMN, false); |
+ tab_table_->SetColumnVisibility(IDS_TASK_MANAGER_IDLE_WAKEUPS_COLUMN, false); |
+ |
tab_table_->SetObserver(this); |
tab_table_->set_context_menu_controller(this); |
set_context_menu_controller(this); |
- |
- RetrieveSavedColumnsSettingsAndUpdateTable(); |
kill_button_ = new views::LabelButton(this, |
l10n_util::GetStringUTF16(IDS_TASK_MANAGER_KILL)); |
@@ -1155,92 +1154,5 @@ |
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 |