blob: caa508dbb35c90e79f9b91f082b9392c62d0e1c4 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/device_log_ui.h"
#include <memory>
#include <string>
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/dev_ui_browser_resources.h"
#include "chrome/grit/generated_resources.h"
#include "components/device_event_log/device_event_log.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "ui/base/webui/web_ui_util.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/webui_url_constants.h"
#include "ui/base/l10n/l10n_util.h"
#endif // BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ash/crosapi/browser_manager.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
namespace chromeos {
namespace {
class DeviceLogMessageHandler : public content::WebUIMessageHandler {
public:
DeviceLogMessageHandler() {}
DeviceLogMessageHandler(const DeviceLogMessageHandler&) = delete;
DeviceLogMessageHandler& operator=(const DeviceLogMessageHandler&) = delete;
~DeviceLogMessageHandler() override {}
// WebUIMessageHandler implementation.
void RegisterMessages() override {
web_ui()->RegisterMessageCallback(
"getLog", base::BindRepeating(&DeviceLogMessageHandler::GetLog,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"clearLog", base::BindRepeating(&DeviceLogMessageHandler::ClearLog,
base::Unretained(this)));
#if BUILDFLAG(IS_CHROMEOS_ASH)
web_ui()->RegisterMessageCallback(
"isLacrosEnabled",
base::BindRepeating(&DeviceLogMessageHandler::IsLacrosEnabled,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"openBrowserDeviceLog",
base::BindRepeating(&DeviceLogMessageHandler::OpenBrowserDevieLog,
base::Unretained(this)));
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
}
private:
void GetLog(const base::Value::List& value) {
AllowJavascript();
std::string callback_id = value[0].GetString();
base::Value data(device_event_log::GetAsString(
device_event_log::NEWEST_FIRST, "json", "",
device_event_log::LOG_LEVEL_DEBUG, 0));
ResolveJavascriptCallback(base::Value(callback_id), data);
}
void ClearLog(const base::Value::List& value) const {
device_event_log::ClearAll();
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
void IsLacrosEnabled(const base::Value::List& value) {
AllowJavascript();
const bool is_lacros_enabled = crosapi::browser_util::IsLacrosEnabled();
std::string callback_id = value[0].GetString();
ResolveJavascriptCallback(base::Value(callback_id),
base::Value(is_lacros_enabled));
}
void OpenBrowserDevieLog(const base::Value::List& args) const {
// Note: This will only be called by the UI when Lacros is available.
DCHECK(crosapi::BrowserManager::Get());
crosapi::BrowserManager::Get()->SwitchToTab(
GURL(chrome::kChromeUIDeviceLogUrl),
/*path_behavior=*/NavigateParams::RESPECT);
}
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
};
} // namespace
DeviceLogUI::DeviceLogUI(content::WebUI* web_ui)
: content::WebUIController(web_ui) {
web_ui->AddMessageHandler(std::make_unique<DeviceLogMessageHandler>());
content::WebUIDataSource* html = content::WebUIDataSource::CreateAndAdd(
web_ui->GetWebContents()->GetBrowserContext(),
chrome::kChromeUIDeviceLogHost);
static constexpr webui::LocalizedString kStrings[] = {
{"titleText", IDS_DEVICE_LOG_TITLE},
{"autoRefreshText", IDS_DEVICE_AUTO_REFRESH},
{"logRefreshText", IDS_DEVICE_LOG_REFRESH},
{"logClearText", IDS_DEVICE_LOG_CLEAR},
{"logClearTypesText", IDS_DEVICE_LOG_CLEAR_TYPES},
{"logNoEntriesText", IDS_DEVICE_LOG_NO_ENTRIES},
{"logLevelLabel", IDS_DEVICE_LOG_LEVEL_LABEL},
{"logLevelErrorText", IDS_DEVICE_LOG_LEVEL_ERROR},
{"logLevelUserText", IDS_DEVICE_LOG_LEVEL_USER},
{"logLevelEventText", IDS_DEVICE_LOG_LEVEL_EVENT},
{"logLevelDebugText", IDS_DEVICE_LOG_LEVEL_DEBUG},
{"logLevelFileinfoText", IDS_DEVICE_LOG_FILEINFO},
{"logLevelTimeDetailText", IDS_DEVICE_LOG_TIME_DETAIL},
{"logTypeLoginText", IDS_DEVICE_LOG_TYPE_LOGIN},
{"logTypeNetworkText", IDS_DEVICE_LOG_TYPE_NETWORK},
{"logTypePowerText", IDS_DEVICE_LOG_TYPE_POWER},
{"logTypeBluetoothText", IDS_DEVICE_LOG_TYPE_BLUETOOTH},
{"logTypeUsbText", IDS_DEVICE_LOG_TYPE_USB},
{"logTypeHidText", IDS_DEVICE_LOG_TYPE_HID},
{"logTypePrinterText", IDS_DEVICE_LOG_TYPE_PRINTER},
{"logTypeFidoText", IDS_DEVICE_LOG_TYPE_FIDO},
{"logTypeSerialText", IDS_DEVICE_LOG_TYPE_SERIAL},
{"logTypeCameraText", IDS_DEVICE_LOG_TYPE_CAMERA},
{"logTypeGeolocationText", IDS_DEVICE_LOG_TYPE_GEOLOCATION},
{"logTypeExtensionsText", IDS_DEVICE_LOG_TYPE_EXTENSIONS},
{"logEntryFormat", IDS_DEVICE_LOG_ENTRY},
};
html->AddLocalizedStrings(kStrings);
#if BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(IS_CHROMEOS_ASH)
auto device_log_url = base::UTF8ToUTF16(chrome::kChromeUIDeviceLogUrl);
#elif BUILDFLAG(IS_CHROMEOS_LACROS)
auto device_log_url = base::UTF8ToUTF16(chrome::kOsUIDeviceLogURL);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
auto os_link_container = l10n_util::GetStringFUTF16(
IDS_DEVICE_LOG_OS_LINK_CONTAINER, device_log_url);
html->AddString("osLinkContainer", os_link_container);
#endif // BUILDFLAG(IS_CHROMEOS)
html->UseStringsJs();
html->AddResourcePath("device_log_ui.css", IDR_DEVICE_LOG_UI_CSS);
html->AddResourcePath("device_log_ui.js", IDR_DEVICE_LOG_UI_JS);
html->SetDefaultResource(IDR_DEVICE_LOG_UI_HTML);
}
DeviceLogUI::~DeviceLogUI() {
}
} // namespace chromeos