Home | History | Annotate | Download | only in webui
      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/ui/webui/system_info_ui.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/memory/ref_counted_memory.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/memory/weak_ptr.h"
     12 #include "base/message_loop/message_loop.h"
     13 #include "base/path_service.h"
     14 #include "base/strings/string_piece.h"
     15 #include "base/strings/string_util.h"
     16 #include "base/strings/utf_string_conversions.h"
     17 #include "base/synchronization/waitable_event.h"
     18 #include "base/threading/thread.h"
     19 #include "base/time/time.h"
     20 #include "base/values.h"
     21 #include "chrome/browser/feedback/system_logs/about_system_logs_fetcher.h"
     22 #include "chrome/browser/profiles/profile.h"
     23 #include "chrome/common/chrome_paths.h"
     24 #include "chrome/common/url_constants.h"
     25 #include "chrome/grit/chromium_strings.h"
     26 #include "chrome/grit/generated_resources.h"
     27 #include "chrome/grit/locale_settings.h"
     28 #include "content/public/browser/url_data_source.h"
     29 #include "content/public/browser/web_contents.h"
     30 #include "content/public/browser/web_ui.h"
     31 #include "content/public/browser/web_ui_message_handler.h"
     32 #include "grit/browser_resources.h"
     33 #include "net/base/directory_lister.h"
     34 #include "net/base/escape.h"
     35 #include "ui/base/l10n/l10n_util.h"
     36 #include "ui/base/resource/resource_bundle.h"
     37 #include "ui/base/webui/jstemplate_builder.h"
     38 #include "ui/base/webui/web_ui_util.h"
     39 
     40 using content::WebContents;
     41 using content::WebUIMessageHandler;
     42 using system_logs::SystemLogsResponse;
     43 using system_logs::AboutSystemLogsFetcher;
     44 
     45 class SystemInfoUIHTMLSource : public content::URLDataSource{
     46  public:
     47   SystemInfoUIHTMLSource();
     48 
     49   // content::URLDataSource implementation.
     50   virtual std::string GetSource() const OVERRIDE;
     51   virtual void StartDataRequest(
     52       const std::string& path,
     53       int render_process_id,
     54       int render_frame_id,
     55       const content::URLDataSource::GotDataCallback& callback) OVERRIDE;
     56   virtual std::string GetMimeType(const std::string&) const OVERRIDE {
     57     return "text/html";
     58   }
     59   virtual bool ShouldAddContentSecurityPolicy() const OVERRIDE {
     60     return false;
     61   }
     62 
     63  private:
     64   virtual ~SystemInfoUIHTMLSource() {}
     65 
     66   void SysInfoComplete(scoped_ptr<SystemLogsResponse> response);
     67   void RequestComplete();
     68   void WaitForData();
     69 
     70   // Stored data from StartDataRequest()
     71   std::string path_;
     72   content::URLDataSource::GotDataCallback callback_;
     73 
     74   scoped_ptr<SystemLogsResponse> response_;
     75   base::WeakPtrFactory<SystemInfoUIHTMLSource> weak_ptr_factory_;
     76   DISALLOW_COPY_AND_ASSIGN(SystemInfoUIHTMLSource);
     77 };
     78 
     79 // The handler for Javascript messages related to the "system" view.
     80 class SystemInfoHandler : public WebUIMessageHandler,
     81                           public base::SupportsWeakPtr<SystemInfoHandler> {
     82  public:
     83   SystemInfoHandler();
     84   virtual ~SystemInfoHandler();
     85 
     86   // WebUIMessageHandler implementation.
     87   virtual void RegisterMessages() OVERRIDE;
     88 
     89  private:
     90   DISALLOW_COPY_AND_ASSIGN(SystemInfoHandler);
     91 };
     92 
     93 ////////////////////////////////////////////////////////////////////////////////
     94 //
     95 // SystemInfoUIHTMLSource
     96 //
     97 ////////////////////////////////////////////////////////////////////////////////
     98 
     99 SystemInfoUIHTMLSource::SystemInfoUIHTMLSource() : weak_ptr_factory_(this) {}
    100 
    101 std::string SystemInfoUIHTMLSource::GetSource() const {
    102   return chrome::kChromeUISystemInfoHost;
    103 }
    104 
    105 void SystemInfoUIHTMLSource::StartDataRequest(
    106     const std::string& path,
    107     int render_process_id,
    108     int render_frame_id,
    109     const content::URLDataSource::GotDataCallback& callback) {
    110   path_ = path;
    111   callback_ = callback;
    112 
    113   AboutSystemLogsFetcher* fetcher = new AboutSystemLogsFetcher();
    114   fetcher->Fetch(base::Bind(&SystemInfoUIHTMLSource::SysInfoComplete,
    115                             weak_ptr_factory_.GetWeakPtr()));
    116 }
    117 
    118 
    119 void SystemInfoUIHTMLSource::SysInfoComplete(
    120     scoped_ptr<SystemLogsResponse> sys_info) {
    121   response_ = sys_info.Pass();
    122   RequestComplete();
    123 }
    124 
    125 void SystemInfoUIHTMLSource::RequestComplete() {
    126   base::DictionaryValue strings;
    127   strings.SetString("title", l10n_util::GetStringUTF16(IDS_ABOUT_SYS_TITLE));
    128   strings.SetString("description",
    129                     l10n_util::GetStringUTF16(IDS_ABOUT_SYS_DESC));
    130   strings.SetString("tableTitle",
    131                     l10n_util::GetStringUTF16(IDS_ABOUT_SYS_TABLE_TITLE));
    132   strings.SetString(
    133       "logFileTableTitle",
    134       l10n_util::GetStringUTF16(IDS_ABOUT_SYS_LOG_FILE_TABLE_TITLE));
    135   strings.SetString("expandAllBtn",
    136                     l10n_util::GetStringUTF16(IDS_ABOUT_SYS_EXPAND_ALL));
    137   strings.SetString("collapseAllBtn",
    138                     l10n_util::GetStringUTF16(IDS_ABOUT_SYS_COLLAPSE_ALL));
    139   strings.SetString("expandBtn",
    140                     l10n_util::GetStringUTF16(IDS_ABOUT_SYS_EXPAND));
    141   strings.SetString("collapseBtn",
    142                     l10n_util::GetStringUTF16(IDS_ABOUT_SYS_COLLAPSE));
    143   strings.SetString("parseError",
    144                     l10n_util::GetStringUTF16(IDS_ABOUT_SYS_PARSE_ERROR));
    145   webui::SetFontAndTextDirection(&strings);
    146   if (response_.get()) {
    147     base::ListValue* details = new base::ListValue();
    148     strings.Set("details", details);
    149     for (SystemLogsResponse::const_iterator it = response_->begin();
    150          it != response_->end();
    151          ++it) {
    152       base::DictionaryValue* val = new base::DictionaryValue;
    153       val->SetString("statName", it->first);
    154       val->SetString("statValue", it->second);
    155       details->Append(val);
    156     }
    157   }
    158   static const base::StringPiece systeminfo_html(
    159       ResourceBundle::GetSharedInstance().GetRawDataResource(
    160           IDR_ABOUT_SYS_HTML));
    161   webui::UseVersion2 version2;
    162   std::string full_html = webui::GetI18nTemplateHtml(systeminfo_html, &strings);
    163   callback_.Run(base::RefCountedString::TakeString(&full_html));
    164 }
    165 
    166 ////////////////////////////////////////////////////////////////////////////////
    167 //
    168 // SystemInfoHandler
    169 //
    170 ////////////////////////////////////////////////////////////////////////////////
    171 SystemInfoHandler::SystemInfoHandler() {
    172 }
    173 
    174 SystemInfoHandler::~SystemInfoHandler() {
    175 }
    176 
    177 void SystemInfoHandler::RegisterMessages() {
    178   // TODO(stevenjb): add message registration, callbacks...
    179 }
    180 
    181 ////////////////////////////////////////////////////////////////////////////////
    182 //
    183 // SystemInfoUI
    184 //
    185 ////////////////////////////////////////////////////////////////////////////////
    186 
    187 SystemInfoUI::SystemInfoUI(content::WebUI* web_ui) : WebUIController(web_ui) {
    188   SystemInfoHandler* handler = new SystemInfoHandler();
    189   web_ui->AddMessageHandler(handler);
    190   SystemInfoUIHTMLSource* html_source = new SystemInfoUIHTMLSource();
    191 
    192   // Set up the chrome://system/ source.
    193   Profile* profile = Profile::FromWebUI(web_ui);
    194   content::URLDataSource::Add(profile, html_source);
    195 }
    196