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