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