Chromium Code Reviews| 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 6e07c9c5b8843fcec0ebb040de89472ff4e60622..8ff4ae27ac9eb4cbdeeee9f887aac170d7b32e63 100644 |
| --- a/chrome/browser/ui/views/new_task_manager_view.cc |
| +++ b/chrome/browser/ui/views/new_task_manager_view.cc |
| @@ -237,6 +237,86 @@ class TaskManagerValuesStringifier { |
| DISALLOW_COPY_AND_ASSIGN(TaskManagerValuesStringifier); |
| }; |
| +// A collection of data to be used in the construction of a task manager table |
| +// column. |
| +struct TableColumnData { |
| + // The ID of the column. |
| + int id; |
| + |
| + // The alignment of the text displayed in this column. |
| + ui::TableColumn::Alignment align; |
| + |
| + // |width| and |percent| used to define the size of the column. See |
| + // ui::TableColumn::width and ui::TableColumn::percent for details. |
| + int width; |
| + float percent; |
| + |
| + // Is the column sortable. |
| + bool sortable; |
| + |
| + // Is the initial sort order ascending? |
| + bool initial_sort_is_ascending; |
| + |
| + // The default visibility of this column at startup of the table if no |
| + // visibility is stored for it in the prefs. |
| + bool default_visibility; |
| +}; |
| + |
| +// The task manager table columns and their properties. |
| +const TableColumnData kColumns[] = { |
|
Lei Zhang
2015/08/27 01:10:44
kDefaultColumns ?
afakhry
2015/08/27 19:56:52
Not sure. They're not really the default columns.
|
| + { 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); |
| + |
| } // namespace |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -280,8 +360,20 @@ class NewTaskManagerView::TableModel |
| // 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); |
| + // refresh types in the task manager. It will also update the |
| + // |visibility_settings| with the new visibility so that it's stored in the |
| + // prefs when the task manager window is closed. |
| + void ToggleColumnVisibility(views::TableView* table, |
| + base::DictionaryValue* visibility_settings, |
| + int column_id); |
| + |
| + // 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; |
| @@ -620,14 +712,28 @@ void NewTaskManagerView::TableModel::KillTask(int row_index) { |
| void NewTaskManagerView::TableModel::ToggleColumnVisibility( |
| views::TableView* table, |
| + base::DictionaryValue* visibility_settings, |
| int column_id) { |
| DCHECK(table); |
| + DCHECK(visibility_settings); |
| bool new_visibility = !table->IsColumnVisible(column_id); |
| table->SetColumnVisibility(column_id, new_visibility); |
| + visibility_settings->SetBoolean(base::IntToString(column_id), new_visibility); |
| + |
| + UpdateRefreshTypes(table, column_id, new_visibility); |
| +} |
| +void NewTaskManagerView::TableModel::UpdateRefreshTypes(views::TableView* table, |
| + int column_id, |
| + bool 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; |
|
Lei Zhang
2015/08/27 01:10:44
Add a short comment to say why we return early.
/
afakhry
2015/08/27 19:56:52
Done.
|
| + |
| case IDS_TASK_MANAGER_NET_COLUMN: |
| type = REFRESH_TYPE_NETWORK_USAGE; |
| break; |
| @@ -636,14 +742,14 @@ void NewTaskManagerView::TableModel::ToggleColumnVisibility( |
| 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_PRIVATE_MEM_COLUMN) || |
| - table->IsColumnVisible(IDS_TASK_MANAGER_SHARED_MEM_COLUMN) || |
| + 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)) { |
|
afakhry
2015/08/26 01:16:27
This was a bug as you can see.
Lei Zhang
2015/08/27 01:10:44
Mmm, delicious copy + pasta bug.
|
| - new_visibility = true; |
| + visibility = true; |
|
Lei Zhang
2015/08/27 01:10:44
I don't like changing POD arguments. Can we keep |
afakhry
2015/08/27 19:56:52
Done.
|
| } |
| break; |
| @@ -652,7 +758,7 @@ void NewTaskManagerView::TableModel::ToggleColumnVisibility( |
| type = REFRESH_TYPE_HANDLES; |
| if (table->IsColumnVisible(IDS_TASK_MANAGER_GDI_HANDLES_COLUMN) || |
| table->IsColumnVisible(IDS_TASK_MANAGER_USER_HANDLES_COLUMN)) { |
| - new_visibility = true; |
| + visibility = true; |
| } |
| break; |
| @@ -668,7 +774,7 @@ void NewTaskManagerView::TableModel::ToggleColumnVisibility( |
| table->IsColumnVisible( |
| IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN) || |
| table->IsColumnVisible(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN)) { |
| - new_visibility = true; |
| + visibility = true; |
| } |
| break; |
| @@ -693,7 +799,7 @@ void NewTaskManagerView::TableModel::ToggleColumnVisibility( |
| return; |
| } |
| - if (new_visibility) |
| + if (visibility) |
| AddRefreshType(type); |
| else |
| RemoveRefreshType(type); |
| @@ -894,6 +1000,7 @@ void NewTaskManagerView::WindowClosing() { |
| // owned by the Views hierarchy. |
| g_task_manager_view = nullptr; |
| } |
| + StoreColumnVisibility(); |
| table_model_->StopUpdating(); |
| } |
| @@ -968,7 +1075,9 @@ bool NewTaskManagerView::GetAcceleratorForCommandId( |
| } |
| void NewTaskManagerView::ExecuteCommand(int id, int event_flags) { |
| - table_model_->ToggleColumnVisibility(tab_table_, id); |
| + table_model_->ToggleColumnVisibility(tab_table_, |
| + column_visibility_settings_.get(), |
| + id); |
| } |
| NewTaskManagerView::NewTaskManagerView(chrome::HostDesktopType desktop_type) |
| @@ -976,7 +1085,8 @@ NewTaskManagerView::NewTaskManagerView(chrome::HostDesktopType desktop_type) |
| new NewTaskManagerView::TableModel(REFRESH_TYPE_CPU | |
| REFRESH_TYPE_MEMORY | |
| REFRESH_TYPE_NETWORK_USAGE)), |
| - menu_runner_(nullptr), |
| + menu_runner_(), |
|
Lei Zhang
2015/08/27 01:10:44
I thought we agreed to just get rid of these in a
afakhry
2015/08/27 19:56:52
Bad habits keep haunting me! :D .. Done.
|
| + column_visibility_settings_(), |
| always_on_top_menu_text_(), |
| kill_button_(nullptr), |
| about_memory_link_(nullptr), |
| @@ -989,134 +1099,33 @@ NewTaskManagerView::NewTaskManagerView(chrome::HostDesktopType desktop_type) |
| } |
| void NewTaskManagerView::Init() { |
| - 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) |
| + column_visibility_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; |
| + |
| + column_visibility_settings_->SetBoolean(base::IntToString(col_data.id), |
| + col_data.default_visibility); |
| + } |
| + // Create the table view. |
| 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); |
| + // Retrieve and update the table columns visibilities. |
| + RetrieveSavedColumnVisibility(); |
| + UpdateColumnVisibility(); |
| + |
| kill_button_ = new views::LabelButton(this, |
| l10n_util::GetStringUTF16(IDS_TASK_MANAGER_KILL)); |
| kill_button_->SetStyle(views::Button::STYLE_BUTTON); |
| @@ -1154,5 +1163,59 @@ void NewTaskManagerView::RetriveSavedAlwaysOnTopState() { |
| dictionary->GetBoolean("always_on_top", &is_always_on_top_); |
| } |
| +void NewTaskManagerView::RetrieveSavedColumnVisibility() { |
| + if (!g_browser_process->local_state()) |
| + return; |
| + |
| + const base::DictionaryValue* dictionary = |
| + g_browser_process->local_state()->GetDictionary( |
| + prefs::kTaskManagerColumnVisibility); |
| + if (!dictionary) |
| + return; |
| + |
| + int stored_num_columns; |
| + if (!dictionary->GetInteger("num_columns", &stored_num_columns)) |
| + return; |
| + |
| + // If the number of columns change from one version to another, we skip and |
|
Lei Zhang
2015/08/27 01:10:44
Can we use a version number instead. What if:
- w
afakhry
2015/08/27 19:56:52
Thanks for pointing this out. I event found out th
|
| + // use the default visibility of the columns as defined in |kColumns|. |
| + if (stored_num_columns != static_cast<int>(kColumnsSize)) |
| + return; |
| + |
| + column_visibility_settings_.reset(dictionary->DeepCopy()); |
| +} |
| + |
| +void NewTaskManagerView::UpdateColumnVisibility() { |
| + for (size_t i = 0; i < kColumnsSize; ++i) { |
| + const int col_id = kColumns[i].id; |
| + bool visible = false; |
| + bool success = column_visibility_settings_->GetBoolean( |
| + base::IntToString(col_id), &visible); |
| + |
| + DCHECK(success); |
| + |
| + tab_table_->SetColumnVisibility(col_id, visible); |
| + table_model_->UpdateRefreshTypes(tab_table_, col_id, visible); |
| + } |
| +} |
| + |
| +void NewTaskManagerView::StoreColumnVisibility() { |
| + PrefService* local_state = g_browser_process->local_state(); |
| + |
| + if (!local_state) |
| + return; |
| + |
| + DictionaryPrefUpdate dict_update(local_state, |
| + prefs::kTaskManagerColumnVisibility); |
| + |
| + base::DictionaryValue::Iterator it(*column_visibility_settings_); |
| + while (!it.IsAtEnd()) { |
| + dict_update->Set(it.key(), it.value().CreateDeepCopy()); |
| + it.Advance(); |
| + } |
| + |
| + dict_update->SetInteger("num_columns", static_cast<int>(kColumnsSize)); |
| +} |
| + |
| } // namespace task_management |