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

Side by Side Diff: chrome/browser/ui/webui/task_manager_handler.cc

Issue 8391039: TaskManager: introduce Resource::(Can)Inspect; support tabs, apps, extensions and notifications. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Self-review. Created 9 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/task_manager_handler.h" 5 #include "chrome/browser/ui/webui/task_manager_handler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/string_number_conversions.h" 11 #include "base/string_number_conversions.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/task_manager/task_manager.h" 14 #include "chrome/browser/task_manager/task_manager.h"
15 #include "chrome/browser/ui/webui/web_ui_util.h" 15 #include "chrome/browser/ui/webui/web_ui_util.h"
16 #include "chrome/common/chrome_notification_types.h" 16 #include "chrome/common/chrome_notification_types.h"
17 #include "content/browser/renderer_host/render_view_host.h" 17 #include "content/browser/renderer_host/render_view_host.h"
18 #include "content/browser/tab_contents/tab_contents.h" 18 #include "content/browser/tab_contents/tab_contents.h"
19 #include "content/public/browser/notification_service.h" 19 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/notification_source.h" 20 #include "content/public/browser/notification_source.h"
21 #include "third_party/skia/include/core/SkBitmap.h" 21 #include "third_party/skia/include/core/SkBitmap.h"
22 #include "webkit/glue/webpreferences.h" 22 #include "webkit/glue/webpreferences.h"
23 23
24 namespace { 24 namespace {
25 25
26 static Value* CreateColumnValue(const TaskManagerModel* tm, 26 static Value* CreateColumnValue(const TaskManagerModel* tm,
27 const std::string column_name, 27 const std::string column_name,
28 const int i) { 28 const int i) {
29 if (column_name == "resourceIndex")
30 return Value::CreateIntegerValue(i);
29 if (column_name == "processId") 31 if (column_name == "processId")
30 return Value::CreateStringValue(tm->GetResourceProcessId(i)); 32 return Value::CreateStringValue(tm->GetResourceProcessId(i));
31 if (column_name == "processIdValue") 33 if (column_name == "processIdValue")
32 return Value::CreateIntegerValue(tm->GetProcessId(i)); 34 return Value::CreateIntegerValue(tm->GetProcessId(i));
33 if (column_name == "cpuUsage") 35 if (column_name == "cpuUsage")
34 return Value::CreateStringValue(tm->GetResourceCPUUsage(i)); 36 return Value::CreateStringValue(tm->GetResourceCPUUsage(i));
35 if (column_name == "cpuUsageValue") 37 if (column_name == "cpuUsageValue")
36 return Value::CreateDoubleValue(tm->GetCPUUsage(i)); 38 return Value::CreateDoubleValue(tm->GetCPUUsage(i));
37 if (column_name == "privateMemory") 39 if (column_name == "privateMemory")
38 return Value::CreateStringValue(tm->GetResourcePrivateMemory(i)); 40 return Value::CreateStringValue(tm->GetResourcePrivateMemory(i));
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 return Value::CreateStringValue(tm->GetResourceGoatsTeleported(i)); 107 return Value::CreateStringValue(tm->GetResourceGoatsTeleported(i));
106 if (column_name == "goatsTeleportedValue") 108 if (column_name == "goatsTeleportedValue")
107 return Value::CreateIntegerValue(tm->GetGoatsTeleported(i)); 109 return Value::CreateIntegerValue(tm->GetGoatsTeleported(i));
108 if (column_name == "v8MemoryAllocatedSize") 110 if (column_name == "v8MemoryAllocatedSize")
109 return Value::CreateStringValue(tm->GetResourceV8MemoryAllocatedSize(i)); 111 return Value::CreateStringValue(tm->GetResourceV8MemoryAllocatedSize(i));
110 if (column_name == "v8MemoryAllocatedSizeValue") { 112 if (column_name == "v8MemoryAllocatedSizeValue") {
111 size_t v8_memory; 113 size_t v8_memory;
112 tm->GetV8Memory(i, &v8_memory); 114 tm->GetV8Memory(i, &v8_memory);
113 return Value::CreateDoubleValue(v8_memory); 115 return Value::CreateDoubleValue(v8_memory);
114 } 116 }
117 if (column_name == "canInspect")
118 return Value::CreateBooleanValue(tm->CanInspect(i));
115 119
116 NOTREACHED(); 120 NOTREACHED();
117 return NULL; 121 return NULL;
118 } 122 }
119 123
120 static void CreateGroupColumnList(const TaskManagerModel* tm, 124 static void CreateGroupColumnList(const TaskManagerModel* tm,
121 const std::string column_name, 125 const std::string column_name,
122 const int index, 126 const int index,
123 const int length, 127 const int length,
124 DictionaryValue* val) { 128 DictionaryValue* val) {
(...skipping 11 matching lines...) Expand all
136 const int group_count = tm->GroupCount(); 140 const int group_count = tm->GroupCount();
137 if (group_index >= group_count) 141 if (group_index >= group_count)
138 return val; 142 return val;
139 143
140 int index = tm->GetResourceIndexForGroup(group_index, 0); 144 int index = tm->GetResourceIndexForGroup(group_index, 0);
141 std::pair<int, int> group_range; 145 std::pair<int, int> group_range;
142 group_range = tm->GetGroupRangeForResource(index); 146 group_range = tm->GetGroupRangeForResource(index);
143 int length = group_range.second; 147 int length = group_range.second;
144 148
145 val->SetInteger("index", index); 149 val->SetInteger("index", index);
146 val->SetInteger("group_range_start", group_range.first);
147 val->SetInteger("group_range_length", group_range.second);
148 val->SetInteger("index_in_group", index - group_range.first);
149 val->SetBoolean("is_resource_first_in_group",
150 tm->IsResourceFirstInGroup(index));
151 val->SetBoolean("isBackgroundResource", 150 val->SetBoolean("isBackgroundResource",
152 tm->IsBackgroundResource(index)); 151 tm->IsBackgroundResource(index));
153 152
154 // Columns which have one datum in each group. 153 // Columns which have one datum in each group.
155 CreateGroupColumnList(tm, "processId", index, 1, val); 154 CreateGroupColumnList(tm, "processId", index, 1, val);
156 CreateGroupColumnList(tm, "processIdValue", index, 1, val); 155 CreateGroupColumnList(tm, "processIdValue", index, 1, val);
157 CreateGroupColumnList(tm, "cpuUsage", index, 1, val); 156 CreateGroupColumnList(tm, "cpuUsage", index, 1, val);
158 CreateGroupColumnList(tm, "cpuUsageValue", index, 1, val); 157 CreateGroupColumnList(tm, "cpuUsageValue", index, 1, val);
159 CreateGroupColumnList(tm, "physicalMemory", index, 1, val); 158 CreateGroupColumnList(tm, "physicalMemory", index, 1, val);
160 CreateGroupColumnList(tm, "physicalMemoryValue", index, 1, val); 159 CreateGroupColumnList(tm, "physicalMemoryValue", index, 1, val);
161 CreateGroupColumnList(tm, "sharedMemory", index, 1, val); 160 CreateGroupColumnList(tm, "sharedMemory", index, 1, val);
162 CreateGroupColumnList(tm, "sharedMemoryValue", index, 1, val); 161 CreateGroupColumnList(tm, "sharedMemoryValue", index, 1, val);
163 CreateGroupColumnList(tm, "privateMemory", index, 1, val); 162 CreateGroupColumnList(tm, "privateMemory", index, 1, val);
164 CreateGroupColumnList(tm, "privateMemoryValue", index, 1, val); 163 CreateGroupColumnList(tm, "privateMemoryValue", index, 1, val);
165 CreateGroupColumnList(tm, "webCoreImageCacheSize", index, 1, val); 164 CreateGroupColumnList(tm, "webCoreImageCacheSize", index, 1, val);
166 CreateGroupColumnList(tm, "webCoreImageCacheSizeValue", index, 1, val); 165 CreateGroupColumnList(tm, "webCoreImageCacheSizeValue", index, 1, val);
167 CreateGroupColumnList(tm, "webCoreScriptsCacheSize", index, 1, val); 166 CreateGroupColumnList(tm, "webCoreScriptsCacheSize", index, 1, val);
168 CreateGroupColumnList(tm, "webCoreScriptsCacheSizeValue", index, 1, val); 167 CreateGroupColumnList(tm, "webCoreScriptsCacheSizeValue", index, 1, val);
169 CreateGroupColumnList(tm, "webCoreCSSCacheSize", index, 1, val); 168 CreateGroupColumnList(tm, "webCoreCSSCacheSize", index, 1, val);
170 CreateGroupColumnList(tm, "webCoreCSSCacheSizeValue", index, 1, val); 169 CreateGroupColumnList(tm, "webCoreCSSCacheSizeValue", index, 1, val);
171 CreateGroupColumnList(tm, "sqliteMemoryUsed", index, 1, val); 170 CreateGroupColumnList(tm, "sqliteMemoryUsed", index, 1, val);
172 CreateGroupColumnList(tm, "sqliteMemoryUsedValue", index, 1, val); 171 CreateGroupColumnList(tm, "sqliteMemoryUsedValue", index, 1, val);
173 CreateGroupColumnList(tm, "v8MemoryAllocatedSize", index, 1, val); 172 CreateGroupColumnList(tm, "v8MemoryAllocatedSize", index, 1, val);
174 CreateGroupColumnList(tm, "v8MemoryAllocatedSizeValue", index, 1, val); 173 CreateGroupColumnList(tm, "v8MemoryAllocatedSizeValue", index, 1, val);
175 174
176 // Columns which have some data in each group. 175 // Columns which have some data in each group.
176 CreateGroupColumnList(tm, "resourceIndex", index, length, val);
177 CreateGroupColumnList(tm, "icon", index, length, val); 177 CreateGroupColumnList(tm, "icon", index, length, val);
178 CreateGroupColumnList(tm, "title", index, length, val); 178 CreateGroupColumnList(tm, "title", index, length, val);
179 CreateGroupColumnList(tm, "profileName", index, length, val); 179 CreateGroupColumnList(tm, "profileName", index, length, val);
180 CreateGroupColumnList(tm, "networkUsage", index, length, val); 180 CreateGroupColumnList(tm, "networkUsage", index, length, val);
181 CreateGroupColumnList(tm, "networkUsageValue", index, length, val); 181 CreateGroupColumnList(tm, "networkUsageValue", index, length, val);
182 CreateGroupColumnList(tm, "fps", index, length, val); 182 CreateGroupColumnList(tm, "fps", index, length, val);
183 CreateGroupColumnList(tm, "fpsValue", index, length, val); 183 CreateGroupColumnList(tm, "fpsValue", index, length, val);
184 CreateGroupColumnList(tm, "goatsTeleported", index, length, val); 184 CreateGroupColumnList(tm, "goatsTeleported", index, length, val);
185 CreateGroupColumnList(tm, "goatsTeleportedValue", index, length, val); 185 CreateGroupColumnList(tm, "goatsTeleportedValue", index, length, val);
186 CreateGroupColumnList(tm, "canInspect", index, length, val);
186 187
187 return val; 188 return val;
188 } 189 }
189 190
190 } // namespace 191 } // namespace
191 192
192 TaskManagerHandler::TaskManagerHandler(TaskManager* tm) 193 TaskManagerHandler::TaskManagerHandler(TaskManager* tm)
193 : task_manager_(tm), 194 : task_manager_(tm),
194 model_(tm->model()), 195 model_(tm->model()),
195 is_enabled_(false) { 196 is_enabled_(false) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 OnGroupRemoved(group_start, group_end - group_start + 1); 295 OnGroupRemoved(group_start, group_end - group_start + 1);
295 } 296 }
296 297
297 void TaskManagerHandler::Init() { 298 void TaskManagerHandler::Init() {
298 } 299 }
299 300
300 void TaskManagerHandler::RegisterMessages() { 301 void TaskManagerHandler::RegisterMessages() {
301 web_ui_->RegisterMessageCallback("killProcess", 302 web_ui_->RegisterMessageCallback("killProcess",
302 base::Bind(&TaskManagerHandler::HandleKillProcess, 303 base::Bind(&TaskManagerHandler::HandleKillProcess,
303 base::Unretained(this))); 304 base::Unretained(this)));
305 web_ui_->RegisterMessageCallback("inspect",
306 base::Bind(&TaskManagerHandler::HandleInspect,
307 base::Unretained(this)));
304 web_ui_->RegisterMessageCallback("openAboutMemory", 308 web_ui_->RegisterMessageCallback("openAboutMemory",
305 base::Bind(&TaskManagerHandler::OpenAboutMemory, 309 base::Bind(&TaskManagerHandler::OpenAboutMemory,
306 base::Unretained(this))); 310 base::Unretained(this)));
307 web_ui_->RegisterMessageCallback("enableTaskManager", 311 web_ui_->RegisterMessageCallback("enableTaskManager",
308 base::Bind(&TaskManagerHandler::EnableTaskManager, 312 base::Bind(&TaskManagerHandler::EnableTaskManager,
309 base::Unretained(this))); 313 base::Unretained(this)));
310 web_ui_->RegisterMessageCallback("disableTaskManager", 314 web_ui_->RegisterMessageCallback("disableTaskManager",
311 base::Bind(&TaskManagerHandler::DisableTaskManager, 315 base::Bind(&TaskManagerHandler::DisableTaskManager,
312 base::Unretained(this))); 316 base::Unretained(this)));
313 } 317 }
314 318
319 static int parseIndex(const Value* value) {
320 int index = -1;
321 string16 string16_index;
322 double double_index;
323 if (value->GetAsString(&string16_index)) {
324 base::StringToInt(string16_index, &index);
325 } else if (value->GetAsDouble(&double_index)) {
326 index = static_cast<int>(double_index);
327 } else {
328 value->GetAsInteger(&index);
329 }
330 return index;
331 }
332
315 void TaskManagerHandler::HandleKillProcess(const ListValue* indexes) { 333 void TaskManagerHandler::HandleKillProcess(const ListValue* indexes) {
316 for (ListValue::const_iterator i = indexes->begin(); 334 for (ListValue::const_iterator i = indexes->begin();
317 i != indexes->end(); i++) { 335 i != indexes->end(); i++) {
318 int index = -1; 336 int index = parseIndex(*i);
319 string16 string16_index;
320 double double_index;
321 if ((*i)->GetAsString(&string16_index)) {
322 base::StringToInt(string16_index, &index);
323 } else if ((*i)->GetAsDouble(&double_index)) {
324 index = static_cast<int>(double_index);
325 } else {
326 (*i)->GetAsInteger(&index);
327 }
328 if (index == -1) 337 if (index == -1)
329 continue; 338 continue;
330 339
331 int resource_index = model_->GetResourceIndexForGroup(index, 0); 340 int resource_index = model_->GetResourceIndexForGroup(index, 0);
332 if (resource_index == -1) 341 if (resource_index == -1)
333 continue; 342 continue;
334 343
335 LOG(INFO) << "kill PID:" << model_->GetResourceProcessId(resource_index); 344 LOG(INFO) << "kill PID:" << model_->GetResourceProcessId(resource_index);
336 task_manager_->KillProcess(resource_index); 345 task_manager_->KillProcess(resource_index);
337 } 346 }
338 } 347 }
339 348
349 void TaskManagerHandler::HandleInspect(const ListValue* resource_index) {
350 for (ListValue::const_iterator i = resource_index->begin();
351 i != resource_index->end(); i++) {
yurys 2011/10/26 14:33:44 ++i
352 int resource_index = parseIndex(*i);
353 if (resource_index == -1)
354 continue;
355 if (model_->CanInspect(resource_index))
356 model_->Inspect(resource_index);
357 break;
358 }
359 }
360
340 void TaskManagerHandler::DisableTaskManager(const ListValue* indexes) { 361 void TaskManagerHandler::DisableTaskManager(const ListValue* indexes) {
341 if (!is_enabled_) 362 if (!is_enabled_)
342 return; 363 return;
343 364
344 is_enabled_ = false; 365 is_enabled_ = false;
345 model_->StopUpdating(); 366 model_->StopUpdating();
346 model_->RemoveObserver(this); 367 model_->RemoveObserver(this);
347 } 368 }
348 369
349 void TaskManagerHandler::EnableTaskManager(const ListValue* indexes) { 370 void TaskManagerHandler::EnableTaskManager(const ListValue* indexes) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 } 441 }
421 } 442 }
422 443
423 void TaskManagerHandler::OnGroupRemoved(const int group_start, 444 void TaskManagerHandler::OnGroupRemoved(const int group_start,
424 const int group_length) { 445 const int group_length) {
425 base::FundamentalValue start_value(group_start); 446 base::FundamentalValue start_value(group_start);
426 base::FundamentalValue length_value(group_length); 447 base::FundamentalValue length_value(group_length);
427 if (is_enabled_) 448 if (is_enabled_)
428 web_ui_->CallJavascriptFunction("taskRemoved", start_value, length_value); 449 web_ui_->CallJavascriptFunction("taskRemoved", start_value, length_value);
429 } 450 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698