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