1 // Copyright 2014 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/device_log_ui.h"
6 
7 #include <memory>
8 #include <string>
9 
10 #include "base/bind.h"
11 #include "base/bind_helpers.h"
12 #include "base/macros.h"
13 #include "base/values.h"
14 #include "chrome/browser/ui/webui/webui_util.h"
15 #include "chrome/common/url_constants.h"
16 #include "chrome/grit/dev_ui_browser_resources.h"
17 #include "chrome/grit/generated_resources.h"
18 #include "components/device_event_log/device_event_log.h"
19 #include "content/public/browser/web_contents.h"
20 #include "content/public/browser/web_ui.h"
21 #include "content/public/browser/web_ui_data_source.h"
22 #include "content/public/browser/web_ui_message_handler.h"
23 #include "ui/base/webui/web_ui_util.h"
24 
25 namespace chromeos {
26 
27 namespace {
28 
29 class DeviceLogMessageHandler : public content::WebUIMessageHandler {
30  public:
DeviceLogMessageHandler()31   DeviceLogMessageHandler() {}
~DeviceLogMessageHandler()32   ~DeviceLogMessageHandler() override {}
33 
34   // WebUIMessageHandler implementation.
RegisterMessages()35   void RegisterMessages() override {
36     web_ui()->RegisterMessageCallback(
37         "DeviceLog.getLog",
38         base::BindRepeating(&DeviceLogMessageHandler::GetLog,
39                             base::Unretained(this)));
40     web_ui()->RegisterMessageCallback(
41         "DeviceLog.clearLog",
42         base::BindRepeating(&DeviceLogMessageHandler::ClearLog,
43                             base::Unretained(this)));
44   }
45 
46  private:
GetLog(const base::ListValue * value) const47   void GetLog(const base::ListValue* value) const {
48     base::Value data(device_event_log::GetAsString(
49         device_event_log::NEWEST_FIRST, "json", "",
50         device_event_log::LOG_LEVEL_DEBUG, 0));
51     web_ui()->CallJavascriptFunctionUnsafe("DeviceLogUI.getLogCallback", data);
52   }
53 
ClearLog(const base::ListValue * value) const54   void ClearLog(const base::ListValue* value) const {
55     device_event_log::ClearAll();
56   }
57 
58   DISALLOW_COPY_AND_ASSIGN(DeviceLogMessageHandler);
59 };
60 
61 }  // namespace
62 
DeviceLogUI(content::WebUI * web_ui)63 DeviceLogUI::DeviceLogUI(content::WebUI* web_ui)
64     : content::WebUIController(web_ui) {
65   web_ui->AddMessageHandler(std::make_unique<DeviceLogMessageHandler>());
66 
67   content::WebUIDataSource* html =
68       content::WebUIDataSource::Create(chrome::kChromeUIDeviceLogHost);
69 
70   static constexpr webui::LocalizedString kStrings[] = {
71       {"titleText", IDS_DEVICE_LOG_TITLE},
72       {"autoRefreshText", IDS_DEVICE_AUTO_REFRESH},
73       {"logRefreshText", IDS_DEVICE_LOG_REFRESH},
74       {"logClearText", IDS_DEVICE_LOG_CLEAR},
75       {"logClearTypesText", IDS_DEVICE_LOG_CLEAR_TYPES},
76       {"logNoEntriesText", IDS_DEVICE_LOG_NO_ENTRIES},
77       {"logLevelLabel", IDS_DEVICE_LOG_LEVEL_LABEL},
78       {"logLevelErrorText", IDS_DEVICE_LOG_LEVEL_ERROR},
79       {"logLevelUserText", IDS_DEVICE_LOG_LEVEL_USER},
80       {"logLevelEventText", IDS_DEVICE_LOG_LEVEL_EVENT},
81       {"logLevelDebugText", IDS_DEVICE_LOG_LEVEL_DEBUG},
82       {"logLevelFileinfoText", IDS_DEVICE_LOG_FILEINFO},
83       {"logLevelTimeDetailText", IDS_DEVICE_LOG_TIME_DETAIL},
84       {"logTypeLoginText", IDS_DEVICE_LOG_TYPE_LOGIN},
85       {"logTypeNetworkText", IDS_DEVICE_LOG_TYPE_NETWORK},
86       {"logTypePowerText", IDS_DEVICE_LOG_TYPE_POWER},
87       {"logTypeBluetoothText", IDS_DEVICE_LOG_TYPE_BLUETOOTH},
88       {"logTypeUsbText", IDS_DEVICE_LOG_TYPE_USB},
89       {"logTypeHidText", IDS_DEVICE_LOG_TYPE_HID},
90       {"logTypePrinterText", IDS_DEVICE_LOG_TYPE_PRINTER},
91       {"logTypeFidoText", IDS_DEVICE_LOG_TYPE_FIDO},
92       {"logEntryFormat", IDS_DEVICE_LOG_ENTRY},
93   };
94   AddLocalizedStringsBulk(html, kStrings);
95 
96   html->UseStringsJs();
97   html->AddResourcePath("device_log_ui.css", IDR_DEVICE_LOG_UI_CSS);
98   html->AddResourcePath("device_log_ui.js", IDR_DEVICE_LOG_UI_JS);
99   html->SetDefaultResource(IDR_DEVICE_LOG_UI_HTML);
100 
101   content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
102                                 html);
103 }
104 
~DeviceLogUI()105 DeviceLogUI::~DeviceLogUI() {
106 }
107 
108 }  // namespace chromeos
109