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
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/chromeos/system_info_ui.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/callback.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/message_loop.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/path_service.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_piece.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_util.h"
133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/time.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/values.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/cros/syslogs_library.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/chrome_paths.h"
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/jstemplate_builder.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/url_constants.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/browser_resources.h"
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/chromium_strings.h"
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/locale_settings.h"
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/directory_lister.h"
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/escape.h"
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SystemInfoUIHTMLSource : public ChromeURLDataManager::DataSource {
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SystemInfoUIHTMLSource();
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Called when the network layer has requested a resource underneath
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // the path we registered.
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void StartDataRequest(const std::string& path,
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                bool is_incognito,
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                int request_id);
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual std::string GetMimeType(const std::string&) const {
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return "text/html";
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~SystemInfoUIHTMLSource() {}
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SyslogsComplete(chromeos::LogDictionaryType* sys_info,
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                       std::string* ignored_content);
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  CancelableRequestConsumer consumer_;
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Stored data from StartDataRequest()
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string path_;
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int request_id_;
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(SystemInfoUIHTMLSource);
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The handler for Javascript messages related to the "system" view.
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass SystemInfoHandler : public WebUIMessageHandler,
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                          public base::SupportsWeakPtr<SystemInfoHandler> {
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SystemInfoHandler();
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~SystemInfoHandler();
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // WebUIMessageHandler implementation.
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual WebUIMessageHandler* Attach(WebUI* web_ui);
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void RegisterMessages();
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(SystemInfoHandler);
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// SystemInfoUIHTMLSource
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSystemInfoUIHTMLSource::SystemInfoUIHTMLSource()
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : DataSource(chrome::kChromeUISystemInfoHost, MessageLoop::current()),
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      request_id_(0) {
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SystemInfoUIHTMLSource::StartDataRequest(const std::string& path,
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                              bool is_incognito,
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                              int request_id) {
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  path_ = path;
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  request_id_ = request_id;
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  chromeos::SyslogsLibrary* syslogs_lib =
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      chromeos::CrosLibrary::Get()->GetSyslogsLibrary();
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (syslogs_lib) {
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    syslogs_lib->RequestSyslogs(
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        false, false,
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        &consumer_,
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        NewCallback(this, &SystemInfoUIHTMLSource::SyslogsComplete));
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SystemInfoUIHTMLSource::SyslogsComplete(
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    chromeos::LogDictionaryType* sys_info,
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    std::string* ignored_content) {
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!ignored_content);
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue strings;
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  strings.SetString("title", l10n_util::GetStringUTF16(IDS_ABOUT_SYS_TITLE));
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  strings.SetString("description",
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    l10n_util::GetStringUTF16(IDS_ABOUT_SYS_DESC));
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  strings.SetString("table_title",
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    l10n_util::GetStringUTF16(IDS_ABOUT_SYS_TABLE_TITLE));
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  strings.SetString("expand_all_btn",
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    l10n_util::GetStringUTF16(IDS_ABOUT_SYS_EXPAND_ALL));
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  strings.SetString("collapse_all_btn",
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    l10n_util::GetStringUTF16(IDS_ABOUT_SYS_COLLAPSE_ALL));
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  strings.SetString("expand_btn",
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    l10n_util::GetStringUTF16(IDS_ABOUT_SYS_EXPAND));
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  strings.SetString("collapse_btn",
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                    l10n_util::GetStringUTF16(IDS_ABOUT_SYS_COLLAPSE));
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SetFontAndTextDirection(&strings);
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (sys_info) {
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     ListValue* details = new ListValue();
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     strings.Set("details", details);
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     chromeos::LogDictionaryType::iterator it;
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     for (it = sys_info->begin(); it != sys_info->end(); ++it) {
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       DictionaryValue* val = new DictionaryValue;
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       val->SetString("stat_name", it->first);
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       val->SetString("stat_value", it->second);
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen       details->Append(val);
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     }
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     strings.SetString("anchor", path_);
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     delete sys_info;
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static const base::StringPiece systeminfo_html(
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ResourceBundle::GetSharedInstance().GetRawDataResource(
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          IDR_ABOUT_SYS_HTML));
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string full_html = jstemplate_builder::GetTemplatesHtml(
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      systeminfo_html, &strings, "t" /* template root node id */);
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_bytes->data.resize(full_html.size());
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SendResponse(request_id_, html_bytes);
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// SystemInfoHandler
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSystemInfoHandler::SystemInfoHandler() {
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSystemInfoHandler::~SystemInfoHandler() {
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenWebUIMessageHandler* SystemInfoHandler::Attach(WebUI* web_ui) {
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(stevenjb): customize handler attach if needed...
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return WebUIMessageHandler::Attach(web_ui);
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SystemInfoHandler::RegisterMessages() {
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(stevenjb): add message registration, callbacks...
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// SystemInfoUI
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSystemInfoUI::SystemInfoUI(TabContents* contents) : WebUI(contents) {
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SystemInfoHandler* handler = new SystemInfoHandler();
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddMessageHandler((handler)->Attach(this));
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SystemInfoUIHTMLSource* html_source = new SystemInfoUIHTMLSource();
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set up the chrome://system/ source.
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source);
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
186