blob: e46dd0322eb444d8c99858d57c1b488f52f88c76 [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.
#include <stddef.h>
#include "base/macros.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/ui/browser_dialogs.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/views/new_task_manager_view.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "content/public/test/test_utils.h"
#include "ui/views/controls/table/table_view.h"
namespace task_management {
class NewTaskManagerViewTest : public InProcessBrowserTest {
public:
NewTaskManagerViewTest() {}
~NewTaskManagerViewTest() override {}
void TearDownOnMainThread() override {
// Make sure the task manager is closed (if any).
chrome::HideTaskManager();
content::RunAllPendingInMessageLoop();
ASSERT_FALSE(GetView());
InProcessBrowserTest::TearDownOnMainThread();
}
NewTaskManagerView* GetView() const {
return NewTaskManagerView::GetInstanceForTests();
}
views::TableView* GetTable() const {
return GetView() ? GetView()->tab_table_ : nullptr;
}
void ClearStoredColumnSettings() const {
PrefService* local_state = g_browser_process->local_state();
if (!local_state)
FAIL();
DictionaryPrefUpdate dict_update(local_state,
prefs::kTaskManagerColumnVisibility);
dict_update->Clear();
}
void ToggleColumnVisibility(NewTaskManagerView* view, int col_id) {
DCHECK(view);
view->table_model_->ToggleColumnVisibility(col_id);
}
private:
DISALLOW_COPY_AND_ASSIGN(NewTaskManagerViewTest);
};
// Tests that all defined columns have a corresponding string IDs for keying
// into the user preferences dictionary.
IN_PROC_BROWSER_TEST_F(NewTaskManagerViewTest, AllColumnsHaveStringIds) {
for (size_t i = 0; i < kColumnsSize; ++i)
EXPECT_NE("", GetColumnIdAsString(kColumns[i].id));
}
// In the case of no settings stored in the user preferences local store, test
// that the task manager table starts with the default columns visibility as
// stored in |kColumns|.
IN_PROC_BROWSER_TEST_F(NewTaskManagerViewTest, TableStartsWithDefaultColumns) {
ASSERT_NO_FATAL_FAILURE(ClearStoredColumnSettings());
chrome::ShowTaskManager(browser());
views::TableView* table = GetTable();
ASSERT_TRUE(table);
EXPECT_FALSE(table->is_sorted());
for (size_t i = 0; i < kColumnsSize; ++i) {
EXPECT_EQ(kColumns[i].default_visibility,
table->IsColumnVisible(kColumns[i].id));
}
}
// Tests that changing columns visibility and sort order will be stored upon
// closing the task manager view and restored when re-opened.
IN_PROC_BROWSER_TEST_F(NewTaskManagerViewTest, ColumnsSettingsAreRestored) {
ASSERT_NO_FATAL_FAILURE(ClearStoredColumnSettings());
chrome::ShowTaskManager(browser());
NewTaskManagerView* view = GetView();
ASSERT_TRUE(view);
views::TableView* table = GetTable();
ASSERT_TRUE(table);
// Toggle the visibility of all columns.
EXPECT_FALSE(table->is_sorted());
for (size_t i = 0; i < kColumnsSize; ++i) {
EXPECT_EQ(kColumns[i].default_visibility,
table->IsColumnVisible(kColumns[i].id));
ToggleColumnVisibility(view, kColumns[i].id);
}
// Sort by the first visible and initially ascending sortable column.
bool is_sorted = false;
int sorted_col_id = -1;
for (size_t i = 0; i < table->visible_columns().size(); ++i) {
const ui::TableColumn& column = table->visible_columns()[i].column;
if (column.sortable && column.initial_sort_is_ascending) {
// Toggle the sort twice for a descending sort.
table->ToggleSortOrder(static_cast<int>(i));
table->ToggleSortOrder(static_cast<int>(i));
is_sorted = true;
sorted_col_id = column.id;
break;
}
}
if (is_sorted) {
EXPECT_TRUE(table->is_sorted());
EXPECT_FALSE(table->sort_descriptors().front().ascending);
EXPECT_EQ(table->sort_descriptors().front().column_id, sorted_col_id);
}
// Close the task manager view and re-open. Expect the inverse of the default
// visibility, and the last sort order.
chrome::HideTaskManager();
content::RunAllPendingInMessageLoop();
ASSERT_FALSE(GetView());
chrome::ShowTaskManager(browser());
view = GetView();
ASSERT_TRUE(view);
table = GetTable();
ASSERT_TRUE(table);
if (is_sorted) {
EXPECT_TRUE(table->is_sorted());
EXPECT_FALSE(table->sort_descriptors().front().ascending);
EXPECT_EQ(table->sort_descriptors().front().column_id, sorted_col_id);
}
for (size_t i = 0; i < kColumnsSize; ++i) {
EXPECT_EQ(!kColumns[i].default_visibility,
table->IsColumnVisible(kColumns[i].id));
}
}
} // namespace task_management