Commit 99d03055 authored by mark a. foltz's avatar mark a. foltz Committed by Commit Bot

[Media Router] Fix Cast MEDIA_STATUS updates.

The Cast SDK expects a MEDIA_STATUS message with an IDLE player after
stopping media.  This updates the Cast MRP to send it.

Bug: 1040185
Change-Id: Ieae8f30906026d2c9d067aecc31a61bcf9027eb9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2087700Reviewed-by: default avatarTakumi Fujimoto <takumif@chromium.org>
Commit-Queue: mark a. foltz <mfoltz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748261}
parent e38f0c99
...@@ -105,6 +105,7 @@ void CastSessionTracker::HandleReceiverStatusMessage( ...@@ -105,6 +105,7 @@ void CastSessionTracker::HandleReceiverStatusMessage(
void CastSessionTracker::HandleMediaStatusMessage(const MediaSinkInternal& sink, void CastSessionTracker::HandleMediaStatusMessage(const MediaSinkInternal& sink,
const base::Value& message) { const base::Value& message) {
DVLOG(2) << "Initial MEDIA_STATUS: " << message;
auto session_it = sessions_by_sink_id_.find(sink.sink().id()); auto session_it = sessions_by_sink_id_.find(sink.sink().id());
if (session_it == sessions_by_sink_id_.end()) { if (session_it == sessions_by_sink_id_.end()) {
DVLOG(2) << "Got media status message, but no session for: " DVLOG(2) << "Got media status message, but no session for: "
...@@ -131,17 +132,7 @@ void CastSessionTracker::HandleMediaStatusMessage(const MediaSinkInternal& sink, ...@@ -131,17 +132,7 @@ void CastSessionTracker::HandleMediaStatusMessage(const MediaSinkInternal& sink,
return; return;
} }
// First filter out any idle media objects.
updated_status->EraseListValueIf([](const base::Value& media) {
const std::string* player_state = media.FindStringKey("playerState");
return player_state && *player_state == "IDLE";
});
base::Value::ListView media_list = updated_status->GetList(); base::Value::ListView media_list = updated_status->GetList();
if (media_list.size() > 1) {
DVLOG(2) << "Media list unexpectedly contains more than one live media: "
<< media_list.size() << ", session: " << session_id;
}
// Backfill messages from receivers to make them compatible with Cast SDK. // Backfill messages from receivers to make them compatible with Cast SDK.
for (auto& media : media_list) { for (auto& media : media_list) {
...@@ -158,7 +149,7 @@ void CastSessionTracker::HandleMediaStatusMessage(const MediaSinkInternal& sink, ...@@ -158,7 +149,7 @@ void CastSessionTracker::HandleMediaStatusMessage(const MediaSinkInternal& sink,
CopySavedMediaFieldsToMediaList(session, media_list); CopySavedMediaFieldsToMediaList(session, media_list);
DVLOG(2) << "Final updated status: " << updated_status; DVLOG(2) << "Final updated MEDIA_STATUS: " << *updated_status;
session->UpdateMedia(*updated_status); session->UpdateMedia(*updated_status);
base::Optional<int> request_id = base::Optional<int> request_id =
......
...@@ -169,9 +169,6 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageBasic) { ...@@ -169,9 +169,6 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageBasic) {
AddSinkAndSendReceiverStatusResponse(); AddSinkAndSendReceiverStatusResponse();
// Expect that: // Expect that:
//
// - Any 'status' entries with 'playerState' equal to "IDLE" are filtered out.
//
// - The session ID is copied into the output message and all values in in the // - The session ID is copied into the output message and all values in in the
// 'status' list. // 'status' list.
// //
...@@ -187,8 +184,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageBasic) { ...@@ -187,8 +184,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageBasic) {
"sessionId": "theSessionId", "sessionId": "theSessionId",
"supportedMediaCommands": [], "supportedMediaCommands": [],
}, },
], {
})"), "playerState": "IDLE",
"sessionId": "theSessionId"
}]})"),
base::Optional<int>())); base::Optional<int>()));
// This should call session_tracker_.HandleMediaStatusMessage(...). // This should call session_tracker_.HandleMediaStatusMessage(...).
...@@ -211,6 +210,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageBasic) { ...@@ -211,6 +210,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageBasic) {
"playerState": "anything but IDLE", "playerState": "anything but IDLE",
"sessionId": "theSessionId", "sessionId": "theSessionId",
"supportedMediaCommands": [], "supportedMediaCommands": [],
},
{
"playerState": "IDLE",
"sessionId": "theSessionId"
}])")); }])"));
} }
...@@ -219,8 +222,6 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageFancy) { ...@@ -219,8 +222,6 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageFancy) {
// Expect that: // Expect that:
// //
// - Any 'status' entries with 'playerState' equal to "IDLE" are filtered out.
//
// - The session ID is copied into the output message and all values in in the // - The session ID is copied into the output message and all values in in the
// 'status' list. // 'status' list.
// //
...@@ -241,7 +242,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageFancy) { ...@@ -241,7 +242,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageFancy) {
"supportedMediaCommands": ["pause"], "supportedMediaCommands": ["pause"],
"xyzzy": "xyzzyValue1", "xyzzy": "xyzzyValue1",
}, },
], {
"playerState": "IDLE",
"sessionId": "theSessionId"
}],
"xyzzy": "xyzzyValue2", "xyzzy": "xyzzyValue2",
})"), })"),
base::make_optional(12345))); base::make_optional(12345)));
...@@ -270,6 +274,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageFancy) { ...@@ -270,6 +274,10 @@ TEST_F(CastSessionTrackerTest, HandleMediaStatusMessageFancy) {
"sessionId": "theSessionId", "sessionId": "theSessionId",
"supportedMediaCommands": ["pause"], "supportedMediaCommands": ["pause"],
"xyzzy": "xyzzyValue1", "xyzzy": "xyzzyValue1",
},
{
"playerState": "IDLE",
"sessionId": "theSessionId"
}])")); }])"));
} }
......
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