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