Commit d470c938 authored by Takumi Fujimoto's avatar Takumi Fujimoto Committed by Commit Bot

Show Media Router logs on chrome://media-router-internals

Print the native logs JSON string on the internals page to aid in
debugging.

Bug: 687380
Change-Id: I864ff7dbdaa32a2b13cab85b1c554e04ed14e53a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2324969Reviewed-by: default avatarmark a. foltz <mfoltz@chromium.org>
Commit-Queue: Takumi Fujimoto <takumif@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795686}
parent 6dea50ee
......@@ -110,6 +110,13 @@ std::string LoggerImpl::GetLogsAsJson() const {
return json;
}
base::Value LoggerImpl::GetLogsAsValue() const {
base::Value entries_val(base::Value::Type::LIST);
for (const auto& entry : entries_)
entries_val.Append(AsValue(entry));
return entries_val;
}
LoggerImpl::Entry::Entry(Severity severity,
mojom::LogCategory category,
base::Time time,
......@@ -172,11 +179,4 @@ base::Value LoggerImpl::AsValue(const LoggerImpl::Entry& entry) {
return entry_val;
}
base::Value LoggerImpl::GetLogsAsValue() const {
base::Value entries_val(base::Value::Type::LIST);
for (const auto& entry : entries_)
entries_val.Append(AsValue(entry));
return entries_val;
}
} // namespace media_router
......@@ -50,6 +50,7 @@ class LoggerImpl : mojom::Logger {
void Bind(mojo::PendingReceiver<mojom::Logger> receiver);
std::string GetLogsAsJson() const;
base::Value GetLogsAsValue() const;
private:
FRIEND_TEST_ALL_PREFIXES(LoggerImplTest, RecordAndGetLogs);
......@@ -93,7 +94,6 @@ class LoggerImpl : mojom::Logger {
const std::string& session_id);
static base::Value AsValue(const Entry& entry);
base::Value GetLogsAsValue() const;
mojo::ReceiverSet<mojom::Logger> receivers_;
base::circular_deque<Entry> entries_;
......
......@@ -195,6 +195,9 @@ class MediaRouter : public KeyedService {
// Returns a pointer to LoggerImpl that can be used to add logging messages.
virtual LoggerImpl* GetLogger() = 0;
// Returns logs collected from Media Router components.
virtual base::Value GetLogs() const = 0;
#endif // !defined(OS_ANDROID)
// Registers/Unregisters a CastRemotingConnector with the |tab_id|. For a
......
......@@ -94,6 +94,10 @@ void MediaRouterBase::GetMediaController(
const MediaRoute::Id& route_id,
mojo::PendingReceiver<mojom::MediaController> controller,
mojo::PendingRemote<mojom::MediaStatusObserver> observer) {}
base::Value MediaRouterBase::GetLogs() const {
return base::Value();
}
#endif // !defined(OS_ANDROID)
MediaRouterBase::MediaRouterBase() : initialized_(false) {}
......
......@@ -47,6 +47,7 @@ class MediaRouterBase : public MediaRouter {
const MediaRoute::Id& route_id,
mojo::PendingReceiver<mojom::MediaController> controller,
mojo::PendingRemote<mojom::MediaStatusObserver> observer) override;
base::Value GetLogs() const override;
#endif // !defined(OS_ANDROID)
void RegisterRemotingSource(SessionID tab_id,
CastRemotingConnector* remoting_source) override;
......
......@@ -459,6 +459,10 @@ void MediaRouterMojoImpl::GetMediaController(
std::move(callback));
}
base::Value MediaRouterMojoImpl::GetLogs() const {
return logger_.GetLogsAsValue();
}
// static
MediaSource MediaRouterMojoImpl::MediaSinksQuery::GetKey(
const MediaSource::Id& id) {
......
......@@ -83,6 +83,7 @@ class MediaRouterMojoImpl : public MediaRouterBase, public mojom::MediaRouter {
const MediaRoute::Id& route_id,
mojo::PendingReceiver<mojom::MediaController> controller,
mojo::PendingRemote<mojom::MediaStatusObserver> observer) final;
base::Value GetLogs() const override;
void RegisterMediaRouteProvider(
MediaRouteProviderId provider_id,
mojo::PendingRemote<mojom::MediaRouteProvider>
......
......@@ -11,5 +11,7 @@
<div id="sink-status-div" class="status"></div>
<h1>Cast Media Route Provider</h1>
<div id="cast-status-div" class="status"></div>
<h1>Logs</h1>
<div id="logs-div" class="status"></div>
</body>
</html>
......@@ -5,14 +5,20 @@
import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
import {$} from 'chrome://resources/js/util.m.js';
function formatJson(jsonObj) {
return JSON.stringify(jsonObj, null, /* spacing level = */ 2);
}
// Handles user events for the Media Router Internals UI.
document.addEventListener('DOMContentLoaded', function() {
sendWithPromise('getState').then(status => {
$('sink-status-div').textContent =
JSON.stringify(status, null, /* spacing level = */ 2);
$('sink-status-div').textContent = formatJson(status);
});
sendWithPromise('getProviderState', 'CAST').then(status => {
$('cast-status-div').textContent =
JSON.stringify(status, null, /* spacing level = */ 2);
$('cast-status-div').textContent = formatJson(status);
});
sendWithPromise('getLogs').then(logs => {
// TODO(crbug.com/687380): Present the logs in a table format.
$('logs-div').textContent = formatJson(logs);
});
});
......@@ -45,6 +45,10 @@ void MediaRouterInternalsWebUIMessageHandler::RegisterMessages() {
base::BindRepeating(
&MediaRouterInternalsWebUIMessageHandler::HandleGetProviderState,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"getLogs", base::BindRepeating(
&MediaRouterInternalsWebUIMessageHandler::HandleGetLogs,
base::Unretained(this)));
}
void MediaRouterInternalsWebUIMessageHandler::HandleGetState(
......@@ -74,6 +78,13 @@ void MediaRouterInternalsWebUIMessageHandler::HandleGetProviderState(
weak_factory_.GetWeakPtr(), std::move(callback_id)));
}
void MediaRouterInternalsWebUIMessageHandler::HandleGetLogs(
const base::ListValue* args) {
AllowJavascript();
const base::Value& callback_id = args->GetList()[0];
ResolveJavascriptCallback(callback_id, router_->GetLogs());
}
void MediaRouterInternalsWebUIMessageHandler::OnProviderState(
base::Value callback_id,
mojom::ProviderStatePtr state) {
......
......@@ -31,6 +31,7 @@ class MediaRouterInternalsWebUIMessageHandler
// Handlers for JavaScript messages.
void HandleGetState(const base::ListValue* args);
void HandleGetProviderState(const base::ListValue* args);
void HandleGetLogs(const base::ListValue* args);
void OnProviderState(base::Value callback_id, mojom::ProviderStatePtr state);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment