Chromium Code Reviews| Index: chrome/browser/task_manager/task_manager_browsertest_util.cc |
| diff --git a/chrome/browser/task_manager/task_manager_browsertest_util.cc b/chrome/browser/task_manager/task_manager_browsertest_util.cc |
| index edeccd0f4a2dc840a22a4dd3433dfa79aa03c7b7..3f8a2030dc1dbf0eadc0208ff127476c06eb2faf 100644 |
| --- a/chrome/browser/task_manager/task_manager_browsertest_util.cc |
| +++ b/chrome/browser/task_manager/task_manager_browsertest_util.cc |
| @@ -4,8 +4,10 @@ |
| #include "chrome/browser/task_manager/task_manager_browsertest_util.h" |
| +#include "base/bind_helpers.h" |
| #include "base/command_line.h" |
| #include "base/location.h" |
| +#include "base/memory/ptr_util.h" |
| #include "base/run_loop.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/strings/pattern.h" |
| @@ -17,40 +19,221 @@ |
| #include "base/timer/timer.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/sessions/session_tab_helper.h" |
| +#include "chrome/browser/task_management/task_manager_interface.h" |
| +#include "chrome/browser/task_management/task_manager_observer.h" |
| #include "chrome/browser/task_manager/resource_provider.h" |
| #include "chrome/browser/task_manager/task_manager.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/chrome_switches.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "extensions/strings/grit/extensions_strings.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/base/l10n/l10n_util.h" |
| +// TODO(nick): Move everything here (except for LegacyTaskManagerTesterImpl) |
| +// into the task_management namespace. |
| +namespace task_management { |
| + |
| +class TaskManagerTesterImpl |
| + : public task_manager::browsertest_util::TaskManagerTester, |
| + public TaskManagerObserver { |
| + public: |
| + // TODO(nick): We have a couple ways we could implement this class: |
| + // (1) Grab the view's model directly. |
|
ncarter (slow)
2016/04/27 17:17:45
This is what the code does today. It gets the job
afakhry
2016/04/28 00:03:13
I think this is the best approach since we are act
|
| + // (2) Instantiate our own TaskManagerTableModel instance and ignore |
|
ncarter (slow)
2016/04/27 17:17:45
I think this is probably the best approach for wha
afakhry
2016/04/28 00:03:13
Your interceptor approach is better.
|
| + // the "real" view. This would be pretty clean, but it makes the |
| + // chrome::ShowTaskManager() steps of the tests kind of lame. |
| + // (3) Some hybrid of the above (where we cross validate the contents) |
| + // of the real table model |
| + // (4) Make TaskManagerTableModel support multiple observers, and |
|
ncarter (slow)
2016/04/27 17:17:45
This turns out to be pretty gross, since SetObserv
afakhry
2016/04/28 00:03:13
Yes, this doesn't sound like a clean solution.
|
| + // observe the real view's model. |
| + explicit TaskManagerTesterImpl(const base::Closure& on_resource_change) |
| + : TaskManagerObserver(NewTaskManagerView::GetInstanceForTests() |
| + ->table_model_->desired_refresh_time(), |
| + NewTaskManagerView::GetInstanceForTests() |
| + ->table_model_->desired_resources_flags()), |
| + on_resource_change_(on_resource_change), |
| + model_(NewTaskManagerView::GetInstanceForTests()->table_model_.get()) { |
| + model_->observed_task_manager()->AddObserver(this); |
| + } |
| + |
| + ~TaskManagerTesterImpl() override { |
| + observed_task_manager()->RemoveObserver(this); |
| + } |
| + |
| + int GetRowCount() override { return model_->RowCount(); } |
| + |
| + base::string16 GetRowTitle(int row) override { |
| + return model_->GetText(row, IDS_TASK_MANAGER_TASK_COLUMN); |
| + } |
| + |
| + void ToggleColumnVisibility( |
| + task_manager::browsertest_util::ColumnSpecifier column) override { |
| + int column_id = 0; |
| + switch (column) { |
| + case task_manager::browsertest_util::COLUMN_NONE: |
| + return; |
| + case task_manager::browsertest_util::SQLITE_MEMORY_USED: |
| + column_id = IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN; |
| + break; |
| + case task_manager::browsertest_util::V8_MEMORY_USED: |
| + case task_manager::browsertest_util::V8_MEMORY: |
| + column_id = IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN; |
| + break; |
| + } |
| + model_->ToggleColumnVisibility(column_id); |
| + } |
| + |
| + int64_t GetColumnValue(task_manager::browsertest_util::ColumnSpecifier column, |
| + int row) override { |
| + TaskId task_id = model_->tasks_[row]; |
| + int64_t value = 0; |
| + int64_t ignored = 0; |
| + bool success = false; |
| + |
| + switch (column) { |
| + case task_manager::browsertest_util::COLUMN_NONE: |
| + break; |
| + case task_manager::browsertest_util::V8_MEMORY: |
| + success = |
| + observed_task_manager()->GetV8Memory(task_id, &value, &ignored); |
| + break; |
| + case task_manager::browsertest_util::V8_MEMORY_USED: |
| + success = |
| + observed_task_manager()->GetV8Memory(task_id, &ignored, &value); |
| + break; |
| + case task_manager::browsertest_util::SQLITE_MEMORY_USED: |
| + value = observed_task_manager()->GetSqliteMemoryUsed(task_id); |
| + success = true; |
| + break; |
| + } |
| + if (!success) |
| + return 0; |
| + return value; |
| + } |
| + |
| + int32_t GetTabId(int row) override { |
| + TaskId task_id = model_->tasks_[row]; |
| + return observed_task_manager()->GetTabId(task_id); |
| + } |
| + |
| + void Kill(int row) override { model_->KillTask(row); } |
| + |
| + // TaskManagerObserver |
| + void OnTaskAdded(TaskId id) override { on_resource_change_.Run(); } |
| + |
| + void OnTaskToBeRemoved(TaskId id) override { on_resource_change_.Run(); } |
| + |
| + void OnTasksRefreshed(const TaskIdList& task_ids) override { |
| + on_resource_change_.Run(); |
| + } |
| + |
| + void OnTasksRefreshedWithBackgroundCalculations( |
| + const TaskIdList& task_ids) override { |
| + on_resource_change_.Run(); |
| + } |
| + |
| + void OnTaskUnresponsive(TaskId id) override { on_resource_change_.Run(); } |
| + |
| + private: |
| + base::Closure on_resource_change_; |
| + TaskManagerTableModel* model_; |
| +}; |
| + |
| +} // namespace task_management |
| + |
| namespace task_manager { |
| namespace browsertest_util { |
| namespace { |
| -class ResourceChangeObserver : public TaskManagerModelObserver { |
| +class LegacyTaskManagerTesterImpl : public TaskManagerTester, |
| + public TaskManagerModelObserver { |
| public: |
| - ResourceChangeObserver(const TaskManagerModel* model, |
| - int required_count, |
| - const base::string16& title_pattern, |
| - ColumnSpecifier column_specifier, |
| - size_t min_column_value) |
| - : model_(model), |
| - required_count_(required_count), |
| - title_pattern_(title_pattern), |
| - column_specifier_(column_specifier), |
| - min_column_value_(min_column_value) {} |
| + explicit LegacyTaskManagerTesterImpl(const base::Closure& on_resource_change) |
| + : on_resource_change_(on_resource_change), |
| + model_(TaskManager::GetInstance()->model()) { |
| + model_->AddObserver(this); |
| + } |
| + ~LegacyTaskManagerTesterImpl() override { model_->RemoveObserver(this); } |
| - void OnModelChanged() override { OnResourceChange(); } |
| + // TaskManagerTester: |
| + int GetRowCount() override { return model_->ResourceCount(); } |
| - void OnItemsChanged(int start, int length) override { OnResourceChange(); } |
| + base::string16 GetRowTitle(int row) override { |
| + return model_->GetResourceTitle(row); |
| + } |
| - void OnItemsAdded(int start, int length) override { OnResourceChange(); } |
| + int64_t GetColumnValue(ColumnSpecifier column, int row) override { |
| + size_t value = 0; |
| + bool success = false; |
| + switch (column) { |
| + case COLUMN_NONE: |
| + break; |
| + case V8_MEMORY: |
| + success = model_->GetV8Memory(row, &value); |
| + break; |
| + case V8_MEMORY_USED: |
| + success = model_->GetV8MemoryUsed(row, &value); |
| + break; |
| + case SQLITE_MEMORY_USED: |
| + success = model_->GetSqliteMemoryUsedBytes(row, &value); |
| + break; |
| + } |
| + if (!success) |
| + return 0; |
| + return static_cast<int64_t>(value); |
| + } |
| + |
| + void ToggleColumnVisibility(ColumnSpecifier column) override { |
| + // Doing nothing is okay here; the legacy TaskManager always collects all |
| + // stats. |
| + } |
| + |
| + int32_t GetTabId(int row) override { |
| + if (model_->GetResourceWebContents(row)) { |
| + return SessionTabHelper::IdForTab(model_->GetResourceWebContents(row)); |
| + } |
| + return -1; |
| + } |
| + void Kill(int row) override { TaskManager::GetInstance()->KillProcess(row); } |
| + |
| + // TaskManagerModelObserver: |
| + void OnModelChanged() override { OnResourceChange(); } |
| + void OnItemsChanged(int start, int length) override { OnResourceChange(); } |
| + void OnItemsAdded(int start, int length) override { OnResourceChange(); } |
| void OnItemsRemoved(int start, int length) override { OnResourceChange(); } |
| + private: |
| + void OnResourceChange() { on_resource_change_.Run(); } |
| + base::Closure on_resource_change_; |
| + TaskManagerModel* model_; |
| +}; |
| + |
| +class ResourceChangeObserver { |
| + public: |
| + ResourceChangeObserver(int required_count, |
| + const base::string16& title_pattern, |
| + ColumnSpecifier column_specifier, |
| + size_t min_column_value) |
| + : required_count_(required_count), |
| + title_pattern_(title_pattern), |
| + column_specifier_(column_specifier), |
| + min_column_value_(min_column_value) { |
| + base::Closure on_resource_change = base::Bind( |
| + &ResourceChangeObserver::OnResourceChange, base::Unretained(this)); |
| + |
| + if (switches::NewTaskManagerEnabled()) { |
| + model_.reset( |
| + new task_management::TaskManagerTesterImpl(on_resource_change)); |
| + } else { |
| + model_.reset(new LegacyTaskManagerTesterImpl(on_resource_change)); |
| + } |
| + } |
| + |
| void RunUntilSatisfied() { |
| // See if the condition is satisfied without having to run the loop. This |
| // check has to be placed after the installation of the |
| @@ -91,8 +274,8 @@ class ResourceChangeObserver : public TaskManagerModelObserver { |
| int CountMatches() { |
| int match_count = 0; |
| - for (int i = 0; i < model_->ResourceCount(); i++) { |
| - if (!base::MatchPattern(model_->GetResourceTitle(i), title_pattern_)) |
| + for (int i = 0; i < model_->GetRowCount(); i++) { |
| + if (!base::MatchPattern(model_->GetRowTitle(i), title_pattern_)) |
| continue; |
| if (GetColumnValue(i) < min_column_value_) |
| @@ -103,25 +286,8 @@ class ResourceChangeObserver : public TaskManagerModelObserver { |
| return match_count; |
| } |
| - size_t GetColumnValue(int index) { |
| - size_t value = 0; |
| - bool success = false; |
| - switch (column_specifier_) { |
| - case COLUMN_NONE: |
| - break; |
| - case V8_MEMORY: |
| - success = model_->GetV8Memory(index, &value); |
| - break; |
| - case V8_MEMORY_USED: |
| - success = model_->GetV8MemoryUsed(index, &value); |
| - break; |
| - case SQLITE_MEMORY_USED: |
| - success = model_->GetSqliteMemoryUsedBytes(index, &value); |
| - break; |
| - } |
| - if (!success) |
| - return 0; |
| - return value; |
| + int64_t GetColumnValue(int index) { |
| + return model_->GetColumnValue(column_specifier_, index); |
| } |
| const char* GetColumnName() { |
| @@ -156,10 +322,9 @@ class ResourceChangeObserver : public TaskManagerModelObserver { |
| task_manager_state_dump << "\nCurrently there are " << CountMatches() |
| << " matches."; |
| task_manager_state_dump << "\nCurrent Task Manager Model is:"; |
| - for (int i = 0; i < model_->ResourceCount(); i++) { |
| - task_manager_state_dump |
| - << "\n > " << std::setw(40) << std::left |
| - << base::UTF16ToASCII(model_->GetResourceTitle(i)); |
| + for (int i = 0; i < model_->GetRowCount(); i++) { |
| + task_manager_state_dump << "\n > " << std::setw(40) << std::left |
| + << base::UTF16ToASCII(model_->GetRowTitle(i)); |
| if (min_column_value_ > 0) { |
| task_manager_state_dump << " [" << GetColumnName() |
| << " == " << GetColumnValue(i) << "]"; |
| @@ -168,45 +333,42 @@ class ResourceChangeObserver : public TaskManagerModelObserver { |
| return task_manager_state_dump; |
| } |
| - const TaskManagerModel* model_; |
| + std::unique_ptr<TaskManagerTester> model_; |
| const int required_count_; |
| const base::string16 title_pattern_; |
| const ColumnSpecifier column_specifier_; |
| - const size_t min_column_value_; |
| + const int64_t min_column_value_; |
| base::RunLoop run_loop_; |
| base::OneShotTimer timer_; |
| }; |
| } // namespace |
| -void EnableOldTaskManager() { |
| - base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| - switches::kDisableNewTaskManager); |
| +std::unique_ptr<TaskManagerTester> GetTaskManagerTester() { |
| + base::Closure do_nothing = base::Bind(&base::DoNothing); |
| + if (switches::NewTaskManagerEnabled()) { |
| + return base::WrapUnique( |
| + new task_management::TaskManagerTesterImpl(do_nothing)); |
| + } else { |
| + return base::WrapUnique(new LegacyTaskManagerTesterImpl(do_nothing)); |
| + } |
| } |
| void WaitForTaskManagerRows(int required_count, |
| const base::string16& title_pattern) { |
| - TaskManagerModel* model = TaskManager::GetInstance()->model(); |
| - |
| const int column_value_dont_care = 0; |
| - ResourceChangeObserver observer(model, required_count, title_pattern, |
| - COLUMN_NONE, column_value_dont_care); |
| - model->AddObserver(&observer); |
| + ResourceChangeObserver observer(required_count, title_pattern, COLUMN_NONE, |
| + column_value_dont_care); |
| observer.RunUntilSatisfied(); |
| - model->RemoveObserver(&observer); |
| } |
| void WaitForTaskManagerStatToExceed(const base::string16& title_pattern, |
| ColumnSpecifier column_getter, |
| size_t min_column_value) { |
| - TaskManagerModel* model = TaskManager::GetInstance()->model(); |
| - |
| const int wait_for_one_match = 1; |
| - ResourceChangeObserver observer(model, wait_for_one_match, title_pattern, |
| + ResourceChangeObserver observer(wait_for_one_match, title_pattern, |
| column_getter, min_column_value); |
| - model->AddObserver(&observer); |
| observer.RunUntilSatisfied(); |
| - model->RemoveObserver(&observer); |
| } |
| base::string16 MatchTab(const char* title) { |