Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |