browser_process_resource_provider.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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 "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) && !defined(OS_MACOSX)
47  if (!default_icon_) {
48    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
49    default_icon_ = rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_16);
50  }
51#elif defined(OS_MACOSX)
52  if (!default_icon_) {
53    // IDR_PRODUCT_LOGO_16 doesn't quite look like chrome/mac's icns icon. Load
54    // the real app icon (requires a nsimage->image_skia->nsimage
55    // conversion :-().
56    default_icon_ = new gfx::ImageSkia(gfx::ApplicationIconAtSize(16));
57  }
58#else
59  // TODO(port): Port icon code.
60  NOTIMPLEMENTED();
61#endif  // defined(OS_WIN)
62  default_icon_->MakeThreadSafe();
63}
64
65BrowserProcessResource::~BrowserProcessResource() {
66  base::CloseProcessHandle(process_);
67}
68
69// Resource methods:
70string16 BrowserProcessResource::GetTitle() const {
71  if (title_.empty()) {
72    title_ = l10n_util::GetStringUTF16(IDS_TASK_MANAGER_WEB_BROWSER_CELL_TEXT);
73  }
74  return title_;
75}
76
77string16 BrowserProcessResource::GetProfileName() const {
78  return base::string16();
79}
80
81gfx::ImageSkia BrowserProcessResource::GetIcon() const {
82  return *default_icon_;
83}
84
85size_t BrowserProcessResource::SqliteMemoryUsedBytes() const {
86  return static_cast<size_t>(sqlite3_memory_used());
87}
88
89base::ProcessHandle BrowserProcessResource::GetProcess() const {
90  return base::GetCurrentProcessHandle();  // process_;
91}
92
93int BrowserProcessResource::GetUniqueChildProcessId() const {
94  return 0;
95}
96
97Resource::Type BrowserProcessResource::GetType() const {
98  return BROWSER;
99}
100
101bool BrowserProcessResource::SupportNetworkUsage() const {
102  return true;
103}
104
105void BrowserProcessResource::SetSupportNetworkUsage() {
106  NOTREACHED();
107}
108
109bool BrowserProcessResource::ReportsSqliteMemoryUsed() const {
110  return true;
111}
112
113// BrowserProcess uses v8 for proxy resolver in certain cases.
114bool BrowserProcessResource::ReportsV8MemoryStats() const {
115  const CommandLine* command_line = CommandLine::ForCurrentProcess();
116  bool using_v8 = !command_line->HasSwitch(switches::kWinHttpProxyResolver);
117  if (using_v8 && command_line->HasSwitch(switches::kSingleProcess)) {
118    using_v8 = false;
119  }
120  return using_v8;
121}
122
123size_t BrowserProcessResource::GetV8MemoryAllocated() const {
124  return net::ProxyResolverV8::GetTotalHeapSize();
125}
126
127size_t BrowserProcessResource::GetV8MemoryUsed() const {
128  return net::ProxyResolverV8::GetUsedHeapSize();
129}
130
131////////////////////////////////////////////////////////////////////////////////
132// BrowserProcessResourceProvider class
133////////////////////////////////////////////////////////////////////////////////
134
135BrowserProcessResourceProvider::
136    BrowserProcessResourceProvider(TaskManager* task_manager)
137    : updating_(false),
138      task_manager_(task_manager) {
139}
140
141BrowserProcessResourceProvider::~BrowserProcessResourceProvider() {
142}
143
144Resource* BrowserProcessResourceProvider::GetResource(
145    int origin_pid,
146    int render_process_host_id,
147    int routing_id) {
148  if (origin_pid || render_process_host_id != -1) {
149    return NULL;
150  }
151
152  return &resource_;
153}
154
155void BrowserProcessResourceProvider::StartUpdating() {
156  task_manager_->AddResource(&resource_);
157}
158
159void BrowserProcessResourceProvider::StopUpdating() {
160}
161
162}  // namespace task_manager
163