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 { ...@@ -110,6 +110,13 @@ std::string LoggerImpl::GetLogsAsJson() const {
return json; 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, LoggerImpl::Entry::Entry(Severity severity,
mojom::LogCategory category, mojom::LogCategory category,
base::Time time, base::Time time,
...@@ -172,11 +179,4 @@ base::Value LoggerImpl::AsValue(const LoggerImpl::Entry& entry) { ...@@ -172,11 +179,4 @@ base::Value LoggerImpl::AsValue(const LoggerImpl::Entry& entry) {
return entry_val; 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 } // namespace media_router
...@@ -50,6 +50,7 @@ class LoggerImpl : mojom::Logger { ...@@ -50,6 +50,7 @@ class LoggerImpl : mojom::Logger {
void Bind(mojo::PendingReceiver<mojom::Logger> receiver); void Bind(mojo::PendingReceiver<mojom::Logger> receiver);
std::string GetLogsAsJson() const; std::string GetLogsAsJson() const;
base::Value GetLogsAsValue() const;
private: private:
FRIEND_TEST_ALL_PREFIXES(LoggerImplTest, RecordAndGetLogs); FRIEND_TEST_ALL_PREFIXES(LoggerImplTest, RecordAndGetLogs);
...@@ -93,7 +94,6 @@ class LoggerImpl : mojom::Logger { ...@@ -93,7 +94,6 @@ class LoggerImpl : mojom::Logger {
const std::string& session_id); const std::string& session_id);
static base::Value AsValue(const Entry& entry); static base::Value AsValue(const Entry& entry);
base::Value GetLogsAsValue() const;
mojo::ReceiverSet<mojom::Logger> receivers_; mojo::ReceiverSet<mojom::Logger> receivers_;
base::circular_deque<Entry> entries_; base::circular_deque<Entry> entries_;
......
...@@ -195,6 +195,9 @@ class MediaRouter : public KeyedService { ...@@ -195,6 +195,9 @@ class MediaRouter : public KeyedService {
// Returns a pointer to LoggerImpl that can be used to add logging messages. // Returns a pointer to LoggerImpl that can be used to add logging messages.
virtual LoggerImpl* GetLogger() = 0; virtual LoggerImpl* GetLogger() = 0;
// Returns logs collected from Media Router components.
virtual base::Value GetLogs() const = 0;
#endif // !defined(OS_ANDROID) #endif // !defined(OS_ANDROID)
// Registers/Unregisters a CastRemotingConnector with the |tab_id|. For a // Registers/Unregisters a CastRemotingConnector with the |tab_id|. For a
......
...@@ -94,6 +94,10 @@ void MediaRouterBase::GetMediaController( ...@@ -94,6 +94,10 @@ void MediaRouterBase::GetMediaController(
const MediaRoute::Id& route_id, const MediaRoute::Id& route_id,
mojo::PendingReceiver<mojom::MediaController> controller, mojo::PendingReceiver<mojom::MediaController> controller,
mojo::PendingRemote<mojom::MediaStatusObserver> observer) {} mojo::PendingRemote<mojom::MediaStatusObserver> observer) {}
base::Value MediaRouterBase::GetLogs() const {
return base::Value();
}
#endif // !defined(OS_ANDROID) #endif // !defined(OS_ANDROID)
MediaRouterBase::MediaRouterBase() : initialized_(false) {} MediaRouterBase::MediaRouterBase() : initialized_(false) {}
......
...@@ -47,6 +47,7 @@ class MediaRouterBase : public MediaRouter { ...@@ -47,6 +47,7 @@ class MediaRouterBase : public MediaRouter {
const MediaRoute::Id& route_id, const MediaRoute::Id& route_id,
mojo::PendingReceiver<mojom::MediaController> controller, mojo::PendingReceiver<mojom::MediaController> controller,
mojo::PendingRemote<mojom::MediaStatusObserver> observer) override; mojo::PendingRemote<mojom::MediaStatusObserver> observer) override;
base::Value GetLogs() const override;
#endif // !defined(OS_ANDROID) #endif // !defined(OS_ANDROID)
void RegisterRemotingSource(SessionID tab_id, void RegisterRemotingSource(SessionID tab_id,
CastRemotingConnector* remoting_source) override; CastRemotingConnector* remoting_source) override;
......
...@@ -459,6 +459,10 @@ void MediaRouterMojoImpl::GetMediaController( ...@@ -459,6 +459,10 @@ void MediaRouterMojoImpl::GetMediaController(
std::move(callback)); std::move(callback));
} }
base::Value MediaRouterMojoImpl::GetLogs() const {
return logger_.GetLogsAsValue();
}
// static // static
MediaSource MediaRouterMojoImpl::MediaSinksQuery::GetKey( MediaSource MediaRouterMojoImpl::MediaSinksQuery::GetKey(
const MediaSource::Id& id) { const MediaSource::Id& id) {
......
...@@ -83,6 +83,7 @@ class MediaRouterMojoImpl : public MediaRouterBase, public mojom::MediaRouter { ...@@ -83,6 +83,7 @@ class MediaRouterMojoImpl : public MediaRouterBase, public mojom::MediaRouter {
const MediaRoute::Id& route_id, const MediaRoute::Id& route_id,
mojo::PendingReceiver<mojom::MediaController> controller, mojo::PendingReceiver<mojom::MediaController> controller,
mojo::PendingRemote<mojom::MediaStatusObserver> observer) final; mojo::PendingRemote<mojom::MediaStatusObserver> observer) final;
base::Value GetLogs() const override;
void RegisterMediaRouteProvider( void RegisterMediaRouteProvider(
MediaRouteProviderId provider_id, MediaRouteProviderId provider_id,
mojo::PendingRemote<mojom::MediaRouteProvider> mojo::PendingRemote<mojom::MediaRouteProvider>
......
...@@ -11,5 +11,7 @@ ...@@ -11,5 +11,7 @@
<div id="sink-status-div" class="status"></div> <div id="sink-status-div" class="status"></div>
<h1>Cast Media Route Provider</h1> <h1>Cast Media Route Provider</h1>
<div id="cast-status-div" class="status"></div> <div id="cast-status-div" class="status"></div>
<h1>Logs</h1>
<div id="logs-div" class="status"></div>
</body> </body>
</html> </html>
...@@ -5,14 +5,20 @@ ...@@ -5,14 +5,20 @@
import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
import {$} from 'chrome://resources/js/util.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. // Handles user events for the Media Router Internals UI.
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
sendWithPromise('getState').then(status => { sendWithPromise('getState').then(status => {
$('sink-status-div').textContent = $('sink-status-div').textContent = formatJson(status);
JSON.stringify(status, null, /* spacing level = */ 2);
}); });
sendWithPromise('getProviderState', 'CAST').then(status => { sendWithPromise('getProviderState', 'CAST').then(status => {
$('cast-status-div').textContent = $('cast-status-div').textContent = formatJson(status);
JSON.stringify(status, null, /* spacing level = */ 2); });
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() { ...@@ -45,6 +45,10 @@ void MediaRouterInternalsWebUIMessageHandler::RegisterMessages() {
base::BindRepeating( base::BindRepeating(
&MediaRouterInternalsWebUIMessageHandler::HandleGetProviderState, &MediaRouterInternalsWebUIMessageHandler::HandleGetProviderState,
base::Unretained(this))); base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"getLogs", base::BindRepeating(
&MediaRouterInternalsWebUIMessageHandler::HandleGetLogs,
base::Unretained(this)));
} }
void MediaRouterInternalsWebUIMessageHandler::HandleGetState( void MediaRouterInternalsWebUIMessageHandler::HandleGetState(
...@@ -74,6 +78,13 @@ void MediaRouterInternalsWebUIMessageHandler::HandleGetProviderState( ...@@ -74,6 +78,13 @@ void MediaRouterInternalsWebUIMessageHandler::HandleGetProviderState(
weak_factory_.GetWeakPtr(), std::move(callback_id))); 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( void MediaRouterInternalsWebUIMessageHandler::OnProviderState(
base::Value callback_id, base::Value callback_id,
mojom::ProviderStatePtr state) { mojom::ProviderStatePtr state) {
......
...@@ -31,6 +31,7 @@ class MediaRouterInternalsWebUIMessageHandler ...@@ -31,6 +31,7 @@ class MediaRouterInternalsWebUIMessageHandler
// Handlers for JavaScript messages. // Handlers for JavaScript messages.
void HandleGetState(const base::ListValue* args); void HandleGetState(const base::ListValue* args);
void HandleGetProviderState(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); 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