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