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