summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryoshiki@chromium.org <yoshiki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-25 12:19:13 +0000
committeryoshiki@chromium.org <yoshiki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-25 12:19:13 +0000
commit6661ef43d4745b513eeecd57e501803aff4e74bb (patch)
treeffdbbfdb151c2f9853ca29e7c1a00b5ed66b4583
parent532e9bd6d2f7e0e6a8e6e6c29bc62e5a3c839adf (diff)
downloadchromium_src-6661ef43d4745b513eeecd57e501803aff4e74bb.zip
chromium_src-6661ef43d4745b513eeecd57e501803aff4e74bb.tar.gz
chromium_src-6661ef43d4745b513eeecd57e501803aff4e74bb.tar.bz2
WebUI TaskManager: Retrieve only visible columns data instead of all the columns.
When task manager is initialized and columns are updating, the javascript side sends the 'setUpdateColumns' message to set the columns visible. On the C++ side, it retrieves and updates only enabled columns data. BUG=110416 TEST=manual Review URL: http://codereview.chromium.org/9178007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119052 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/resources/task_manager/main.js59
-rw-r--r--chrome/browser/ui/webui/task_manager_handler.cc136
-rw-r--r--chrome/browser/ui/webui/task_manager_handler.h11
3 files changed, 143 insertions, 63 deletions
diff --git a/chrome/browser/resources/task_manager/main.js b/chrome/browser/resources/task_manager/main.js
index 5beea99..7965150 100644
--- a/chrome/browser/resources/task_manager/main.js
+++ b/chrome/browser/resources/task_manager/main.js
@@ -141,6 +141,18 @@ TaskManager.prototype = {
},
/**
+ * Sends command to enable or disable the given columns to update the data.
+ * @public
+ */
+ setUpdateColumn: function(columnId, isEnabled) {
+ chrome.send('setUpdateColumn', [columnId, isEnabled]);
+
+ // The 'title' column contains the icon.
+ if (columnId == 'title')
+ chrome.send('setUpdateColumn', ['icon', isEnabled]);
+ },
+
+ /**
* Initializes taskmanager.
*/
initialize: function (dialogDom, opt) {
@@ -154,7 +166,6 @@ TaskManager.prototype = {
this.opt_ = opt;
this.initialized_ = true;
- this.enableTaskManager();
this.elementsCache_ = {};
this.dialogDom_ = dialogDom;
@@ -215,6 +226,11 @@ TaskManager.prototype = {
this.initTable_();
+ // enableTaskManager() must be called after enabling columns using
+ // setUpdateColumn() because it is necessary to tell the handler which
+ // columns to display before updating.
+ this.enableTaskManager();
+
// Populate the static localized strings.
i18nTemplate.process(this.document_, templateData);
@@ -257,11 +273,15 @@ TaskManager.prototype = {
var dm = this.dataModel_;
for (var i = 0; i < dm.length; i++) {
+ var processId = dm.item(i)['processId'][0];
for (var j = 0; j < DEFAULT_COLUMNS.length; j++) {
var columnId = DEFAULT_COLUMNS[j][0];
+
var row = dm.item(i)[columnId];
+ if (!row)
+ continue;
+
for (var k = 0; k < row.length; k++) {
- var processId = dm.item(i)['processId'][0];
var labelId = 'detail-' + columnId + '-pid' + processId + '-' + k;
var label = $(labelId);
@@ -285,9 +305,12 @@ TaskManager.prototype = {
continue;
var column = DEFAULT_COLUMNS[i];
- table_columns.push(new cr.ui.table.TableColumn(column[0],
+ var columnId = column[0];
+ table_columns.push(new cr.ui.table.TableColumn(columnId,
this.localized_column_[i],
column[2]));
+
+ this.setUpdateColumn(columnId, true);
}
for (var i = 0; i < table_columns.length; i++) {
@@ -363,6 +386,9 @@ TaskManager.prototype = {
this.document_.body.appendChild(this.tableContextMenu_);
cr.ui.Menu.decorate(this.tableContextMenu_);
+
+ this.setUpdateColumn('canInspect', true);
+ this.setUpdateColumn('canActivate', true);
},
initTable_: function () {
@@ -440,6 +466,10 @@ TaskManager.prototype = {
var columnId = cm.getId(i);
var columnData = data[columnId];
var oldColumnData = listItemElement.data[columnId];
+ var columnElements = cache.columns[columnId];
+
+ if (!columnData || !oldColumnData || !columnElements)
+ return null;
// Sets new width of the cell.
var cellElement = cache.cell[i];
@@ -448,19 +478,23 @@ TaskManager.prototype = {
for (var j = 0; j < columnData.length; j++) {
// Sets the new text, if the text has been changed.
if (oldColumnData[j] != columnData[j]) {
- var textElement = cache.columns[columnId][j];
+ var textElement = columnElements[j];
textElement.textContent = columnData[j];
}
}
}
// Updates icon of the task if necessary.
- for (var j = 0; j < columnData.length; j++) {
- var oldIcon = listItemElement.data['icon'][j];
- var newIcon = data['icon'][j];
- if (oldIcon != newIcon) {
- var iconElement = cache.icon[j];
- iconElement.src = newIcon;
+ var oldIcons = listItemElement.data['icon'];
+ var newIcons = data['icon'];
+ if (oldIcons && newIcons) {
+ for (var j = 0; j < columnData.length; j++) {
+ var oldIcon = oldIcons[j];
+ var newIcon = newIcons[j];
+ if (oldIcon != newIcon) {
+ var iconElement = cache.icon[j];
+ iconElement.src = newIcon;
+ }
}
}
listItemElement.data = data;
@@ -756,10 +790,13 @@ TaskManager.prototype = {
var column = DEFAULT_COLUMNS[i];
if (column[0] == id) {
this.is_column_shown_[i] = !this.is_column_shown_[i];
- menuitem.checked = this.is_column_shown_[i];
+ var checked = this.is_column_shown_[i];
+ menuitem.checked = checked;
this.initColumnModel_()
this.table_.columnModel = this.columnModel_;
this.table_.redraw();
+
+ this.setUpdateColumn(column[0], checked);
return;
}
}
diff --git a/chrome/browser/ui/webui/task_manager_handler.cc b/chrome/browser/ui/webui/task_manager_handler.cc
index 80a012a..1a72f501 100644
--- a/chrome/browser/ui/webui/task_manager_handler.cc
+++ b/chrome/browser/ui/webui/task_manager_handler.cc
@@ -25,9 +25,9 @@
namespace {
-static Value* CreateColumnValue(const TaskManagerModel* tm,
- const std::string column_name,
- const int i) {
+Value* CreateColumnValue(const TaskManagerModel* tm,
+ const std::string column_name,
+ const int i) {
if (column_name == "uniqueId")
return Value::CreateIntegerValue(tm->GetResourceUniqueId(i));
if (column_name == "type")
@@ -129,20 +129,54 @@ static Value* CreateColumnValue(const TaskManagerModel* tm,
return NULL;
}
-static void CreateGroupColumnList(const TaskManagerModel* tm,
- const std::string& column_name,
- const int index,
- const int length,
- DictionaryValue* val) {
+void CreateGroupColumnList(const TaskManagerModel* tm,
+ const std::string& column_name,
+ const int index,
+ const int length,
+ DictionaryValue* val) {
ListValue *list = new ListValue();
- for (int i = index; i < (index + length); i++) {
+ for (int i = index; i < (index + length); ++i) {
list->Append(CreateColumnValue(tm, column_name, i));
}
val->Set(column_name, list);
}
-static DictionaryValue* CreateTaskGroupValue(const TaskManagerModel* tm,
- const int group_index) {
+struct ColumnType {
+ const char* column_id;
+ // Whether the column has the real value separately or not, instead of the
+ // formatted value to display.
+ const bool has_real_value;
+ // Whether the column has single datum or multiple data in each group.
+ const bool has_multiple_data;
+};
+
+const ColumnType kColumnsList[] = {
+ {"type", false, false},
+ {"processId", true, false},
+ {"cpuUsage", true, false},
+ {"physicalMemory", true, false},
+ {"sharedMemory", true, false},
+ {"privateMemory", true, false},
+ {"webCoreImageCacheSize", true, false},
+ {"webCoreImageCacheSize", true, false},
+ {"webCoreScriptsCacheSize", true, false},
+ {"webCoreCSSCacheSize", true, false},
+ {"sqliteMemoryUsed", true, false},
+ {"v8MemoryAllocatedSize", true, false},
+ {"icon", false, true},
+ {"title", false, true},
+ {"profileName", false, true},
+ {"networkUsage", true, true},
+ {"fps", true, true},
+ {"goatsTeleported", true, true},
+ {"canInspect", false, true},
+ {"canActivate", false, true}
+};
+
+DictionaryValue* CreateTaskGroupValue(
+ const TaskManagerModel* tm,
+ const int group_index,
+ const std::set<std::string>& columns) {
DictionaryValue* val = new DictionaryValue();
const int group_count = tm->GroupCount();
@@ -154,46 +188,25 @@ static DictionaryValue* CreateTaskGroupValue(const TaskManagerModel* tm,
group_range = tm->GetGroupRangeForResource(index);
int length = group_range.second;
+ // Forces to set following 3 columns regardless of |enable_columns|.
val->SetInteger("index", index);
val->SetBoolean("isBackgroundResource",
tm->IsBackgroundResource(index));
-
- // Columns which have one datum in each group.
- CreateGroupColumnList(tm, "type", index, 1, val);
- CreateGroupColumnList(tm, "processId", index, 1, val);
- CreateGroupColumnList(tm, "processIdValue", index, 1, val);
- CreateGroupColumnList(tm, "cpuUsage", index, 1, val);
- CreateGroupColumnList(tm, "cpuUsageValue", index, 1, val);
- CreateGroupColumnList(tm, "physicalMemory", index, 1, val);
- CreateGroupColumnList(tm, "physicalMemoryValue", index, 1, val);
- CreateGroupColumnList(tm, "sharedMemory", index, 1, val);
- CreateGroupColumnList(tm, "sharedMemoryValue", index, 1, val);
- CreateGroupColumnList(tm, "privateMemory", index, 1, val);
- CreateGroupColumnList(tm, "privateMemoryValue", index, 1, val);
- CreateGroupColumnList(tm, "webCoreImageCacheSize", index, 1, val);
- CreateGroupColumnList(tm, "webCoreImageCacheSizeValue", index, 1, val);
- CreateGroupColumnList(tm, "webCoreScriptsCacheSize", index, 1, val);
- CreateGroupColumnList(tm, "webCoreScriptsCacheSizeValue", index, 1, val);
- CreateGroupColumnList(tm, "webCoreCSSCacheSize", index, 1, val);
- CreateGroupColumnList(tm, "webCoreCSSCacheSizeValue", index, 1, val);
- CreateGroupColumnList(tm, "sqliteMemoryUsed", index, 1, val);
- CreateGroupColumnList(tm, "sqliteMemoryUsedValue", index, 1, val);
- CreateGroupColumnList(tm, "v8MemoryAllocatedSize", index, 1, val);
- CreateGroupColumnList(tm, "v8MemoryAllocatedSizeValue", index, 1, val);
-
- // Columns which have some data in each group.
CreateGroupColumnList(tm, "uniqueId", index, length, val);
- CreateGroupColumnList(tm, "icon", index, length, val);
- CreateGroupColumnList(tm, "title", index, length, val);
- CreateGroupColumnList(tm, "profileName", index, length, val);
- CreateGroupColumnList(tm, "networkUsage", index, length, val);
- CreateGroupColumnList(tm, "networkUsageValue", index, length, val);
- CreateGroupColumnList(tm, "fps", index, length, val);
- CreateGroupColumnList(tm, "fpsValue", index, length, val);
- CreateGroupColumnList(tm, "goatsTeleported", index, length, val);
- CreateGroupColumnList(tm, "goatsTeleportedValue", index, length, val);
- CreateGroupColumnList(tm, "canInspect", index, length, val);
- CreateGroupColumnList(tm, "canActivate", index, length, val);
+ CreateGroupColumnList(tm, "processId", index, 1, val);
+
+ for (size_t i = 0; i < arraysize(kColumnsList); ++i) {
+ const std::string column_id = kColumnsList[i].column_id;
+
+ if (columns.find(column_id) == columns.end())
+ continue;
+
+ int column_length = kColumnsList[i].has_multiple_data ? length : 1;
+ CreateGroupColumnList(tm, column_id, index, column_length, val);
+
+ if (kColumnsList[i].has_real_value)
+ CreateGroupColumnList(tm, column_id + "Value", index, column_length, val);
+ }
return val;
}
@@ -219,7 +232,7 @@ void TaskManagerHandler::OnModelChanged() {
base::FundamentalValue length_value(count);
base::ListValue tasks_value;
for (int i = 0; i < count; ++i)
- tasks_value.Append(CreateTaskGroupValue(model_, i));
+ tasks_value.Append(CreateTaskGroupValue(model_, i, enabled_columns_));
if (is_enabled_) {
web_ui()->CallJavascriptFunction("taskChanged",
@@ -324,6 +337,9 @@ void TaskManagerHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback("disableTaskManager",
base::Bind(&TaskManagerHandler::DisableTaskManager,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback("setUpdateColumn",
+ base::Bind(&TaskManagerHandler::HandleSetUpdateColumn,
+ base::Unretained(this)));
}
static int parseIndex(const Value* value) {
@@ -416,6 +432,22 @@ void TaskManagerHandler::OpenAboutMemory(const ListValue* indexes) {
task_manager_->OpenAboutMemory();
}
+void TaskManagerHandler::HandleSetUpdateColumn(const ListValue* args) {
+ DCHECK_EQ(2U, args->GetSize());
+
+ bool ret = true;
+ std::string column_id;
+ ret &= args->GetString(0, &column_id);
+ bool is_enabled;
+ ret &= args->GetBoolean(1, &is_enabled);
+ DCHECK(ret);
+
+ if (is_enabled)
+ enabled_columns_.insert(column_id);
+ else
+ enabled_columns_.erase(column_id);
+}
+
// TaskManagerHandler, private: -----------------------------------------------
bool TaskManagerHandler::is_alive() {
@@ -432,7 +464,7 @@ void TaskManagerHandler::UpdateResourceGroupTable(int start, int length) {
std::vector<int>::iterator it = resource_to_group_table_.begin() + start;
resource_to_group_table_.insert(it, static_cast<size_t>(length), -1);
- for (int i = start; i < start + length; i++) {
+ for (int i = start; i < start + length; ++i) {
const int group_index = model_->GetGroupIndexForResource(i);
resource_to_group_table_[i] = group_index;
}
@@ -445,7 +477,8 @@ void TaskManagerHandler::OnGroupChanged(const int group_start,
base::ListValue tasks_value;
for (int i = 0; i < group_length; ++i)
- tasks_value.Append(CreateTaskGroupValue(model_, group_start + i));
+ tasks_value.Append(
+ CreateTaskGroupValue(model_, group_start + i, enabled_columns_));
if (is_enabled_ && is_alive()) {
web_ui()->CallJavascriptFunction("taskChanged",
@@ -459,7 +492,8 @@ void TaskManagerHandler::OnGroupAdded(const int group_start,
base::FundamentalValue length_value(group_length);
base::ListValue tasks_value;
for (int i = 0; i < group_length; ++i)
- tasks_value.Append(CreateTaskGroupValue(model_, group_start + i));
+ tasks_value.Append(
+ CreateTaskGroupValue(model_, group_start + i, enabled_columns_));
if (is_enabled_ && is_alive()) {
web_ui()->CallJavascriptFunction("taskAdded",
diff --git a/chrome/browser/ui/webui/task_manager_handler.h b/chrome/browser/ui/webui/task_manager_handler.h
index fbc0872..0a00765 100644
--- a/chrome/browser/ui/webui/task_manager_handler.h
+++ b/chrome/browser/ui/webui/task_manager_handler.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -6,7 +6,10 @@
#define CHROME_BROWSER_UI_WEBUI_TASK_MANAGER_HANDLER_H_
#pragma once
+#include <set>
+#include <string>
#include <vector>
+
#include "content/public/browser/web_ui_message_handler.h"
#include "chrome/browser/task_manager/task_manager.h"
@@ -46,6 +49,9 @@ class TaskManagerHandler : public content::WebUIMessageHandler,
void DisableTaskManager(const base::ListValue* indexes);
void OpenAboutMemory(const base::ListValue* indexes);
+ // Callback for the "setUpdateColumn" message.
+ void HandleSetUpdateColumn(const base::ListValue* args);
+
private:
bool is_alive();
@@ -58,6 +64,9 @@ class TaskManagerHandler : public content::WebUIMessageHandler,
// Table to cache the group index of the resource index.
std::vector<int> resource_to_group_table_;
+ // Set to store the enabled columns.
+ std::set<std::string> enabled_columns_;
+
// Invoked when group(s) are added/changed/removed.
// These method are called from OnItemAdded/-Changed/-Removed internally.
void OnGroupAdded(int start, int length);