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