task_manager_resource_providers.cc revision bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293
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_process.h" 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_list.h" 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chrome_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 357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerChildProcessResourceProvider class 359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider:: 362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResourceProvider(TaskManager* task_manager) 363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider:: 368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerChildProcessResourceProvider() { 369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerChildProcessResourceProvider::GetResource( 372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerChildProcessResource*>::iterator iter = 376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(origin_pid); 377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != pid_to_resources_.end()) 378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return iter->second; 379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen else 380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StartUpdating() { 384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications to get new child processes. 388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED, 389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_DISCONNECTED, 391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Get the existing child processes. 394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChromeThread::PostTask( 395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChromeThread::IO, FROM_HERE, 396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NewRunnableMethod( 397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen this, 398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo)); 399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StopUpdating() { 402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications to get new plugin processes. 406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED, 407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, 409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::CHILD_PROCESS_HOST_DISCONNECTED, 410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.clear(); 417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.clear(); 418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Observe( 421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::CHILD_PROCESS_HOST_CONNECTED: 426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*Details<ChildProcessInfo>(details).ptr()); 427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::CHILD_PROCESS_HOST_DISCONNECTED: 429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Remove(*Details<ChildProcessInfo>(details).ptr()); 430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Add( 438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChildProcessInfo child_process_info) { 439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ChildProcessInfo, TaskManagerChildProcessResource*>:: 442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const_iterator iter = resources_.find(child_process_info); 443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != resources_.end()) { 444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The case may happen that we have added a child_process_info as part of 445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the iteration performed during StartUpdating() call but the notification 446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // that it has connected was not fired yet. So when the notification 447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // happens, we already know about this plugin and just ignore it. 448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(child_process_info); 451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Remove( 454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChildProcessInfo child_process_info) { 455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ChildProcessInfo, TaskManagerChildProcessResource*> 458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ::iterator iter = resources_.find(child_process_info); 459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) { 460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // ChildProcessInfo disconnection notifications are asynchronous, so we 461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // might be notified for a plugin we don't know anything about (if it was 462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // closed before the task manager was shown and destroyed after that). 463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResource* resource = iter->second; 467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the provider. 469bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from our pid map. 471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerChildProcessResource*>::iterator pid_iter = 472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(resource->process_id()); 473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(pid_iter != pid_to_resources_.end()); 474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid_iter != pid_to_resources_.end()) 475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.erase(pid_iter); 476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::AddToTaskManager( 482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChildProcessInfo child_process_info) { 483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerChildProcessResource* resource = 484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerChildProcessResource(child_process_info); 485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[child_process_info] = resource; 486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_[resource->process_id()] = resource; 487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The ChildProcessInfo::Iterator has to be used from the IO thread. 491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo() { 492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) { 493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Only add processes which are already started, since we need their handle. 494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if ((*iter)->handle() != base::kNullProcessHandle) 495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.push_back(**iter); 496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Now notify the UI thread that we have retrieved information about child 498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // processes. 499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChromeThread::PostTask( 500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ChromeThread::UI, FROM_HERE, 501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NewRunnableMethod(this, 502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived)); 503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This is called on the UI thread. 506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived() { 507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::vector<ChildProcessInfo>::const_iterator iter; 508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (iter = existing_child_process_info_.begin(); 509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter != existing_child_process_info_.end(); ++iter) { 510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Add(*iter); 511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen existing_child_process_info_.clear(); 513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResource class 517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerExtensionProcessResource::default_icon_ = NULL; 520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::TaskManagerExtensionProcessResource( 522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) 523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : extension_host_(extension_host) { 524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 526bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen process_handle_ = extension_host_->render_process_host()->GetHandle(); 529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_handle_); 530bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::wstring extension_name(UTF8ToWide(GetExtension()->name())); 531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!extension_name.empty()); 532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int message_id = 534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetExtension()->is_app() ? 535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (extension_host_->profile()->IsOffTheRecord() ? 536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX : 537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_APP_PREFIX) : 538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (extension_host_->profile()->IsOffTheRecord() ? 539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_EXTENSION_INCOGNITO_PREFIX : 540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_EXTENSION_PREFIX); 541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = l10n_util::GetStringF(message_id, extension_name); 542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::~TaskManagerExtensionProcessResource() { 545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerExtensionProcessResource::GetTitle() const { 548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerExtensionProcessResource::GetIcon() const { 552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerExtensionProcessResource::GetProcess() const { 556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return process_handle_; 557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst Extension* TaskManagerExtensionProcessResource::GetExtension() const { 560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return extension_host_->extension(); 561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResourceProvider class 565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider:: 568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResourceProvider(TaskManager* task_manager) 569bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : task_manager_(task_manager), 570bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_(false) { 571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider:: 574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerExtensionProcessResourceProvider() { 575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 576bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerExtensionProcessResourceProvider::GetResource( 578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerExtensionProcessResource*>::iterator iter = 582bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(origin_pid); 583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter != pid_to_resources_.end()) 584bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return iter->second; 585bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen else 586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 589bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StartUpdating() { 590bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 591bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 592bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 593bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing ExtensionHosts. 594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ProfileManager* profile_manager = g_browser_process->profile_manager(); 595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (ProfileManager::const_iterator it = profile_manager->begin(); 596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != profile_manager->end(); ++it) { 597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager* process_manager = 598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*it)->GetExtensionProcessManager(); 599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (process_manager) { 600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager::const_iterator jt; 601bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (jt = process_manager->begin(); jt != process_manager->end(); ++jt) 602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(*jt); 603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 604bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If we have an incognito profile active, include the split-mode incognito 606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // extensions. 607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (BrowserList::IsOffTheRecordSessionActive()) { 608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager* process_manager = 609bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*it)->GetOffTheRecordProfile()->GetExtensionProcessManager(); 610bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (process_manager) { 611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionProcessManager::const_iterator jt; 612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (jt = process_manager->begin(); jt != process_manager->end(); ++jt) 613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(*jt); 614bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 615bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications about extension process changes. 619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_PROCESS_CREATED, 620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_PROCESS_TERMINATED, 622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, 624bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 625bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StopUpdating() { 628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications about extension process changes. 632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_CREATED, 633bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 634bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_TERMINATED, 635bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 636bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::EXTENSION_HOST_DESTROYED, 637bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 641bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 642bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 643bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.clear(); 644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 646bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::Observe( 647bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_PROCESS_CREATED: 652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(Details<ExtensionHost>(details).ptr()); 653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_PROCESS_TERMINATED: 655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::EXTENSION_HOST_DESTROYED: 656bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RemoveFromTaskManager(Details<ExtensionHost>(details).ptr()); 657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::AddToTaskManager( 665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) { 666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Don't add dead extension processes. 667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!extension_host->IsRenderViewLive()) 668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResource* resource = 671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerExtensionProcessResource(extension_host); 672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(extension_host) == resources_.end()); 673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[extension_host] = resource; 674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_[resource->process_id()] = resource; 675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::RemoveFromTaskManager( 679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionHost* extension_host) { 680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<ExtensionHost*, TaskManagerExtensionProcessResource*> 683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ::iterator iter = resources_.find(extension_host); 684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) 685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 686bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 688bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerExtensionProcessResource* resource = iter->second; 689bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 691bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the provider. 692bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 693bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 694bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from our pid map. 695bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, TaskManagerExtensionProcessResource*>::iterator pid_iter = 696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.find(resource->process_id()); 697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(pid_iter != pid_to_resources_.end()); 698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pid_iter != pid_to_resources_.end()) 699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_to_resources_.erase(pid_iter); 700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResource class 707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerNotificationResource::default_icon_ = NULL; 710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::TaskManagerNotificationResource( 712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) 713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : balloon_host_(balloon_host) { 714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN); 717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen process_handle_ = balloon_host_->render_view_host()->process()->GetHandle(); 719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetProcId(process_handle_); 720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = UTF16ToWide(l10n_util::GetStringFUTF16( 721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_TASK_MANAGER_NOTIFICATION_PREFIX, 722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen balloon_host_->GetSource())); 723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 724bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 725bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::~TaskManagerNotificationResource() { 726bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerNotificationResource::GetIcon() const { 729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerNotificationResource::GetProcess() const { 733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return process_handle_; 734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResourceProvider class 738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider:: 741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResourceProvider(TaskManager* task_manager) 742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : task_manager_(task_manager), 743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_(false) { 744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 746bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider:: 747bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerNotificationResourceProvider() { 748bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 749bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 750bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerNotificationResourceProvider::GetResource( 751bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 752bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 754bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(johnnyg): provide resources by pid if necessary. 755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StartUpdating() { 759bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(!updating_); 760bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = true; 761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add all the existing BalloonHosts. 763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonCollection* collection = 764bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_browser_process->notification_ui_manager()->balloon_collection(); 765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons(); 766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (BalloonCollection::Balloons::const_iterator it = balloons.begin(); 767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != balloons.end(); ++it) { 768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager((*it)->view()->GetHost()); 769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 771bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for notifications about extension process changes. 772bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::NOTIFY_BALLOON_CONNECTED, 773bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 774bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, 775bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 776bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 777bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 778bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StopUpdating() { 779bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(updating_); 780bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen updating_ = false; 781bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 782bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Unregister for notifications about extension process changes. 783bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_CONNECTED, 784bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 785bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED, 786bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 787bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 788bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Delete all the resources. 789bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 790bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.clear(); 791bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 792bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 793bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::Observe( 794bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType type, 795bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationSource& source, 796bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NotificationDetails& details) { 797bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (type.value) { 798bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::NOTIFY_BALLOON_CONNECTED: 799bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddToTaskManager(Source<BalloonHost>(source).ptr()); 800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case NotificationType::NOTIFY_BALLOON_DISCONNECTED: 802bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RemoveFromTaskManager(Source<BalloonHost>(source).ptr()); 803bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 804bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 805bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unexpected notification."; 806bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 807bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 808bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 809bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 810bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::AddToTaskManager( 811bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) { 812bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResource* resource = 813bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TaskManagerNotificationResource(balloon_host); 814bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(resources_.find(balloon_host) == resources_.end()); 815bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_[balloon_host] = resource; 816bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(resource); 817bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 818bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 819bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::RemoveFromTaskManager( 820bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BalloonHost* balloon_host) { 821bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!updating_) 822bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 823bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<BalloonHost*, TaskManagerNotificationResource*>::iterator iter = 824bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.find(balloon_host); 825bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (iter == resources_.end()) 826bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 827bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 828bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove the resource from the Task Manager. 829bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerNotificationResource* resource = iter->second; 830bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->RemoveResource(resource); 831bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 832bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove it from the map. 833bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources_.erase(iter); 834bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 835bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Finally, delete the resource. 836bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete resource; 837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResource class 841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerBrowserProcessResource::default_icon_ = NULL; 844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::TaskManagerBrowserProcessResource() 846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : title_() { 847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pid_ = base::GetCurrentProcId(); 848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool success = base::OpenPrivilegedProcessHandle(pid_, &process_); 849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(success); 850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN) 851bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen HICON icon = GetAppIcon(); 853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (icon) { 854bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ICONINFO icon_info = {0}; 855bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BITMAP bitmap_info = {0}; 856bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 857bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetIconInfo(icon, &icon_info); 858bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetObject(icon_info.hbmMask, sizeof(bitmap_info), &bitmap_info); 859bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 860bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size icon_size(bitmap_info.bmWidth, bitmap_info.bmHeight); 861bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = IconUtil::CreateSkBitmapFromHICON(icon, icon_size); 862bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 863bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 864bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_LINUX) 865bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 866bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 867bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = rb.GetBitmapNamed(IDR_PRODUCT_LOGO_16); 868bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 869bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_MACOSX) 870bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!default_icon_) { 871bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // IDR_PRODUCT_LOGO_16 doesn't quite look like chrome/mac's icns icon. Load 872bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the real app icon (requires a nsimage->skbitmap->nsimage conversion :-(). 873bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default_icon_ = new SkBitmap(gfx::AppplicationIconAtSize(16)); 874bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 875bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else 876bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(port): Port icon code. 877bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTIMPLEMENTED(); 878bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // defined(OS_WIN) 879bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 880bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 881bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::~TaskManagerBrowserProcessResource() { 882bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::CloseProcessHandle(process_); 883bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 884bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 885bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerResource methods: 886bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring TaskManagerBrowserProcessResource::GetTitle() const { 887bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (title_.empty()) { 888bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = l10n_util::GetString(IDS_TASK_MANAGER_WEB_BROWSER_CELL_TEXT); 889bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 890bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return title_; 891bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 892bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 893bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerBrowserProcessResource::GetIcon() const { 894bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *default_icon_; 895bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 896bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 897bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsensize_t TaskManagerBrowserProcessResource::SqliteMemoryUsedBytes() const { 898bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return static_cast<size_t>(sqlite3_memory_used()); 899bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 900bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 901bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerBrowserProcessResource::GetProcess() const { 902bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return base::GetCurrentProcessHandle(); // process_; 903bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 904bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 905bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 906bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResourceProvider class 907bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 908bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 909bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider:: 910bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TaskManagerBrowserProcessResourceProvider(TaskManager* task_manager) 911bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : updating_(false), 912bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_(task_manager) { 913bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 914bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 915bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider:: 916bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerBrowserProcessResourceProvider() { 917bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 918bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 919bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerBrowserProcessResourceProvider::GetResource( 920bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_pid, 921bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_id, 922bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id) { 923bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (origin_pid != resource_.process_id()) { 924bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 925bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 926bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 927bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return &resource_; 928bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 929bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 930bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StartUpdating() { 931bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen task_manager_->AddResource(&resource_); 932bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 933bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 934bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StopUpdating() { 935bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 936