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

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

Issue 1320563002: Task Manager Should remember the most recently enabled columns. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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 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

Powered by Google App Engine
This is Rietveld 408576698