blob: b1badb1bd8a9cbe495c54e2daa0fb9954c1f7991 [file] [log] [blame]
// Copyright 2016 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 "chrome/browser/task_management/task_manager_tester.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/sessions/session_tab_helper.h"
#include "chrome/browser/task_management/task_manager_interface.h"
#include "chrome/browser/task_manager/resource_provider.h"
#include "chrome/browser/task_manager/task_manager.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/grit/generated_resources.h"
#include "extensions/strings/grit/extensions_strings.h"
namespace {
class LegacyTaskManagerTester : public task_management::TaskManagerTester,
public TaskManagerModelObserver {
public:
explicit LegacyTaskManagerTester(const base::Closure& on_resource_change)
: on_resource_change_(on_resource_change),
model_(TaskManager::GetInstance()->model()) {
if (!on_resource_change_.is_null())
model_->AddObserver(this);
}
~LegacyTaskManagerTester() override {
if (!on_resource_change_.is_null())
model_->RemoveObserver(this);
}
// TaskManagerTester:
int GetRowCount() override { return model_->ResourceCount(); }
base::string16 GetRowTitle(int row) override {
return model_->GetResourceTitle(row);
}
int64_t GetColumnValue(ColumnSpecifier column, int row) override {
size_t value = 0;
bool success = false;
switch (column) {
case ColumnSpecifier::COLUMN_NONE:
break;
case ColumnSpecifier::V8_MEMORY:
success = model_->GetV8Memory(row, &value);
break;
case ColumnSpecifier::V8_MEMORY_USED:
success = model_->GetV8MemoryUsed(row, &value);
break;
case ColumnSpecifier::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() {
if (!on_resource_change_.is_null())
on_resource_change_.Run();
}
base::Closure on_resource_change_;
TaskManagerModel* model_;
};
} // namespace
namespace task_management {
// static
std::unique_ptr<TaskManagerTester> TaskManagerTester::Create(
const base::Closure& callback) {
if (TaskManagerInterface::IsNewTaskManagerEnabled())
return TaskManagerTester::CreateDefault(callback);
return base::WrapUnique(new LegacyTaskManagerTester(callback));
}
void TaskManagerTester::MaybeRefreshLegacyInstance() {
// On Mac, the old task manager might still be used if we are not using mac
// views. Refresh() isn't ever needed on the new task manager.
if (!TaskManagerInterface::IsNewTaskManagerEnabled())
TaskManager::GetInstance()->model()->Refresh();
}
} // namespace task_management