172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 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 "base/basictypes.h"
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_version_info.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/i18n/rtl.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/process_util.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/stl_util-inl.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_util.h"
133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/utf_string_conversions.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "build/build_config.h"
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/background_contents_service.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/background_contents_service_factory.h"
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_process.h"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_host.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_process_manager.h"
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/balloon_collection.h"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/balloon_host.h"
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/notifications/notification_ui_manager.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prerender/prerender_contents.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prerender/prerender_manager.h"
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h"
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/tab_contents/background_contents.h"
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/tab_contents/tab_util.h"
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/extensions/extension.h"
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/render_messages.h"
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_child_process_host.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_message_filter.h"
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/theme_resources.h"
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "third_party/sqlite/sqlite3.h"
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_MACOSX)
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "skia/ext/skia_utils_mac.h"
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/app_icon_win.h"
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/icon_util.h"
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // defined(OS_WIN)
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace {
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Returns the appropriate message prefix ID for tabs and extensions,
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// reflecting whether they are apps or in incognito mode.
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenint GetMessagePrefixID(bool is_app, bool is_extension,
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       bool is_incognito) {
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return is_app ?
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      (is_incognito ?
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX :
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          IDS_TASK_MANAGER_APP_PREFIX) :
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      (is_extension ?
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          (is_incognito ?
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              IDS_TASK_MANAGER_EXTENSION_INCOGNITO_PREFIX :
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              IDS_TASK_MANAGER_EXTENSION_PREFIX) :
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          IDS_TASK_MANAGER_TAB_PREFIX);
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerRendererResource class
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerRendererResource::TaskManagerRendererResource(
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    base::ProcessHandle process, RenderViewHost* render_view_host)
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    : process_(process),
814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      render_view_host_(render_view_host),
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pending_stats_update_(false),
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      v8_memory_allocated_(0),
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      v8_memory_used_(0),
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pending_v8_memory_allocated_update_(false) {
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // We cache the process and pid as when a Tab/BackgroundContents is closed the
874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // process reference becomes NULL and the TaskManager still needs it.
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pid_ = base::GetProcId(process_);
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  stats_.images.size = 0;
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  stats_.cssStyleSheets.size = 0;
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  stats_.scripts.size = 0;
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  stats_.xslStyleSheets.size = 0;
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  stats_.fonts.size = 0;
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerRendererResource::~TaskManagerRendererResource() {
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerRendererResource::Refresh() {
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!pending_stats_update_) {
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    render_view_host_->Send(new ViewMsg_GetCacheResourceStats);
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pending_stats_update_ = true;
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!pending_v8_memory_allocated_update_) {
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    render_view_host_->Send(new ViewMsg_GetV8HeapStats);
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pending_v8_memory_allocated_update_ = true;
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenWebKit::WebCache::ResourceTypeStats
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerRendererResource::GetWebCoreCacheStats() const {
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return stats_;
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochsize_t TaskManagerRendererResource::GetV8MemoryAllocated() const {
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return v8_memory_allocated_;
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochsize_t TaskManagerRendererResource::GetV8MemoryUsed() const {
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return v8_memory_used_;
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerRendererResource::NotifyResourceTypeStats(
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const WebKit::WebCache::ResourceTypeStats& stats) {
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  stats_ = stats;
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pending_stats_update_ = false;
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerRendererResource::NotifyV8HeapStats(
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    size_t v8_memory_allocated, size_t v8_memory_used) {
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  v8_memory_allocated_ = v8_memory_allocated;
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  v8_memory_used_ = v8_memory_used;
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pending_v8_memory_allocated_update_ = false;
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbase::ProcessHandle TaskManagerRendererResource::GetProcess() const {
1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return process_;
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTaskManager::Resource::Type TaskManagerRendererResource::GetType() const {
14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return RENDERER;
14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerRendererResource::ReportsCacheStats() const {
14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerRendererResource::ReportsV8MemoryStats() const {
14921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
15121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerRendererResource::SupportNetworkUsage() const {
15321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerTabContentsResource class
1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerTabContentsResource::TaskManagerTabContentsResource(
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContentsWrapper* tab_contents)
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    : TaskManagerRendererResource(
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          tab_contents->tab_contents()->GetRenderProcessHost()->GetHandle(),
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          tab_contents->render_view_host()),
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      tab_contents_(tab_contents) {
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerTabContentsResource::~TaskManagerTabContentsResource() {
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
17121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTaskManager::Resource::Type TaskManagerTabContentsResource::GetType() const {
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return tab_contents_->tab_contents()->HostsExtension() ? EXTENSION : RENDERER;
17321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 TaskManagerTabContentsResource::GetTitle() const {
1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Fall back on the URL if there's no title.
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 tab_title = tab_contents_->tab_contents()->GetTitle();
1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (tab_title.empty()) {
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    tab_title = UTF8ToUTF16(tab_contents_->tab_contents()->GetURL().spec());
1804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Force URL to be LTR.
1813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    tab_title = base::i18n::GetDisplayStringInLTRDirectionality(tab_title);
1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  } else {
1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Since the tab_title will be concatenated with
1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // IDS_TASK_MANAGER_TAB_PREFIX, we need to explicitly set the tab_title to
1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // be LTR format if there is no strong RTL charater in it. Otherwise, if
1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // IDS_TASK_MANAGER_TAB_PREFIX is an RTL word, the concatenated result
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // might be wrong. For example, http://mail.yahoo.com, whose title is
1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // "Yahoo! Mail: The best web-based Email!", without setting it explicitly
1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // as LTR format, the concatenated result will be "!Yahoo! Mail: The best
1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // web-based Email :BAT", in which the capital letters "BAT" stands for
1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // the Hebrew word for "tab".
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    base::i18n::AdjustStringForLocaleDirection(&tab_title);
1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* extensions_service =
19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      tab_contents_->profile()->GetExtensionService();
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int message_id = GetMessagePrefixID(
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      extensions_service->IsInstalledApp(
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          tab_contents_->tab_contents()->GetURL()),
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_contents_->tab_contents()->HostsExtension(),
20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      tab_contents_->profile()->IsOffTheRecord());
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringFUTF16(message_id, tab_title);
2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochSkBitmap TaskManagerTabContentsResource::GetIcon() const {
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return tab_contents_->tab_contents()->GetFavicon();
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTabContentsWrapper* TaskManagerTabContentsResource::GetTabContents() const {
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return tab_contents_;
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst Extension* TaskManagerTabContentsResource::GetExtension() const {
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (tab_contents_->tab_contents()->HostsExtension()) {
21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ExtensionService* extensions_service =
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        tab_contents_->profile()->GetExtensionService();
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return extensions_service->GetExtensionByURL(
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        tab_contents_->tab_contents()->GetURL());
21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return NULL;
22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerTabContentsResourceProvider class
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResourceProvider::
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TaskManagerTabContentsResourceProvider(TaskManager* task_manager)
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    :  updating_(false),
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       task_manager_(task_manager) {
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerTabContentsResourceProvider::
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ~TaskManagerTabContentsResourceProvider() {
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerTabContentsResourceProvider::GetResource(
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int origin_pid,
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int render_process_host_id,
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int routing_id) {
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents =
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      tab_util::GetTabContentsByID(render_process_host_id, routing_id);
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!tab_contents)  // Not one of our resource.
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // If an origin PID was specified then the request originated in a plugin
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // working on the TabContent's behalf, so ignore it.
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (origin_pid)
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* wrapper =
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      TabContentsWrapper::GetCurrentWrapperForContents(tab_contents);
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::map<TabContentsWrapper*, TaskManagerTabContentsResource*>::iterator
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      res_iter = resources_.find(wrapper);
2564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (res_iter == resources_.end()) {
257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Can happen if the tab was closed while a network request was being
258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // performed.
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
2604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return res_iter->second;
262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::StartUpdating() {
265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!updating_);
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = true;
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Add all the existing TabContents.
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (TabContentsIterator iterator; !iterator.done(); ++iterator)
270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Add(*iterator);
271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Then we register for notifications to get new tabs.
273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::TAB_CONTENTS_CONNECTED,
274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::TAB_CONTENTS_SWAPPED,
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::TAB_CONTENTS_DISCONNECTED,
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TAB_CONTENTS_DISCONNECTED should be enough to know when to remove a
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resource.  This is an attempt at mitigating a crasher that seem to
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // indicate a resource is still referencing a deleted TabContents
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (http://crbug.com/7321).
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED,
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::StopUpdating() {
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(updating_);
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = false;
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Then we unregister for notifications to get new tabs.
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::TAB_CONTENTS_CONNECTED,
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::TAB_CONTENTS_SWAPPED,
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::TAB_CONTENTS_DISCONNECTED,
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::TAB_CONTENTS_DESTROYED,
299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Delete all the resources.
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.clear();
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::AddToTaskManager(
308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContentsWrapper* tab_contents) {
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerTabContentsResource* resource =
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new TaskManagerTabContentsResource(tab_contents);
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_[tab_contents] = resource;
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->AddResource(resource);
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Add(
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContentsWrapper* tab_contents) {
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!updating_)
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Don't add dead tabs or tabs that haven't yet connected.
321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!tab_contents->tab_contents()->GetRenderProcessHost()->GetHandle() ||
322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !tab_contents->tab_contents()->notify_disconnection()) {
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::map<TabContentsWrapper*, TaskManagerTabContentsResource*>::const_iterator
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      iter = resources_.find(tab_contents);
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter != resources_.end()) {
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // The case may happen that we have added a TabContents as part of the
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // iteration performed during StartUpdating() call but the notification that
331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // it has connected was not fired yet. So when the notification happens, we
332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // already know about this tab and just ignore it.
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddToTaskManager(tab_contents);
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Remove(
339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContentsWrapper* tab_contents) {
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!updating_)
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::map<TabContentsWrapper*, TaskManagerTabContentsResource*>::iterator
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      iter = resources_.find(tab_contents);
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter == resources_.end()) {
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Since TabContents are destroyed asynchronously (see TabContentsCollector
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // in navigation_controller.cc), we can be notified of a tab being removed
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // that we don't know.  This can happen if the user closes a tab and quickly
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // opens the task manager, before the tab is actually destroyed.
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove the resource from the Task Manager.
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerTabContentsResource* resource = iter->second;
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->RemoveResource(resource);
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // And from the provider.
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.erase(iter);
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Finally, delete the resource.
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete resource;
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerTabContentsResourceProvider::Observe(NotificationType type,
362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationSource& source,
363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationDetails& details) {
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* tab_contents =
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      TabContentsWrapper::GetCurrentWrapperForContents(
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          Source<TabContents>(source).ptr());
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A background page does not have a TabContentsWrapper.
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!tab_contents)
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  switch (type.value) {
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::TAB_CONTENTS_CONNECTED:
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Add(tab_contents);
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::TAB_CONTENTS_SWAPPED:
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Remove(tab_contents);
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Add(tab_contents);
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::TAB_CONTENTS_DESTROYED:
379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // If this DCHECK is triggered, it could explain http://crbug.com/7321 .
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(resources_.find(tab_contents) ==
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen             resources_.end()) << "TAB_CONTENTS_DESTROYED with no associated "
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                  "TAB_CONTENTS_DISCONNECTED";
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Fall through.
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::TAB_CONTENTS_DISCONNECTED:
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Remove(tab_contents);
386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default:
388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NOTREACHED() << "Unexpected notification.";
389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TaskManagerPrerenderResource class
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSkBitmap* TaskManagerPrerenderResource::default_icon_ = NULL;
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTaskManagerPrerenderResource::TaskManagerPrerenderResource(
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RenderViewHost* render_view_host)
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : TaskManagerRendererResource(
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          render_view_host->process()->GetHandle(),
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          render_view_host),
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      process_route_id_pair_(std::make_pair(render_view_host->process()->id(),
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            render_view_host->routing_id())) {
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!default_icon_) {
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default_icon_ = rb.GetBitmapNamed(IDR_PRERENDER);
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTaskManagerPrerenderResource::~TaskManagerPrerenderResource() {
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTaskManager::Resource::Type TaskManagerPrerenderResource::GetType() const {
416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return RENDERER;
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 TaskManagerPrerenderResource::GetTitle() const {
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The URL is used as the title.
421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(dominich): Expose document title through RenderHostDelegate.
422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // http://crbug.com/77776
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHost* render_view_host =
424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      RenderViewHost::FromID(process_route_id_pair_.first,
425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             process_route_id_pair_.second);
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // In some instances, for instance when the RenderProcessHost has been
428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // destroyed, we try to get the title for a RenderViewHost that has
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // been removed. Return an empty string in this case.
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!render_view_host)
431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return EmptyString16();
432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHostDelegate* delegate = render_view_host->delegate();
434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 title = UTF8ToUTF16(delegate->GetURL().spec());
436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Force URL to be LTR.
437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  title = base::i18n::GetDisplayStringInLTRDirectionality(title);
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int message_id = IDS_TASK_MANAGER_PRERENDER_PREFIX;
440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return l10n_util::GetStringFUTF16(message_id, title);
441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSkBitmap TaskManagerPrerenderResource::GetIcon() const {
444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(dominich): use the favicon if available.
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // http://crbug.com/77782
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return *default_icon_;
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TaskManagerPrerenderResourceProvider class
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTaskManagerPrerenderResourceProvider::TaskManagerPrerenderResourceProvider(
454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TaskManager* task_manager)
455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    :  updating_(false),
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       task_manager_(task_manager) {
457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTaskManagerPrerenderResourceProvider::~TaskManagerPrerenderResourceProvider() {
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTaskManager::Resource* TaskManagerPrerenderResourceProvider::GetResource(
464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int origin_pid,
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int render_process_host_id,
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int routing_id) {
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If an origin PID was specified then the request originated in a plugin so
468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ignore it.
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (origin_pid)
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ResourceMap::iterator res_iter = resources_.find(
473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::make_pair(render_process_host_id, routing_id));
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (res_iter == resources_.end())
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return res_iter->second;
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerPrerenderResourceProvider::StartUpdating() {
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(!updating_);
482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  updating_ = true;
483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Add all the existing PrerenderContents.
485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const ResourceDispatcherHost* resource_dispatcher_host =
486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      g_browser_process->resource_dispatcher_host();
487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const ResourceDispatcherHost::PrerenderChildRouteIdPairs&
488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      prerender_child_route_id_pairs =
489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          resource_dispatcher_host->prerender_child_route_id_pairs();
490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (ResourceDispatcherHost::PrerenderChildRouteIdPairs::const_iterator it =
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen           prerender_child_route_id_pairs.begin();
492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       it != prerender_child_route_id_pairs.end();
493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       ++it) {
494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Add(*it);
495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Then we register for notifications to get new prerender items.
498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  registrar_.Add(this, NotificationType::PRERENDER_CONTENTS_STARTED,
499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 NotificationService::AllSources());
500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  registrar_.Add(this, NotificationType::PRERENDER_CONTENTS_USED,
501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 NotificationService::AllSources());
502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  registrar_.Add(this, NotificationType::PRERENDER_CONTENTS_DESTROYED,
503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 NotificationService::AllSources());
504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerPrerenderResourceProvider::StopUpdating() {
507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(updating_);
508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  updating_ = false;
509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Then we unregister for notifications to get new prerender items.
511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  registrar_.Remove(this, NotificationType::PRERENDER_CONTENTS_STARTED,
512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    NotificationService::AllSources());
513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  registrar_.Remove(this, NotificationType::PRERENDER_CONTENTS_USED,
514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    NotificationService::AllSources());
515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  registrar_.Remove(this, NotificationType::PRERENDER_CONTENTS_DESTROYED,
516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    NotificationService::AllSources());
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Delete all the resources.
519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  resources_.clear();
522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerPrerenderResourceProvider::AddToTaskManager(
525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::pair<int, int>& process_route_id_pair) {
526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHost* render_view_host =
527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      RenderViewHost::FromID(process_route_id_pair.first,
528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             process_route_id_pair.second);
529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CHECK(render_view_host);
530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TaskManagerPrerenderResource* resource =
531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new TaskManagerPrerenderResource(render_view_host);
532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  resources_[process_route_id_pair] = resource;
533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  task_manager_->AddResource(resource);
534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerPrerenderResourceProvider::Add(
537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::pair<int, int>& process_route_id_pair) {
538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!updating_)
539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Don't add dead prerender contents or prerender contents that haven't yet
542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // started.
543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHost* render_view_host =
544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      RenderViewHost::FromID(process_route_id_pair.first,
545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             process_route_id_pair.second);
546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!render_view_host)
547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AddToTaskManager(process_route_id_pair);
550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerPrerenderResourceProvider::Remove(
553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::pair<int, int>& process_route_id_pair) {
554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!updating_)
555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RenderViewHost* render_view_host =
558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      RenderViewHost::FromID(process_route_id_pair.first,
559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             process_route_id_pair.second);
560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!render_view_host) {
562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This will happen if the PrerenderContents was used. We should have had a
563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // PRERENDER_CONTENTS_USED message about it and already removed it, but
564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // either way we can't remove a NULL resource.
565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ResourceMap::iterator iter = resources_.find(process_route_id_pair);
569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(iter != resources_.end());
570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Remove the resource from the Task Manager.
572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TaskManagerPrerenderResource* resource = iter->second;
573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  task_manager_->RemoveResource(resource);
574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // And from the provider.
575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  resources_.erase(iter);
576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Finally, delete the resource.
577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delete resource;
578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TaskManagerPrerenderResourceProvider::Observe(
581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotificationType type,
582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NotificationSource& source,
583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NotificationDetails& details) {
584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(NotificationService::NoDetails() == details);
585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (type.value) {
586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case NotificationType::PRERENDER_CONTENTS_STARTED:
587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Add(*Source<std::pair<int, int> >(source).ptr());
588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case NotificationType::PRERENDER_CONTENTS_USED:
590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case NotificationType::PRERENDER_CONTENTS_DESTROYED:
591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Remove(*Source<std::pair<int, int> >(source).ptr());
592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Unexpected notification.";
595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
5994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerBackgroundContentsResource class
6004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
6014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochSkBitmap* TaskManagerBackgroundContentsResource::default_icon_ = NULL;
6034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResource::TaskManagerBackgroundContentsResource(
6054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    BackgroundContents* background_contents,
60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& application_name)
6074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    : TaskManagerRendererResource(
6084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          background_contents->render_view_host()->process()->GetHandle(),
6094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          background_contents->render_view_host()),
6104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      background_contents_(background_contents),
6114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      application_name_(application_name) {
6124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Just use the same icon that other extension resources do.
6134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // TODO(atwilson): Use the favicon when that's available.
6144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!default_icon_) {
6154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
6164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN);
6174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
6184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Ensure that the string has the appropriate direction markers (see comment
6194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // in TaskManagerTabContentsResource::GetTitle()).
620201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  base::i18n::AdjustStringForLocaleDirection(&application_name_);
6214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResource::~TaskManagerBackgroundContentsResource(
6244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ) {
6254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
62772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 TaskManagerBackgroundContentsResource::GetTitle() const {
62872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 title = application_name_;
6294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (title.empty()) {
6314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // No title (can't locate the parent app for some reason) so just display
6324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // the URL (properly forced to be LTR).
6333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    title = base::i18n::GetDisplayStringInLTRDirectionality(
6343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        UTF8ToUTF16(background_contents_->GetURL().spec()));
6354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
63672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_BACKGROUND_PREFIX, title);
6374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochSkBitmap TaskManagerBackgroundContentsResource::GetIcon() const {
6414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return *default_icon_;
6424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool TaskManagerBackgroundContentsResource::IsBackground() const {
6454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return true;
6464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
6494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// TaskManagerBackgroundContentsResourceProvider class
6504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
6514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResourceProvider::
6534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    TaskManagerBackgroundContentsResourceProvider(TaskManager* task_manager)
6544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    : updating_(false),
6554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      task_manager_(task_manager) {
6564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResourceProvider::
6594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ~TaskManagerBackgroundContentsResourceProvider() {
6604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManager::Resource*
6634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTaskManagerBackgroundContentsResourceProvider::GetResource(
6644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    int origin_pid,
6654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    int render_process_host_id,
6664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    int routing_id) {
6674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BackgroundContents* contents = BackgroundContents::GetBackgroundContentsByID(
6684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      render_process_host_id, routing_id);
6694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!contents)  // This resource no longer exists.
6704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return NULL;
6714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
67272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // If an origin PID was specified, the request is from a plugin, not the
67372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // render view host process
67472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (origin_pid)
6754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return NULL;
6764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::map<BackgroundContents*,
6784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      TaskManagerBackgroundContentsResource*>::iterator res_iter =
6794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      resources_.find(contents);
6804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (res_iter == resources_.end())
6814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Can happen if the page went away while a network request was being
6824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // performed.
6834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return NULL;
6844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return res_iter->second;
6864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
6874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::StartUpdating() {
6894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DCHECK(!updating_);
6904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  updating_ = true;
6914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
6924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Add all the existing BackgroundContents from every profile.
6934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ProfileManager* profile_manager = g_browser_process->profile_manager();
694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < profiles.size(); ++i) {
6964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    BackgroundContentsService* background_contents_service =
697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        BackgroundContentsServiceFactory::GetForProfile(profiles[i]);
698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ExtensionService* extensions_service = profiles[i]->GetExtensionService();
6994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    std::vector<BackgroundContents*> contents =
7004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        background_contents_service->GetBackgroundContents();
7014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    for (std::vector<BackgroundContents*>::iterator iterator = contents.begin();
7024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch         iterator != contents.end(); ++iterator) {
70372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      string16 application_name;
7044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // Lookup the name from the parent extension.
7054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      if (extensions_service) {
7064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        const string16& application_id =
7074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch            background_contents_service->GetParentApplicationId(*iterator);
7084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        const Extension* extension = extensions_service->GetExtensionById(
7094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch            UTF16ToUTF8(application_id), false);
7104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        if (extension)
71172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          application_name = UTF8ToUTF16(extension->name());
7124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      }
7134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      Add(*iterator, application_name);
7144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
7154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
7164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Then we register for notifications to get new BackgroundContents.
7184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_OPENED,
7194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                 NotificationService::AllSources());
7204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_NAVIGATED,
7214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                 NotificationService::AllSources());
7224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_DELETED,
7234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                 NotificationService::AllSources());
7244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
7254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::StopUpdating() {
7274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DCHECK(updating_);
7284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  updating_ = false;
7294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Unregister for notifications
7314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  registrar_.Remove(this, NotificationType::BACKGROUND_CONTENTS_OPENED,
7324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    NotificationService::AllSources());
7334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  registrar_.Remove(this, NotificationType::BACKGROUND_CONTENTS_NAVIGATED,
7344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    NotificationService::AllSources());
7354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  registrar_.Remove(this, NotificationType::BACKGROUND_CONTENTS_DELETED,
7364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    NotificationService::AllSources());
7374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Delete all the resources.
7394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
7404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  resources_.clear();
7424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
7434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::AddToTaskManager(
7454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    BackgroundContents* background_contents,
74672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16& application_name) {
7474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TaskManagerBackgroundContentsResource* resource =
7484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      new TaskManagerBackgroundContentsResource(background_contents,
7494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                                application_name);
7504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  resources_[background_contents] = resource;
7514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  task_manager_->AddResource(resource);
7524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
7534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::Add(
75572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    BackgroundContents* contents, const string16& application_name) {
7564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!updating_)
7574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return;
7584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Don't add contents whose process is dead.
7604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!contents->render_view_host()->process()->GetHandle())
7614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return;
7624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Should never add the same BackgroundContents twice.
7644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DCHECK(resources_.find(contents) == resources_.end());
7654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  AddToTaskManager(contents, application_name);
7664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
7674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::Remove(
7694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    BackgroundContents* contents) {
7704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!updating_)
7714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return;
7724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::map<BackgroundContents*,
7734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      TaskManagerBackgroundContentsResource*>::iterator iter =
7744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      resources_.find(contents);
7754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DCHECK(iter != resources_.end());
7764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Remove the resource from the Task Manager.
7784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TaskManagerBackgroundContentsResource* resource = iter->second;
7794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  task_manager_->RemoveResource(resource);
7804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // And from the provider.
7814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  resources_.erase(iter);
7824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Finally, delete the resource.
7834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  delete resource;
7844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
7854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
7864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid TaskManagerBackgroundContentsResourceProvider::Observe(
7874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    NotificationType type,
7884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    const NotificationSource& source,
7894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    const NotificationDetails& details) {
7904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  switch (type.value) {
7914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case NotificationType::BACKGROUND_CONTENTS_OPENED: {
7924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // Get the name from the parent application. If no parent application is
7934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // found, just pass an empty string - BackgroundContentsResource::GetTitle
7944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // will display the URL instead in this case. This should never happen
7954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // except in rare cases when an extension is being unloaded or chrome is
7964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // exiting while the task manager is displayed.
79772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      string16 application_name;
79821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      ExtensionService* service =
79921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          Source<Profile>(source)->GetExtensionService();
8004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      if (service) {
8014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        std::string application_id = UTF16ToUTF8(
8024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch            Details<BackgroundContentsOpenedDetails>(details)->application_id);
8034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        const Extension* extension =
8044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch            service->GetExtensionById(application_id, false);
8054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        // Extension can be NULL when running unit tests.
8064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        if (extension)
80772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          application_name = UTF8ToUTF16(extension->name());
8084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      }
8094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      Add(Details<BackgroundContentsOpenedDetails>(details)->contents,
8104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          application_name);
8114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // Opening a new BackgroundContents needs to force the display to refresh
8124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // (applications may now be considered "background" that weren't before).
8134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      task_manager_->ModelChanged();
8144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
8154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
8164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case NotificationType::BACKGROUND_CONTENTS_NAVIGATED: {
8174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      BackgroundContents* contents = Details<BackgroundContents>(details).ptr();
8184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // Should never get a NAVIGATED before OPENED.
8194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      DCHECK(resources_.find(contents) != resources_.end());
8204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // Preserve the application name.
82172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      string16 application_name(
8224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          resources_.find(contents)->second->application_name());
8234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      Remove(contents);
8244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      Add(contents, application_name);
8254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
8264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
8274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case NotificationType::BACKGROUND_CONTENTS_DELETED:
8284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      Remove(Details<BackgroundContents>(details).ptr());
8294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // Closing a BackgroundContents needs to force the display to refresh
8304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      // (applications may now be considered "foreground" that weren't before).
8314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      task_manager_->ModelChanged();
8324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
8334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    default:
8344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      NOTREACHED() << "Unexpected notification.";
8354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return;
8364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
8374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
8384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
8394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerChildProcessResource class
841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerChildProcessResource::default_icon_ = NULL;
843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResource::TaskManagerChildProcessResource(
845513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const ChildProcessInfo& child_proc)
846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : child_process_(child_proc),
847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      title_(),
848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      network_usage_support_(false) {
849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // We cache the process id because it's not cheap to calculate, and it won't
850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // be available when we get the plugin disconnected notification.
85172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  pid_ = child_proc.pid();
852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!default_icon_) {
853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
854bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN);
855bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // TODO(jabdelmalek): use different icon for web workers.
856bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
857bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
858bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
859bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResource::~TaskManagerChildProcessResource() {
860bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
861bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
862bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerResource methods:
86372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 TaskManagerChildProcessResource::GetTitle() const {
864bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (title_.empty())
865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    title_ = GetLocalizedTitle();
866bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
867bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return title_;
868bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
869bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
870bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerChildProcessResource::GetIcon() const {
871bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return *default_icon_;
872bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
873bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
874bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerChildProcessResource::GetProcess() const {
875bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return child_process_.handle();
876bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
877bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
878731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTaskManager::Resource::Type TaskManagerChildProcessResource::GetType() const {
879731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Translate types to TaskManager::ResourceType, since ChildProcessInfo's type
880731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // is not available for all TaskManager resources.
881731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (child_process_.type()) {
882731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::BROWSER_PROCESS:
883731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::BROWSER;
884731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::RENDER_PROCESS:
885731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::RENDERER;
886731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::PLUGIN_PROCESS:
887731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::PLUGIN;
888731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::WORKER_PROCESS:
889731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::WORKER;
890731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::NACL_LOADER_PROCESS:
891731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::NACL_BROKER_PROCESS:
892731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::NACL;
893731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::UTILITY_PROCESS:
894731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::UTILITY;
895731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::PROFILE_IMPORT_PROCESS:
896731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::PROFILE_IMPORT;
897731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::ZYGOTE_PROCESS:
898731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::ZYGOTE;
899731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::SANDBOX_HELPER_PROCESS:
900731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::SANDBOX_HELPER;
901731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ChildProcessInfo::GPU_PROCESS:
902731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::GPU;
903731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
904731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return TaskManager::Resource::UNKNOWN;
905731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
906731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
907731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
90821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerChildProcessResource::SupportNetworkUsage() const {
90921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return network_usage_support_;
91021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
91121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
91221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TaskManagerChildProcessResource::SetSupportNetworkUsage() {
91321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  network_usage_support_ = true;
91421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
91521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 TaskManagerChildProcessResource::GetLocalizedTitle() const {
917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 title = WideToUTF16Hack(child_process_.name());
918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (child_process_.type() == ChildProcessInfo::PLUGIN_PROCESS &&
919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      title.empty()) {
920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    title = l10n_util::GetStringUTF16(IDS_TASK_MANAGER_UNKNOWN_PLUGIN_NAME);
921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Explicitly mark name as LTR if there is no strong RTL character,
924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to avoid the wrong concatenation result similar to "!Yahoo! Mail: the
925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // best web-based Email: NIGULP", in which "NIGULP" stands for the Hebrew
926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // or Arabic word for "plugin".
927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::i18n::AdjustStringForLocaleDirection(&title);
928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (child_process_.type()) {
930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::UTILITY_PROCESS:
931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_UTILITY_PREFIX);
932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::PROFILE_IMPORT_PROCESS:
934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_UTILITY_PREFIX);
935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::GPU_PROCESS:
937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_GPU_PREFIX);
938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::NACL_BROKER_PROCESS:
940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NACL_BROKER_PREFIX);
941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::PLUGIN_PROCESS:
943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::PPAPI_PLUGIN_PROCESS:
944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::PPAPI_BROKER_PROCESS: {
945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringFUTF16(
946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_TASK_MANAGER_PLUGIN_PREFIX, title,
947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          WideToUTF16Hack(child_process_.version()));
948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::NACL_LOADER_PROCESS:
951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_NACL_PREFIX, title);
952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::WORKER_PROCESS:
954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_WORKER_PREFIX, title);
955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // These types don't need display names or get them from elsewhere.
957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::BROWSER_PROCESS:
958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::RENDER_PROCESS:
959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::ZYGOTE_PROCESS:
960ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::SANDBOX_HELPER_PROCESS:
961ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
962ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
964ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case ChildProcessInfo::UNKNOWN_PROCESS:
965ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Need localized name for child process type.";
966ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
967ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return title;
969ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
971bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
972bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerChildProcessResourceProvider class
973bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
974bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
975bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider::
976bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TaskManagerChildProcessResourceProvider(TaskManager* task_manager)
977bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : updating_(false),
978bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      task_manager_(task_manager) {
979bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
980bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
981bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerChildProcessResourceProvider::
982bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ~TaskManagerChildProcessResourceProvider() {
983bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
984bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
985bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerChildProcessResourceProvider::GetResource(
986bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int origin_pid,
987bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int render_process_host_id,
988bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int routing_id) {
989bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<int, TaskManagerChildProcessResource*>::iterator iter =
990bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pid_to_resources_.find(origin_pid);
991bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter != pid_to_resources_.end())
992bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return iter->second;
993bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  else
994bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
995bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
996bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
997bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StartUpdating() {
998bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!updating_);
999bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = true;
1000bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1001bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Register for notifications to get new child processes.
1002bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED,
1003bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
1004bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::CHILD_PROCESS_HOST_DISCONNECTED,
1005bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
1006bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1007bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Get the existing child processes.
1008731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
1009731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::IO, FROM_HERE,
1010bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(
1011bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          this,
1012bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          &TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo));
1013bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1014bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1015bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::StopUpdating() {
1016bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(updating_);
1017bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = false;
1018bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1019bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Unregister for notifications to get new plugin processes.
1020bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::CHILD_PROCESS_HOST_CONNECTED,
1021bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
1022bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this,
1023bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationType::CHILD_PROCESS_HOST_DISCONNECTED,
1024bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
1025bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1026bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Delete all the resources.
1027bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
1028bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1029bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.clear();
1030bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pid_to_resources_.clear();
1031bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  existing_child_process_info_.clear();
1032bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1033bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1034bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Observe(
1035bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NotificationType type,
1036bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationSource& source,
1037bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationDetails& details) {
1038bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  switch (type.value) {
1039bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::CHILD_PROCESS_HOST_CONNECTED:
1040bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      Add(*Details<ChildProcessInfo>(details).ptr());
1041bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
1042bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::CHILD_PROCESS_HOST_DISCONNECTED:
1043bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      Remove(*Details<ChildProcessInfo>(details).ptr());
1044bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
1045bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default:
1046bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NOTREACHED() << "Unexpected notification.";
1047bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
1048bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1049bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1050bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1051bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Add(
1052513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const ChildProcessInfo& child_process_info) {
1053bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!updating_)
1054bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1055bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<ChildProcessInfo, TaskManagerChildProcessResource*>::
1056bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const_iterator iter = resources_.find(child_process_info);
1057bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter != resources_.end()) {
1058bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // The case may happen that we have added a child_process_info as part of
1059bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // the iteration performed during StartUpdating() call but the notification
1060bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // that it has connected was not fired yet. So when the notification
1061bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // happens, we already know about this plugin and just ignore it.
1062bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1063bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1064bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddToTaskManager(child_process_info);
1065bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1066bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1067bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::Remove(
1068513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const ChildProcessInfo& child_process_info) {
1069bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!updating_)
1070bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1071bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<ChildProcessInfo, TaskManagerChildProcessResource*>
1072bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ::iterator iter = resources_.find(child_process_info);
1073bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter == resources_.end()) {
1074bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // ChildProcessInfo disconnection notifications are asynchronous, so we
1075bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // might be notified for a plugin we don't know anything about (if it was
1076bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // closed before the task manager was shown and destroyed after that).
1077bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1078bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1079bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove the resource from the Task Manager.
1080bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerChildProcessResource* resource = iter->second;
1081bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->RemoveResource(resource);
1082bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove it from the provider.
1083bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.erase(iter);
1084bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove it from our pid map.
1085bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<int, TaskManagerChildProcessResource*>::iterator pid_iter =
1086bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pid_to_resources_.find(resource->process_id());
1087bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(pid_iter != pid_to_resources_.end());
1088bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (pid_iter != pid_to_resources_.end())
1089bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pid_to_resources_.erase(pid_iter);
1090bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1091bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Finally, delete the resource.
1092bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete resource;
1093bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1094bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1095bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::AddToTaskManager(
1096513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const ChildProcessInfo& child_process_info) {
1097bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerChildProcessResource* resource =
1098bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new TaskManagerChildProcessResource(child_process_info);
1099bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_[child_process_info] = resource;
1100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pid_to_resources_[resource->process_id()] = resource;
1101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->AddResource(resource);
1102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The ChildProcessInfo::Iterator has to be used from the IO thread.
1105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::RetrieveChildProcessInfo() {
1106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) {
1107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Only add processes which are already started, since we need their handle.
1108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if ((*iter)->handle() != base::kNullProcessHandle)
1109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      existing_child_process_info_.push_back(**iter);
1110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Now notify the UI thread that we have retrieved information about child
1112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // processes.
1113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
1114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::UI, FROM_HERE,
1115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(this,
1116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          &TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived));
1117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This is called on the UI thread.
1120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerChildProcessResourceProvider::ChildProcessInfoRetreived() {
1121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<ChildProcessInfo>::const_iterator iter;
1122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (iter = existing_child_process_info_.begin();
1123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       iter != existing_child_process_info_.end(); ++iter) {
1124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Add(*iter);
1125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  existing_child_process_info_.clear();
1127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResource class
1131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerExtensionProcessResource::default_icon_ = NULL;
1134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::TaskManagerExtensionProcessResource(
1136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionHost* extension_host)
1137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : extension_host_(extension_host) {
1138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!default_icon_) {
1139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
1140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN);
1141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  process_handle_ = extension_host_->render_process_host()->GetHandle();
1143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pid_ = base::GetProcId(process_handle_);
11443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 extension_name = UTF8ToUTF16(GetExtension()->name());
1145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!extension_name.empty());
1146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
114721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int message_id = GetMessagePrefixID(GetExtension()->is_app(), true,
114821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      extension_host_->profile()->IsOffTheRecord());
114972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  title_ = l10n_util::GetStringFUTF16(message_id, extension_name);
1150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResource::~TaskManagerExtensionProcessResource() {
1153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
115572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 TaskManagerExtensionProcessResource::GetTitle() const {
1156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return title_;
1157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerExtensionProcessResource::GetIcon() const {
1160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return *default_icon_;
1161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerExtensionProcessResource::GetProcess() const {
1164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return process_handle_;
1165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
116721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTaskManager::Resource::Type
116821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTaskManagerExtensionProcessResource::GetType() const {
116921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return EXTENSION;
117021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
117121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
117221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerExtensionProcessResource::SupportNetworkUsage() const {
117321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
117421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
117521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
117621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TaskManagerExtensionProcessResource::SetSupportNetworkUsage() {
117721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NOTREACHED();
117821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
117921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst Extension* TaskManagerExtensionProcessResource::GetExtension() const {
1181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return extension_host_->extension();
1182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
11844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool TaskManagerExtensionProcessResource::IsBackground() const {
11854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return extension_host_->GetRenderViewType() ==
11864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      ViewType::EXTENSION_BACKGROUND_PAGE;
11874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
11884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerExtensionProcessResourceProvider class
1191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider::
1194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TaskManagerExtensionProcessResourceProvider(TaskManager* task_manager)
1195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : task_manager_(task_manager),
1196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      updating_(false) {
1197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerExtensionProcessResourceProvider::
1200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ~TaskManagerExtensionProcessResourceProvider() {
1201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerExtensionProcessResourceProvider::GetResource(
1204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int origin_pid,
1205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int render_process_host_id,
1206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int routing_id) {
1207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<int, TaskManagerExtensionProcessResource*>::iterator iter =
1208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pid_to_resources_.find(origin_pid);
1209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter != pid_to_resources_.end())
1210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return iter->second;
1211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  else
1212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
1213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StartUpdating() {
1216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!updating_);
1217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = true;
1218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Add all the existing ExtensionHosts.
1220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ProfileManager* profile_manager = g_browser_process->profile_manager();
1221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
1222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < profiles.size(); ++i) {
1223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionProcessManager* process_manager =
1224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        profiles[i]->GetExtensionProcessManager();
1225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (process_manager) {
1226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ExtensionProcessManager::const_iterator jt;
1227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      for (jt = process_manager->begin(); jt != process_manager->end(); ++jt)
1228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AddToTaskManager(*jt);
1229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // If we have an incognito profile active, include the split-mode incognito
1232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // extensions.
1233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (BrowserList::IsOffTheRecordSessionActive()) {
1234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ExtensionProcessManager* process_manager =
1235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          profiles[i]->GetOffTheRecordProfile()->GetExtensionProcessManager();
1236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (process_manager) {
1237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ExtensionProcessManager::const_iterator jt;
1238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      for (jt = process_manager->begin(); jt != process_manager->end(); ++jt)
1239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        AddToTaskManager(*jt);
1240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      }
1241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Register for notifications about extension process changes.
1245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::EXTENSION_PROCESS_CREATED,
1246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
1247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::EXTENSION_PROCESS_TERMINATED,
1248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
1249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED,
1250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
1251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::StopUpdating() {
1254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(updating_);
1255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = false;
1256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Unregister for notifications about extension process changes.
1258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_CREATED,
1259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
1260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::EXTENSION_PROCESS_TERMINATED,
1261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
1262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::EXTENSION_HOST_DESTROYED,
1263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
1264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Delete all the resources.
1266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
1267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.clear();
1269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pid_to_resources_.clear();
1270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::Observe(
1273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NotificationType type,
1274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationSource& source,
1275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationDetails& details) {
1276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  switch (type.value) {
1277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::EXTENSION_PROCESS_CREATED:
1278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      AddToTaskManager(Details<ExtensionHost>(details).ptr());
1279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
1280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::EXTENSION_PROCESS_TERMINATED:
1281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::EXTENSION_HOST_DESTROYED:
1282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      RemoveFromTaskManager(Details<ExtensionHost>(details).ptr());
1283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
1284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default:
1285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NOTREACHED() << "Unexpected notification.";
1286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
1287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::AddToTaskManager(
1291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionHost* extension_host) {
1292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Don't add dead extension processes.
1293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!extension_host->IsRenderViewLive())
1294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerExtensionProcessResource* resource =
1297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new TaskManagerExtensionProcessResource(extension_host);
1298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(resources_.find(extension_host) == resources_.end());
1299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_[extension_host] = resource;
1300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pid_to_resources_[resource->process_id()] = resource;
1301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->AddResource(resource);
1302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerExtensionProcessResourceProvider::RemoveFromTaskManager(
1305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ExtensionHost* extension_host) {
1306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!updating_)
1307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<ExtensionHost*, TaskManagerExtensionProcessResource*>
1309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ::iterator iter = resources_.find(extension_host);
1310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter == resources_.end())
1311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove the resource from the Task Manager.
1314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerExtensionProcessResource* resource = iter->second;
1315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->RemoveResource(resource);
1316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove it from the provider.
1318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.erase(iter);
1319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove it from our pid map.
1321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<int, TaskManagerExtensionProcessResource*>::iterator pid_iter =
1322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      pid_to_resources_.find(resource->process_id());
1323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(pid_iter != pid_to_resources_.end());
1324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (pid_iter != pid_to_resources_.end())
1325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    pid_to_resources_.erase(pid_iter);
1326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Finally, delete the resource.
1328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete resource;
1329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResource class
1333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerNotificationResource::default_icon_ = NULL;
1336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::TaskManagerNotificationResource(
1338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    BalloonHost* balloon_host)
1339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : balloon_host_(balloon_host) {
1340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!default_icon_) {
1341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
1342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default_icon_ = rb.GetBitmapNamed(IDR_PLUGIN);
1343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  process_handle_ = balloon_host_->render_view_host()->process()->GetHandle();
1345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  pid_ = base::GetProcId(process_handle_);
134672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  title_ = l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_NOTIFICATION_PREFIX,
134772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      balloon_host_->GetSource());
1348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResource::~TaskManagerNotificationResource() {
1351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
135372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 TaskManagerNotificationResource::GetTitle() const {
135421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return title_;
135521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
135621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerNotificationResource::GetIcon() const {
1358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return *default_icon_;
1359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerNotificationResource::GetProcess() const {
1362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return process_handle_;
1363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
136521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTaskManager::Resource::Type TaskManagerNotificationResource::GetType() const {
136621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return NOTIFICATION;
136721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
136821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
136921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerNotificationResource::SupportNetworkUsage() const {
137021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
137121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
137221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerNotificationResourceProvider class
1375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider::
1378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TaskManagerNotificationResourceProvider(TaskManager* task_manager)
1379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : task_manager_(task_manager),
1380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      updating_(false) {
1381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerNotificationResourceProvider::
1384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ~TaskManagerNotificationResourceProvider() {
1385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerNotificationResourceProvider::GetResource(
1388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int origin_pid,
1389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int render_process_host_id,
1390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int routing_id) {
1391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(johnnyg): provide resources by pid if necessary.
1392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return NULL;
1393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StartUpdating() {
1396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!updating_);
1397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = true;
1398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Add all the existing BalloonHosts.
1400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BalloonCollection* collection =
1401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      g_browser_process->notification_ui_manager()->balloon_collection();
1402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons();
1403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (BalloonCollection::Balloons::const_iterator it = balloons.begin();
1404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       it != balloons.end(); ++it) {
1405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    AddToTaskManager((*it)->view()->GetHost());
1406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Register for notifications about extension process changes.
1409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::NOTIFY_BALLOON_CONNECTED,
1410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
1411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Add(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED,
1412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                 NotificationService::AllSources());
1413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::StopUpdating() {
1416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(updating_);
1417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  updating_ = false;
1418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Unregister for notifications about extension process changes.
1420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_CONNECTED,
1421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
1422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  registrar_.Remove(this, NotificationType::NOTIFY_BALLOON_DISCONNECTED,
1423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    NotificationService::AllSources());
1424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Delete all the resources.
1426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
1427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.clear();
1428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::Observe(
1431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NotificationType type,
1432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationSource& source,
1433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const NotificationDetails& details) {
1434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  switch (type.value) {
1435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::NOTIFY_BALLOON_CONNECTED:
1436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      AddToTaskManager(Source<BalloonHost>(source).ptr());
1437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
1438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case NotificationType::NOTIFY_BALLOON_DISCONNECTED:
1439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      RemoveFromTaskManager(Source<BalloonHost>(source).ptr());
1440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      break;
1441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default:
1442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NOTREACHED() << "Unexpected notification.";
1443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
1444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::AddToTaskManager(
1448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    BalloonHost* balloon_host) {
1449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerNotificationResource* resource =
1450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new TaskManagerNotificationResource(balloon_host);
1451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(resources_.find(balloon_host) == resources_.end());
1452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_[balloon_host] = resource;
1453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->AddResource(resource);
1454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerNotificationResourceProvider::RemoveFromTaskManager(
1457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    BalloonHost* balloon_host) {
1458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!updating_)
1459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::map<BalloonHost*, TaskManagerNotificationResource*>::iterator iter =
1461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      resources_.find(balloon_host);
1462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (iter == resources_.end())
1463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
1464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove the resource from the Task Manager.
1466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerNotificationResource* resource = iter->second;
1467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->RemoveResource(resource);
1468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1469bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Remove it from the map.
1470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  resources_.erase(iter);
1471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Finally, delete the resource.
1473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete resource;
1474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResource class
1478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* TaskManagerBrowserProcessResource::default_icon_ = NULL;
1481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::TaskManagerBrowserProcessResource()
1483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : title_() {
148472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int pid = base::GetCurrentProcId();
148572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool success = base::OpenPrivilegedProcessHandle(pid, &process_);
1486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(success);
1487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
1488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!default_icon_) {
1489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    HICON icon = GetAppIcon();
1490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (icon) {
1491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ICONINFO icon_info = {0};
1492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      BITMAP bitmap_info = {0};
1493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetIconInfo(icon, &icon_info);
1495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetObject(icon_info.hbmMask, sizeof(bitmap_info), &bitmap_info);
1496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      gfx::Size icon_size(bitmap_info.bmWidth, bitmap_info.bmHeight);
1498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      default_icon_ = IconUtil::CreateSkBitmapFromHICON(icon, icon_size);
1499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
1500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_LINUX)
1502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!default_icon_) {
1503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
1504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default_icon_ = rb.GetBitmapNamed(IDR_PRODUCT_LOGO_16);
1505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_MACOSX)
1507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!default_icon_) {
1508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // IDR_PRODUCT_LOGO_16 doesn't quite look like chrome/mac's icns icon. Load
1509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // the real app icon (requires a nsimage->skbitmap->nsimage conversion :-().
1510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default_icon_ = new SkBitmap(gfx::AppplicationIconAtSize(16));
1511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
1513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(port): Port icon code.
1514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NOTIMPLEMENTED();
1515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // defined(OS_WIN)
1516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResource::~TaskManagerBrowserProcessResource() {
1519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::CloseProcessHandle(process_);
1520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerResource methods:
152372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 TaskManagerBrowserProcessResource::GetTitle() const {
1524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (title_.empty()) {
152572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    title_ = l10n_util::GetStringUTF16(IDS_TASK_MANAGER_WEB_BROWSER_CELL_TEXT);
1526bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return title_;
1528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1530bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap TaskManagerBrowserProcessResource::GetIcon() const {
1531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return *default_icon_;
1532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsensize_t TaskManagerBrowserProcessResource::SqliteMemoryUsedBytes() const {
1535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return static_cast<size_t>(sqlite3_memory_used());
1536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::ProcessHandle TaskManagerBrowserProcessResource::GetProcess() const {
1539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return base::GetCurrentProcessHandle();  // process_;
1540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
154221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTaskManager::Resource::Type TaskManagerBrowserProcessResource::GetType() const {
154321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return BROWSER;
154421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
154521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
154621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerBrowserProcessResource::SupportNetworkUsage() const {
154721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
154821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
154921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
155021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TaskManagerBrowserProcessResource::SetSupportNetworkUsage() {
155121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NOTREACHED();
155221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
155321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
155421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool TaskManagerBrowserProcessResource::ReportsSqliteMemoryUsed() const {
155521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
155621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
155721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TaskManagerBrowserProcessResourceProvider class
1560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider::
1563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TaskManagerBrowserProcessResourceProvider(TaskManager* task_manager)
1564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : updating_(false),
1565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      task_manager_(task_manager) {
1566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManagerBrowserProcessResourceProvider::
1569bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ~TaskManagerBrowserProcessResourceProvider() {
1570bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTaskManager::Resource* TaskManagerBrowserProcessResourceProvider::GetResource(
1573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int origin_pid,
1574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int render_process_host_id,
1575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int routing_id) {
157672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (origin_pid || render_process_host_id != -1) {
1577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return NULL;
1578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
1579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return &resource_;
1581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1582bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StartUpdating() {
1584bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  task_manager_->AddResource(&resource_);
1585bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TaskManagerBrowserProcessResourceProvider::StopUpdating() {
1588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
1589