Home | History | Annotate | Download | only in chromeos
      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