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