1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/task_manager/browser_process_resource_provider.h" 6 7#include "base/command_line.h" 8#include "base/strings/string16.h" 9#include "chrome/browser/task_manager/resource_provider.h" 10#include "chrome/browser/task_manager/task_manager.h" 11#include "chrome/common/chrome_switches.h" 12#include "chrome/grit/generated_resources.h" 13#include "grit/theme_resources.h" 14#include "net/proxy/proxy_resolver_v8.h" 15#include "third_party/sqlite/sqlite3.h" 16#include "ui/base/l10n/l10n_util.h" 17#include "ui/base/resource/resource_bundle.h" 18#include "ui/gfx/image/image_skia.h" 19 20#if defined(OS_MACOSX) 21#include "ui/gfx/image/image_skia_util_mac.h" 22#endif // defined(OS_MACOSX) 23 24#if defined(OS_WIN) 25#include "chrome/browser/app_icon_win.h" 26#include "ui/gfx/icon_util.h" 27#endif // defined(OS_WIN) 28 29namespace task_manager { 30 31gfx::ImageSkia* BrowserProcessResource::default_icon_ = NULL; 32 33BrowserProcessResource::BrowserProcessResource() 34 : title_() { 35 int pid = base::GetCurrentProcId(); 36 bool success = base::OpenPrivilegedProcessHandle(pid, &process_); 37 DCHECK(success); 38#if defined(OS_WIN) 39 if (!default_icon_) { 40 HICON icon = GetAppIcon(); 41 if (icon) { 42 scoped_ptr<SkBitmap> bitmap(IconUtil::CreateSkBitmapFromHICON(icon)); 43 default_icon_ = new gfx::ImageSkia(gfx::ImageSkiaRep(*bitmap, 1.0f)); 44 } 45 } 46#elif defined(OS_POSIX) 47 if (!default_icon_) { 48 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 49 default_icon_ = rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_16); 50 } 51#else 52 // TODO(port): Port icon code. 53 NOTIMPLEMENTED(); 54#endif // defined(OS_WIN) 55 default_icon_->MakeThreadSafe(); 56} 57 58BrowserProcessResource::~BrowserProcessResource() { 59 base::CloseProcessHandle(process_); 60} 61 62// Resource methods: 63base::string16 BrowserProcessResource::GetTitle() const { 64 if (title_.empty()) { 65 title_ = l10n_util::GetStringUTF16(IDS_TASK_MANAGER_WEB_BROWSER_CELL_TEXT); 66 } 67 return title_; 68} 69 70base::string16 BrowserProcessResource::GetProfileName() const { 71 return base::string16(); 72} 73 74gfx::ImageSkia BrowserProcessResource::GetIcon() const { 75 return *default_icon_; 76} 77 78size_t BrowserProcessResource::SqliteMemoryUsedBytes() const { 79 return static_cast<size_t>(sqlite3_memory_used()); 80} 81 82base::ProcessHandle BrowserProcessResource::GetProcess() const { 83 return base::GetCurrentProcessHandle(); // process_; 84} 85 86int BrowserProcessResource::GetUniqueChildProcessId() const { 87 return 0; 88} 89 90Resource::Type BrowserProcessResource::GetType() const { 91 return BROWSER; 92} 93 94bool BrowserProcessResource::SupportNetworkUsage() const { 95 return true; 96} 97 98void BrowserProcessResource::SetSupportNetworkUsage() { 99 NOTREACHED(); 100} 101 102bool BrowserProcessResource::ReportsSqliteMemoryUsed() const { 103 return true; 104} 105 106// BrowserProcess uses v8 for proxy resolver in certain cases. 107bool BrowserProcessResource::ReportsV8MemoryStats() const { 108 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 109 bool using_v8 = !command_line->HasSwitch(switches::kWinHttpProxyResolver); 110 if (using_v8 && command_line->HasSwitch(switches::kSingleProcess)) { 111 using_v8 = false; 112 } 113 return using_v8; 114} 115 116size_t BrowserProcessResource::GetV8MemoryAllocated() const { 117 return net::ProxyResolverV8::GetTotalHeapSize(); 118} 119 120size_t BrowserProcessResource::GetV8MemoryUsed() const { 121 return net::ProxyResolverV8::GetUsedHeapSize(); 122} 123 124//////////////////////////////////////////////////////////////////////////////// 125// BrowserProcessResourceProvider class 126//////////////////////////////////////////////////////////////////////////////// 127 128BrowserProcessResourceProvider:: 129 BrowserProcessResourceProvider(TaskManager* task_manager) 130 : updating_(false), 131 task_manager_(task_manager) { 132} 133 134BrowserProcessResourceProvider::~BrowserProcessResourceProvider() { 135} 136 137Resource* BrowserProcessResourceProvider::GetResource( 138 int origin_pid, 139 int child_id, 140 int route_id) { 141 if (origin_pid || child_id != -1) { 142 return NULL; 143 } 144 145 return &resource_; 146} 147 148void BrowserProcessResourceProvider::StartUpdating() { 149 task_manager_->AddResource(&resource_); 150} 151 152void BrowserProcessResourceProvider::StopUpdating() { 153} 154 155} // namespace task_manager 156