task_manager_resource_providers.cc revision 4a5e2dc747d50c653511c68ccb2cfbfb740bd5a7
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/task_manager/task_manager_resource_providers.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "build/build_config.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "app/l10n_util.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "app/resource_bundle.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h" 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_version_info.h" 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/i18n/rtl.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/process_util.h" 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/stl_util-inl.h" 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_util.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/thread.h" 184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/utf_string_conversions.h" 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/background_contents_service.h" 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_child_process_host.h" 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_list.h" 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_process.h" 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_thread.h" 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_host.h" 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_process_manager.h" 274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/extensions_service.h" 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/balloon_collection.h" 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/balloon_host.h" 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/notification_ui_manager.h" 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/profile_manager.h" 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/render_process_host.h" 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/render_view_host.h" 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/resource_message_filter.h" 354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/tab_contents/background_contents.h" 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/tab_contents/tab_contents.h" 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/tab_contents/tab_util.h" 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/extensions/extension.h" 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/notification_service.h" 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/render_messages.h" 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/sqlite_utils.h" 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h" 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/theme_resources.h" 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_MACOSX) 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "skia/ext/skia_utils_mac.h" 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN) 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/app_icon_win.h" 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "gfx/icon_util.h" 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // defined(OS_WIN) 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerRendererResource class 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerRendererResource::TaskManagerRendererResource( 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::ProcessHandle process, RenderViewHost* render_view_host) 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : process_(process), 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch render_view_host_(render_view_host), 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_stats_update_(false), 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_allocated_(0), 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_used_(0), 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_v8_memory_allocated_update_(false) { 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // We cache the process and pid as when a Tab/BackgroundContents is closed the 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // process reference becomes NULL and the TaskManager still needs it. 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_); 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.images.size = 0; 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.cssStyleSheets.size = 0; 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.scripts.size = 0; 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.xslStyleSheets.size = 0; 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.fonts.size = 0; 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerRendererResource::~TaskManagerRendererResource() { 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerRendererResource::Refresh() { 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pending_stats_update_) { 804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch render_view_host_->Send(new ViewMsg_GetCacheResourceStats); 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_stats_update_ = true; 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pending_v8_memory_allocated_update_) { 844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch render_view_host_->Send(new ViewMsg_GetV8HeapStats); 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_v8_memory_allocated_update_ = true; 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenWebKit::WebCache::ResourceTypeStats 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerRendererResource::GetWebCoreCacheStats() const { 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return stats_; 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochsize_t TaskManagerRendererResource::GetV8MemoryAllocated() const { 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return v8_memory_allocated_; 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochsize_t TaskManagerRendererResource::GetV8MemoryUsed() const { 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return v8_memory_used_; 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerRendererResource::NotifyResourceTypeStats( 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const WebKit::WebCache::ResourceTypeStats& stats) { 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_ = stats; 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_stats_update_ = false; 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerRendererResource::NotifyV8HeapStats( 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size_t v8_memory_allocated, size_t v8_memory_used) { 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_allocated_ = v8_memory_allocated; 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_used_ = v8_memory_used; 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_v8_memory_allocated_update_ = false; 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbase::ProcessHandle TaskManagerRendererResource::GetProcess() const { 1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return process_; 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerTabContentsResource class 1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerTabContentsResource::TaskManagerTabContentsResource( 1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TabContents* tab_contents) 1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : TaskManagerRendererResource( 1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_contents->GetRenderProcessHost()->GetHandle(), 1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_contents->render_view_host()), 1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_contents_(tab_contents) { 1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerTabContentsResource::~TaskManagerTabContentsResource() { 1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstd::wstring TaskManagerTabContentsResource::GetTitle() const { 1354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Fall back on the URL if there's no title. 1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::wstring tab_title(UTF16ToWideHack(tab_contents_->GetTitle())); 1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (tab_title.empty()) { 1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_title = UTF8ToWide(tab_contents_->GetURL().spec()); 1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Force URL to be LTR. 1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_title = UTF16ToWide(base::i18n::GetDisplayStringInLTRDirectionality( 1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch WideToUTF16(tab_title))); 1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } else { 1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Since the tab_title will be concatenated with 1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // IDS_TASK_MANAGER_TAB_PREFIX, we need to explicitly set the tab_title to 1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // be LTR format if there is no strong RTL charater in it. Otherwise, if 1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // IDS_TASK_MANAGER_TAB_PREFIX is an RTL word, the concatenated result 1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // might be wrong. For example, http://mail.yahoo.com, whose title is 1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // "Yahoo! Mail: The best web-based Email!", without setting it explicitly 1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // as LTR format, the concatenated result will be "!Yahoo! Mail: The best 1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // web-based Email :BAT", in which the capital letters "BAT" stands for 1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // the Hebrew word for "tab". 1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::i18n::AdjustStringForLocaleDirection(tab_title, &tab_title); 1534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return l10n_util::GetStringF(IDS_TASK_MANAGER_TAB_PREFIX, tab_title); 1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochSkBitmap TaskManagerTabContentsResource::GetIcon() const { 1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return tab_contents_->GetFavIcon(); 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTabContents* TaskManagerTabContentsResource::GetTabContents() const { 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return static_cast<TabContents*>(tab_contents_); 165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerTabContentsResourceProvider class 169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResourceProvider:: 172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerTabContentsResourceProvider(TaskManager* task_manager) 173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResourceProvider:: 178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerTabContentsResourceProvider() { 179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerTabContentsResourceProvider::GetResource( 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TabContents* tab_contents = 187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_util::GetTabContentsByID(render_process_host_id, routing_id); 188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!tab_contents) // Not one of our resource. 189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::ProcessHandle process_handle = 192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_contents->GetRenderProcessHost()->GetHandle(); 193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!process_handle) { 194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We should not be holding on to a dead tab (it should have been removed 195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // through the NOTIFY_TAB_CONTENTS_DISCONNECTED notification. 196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED(); 197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int pid = base::GetProcId(process_handle); 201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid != origin_pid) 202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<TabContents*, TaskManagerTabContentsResource*>::iterator 205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen res_iter = resources_.find(tab_contents); 2064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (res_iter == resources_.end()) { 207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Can happen if the tab was closed while a network request was being 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // performed. 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return res_iter->second; 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::StartUpdating() { 215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing TabContents. 219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (TabContentsIterator iterator; !iterator.done(); ++iterator) 220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*iterator); 221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Then we register for notifications to get new tabs. 223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_CONNECTED, 224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_SWAPPED, 226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_DISCONNECTED, 228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TAB_CONTENTS_DISCONNECTED should be enough to know when to remove a 230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // resource. This is an attempt at mitigating a crasher that seem to 231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // indicate a resource is still referencing a deleted TabContents 232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // (http://crbug.com/7321). 233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED, 234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::StopUpdating() { 238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Then we unregister for notifications to get new tabs. 242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_CONNECTED, 243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_SWAPPED, 245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_DISCONNECTED, 247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_DESTROYED, 249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::AddToTaskManager( 258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TabContents* tab_contents) { 259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerTabContentsResource* resource = 260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerTabContentsResource(tab_contents); 261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[tab_contents] = resource; 262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Add(TabContents* tab_contents) { 266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Don't add dead tabs or tabs that haven't yet connected. 270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Also ignore tabs which display extension content. We collapse 271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // all of these into one extension row. 272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!tab_contents->GetRenderProcessHost()->GetHandle() || 273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen !tab_contents->notify_disconnection() || 274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_contents->HostsExtension()) { 275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<TabContents*, TaskManagerTabContentsResource*>::const_iterator 279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter = resources_.find(tab_contents); 280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != resources_.end()) { 281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The case may happen that we have added a TabContents as part of the 282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // iteration performed during StartUpdating() call but the notification that 283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // it has connected was not fired yet. So when the notification happens, we 284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // already know about this tab and just ignore it. 285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(tab_contents); 288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Remove(TabContents* tab_contents) { 291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<TabContents*, TaskManagerTabContentsResource*>::iterator 294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter = resources_.find(tab_contents); 295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) { 296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Since TabContents are destroyed asynchronously (see TabContentsCollector 297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // in navigation_controller.cc), we can be notified of a tab being removed 298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // that we don't know. This can happen if the user closes a tab and quickly 299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // opens the task manager, before the tab is actually destroyed. 300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerTabContentsResource* resource = iter->second; 305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // And from the provider. 307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Observe(NotificationType type, 313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_CONNECTED: 317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(Source<TabContents>(source).ptr()); 318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_SWAPPED: 320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Remove(Source<TabContents>(source).ptr()); 321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(Source<TabContents>(source).ptr()); 322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_DESTROYED: 324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If this DCHECK is triggered, it could explain http://crbug.com/7321. 325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(Source<TabContents>(source).ptr()) == 326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.end()) << "TAB_CONTENTS_DESTROYED with no associated " 327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "TAB_CONTENTS_DISCONNECTED"; 328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Fall through. 329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_DISCONNECTED: 330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Remove(Source<TabContents>(source).ptr()); 331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 3394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerBackgroundContentsResource class 3404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 3414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochSkBitmap* TaskManagerBackgroundContentsResource::default_icon_ = NULL; 3434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResource::TaskManagerBackgroundContentsResource( 3454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BackgroundContents* background_contents, 3464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::wstring& application_name) 3474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : TaskManagerRendererResource( 3484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch background_contents->render_view_host()->process()->GetHandle(), 3494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch background_contents->render_view_host()), 3504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch background_contents_(background_contents), 3514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch application_name_(application_name) { 3524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Just use the same icon that other extension resources do. 3534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // TODO(atwilson): Use the favicon when that's available. 3544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!default_icon_) { 3554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 3564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 3574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 3584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Ensure that the string has the appropriate direction markers (see comment 3594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // in TaskManagerTabContentsResource::GetTitle()). 3604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::i18n::AdjustStringForLocaleDirection(application_name_, 3614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch &application_name_); 3624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 3634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResource::~TaskManagerBackgroundContentsResource( 3654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ) { 3664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 3674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstd::wstring TaskManagerBackgroundContentsResource::GetTitle() const { 3694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::wstring title = application_name_; 3704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (title.empty()) { 3724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // No title (can't locate the parent app for some reason) so just display 3734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // the URL (properly forced to be LTR). 3744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch title = UTF16ToWide(base::i18n::GetDisplayStringInLTRDirectionality( 3754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch UTF8ToUTF16(background_contents_->GetURL().spec()))); 3764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 3774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return l10n_util::GetStringF(IDS_TASK_MANAGER_BACKGROUND_PREFIX, title); 3784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 3794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochSkBitmap TaskManagerBackgroundContentsResource::GetIcon() const { 3824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return *default_icon_; 3834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 3844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool TaskManagerBackgroundContentsResource::IsBackground() const { 3864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return true; 3874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 3884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 3904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerBackgroundContentsResourceProvider class 3914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 3924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResourceProvider:: 3944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TaskManagerBackgroundContentsResourceProvider(TaskManager* task_manager) 3954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : updating_(false), 3964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch task_manager_(task_manager) { 3974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 3984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResourceProvider:: 4004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ~TaskManagerBackgroundContentsResourceProvider() { 4014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 4024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManager::Resource* 4044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResourceProvider::GetResource( 4054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int origin_pid, 4064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int render_process_host_id, 4074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int routing_id) { 4084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BackgroundContents* contents = BackgroundContents::GetBackgroundContentsByID( 4104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch render_process_host_id, routing_id); 4114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!contents) // This resource no longer exists. 4124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return NULL; 4134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::ProcessHandle process_handle = 4154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch contents->render_view_host()->process()->GetHandle(); 4164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!process_handle) // Process crashed. 4174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return NULL; 4184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int pid = base::GetProcId(process_handle); 4204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (pid != origin_pid) 4214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return NULL; 4224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::map<BackgroundContents*, 4244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TaskManagerBackgroundContentsResource*>::iterator res_iter = 4254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch resources_.find(contents); 4264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (res_iter == resources_.end()) 4274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Can happen if the page went away while a network request was being 4284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // performed. 4294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return NULL; 4304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return res_iter->second; 4324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 4334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::StartUpdating() { 4354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK(!updating_); 4364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch updating_ = true; 4374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Add all the existing BackgroundContents from every profile. 4394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 4404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch for (ProfileManager::const_iterator it = profile_manager->begin(); 4414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch it != profile_manager->end(); ++it) { 4424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BackgroundContentsService* background_contents_service = 4434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch (*it)->GetBackgroundContentsService(); 4444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionsService* extensions_service = (*it)->GetExtensionsService(); 4454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::vector<BackgroundContents*> contents = 4464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch background_contents_service->GetBackgroundContents(); 4474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch for (std::vector<BackgroundContents*>::iterator iterator = contents.begin(); 4484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch iterator != contents.end(); ++iterator) { 4494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::wstring application_name; 4504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Lookup the name from the parent extension. 4514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (extensions_service) { 4524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const string16& application_id = 4534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch background_contents_service->GetParentApplicationId(*iterator); 4544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const Extension* extension = extensions_service->GetExtensionById( 4554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch UTF16ToUTF8(application_id), false); 4564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (extension) 4574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch application_name = UTF8ToWide(extension->name()); 4584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 4594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Add(*iterator, application_name); 4604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 4614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 4624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Then we register for notifications to get new BackgroundContents. 4644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_OPENED, 4654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationService::AllSources()); 4664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_NAVIGATED, 4674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationService::AllSources()); 4684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_DELETED, 4694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationService::AllSources()); 4704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 4714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::StopUpdating() { 4734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK(updating_); 4744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch updating_ = false; 4754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Unregister for notifications 4774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch registrar_.Remove(this, NotificationType::BACKGROUND_CONTENTS_OPENED, 4784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationService::AllSources()); 4794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch registrar_.Remove(this, NotificationType::BACKGROUND_CONTENTS_NAVIGATED, 4804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationService::AllSources()); 4814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch registrar_.Remove(this, NotificationType::BACKGROUND_CONTENTS_DELETED, 4824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationService::AllSources()); 4834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Delete all the resources. 4854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 4864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch resources_.clear(); 4884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 4894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::AddToTaskManager( 4914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BackgroundContents* background_contents, 4924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::wstring& application_name) { 4934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TaskManagerBackgroundContentsResource* resource = 4944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new TaskManagerBackgroundContentsResource(background_contents, 4954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch application_name); 4964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch resources_[background_contents] = resource; 4974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch task_manager_->AddResource(resource); 4984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 4994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::Add( 5014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BackgroundContents* contents, const std::wstring& application_name) { 5024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!updating_) 5034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return; 5044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Don't add contents whose process is dead. 5064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!contents->render_view_host()->process()->GetHandle()) 5074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return; 5084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Should never add the same BackgroundContents twice. 5104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK(resources_.find(contents) == resources_.end()); 5114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch AddToTaskManager(contents, application_name); 5124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 5134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::Remove( 5154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BackgroundContents* contents) { 5164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!updating_) 5174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return; 5184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::map<BackgroundContents*, 5194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TaskManagerBackgroundContentsResource*>::iterator iter = 5204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch resources_.find(contents); 5214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK(iter != resources_.end()); 5224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Remove the resource from the Task Manager. 5244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TaskManagerBackgroundContentsResource* resource = iter->second; 5254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch task_manager_->RemoveResource(resource); 5264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // And from the provider. 5274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch resources_.erase(iter); 5284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Finally, delete the resource. 5294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch delete resource; 5304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 5314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::Observe( 5334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationType type, 5344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const NotificationSource& source, 5354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const NotificationDetails& details) { 5364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch switch (type.value) { 5374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch case NotificationType::BACKGROUND_CONTENTS_OPENED: { 5384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Get the name from the parent application. If no parent application is 5394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // found, just pass an empty string - BackgroundContentsResource::GetTitle 5404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // will display the URL instead in this case. This should never happen 5414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // except in rare cases when an extension is being unloaded or chrome is 5424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // exiting while the task manager is displayed. 5434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::wstring application_name; 5444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionsService* service = 5454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Source<Profile>(source)->GetExtensionsService(); 5464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (service) { 5474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string application_id = UTF16ToUTF8( 5484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Details<BackgroundContentsOpenedDetails>(details)->application_id); 5494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const Extension* extension = 5504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch service->GetExtensionById(application_id, false); 5514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Extension can be NULL when running unit tests. 5524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (extension) 5534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch application_name = UTF8ToWide(extension->name()); 5544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 5554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Add(Details<BackgroundContentsOpenedDetails>(details)->contents, 5564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch application_name); 5574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Opening a new BackgroundContents needs to force the display to refresh 5584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // (applications may now be considered "background" that weren't before). 5594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch task_manager_->ModelChanged(); 5604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch break; 5614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 5624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch case NotificationType::BACKGROUND_CONTENTS_NAVIGATED: { 5634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BackgroundContents* contents = Details<BackgroundContents>(details).ptr(); 5644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Should never get a NAVIGATED before OPENED. 5654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK(resources_.find(contents) != resources_.end()); 5664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Preserve the application name. 5674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::wstring application_name( 5684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch resources_.find(contents)->second->application_name()); 5694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Remove(contents); 5704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Add(contents, application_name); 5714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch break; 5724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 5734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch case NotificationType::BACKGROUND_CONTENTS_DELETED: 5744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Remove(Details<BackgroundContents>(details).ptr()); 5754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Closing a BackgroundContents needs to force the display to refresh 5764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // (applications may now be considered "foreground" that weren't before). 5774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch task_manager_->ModelChanged(); 5784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch break; 5794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch default: 5804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NOTREACHED() << "Unexpected notification."; 5814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return; 5824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 5834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 5844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerChildProcessResource class 587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerChildProcessResource::default_icon_ = NULL; 589bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 590bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResource::TaskManagerChildProcessResource( 591513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ChildProcessInfo& child_proc) 592bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : child_process_(child_proc), 593bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_(), 594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen network_usage_support_(false) { 595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We cache the process id because it's not cheap to calculate, and it won't 596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // be available when we get the plugin disconnected notification. 597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = child_proc.id(); 598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 601bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(jabdelmalek): use different icon for web workers. 602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 604bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResource::~TaskManagerChildProcessResource() { 606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerResource methods: 609bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerChildProcessResource::GetTitle() const { 610bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (title_.empty()) 611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = UTF16ToWideHack(child_process_.GetLocalizedTitle()); 612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 614bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 615bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerChildProcessResource::GetIcon() const { 617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerChildProcessResource::GetProcess() const { 621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return child_process_.handle(); 622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 624731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTaskManager::Resource::Type TaskManagerChildProcessResource::GetType() const { 625731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Translate types to TaskManager::ResourceType, since ChildProcessInfo's type 626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // is not available for all TaskManager resources. 627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (child_process_.type()) { 628731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::BROWSER_PROCESS: 629731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::BROWSER; 630731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::RENDER_PROCESS: 631731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::RENDERER; 632731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::PLUGIN_PROCESS: 633731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::PLUGIN; 634731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::WORKER_PROCESS: 635731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::WORKER; 636731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::NACL_LOADER_PROCESS: 637731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::NACL_BROKER_PROCESS: 638731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::NACL; 639731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::UTILITY_PROCESS: 640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::UTILITY; 641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::PROFILE_IMPORT_PROCESS: 642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::PROFILE_IMPORT; 643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::ZYGOTE_PROCESS: 644731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::ZYGOTE; 645731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::SANDBOX_HELPER_PROCESS: 646731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::SANDBOX_HELPER; 647731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::GPU_PROCESS: 648731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::GPU; 649731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::UNKNOWN; 651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerChildProcessResourceProvider class 656bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider:: 659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResourceProvider(TaskManager* task_manager) 660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider:: 665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerChildProcessResourceProvider() { 666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerChildProcessResourceProvider::GetResource( 669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerChildProcessResource*>::iterator iter = 673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(origin_pid); 674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != pid_to_resources_.end()) 675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return iter->second; 676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen else 677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StartUpdating() { 681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications to get new child processes. 685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED, 686bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_DISCONNECTED, 688bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 689bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Get the existing child processes. 691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 693bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NewRunnableMethod( 694bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen this, 695bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo)); 696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StopUpdating() { 699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications to get new plugin processes. 703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED, 704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, 706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::CHILD_PROCESS_HOST_DISCONNECTED, 707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.clear(); 714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.clear(); 715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Observe( 718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::CHILD_PROCESS_HOST_CONNECTED: 723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*Details<ChildProcessInfo>(details).ptr()); 724bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 725bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::CHILD_PROCESS_HOST_DISCONNECTED: 726bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Remove(*Details<ChildProcessInfo>(details).ptr()); 727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Add( 735513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ChildProcessInfo& child_process_info) { 736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ChildProcessInfo, TaskManagerChildProcessResource*>:: 739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const_iterator iter = resources_.find(child_process_info); 740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != resources_.end()) { 741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The case may happen that we have added a child_process_info as part of 742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the iteration performed during StartUpdating() call but the notification 743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // that it has connected was not fired yet. So when the notification 744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // happens, we already know about this plugin and just ignore it. 745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 746bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 747bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(child_process_info); 748bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 749bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 750bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Remove( 751513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ChildProcessInfo& child_process_info) { 752bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 754bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ChildProcessInfo, TaskManagerChildProcessResource*> 755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ::iterator iter = resources_.find(child_process_info); 756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) { 757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // ChildProcessInfo disconnection notifications are asynchronous, so we 758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // might be notified for a plugin we don't know anything about (if it was 759bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // closed before the task manager was shown and destroyed after that). 760bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResource* resource = iter->second; 764bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the provider. 766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from our pid map. 768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerChildProcessResource*>::iterator pid_iter = 769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(resource->process_id()); 770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(pid_iter != pid_to_resources_.end()); 771bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid_iter != pid_to_resources_.end()) 772bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.erase(pid_iter); 773bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 774bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 775bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 776bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 777bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 778bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::AddToTaskManager( 779513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const ChildProcessInfo& child_process_info) { 780bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResource* resource = 781bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerChildProcessResource(child_process_info); 782bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[child_process_info] = resource; 783bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_[resource->process_id()] = resource; 784bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 785bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 786bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 787bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The ChildProcessInfo::Iterator has to be used from the IO thread. 788bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo() { 789bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) { 790bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Only add processes which are already started, since we need their handle. 791bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if ((*iter)->handle() != base::kNullProcessHandle) 792bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.push_back(**iter); 793bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 794bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Now notify the UI thread that we have retrieved information about child 795bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // processes. 796731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::UI, FROM_HERE, 798bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NewRunnableMethod(this, 799bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived)); 800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 802bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This is called on the UI thread. 803bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived() { 804bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::vector<ChildProcessInfo>::const_iterator iter; 805bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (iter = existing_child_process_info_.begin(); 806bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter != existing_child_process_info_.end(); ++iter) { 807bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*iter); 808bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 809bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.clear(); 810bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 811bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 812bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 813bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResource class 814bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 815bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 816bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerExtensionProcessResource::default_icon_ = NULL; 817bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 818bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::TaskManagerExtensionProcessResource( 819bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) 820bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : extension_host_(extension_host) { 821bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 822bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 823bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 824bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 825bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen process_handle_ = extension_host_->render_process_host()->GetHandle(); 826bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_handle_); 827bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::wstring extension_name(UTF8ToWide(GetExtension()->name())); 828bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!extension_name.empty()); 829bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 830bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int message_id = 831bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetExtension()->is_app() ? 832bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (extension_host_->profile()->IsOffTheRecord() ? 833bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX : 834bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_APP_PREFIX) : 835bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (extension_host_->profile()->IsOffTheRecord() ? 836bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_EXTENSION_INCOGNITO_PREFIX : 837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_EXTENSION_PREFIX); 838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = l10n_util::GetStringF(message_id, extension_name); 839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::~TaskManagerExtensionProcessResource() { 842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerExtensionProcessResource::GetTitle() const { 845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerExtensionProcessResource::GetIcon() const { 849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 851bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerExtensionProcessResource::GetProcess() const { 853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return process_handle_; 854bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 855bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 856bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst Extension* TaskManagerExtensionProcessResource::GetExtension() const { 857bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return extension_host_->extension(); 858bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 859bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 8604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool TaskManagerExtensionProcessResource::IsBackground() const { 8614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return extension_host_->GetRenderViewType() == 8624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ViewType::EXTENSION_BACKGROUND_PAGE; 8634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 8644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 865bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 866bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResourceProvider class 867bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 868bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 869bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider:: 870bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResourceProvider(TaskManager* task_manager) 871bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : task_manager_(task_manager), 872bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_(false) { 873bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 874bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 875bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider:: 876bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerExtensionProcessResourceProvider() { 877bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 878bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 879bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerExtensionProcessResourceProvider::GetResource( 880bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 881bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 882bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 883bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerExtensionProcessResource*>::iterator iter = 884bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(origin_pid); 885bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != pid_to_resources_.end()) 886bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return iter->second; 887bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen else 888bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 889bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 890bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 891bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StartUpdating() { 892bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 893bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 894bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 895bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing ExtensionHosts. 896bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ProfileManager* profile_manager = g_browser_process->profile_manager(); 897bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (ProfileManager::const_iterator it = profile_manager->begin(); 898bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != profile_manager->end(); ++it) { 899bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager* process_manager = 900bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*it)->GetExtensionProcessManager(); 901bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (process_manager) { 902bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager::const_iterator jt; 903bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (jt = process_manager->begin(); jt != process_manager->end(); ++jt) 904bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(*jt); 905bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 906bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 907bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If we have an incognito profile active, include the split-mode incognito 908bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // extensions. 909bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (BrowserList::IsOffTheRecordSessionActive()) { 910bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager* process_manager = 911bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*it)->GetOffTheRecordProfile()->GetExtensionProcessManager(); 912bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (process_manager) { 913bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager::const_iterator jt; 914bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (jt = process_manager->begin(); jt != process_manager->end(); ++jt) 915bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(*jt); 916bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 917bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 918bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 919bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 920bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications about extension process changes. 921bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_PROCESS_CREATED, 922bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 923bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_PROCESS_TERMINATED, 924bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 925bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, 926bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 927bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 928bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 929bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StopUpdating() { 930bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 931bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 932bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 933bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications about extension process changes. 934bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_CREATED, 935bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 936bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_TERMINATED, 937bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 938bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_HOST_DESTROYED, 939bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 940bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 941bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 942bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 943bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 944bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 945bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.clear(); 946bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 947bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 948bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::Observe( 949bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 950bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 951bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 952bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 953bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_PROCESS_CREATED: 954bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(Details<ExtensionHost>(details).ptr()); 955bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 956bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_PROCESS_TERMINATED: 957bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_HOST_DESTROYED: 958bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RemoveFromTaskManager(Details<ExtensionHost>(details).ptr()); 959bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 960bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 961bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 962bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 963bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 964bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 965bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 966bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::AddToTaskManager( 967bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) { 968bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Don't add dead extension processes. 969bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!extension_host->IsRenderViewLive()) 970bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 971bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 972bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResource* resource = 973bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerExtensionProcessResource(extension_host); 974bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(extension_host) == resources_.end()); 975bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[extension_host] = resource; 976bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_[resource->process_id()] = resource; 977bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 978bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 979bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 980bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::RemoveFromTaskManager( 981bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) { 982bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 983bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 984bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ExtensionHost*, TaskManagerExtensionProcessResource*> 985bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ::iterator iter = resources_.find(extension_host); 986bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) 987bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 988bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 989bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 990bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResource* resource = iter->second; 991bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 992bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 993bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the provider. 994bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 995bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 996bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from our pid map. 997bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerExtensionProcessResource*>::iterator pid_iter = 998bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(resource->process_id()); 999bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(pid_iter != pid_to_resources_.end()); 1000bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid_iter != pid_to_resources_.end()) 1001bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.erase(pid_iter); 1002bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1003bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 1004bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 1005bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1006bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1007bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1008bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResource class 1009bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1010bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1011bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerNotificationResource::default_icon_ = NULL; 1012bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1013bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::TaskManagerNotificationResource( 1014bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) 1015bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : balloon_host_(balloon_host) { 1016bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 1017bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 1018bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 1019bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1020bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen process_handle_ = balloon_host_->render_view_host()->process()->GetHandle(); 1021bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_handle_); 1022bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = UTF16ToWide(l10n_util::GetStringFUTF16( 1023bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_NOTIFICATION_PREFIX, 1024bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen balloon_host_->GetSource())); 1025bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1026bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1027bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::~TaskManagerNotificationResource() { 1028bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1029bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1030bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerNotificationResource::GetIcon() const { 1031bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 1032bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1033bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1034bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerNotificationResource::GetProcess() const { 1035bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return process_handle_; 1036bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1037bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1038bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1039bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResourceProvider class 1040bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1041bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1042bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider:: 1043bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResourceProvider(TaskManager* task_manager) 1044bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : task_manager_(task_manager), 1045bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_(false) { 1046bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1047bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1048bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider:: 1049bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerNotificationResourceProvider() { 1050bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1051bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1052bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerNotificationResourceProvider::GetResource( 1053bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 1054bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 1055bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 1056bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(johnnyg): provide resources by pid if necessary. 1057bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 1058bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1059bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1060bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StartUpdating() { 1061bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 1062bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 1063bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1064bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing BalloonHosts. 1065bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonCollection* collection = 1066bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_browser_process->notification_ui_manager()->balloon_collection(); 1067bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons(); 1068bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (BalloonCollection::Balloons::const_iterator it = balloons.begin(); 1069bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != balloons.end(); ++it) { 1070bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager((*it)->view()->GetHost()); 1071bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1072bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1073bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications about extension process changes. 1074bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::NOTIFY_BALLOON_CONNECTED, 1075bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 1076bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, 1077bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 1078bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1079bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1080bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StopUpdating() { 1081bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 1082bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 1083bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1084bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications about extension process changes. 1085bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_CONNECTED, 1086bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 1087bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, 1088bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 1089bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1090bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 1091bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 1092bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 1093bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1094bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1095bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::Observe( 1096bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 1097bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 1098bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 1099bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 1100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::NOTIFY_BALLOON_CONNECTED: 1101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(Source<BalloonHost>(source).ptr()); 1102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 1103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::NOTIFY_BALLOON_DISCONNECTED: 1104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RemoveFromTaskManager(Source<BalloonHost>(source).ptr()); 1105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 1106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 1107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 1108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 1109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::AddToTaskManager( 1113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) { 1114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResource* resource = 1115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerNotificationResource(balloon_host); 1116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(balloon_host) == resources_.end()); 1117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[balloon_host] = resource; 1118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 1119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::RemoveFromTaskManager( 1122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) { 1123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 1124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 1125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<BalloonHost*, TaskManagerNotificationResource*>::iterator iter = 1126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.find(balloon_host); 1127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) 1128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 1129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 1131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResource* resource = iter->second; 1132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 1133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the map. 1135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 1136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 1138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 1139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResource class 1143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerBrowserProcessResource::default_icon_ = NULL; 1146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::TaskManagerBrowserProcessResource() 1148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : title_() { 1149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetCurrentProcId(); 1150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool success = base::OpenPrivilegedProcessHandle(pid_, &process_); 1151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(success); 1152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN) 1153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 1154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen HICON icon = GetAppIcon(); 1155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (icon) { 1156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ICONINFO icon_info = {0}; 1157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BITMAP bitmap_info = {0}; 1158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetIconInfo(icon, &icon_info); 1160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetObject(icon_info.hbmMask, sizeof(bitmap_info), &bitmap_info); 1161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size icon_size(bitmap_info.bmWidth, bitmap_info.bmHeight); 1163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = IconUtil::CreateSkBitmapFromHICON(icon, icon_size); 1164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_LINUX) 1167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 1168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 1169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PRODUCT_LOGO_16); 1170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_MACOSX) 1172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 1173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // IDR_PRODUCT_LOGO_16 doesn't quite look like chrome/mac's icns icon. Load 1174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the real app icon (requires a nsimage->skbitmap->nsimage conversion :-(). 1175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = new SkBitmap(gfx::AppplicationIconAtSize(16)); 1176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else 1178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(port): Port icon code. 1179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTIMPLEMENTED(); 1180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // defined(OS_WIN) 1181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::~TaskManagerBrowserProcessResource() { 1184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::CloseProcessHandle(process_); 1185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerResource methods: 1188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerBrowserProcessResource::GetTitle() const { 1189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (title_.empty()) { 1190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = l10n_util::GetString(IDS_TASK_MANAGER_WEB_BROWSER_CELL_TEXT); 1191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 1193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerBrowserProcessResource::GetIcon() const { 1196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 1197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsensize_t TaskManagerBrowserProcessResource::SqliteMemoryUsedBytes() const { 1200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return static_cast<size_t>(sqlite3_memory_used()); 1201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerBrowserProcessResource::GetProcess() const { 1204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return base::GetCurrentProcessHandle(); // process_; 1205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResourceProvider class 1209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 1210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider:: 1212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerBrowserProcessResourceProvider(TaskManager* task_manager) 1213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 1214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 1215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider:: 1218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerBrowserProcessResourceProvider() { 1219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerBrowserProcessResourceProvider::GetResource( 1222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 1223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 1224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 1225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (origin_pid != resource_.process_id()) { 1226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 1227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return &resource_; 1230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StartUpdating() { 1233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(&resource_); 1234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StopUpdating() { 1237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1238