task_manager_resource_providers.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
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" 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/app/chrome_dll_resource.h" 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_child_process_host.h" 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_list.h" 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_process.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_thread.h" 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_host.h" 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_process_manager.h" 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/balloon_collection.h" 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/balloon_host.h" 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/notification_ui_manager.h" 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/profile_manager.h" 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/render_process_host.h" 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/render_view_host.h" 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/resource_message_filter.h" 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/tab_contents/tab_util.h" 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/tab_contents/tab_contents.h" 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/extensions/extension.h" 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/notification_service.h" 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/render_messages.h" 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/sqlite_utils.h" 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h" 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/theme_resources.h" 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_MACOSX) 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "skia/ext/skia_utils_mac.h" 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN) 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/app_icon_win.h" 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "gfx/icon_util.h" 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // defined(OS_WIN) 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerTabContentsResource class 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResource::TaskManagerTabContentsResource( 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TabContents* tab_contents) 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : tab_contents_(tab_contents), 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_stats_update_(false), 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_allocated_(0), 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_used_(0), 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_v8_memory_allocated_update_(false) { 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We cache the process as when the TabContents is closed the process 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // becomes NULL and the TaskManager still needs it. 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen process_ = tab_contents_->GetRenderProcessHost()->GetHandle(); 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_); 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.images.size = 0; 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.cssStyleSheets.size = 0; 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.scripts.size = 0; 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.xslStyleSheets.size = 0; 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_.fonts.size = 0; 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResource::~TaskManagerTabContentsResource() { 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerTabContentsResource::GetTitle() const { 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Fall back on the URL if there's no title. 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::wstring tab_title(UTF16ToWideHack(tab_contents_->GetTitle())); 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tab_title.empty()) { 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_title = UTF8ToWide(tab_contents_->GetURL().spec()); 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Force URL to be LTR. 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_title = UTF16ToWide(base::i18n::GetDisplayStringInLTRDirectionality( 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen WideToUTF16(tab_title))); 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Since the tab_title will be concatenated with 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // IDS_TASK_MANAGER_TAB_PREFIX, we need to explicitly set the tab_title to 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // be LTR format if there is no strong RTL charater in it. Otherwise, if 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // IDS_TASK_MANAGER_TAB_PREFIX is an RTL word, the concatenated result 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // might be wrong. For example, http://mail.yahoo.com, whose title is 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // "Yahoo! Mail: The best web-based Email!", without setting it explicitly 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // as LTR format, the concatenated result will be "!Yahoo! Mail: The best 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // web-based Email :BAT", in which the capital letters "BAT" stands for 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the Hebrew word for "tab". 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::i18n::AdjustStringForLocaleDirection(tab_title, &tab_title); 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return l10n_util::GetStringF(IDS_TASK_MANAGER_TAB_PREFIX, tab_title); 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResource::Refresh() { 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pending_stats_update_) { 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_contents_->render_view_host()->Send(new ViewMsg_GetCacheResourceStats); 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_stats_update_ = true; 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pending_v8_memory_allocated_update_) { 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_contents_->render_view_host()->Send(new ViewMsg_GetV8HeapStats); 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_v8_memory_allocated_update_ = true; 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenWebKit::WebCache::ResourceTypeStats 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerTabContentsResource::GetWebCoreCacheStats() const { 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return stats_; 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsensize_t TaskManagerTabContentsResource::GetV8MemoryAllocated() const { 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return v8_memory_allocated_; 116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsensize_t TaskManagerTabContentsResource::GetV8MemoryUsed() const { 119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return v8_memory_used_; 120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResource::NotifyResourceTypeStats( 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const WebKit::WebCache::ResourceTypeStats& stats) { 124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen stats_ = stats; 125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_stats_update_ = false; 126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResource::NotifyV8HeapStats( 129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size_t v8_memory_allocated, size_t v8_memory_used) { 130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_allocated_ = v8_memory_allocated; 131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen v8_memory_used_ = v8_memory_used; 132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pending_v8_memory_allocated_update_ = false; 133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerTabContentsResource::GetIcon() const { 136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return tab_contents_->GetFavIcon(); 137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerTabContentsResource::GetProcess() const { 140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return process_; 141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTabContents* TaskManagerTabContentsResource::GetTabContents() const { 144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return static_cast<TabContents*>(tab_contents_); 145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerTabContentsResourceProvider class 149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResourceProvider:: 152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerTabContentsResourceProvider(TaskManager* task_manager) 153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResourceProvider:: 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerTabContentsResourceProvider() { 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerTabContentsResourceProvider::GetResource( 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TabContents* tab_contents = 167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_util::GetTabContentsByID(render_process_host_id, routing_id); 168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!tab_contents) // Not one of our resource. 169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::ProcessHandle process_handle = 172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_contents->GetRenderProcessHost()->GetHandle(); 173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!process_handle) { 174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We should not be holding on to a dead tab (it should have been removed 175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // through the NOTIFY_TAB_CONTENTS_DISCONNECTED notification. 176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED(); 177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int pid = base::GetProcId(process_handle); 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid != origin_pid) 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<TabContents*, TaskManagerTabContentsResource*>::iterator 185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen res_iter = resources_.find(tab_contents); 186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (res_iter == resources_.end()) 187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Can happen if the tab was closed while a network request was being 188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // performed. 189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return res_iter->second; 192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::StartUpdating() { 195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing TabContents. 199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (TabContentsIterator iterator; !iterator.done(); ++iterator) 200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*iterator); 201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Then we register for notifications to get new tabs. 203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_CONNECTED, 204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_SWAPPED, 206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_DISCONNECTED, 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TAB_CONTENTS_DISCONNECTED should be enough to know when to remove a 210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // resource. This is an attempt at mitigating a crasher that seem to 211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // indicate a resource is still referencing a deleted TabContents 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // (http://crbug.com/7321). 213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED, 214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::StopUpdating() { 218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Then we unregister for notifications to get new tabs. 222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_CONNECTED, 223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_SWAPPED, 225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_DISCONNECTED, 227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::TAB_CONTENTS_DESTROYED, 229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::AddToTaskManager( 238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TabContents* tab_contents) { 239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerTabContentsResource* resource = 240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerTabContentsResource(tab_contents); 241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[tab_contents] = resource; 242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Add(TabContents* tab_contents) { 246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Don't add dead tabs or tabs that haven't yet connected. 250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Also ignore tabs which display extension content. We collapse 251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // all of these into one extension row. 252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!tab_contents->GetRenderProcessHost()->GetHandle() || 253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen !tab_contents->notify_disconnection() || 254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tab_contents->HostsExtension()) { 255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<TabContents*, TaskManagerTabContentsResource*>::const_iterator 259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter = resources_.find(tab_contents); 260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != resources_.end()) { 261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The case may happen that we have added a TabContents as part of the 262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // iteration performed during StartUpdating() call but the notification that 263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // it has connected was not fired yet. So when the notification happens, we 264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // already know about this tab and just ignore it. 265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(tab_contents); 268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Remove(TabContents* tab_contents) { 271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<TabContents*, TaskManagerTabContentsResource*>::iterator 274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter = resources_.find(tab_contents); 275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) { 276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Since TabContents are destroyed asynchronously (see TabContentsCollector 277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // in navigation_controller.cc), we can be notified of a tab being removed 278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // that we don't know. This can happen if the user closes a tab and quickly 279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // opens the task manager, before the tab is actually destroyed. 280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerTabContentsResource* resource = iter->second; 285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // And from the provider. 287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Observe(NotificationType type, 293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_CONNECTED: 297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(Source<TabContents>(source).ptr()); 298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_SWAPPED: 300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Remove(Source<TabContents>(source).ptr()); 301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(Source<TabContents>(source).ptr()); 302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_DESTROYED: 304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If this DCHECK is triggered, it could explain http://crbug.com/7321. 305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(Source<TabContents>(source).ptr()) == 306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.end()) << "TAB_CONTENTS_DESTROYED with no associated " 307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "TAB_CONTENTS_DISCONNECTED"; 308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Fall through. 309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::TAB_CONTENTS_DISCONNECTED: 310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Remove(Source<TabContents>(source).ptr()); 311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerChildProcessResource class 320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerChildProcessResource::default_icon_ = NULL; 322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResource::TaskManagerChildProcessResource( 324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChildProcessInfo child_proc) 325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : child_process_(child_proc), 326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_(), 327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen network_usage_support_(false) { 328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We cache the process id because it's not cheap to calculate, and it won't 329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // be available when we get the plugin disconnected notification. 330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = child_proc.id(); 331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(jabdelmalek): use different icon for web workers. 335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResource::~TaskManagerChildProcessResource() { 339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerResource methods: 342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerChildProcessResource::GetTitle() const { 343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (title_.empty()) 344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = UTF16ToWideHack(child_process_.GetLocalizedTitle()); 345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerChildProcessResource::GetIcon() const { 350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerChildProcessResource::GetProcess() const { 354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return child_process_.handle(); 355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 357731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTaskManager::Resource::Type TaskManagerChildProcessResource::GetType() const { 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Translate types to TaskManager::ResourceType, since ChildProcessInfo's type 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // is not available for all TaskManager resources. 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (child_process_.type()) { 361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::BROWSER_PROCESS: 362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::BROWSER; 363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::RENDER_PROCESS: 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::RENDERER; 365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::PLUGIN_PROCESS: 366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::PLUGIN; 367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::WORKER_PROCESS: 368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::WORKER; 369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::NACL_LOADER_PROCESS: 370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::NACL_BROKER_PROCESS: 371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::NACL; 372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::UTILITY_PROCESS: 373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::UTILITY; 374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::PROFILE_IMPORT_PROCESS: 375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::PROFILE_IMPORT; 376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::ZYGOTE_PROCESS: 377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::ZYGOTE; 378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::SANDBOX_HELPER_PROCESS: 379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::SANDBOX_HELPER; 380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case ChildProcessInfo::GPU_PROCESS: 381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::GPU; 382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TaskManager::Resource::UNKNOWN; 384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 385731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerChildProcessResourceProvider class 389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider:: 392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResourceProvider(TaskManager* task_manager) 393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider:: 398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerChildProcessResourceProvider() { 399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerChildProcessResourceProvider::GetResource( 402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerChildProcessResource*>::iterator iter = 406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(origin_pid); 407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != pid_to_resources_.end()) 408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return iter->second; 409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen else 410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StartUpdating() { 414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications to get new child processes. 418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED, 419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_DISCONNECTED, 421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Get the existing child processes. 424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NewRunnableMethod( 427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen this, 428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo)); 429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StopUpdating() { 432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications to get new plugin processes. 436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED, 437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, 439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::CHILD_PROCESS_HOST_DISCONNECTED, 440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.clear(); 447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.clear(); 448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Observe( 451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::CHILD_PROCESS_HOST_CONNECTED: 456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*Details<ChildProcessInfo>(details).ptr()); 457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::CHILD_PROCESS_HOST_DISCONNECTED: 459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Remove(*Details<ChildProcessInfo>(details).ptr()); 460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Add( 468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChildProcessInfo child_process_info) { 469bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ChildProcessInfo, TaskManagerChildProcessResource*>:: 472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const_iterator iter = resources_.find(child_process_info); 473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != resources_.end()) { 474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The case may happen that we have added a child_process_info as part of 475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the iteration performed during StartUpdating() call but the notification 476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // that it has connected was not fired yet. So when the notification 477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // happens, we already know about this plugin and just ignore it. 478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(child_process_info); 481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Remove( 484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChildProcessInfo child_process_info) { 485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ChildProcessInfo, TaskManagerChildProcessResource*> 488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ::iterator iter = resources_.find(child_process_info); 489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) { 490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // ChildProcessInfo disconnection notifications are asynchronous, so we 491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // might be notified for a plugin we don't know anything about (if it was 492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // closed before the task manager was shown and destroyed after that). 493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResource* resource = iter->second; 497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the provider. 499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from our pid map. 501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerChildProcessResource*>::iterator pid_iter = 502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(resource->process_id()); 503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(pid_iter != pid_to_resources_.end()); 504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid_iter != pid_to_resources_.end()) 505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.erase(pid_iter); 506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::AddToTaskManager( 512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChildProcessInfo child_process_info) { 513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResource* resource = 514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerChildProcessResource(child_process_info); 515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[child_process_info] = resource; 516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_[resource->process_id()] = resource; 517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The ChildProcessInfo::Iterator has to be used from the IO thread. 521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo() { 522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) { 523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Only add processes which are already started, since we need their handle. 524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if ((*iter)->handle() != base::kNullProcessHandle) 525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.push_back(**iter); 526bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Now notify the UI thread that we have retrieved information about child 528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // processes. 529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::UI, FROM_HERE, 531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NewRunnableMethod(this, 532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived)); 533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This is called on the UI thread. 536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived() { 537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::vector<ChildProcessInfo>::const_iterator iter; 538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (iter = existing_child_process_info_.begin(); 539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter != existing_child_process_info_.end(); ++iter) { 540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*iter); 541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.clear(); 543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResource class 547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerExtensionProcessResource::default_icon_ = NULL; 550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::TaskManagerExtensionProcessResource( 552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) 553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : extension_host_(extension_host) { 554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen process_handle_ = extension_host_->render_process_host()->GetHandle(); 559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_handle_); 560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::wstring extension_name(UTF8ToWide(GetExtension()->name())); 561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!extension_name.empty()); 562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int message_id = 564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetExtension()->is_app() ? 565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (extension_host_->profile()->IsOffTheRecord() ? 566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX : 567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_APP_PREFIX) : 568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (extension_host_->profile()->IsOffTheRecord() ? 569bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_EXTENSION_INCOGNITO_PREFIX : 570bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_EXTENSION_PREFIX); 571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = l10n_util::GetStringF(message_id, extension_name); 572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::~TaskManagerExtensionProcessResource() { 575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 576bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerExtensionProcessResource::GetTitle() const { 578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerExtensionProcessResource::GetIcon() const { 582bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 584bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 585bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerExtensionProcessResource::GetProcess() const { 586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return process_handle_; 587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 589bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst Extension* TaskManagerExtensionProcessResource::GetExtension() const { 590bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return extension_host_->extension(); 591bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 592bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 593bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResourceProvider class 595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider:: 598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResourceProvider(TaskManager* task_manager) 599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : task_manager_(task_manager), 600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_(false) { 601bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider:: 604bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerExtensionProcessResourceProvider() { 605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerExtensionProcessResourceProvider::GetResource( 608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 609bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 610bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerExtensionProcessResource*>::iterator iter = 612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(origin_pid); 613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != pid_to_resources_.end()) 614bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return iter->second; 615bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen else 616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StartUpdating() { 620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing ExtensionHosts. 624bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ProfileManager* profile_manager = g_browser_process->profile_manager(); 625bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (ProfileManager::const_iterator it = profile_manager->begin(); 626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != profile_manager->end(); ++it) { 627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager* process_manager = 628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*it)->GetExtensionProcessManager(); 629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (process_manager) { 630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager::const_iterator jt; 631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (jt = process_manager->begin(); jt != process_manager->end(); ++jt) 632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(*jt); 633bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 634bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 635bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If we have an incognito profile active, include the split-mode incognito 636bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // extensions. 637bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (BrowserList::IsOffTheRecordSessionActive()) { 638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager* process_manager = 639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*it)->GetOffTheRecordProfile()->GetExtensionProcessManager(); 640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (process_manager) { 641bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager::const_iterator jt; 642bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (jt = process_manager->begin(); jt != process_manager->end(); ++jt) 643bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(*jt); 644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 646bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 647bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications about extension process changes. 649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_PROCESS_CREATED, 650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_PROCESS_TERMINATED, 652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, 654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 656bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StopUpdating() { 658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications about extension process changes. 662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_CREATED, 663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_TERMINATED, 665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_HOST_DESTROYED, 667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.clear(); 674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::Observe( 677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_PROCESS_CREATED: 682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(Details<ExtensionHost>(details).ptr()); 683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_PROCESS_TERMINATED: 685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_HOST_DESTROYED: 686bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RemoveFromTaskManager(Details<ExtensionHost>(details).ptr()); 687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 688bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 689bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 691bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 692bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 693bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 694bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::AddToTaskManager( 695bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) { 696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Don't add dead extension processes. 697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!extension_host->IsRenderViewLive()) 698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResource* resource = 701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerExtensionProcessResource(extension_host); 702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(extension_host) == resources_.end()); 703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[extension_host] = resource; 704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_[resource->process_id()] = resource; 705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::RemoveFromTaskManager( 709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) { 710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ExtensionHost*, TaskManagerExtensionProcessResource*> 713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ::iterator iter = resources_.find(extension_host); 714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) 715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResource* resource = iter->second; 719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the provider. 722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 724bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from our pid map. 725bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerExtensionProcessResource*>::iterator pid_iter = 726bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(resource->process_id()); 727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(pid_iter != pid_to_resources_.end()); 728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid_iter != pid_to_resources_.end()) 729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.erase(pid_iter); 730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResource class 737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerNotificationResource::default_icon_ = NULL; 740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::TaskManagerNotificationResource( 742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) 743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : balloon_host_(balloon_host) { 744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 746bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 747bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 748bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen process_handle_ = balloon_host_->render_view_host()->process()->GetHandle(); 749bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_handle_); 750bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = UTF16ToWide(l10n_util::GetStringFUTF16( 751bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_NOTIFICATION_PREFIX, 752bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen balloon_host_->GetSource())); 753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 754bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::~TaskManagerNotificationResource() { 756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerNotificationResource::GetIcon() const { 759bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 760bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerNotificationResource::GetProcess() const { 763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return process_handle_; 764bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResourceProvider class 768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider:: 771bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResourceProvider(TaskManager* task_manager) 772bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : task_manager_(task_manager), 773bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_(false) { 774bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 775bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 776bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider:: 777bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerNotificationResourceProvider() { 778bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 779bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 780bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerNotificationResourceProvider::GetResource( 781bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 782bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 783bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 784bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(johnnyg): provide resources by pid if necessary. 785bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 786bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 787bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 788bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StartUpdating() { 789bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 790bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 791bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 792bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing BalloonHosts. 793bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonCollection* collection = 794bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_browser_process->notification_ui_manager()->balloon_collection(); 795bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons(); 796bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (BalloonCollection::Balloons::const_iterator it = balloons.begin(); 797bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != balloons.end(); ++it) { 798bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager((*it)->view()->GetHost()); 799bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications about extension process changes. 802bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::NOTIFY_BALLOON_CONNECTED, 803bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 804bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, 805bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 806bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 807bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 808bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StopUpdating() { 809bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 810bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 811bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 812bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications about extension process changes. 813bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_CONNECTED, 814bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 815bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, 816bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 817bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 818bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 819bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 820bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 821bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 822bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 823bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::Observe( 824bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 825bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 826bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 827bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 828bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::NOTIFY_BALLOON_CONNECTED: 829bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(Source<BalloonHost>(source).ptr()); 830bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 831bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::NOTIFY_BALLOON_DISCONNECTED: 832bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RemoveFromTaskManager(Source<BalloonHost>(source).ptr()); 833bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 834bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 835bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 836bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::AddToTaskManager( 841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) { 842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResource* resource = 843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerNotificationResource(balloon_host); 844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(balloon_host) == resources_.end()); 845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[balloon_host] = resource; 846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::RemoveFromTaskManager( 850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) { 851bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<BalloonHost*, TaskManagerNotificationResource*>::iterator iter = 854bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.find(balloon_host); 855bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) 856bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 857bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 858bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 859bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResource* resource = iter->second; 860bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 861bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 862bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the map. 863bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 864bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 865bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 866bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 867bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 868bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 869bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 870bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResource class 871bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 872bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 873bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerBrowserProcessResource::default_icon_ = NULL; 874bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 875bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::TaskManagerBrowserProcessResource() 876bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : title_() { 877bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetCurrentProcId(); 878bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool success = base::OpenPrivilegedProcessHandle(pid_, &process_); 879bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(success); 880bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN) 881bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 882bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen HICON icon = GetAppIcon(); 883bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (icon) { 884bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ICONINFO icon_info = {0}; 885bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BITMAP bitmap_info = {0}; 886bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 887bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetIconInfo(icon, &icon_info); 888bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetObject(icon_info.hbmMask, sizeof(bitmap_info), &bitmap_info); 889bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 890bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size icon_size(bitmap_info.bmWidth, bitmap_info.bmHeight); 891bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = IconUtil::CreateSkBitmapFromHICON(icon, icon_size); 892bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 893bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 894bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_LINUX) 895bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 896bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 897bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PRODUCT_LOGO_16); 898bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 899bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_MACOSX) 900bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 901bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // IDR_PRODUCT_LOGO_16 doesn't quite look like chrome/mac's icns icon. Load 902bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the real app icon (requires a nsimage->skbitmap->nsimage conversion :-(). 903bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = new SkBitmap(gfx::AppplicationIconAtSize(16)); 904bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 905bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else 906bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(port): Port icon code. 907bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTIMPLEMENTED(); 908bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // defined(OS_WIN) 909bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 910bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 911bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::~TaskManagerBrowserProcessResource() { 912bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::CloseProcessHandle(process_); 913bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 914bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 915bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerResource methods: 916bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerBrowserProcessResource::GetTitle() const { 917bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (title_.empty()) { 918bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = l10n_util::GetString(IDS_TASK_MANAGER_WEB_BROWSER_CELL_TEXT); 919bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 920bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 921bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 922bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 923bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerBrowserProcessResource::GetIcon() const { 924bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 925bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 926bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 927bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsensize_t TaskManagerBrowserProcessResource::SqliteMemoryUsedBytes() const { 928bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return static_cast<size_t>(sqlite3_memory_used()); 929bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 930bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 931bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerBrowserProcessResource::GetProcess() const { 932bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return base::GetCurrentProcessHandle(); // process_; 933bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 934bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 935bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 936bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResourceProvider class 937bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 938bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 939bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider:: 940bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerBrowserProcessResourceProvider(TaskManager* task_manager) 941bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 942bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 943bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 944bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 945bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider:: 946bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerBrowserProcessResourceProvider() { 947bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 948bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 949bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerBrowserProcessResourceProvider::GetResource( 950bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 951bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 952bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 953bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (origin_pid != resource_.process_id()) { 954bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 955bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 956bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 957bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return &resource_; 958bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 959bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 960bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StartUpdating() { 961bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(&resource_); 962bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 963bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 964bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StopUpdating() { 965bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 966