Commit bed81479 authored by John Williams's avatar John Williams Committed by Commit Bot

[Cast MRP] Don't automatically terminate non-local mirroring activities.

Bug: 1138469
Change-Id: Idcb06541f74c1795abef7725176aa87b7cab0337
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2472206Reviewed-by: default avatarTakumi Fujimoto <takumif@chromium.org>
Commit-Queue: John Williams <jrw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#817257}
parent 198d53d8
......@@ -73,7 +73,7 @@ CastActivityManager::~CastActivityManager() {
// browser shuts down. This works when the browser is closed through its UI,
// or when it is given an opportunity to shut down gracefully, e.g. with
// SIGINT on Linux, but not SIGTERM.
TerminateAllMirroringActivities();
TerminateAllLocalMirroringActivities();
message_handler_->RemoveObserver(this);
session_tracker_->RemoveObserver(this);
......@@ -910,14 +910,16 @@ std::string CastActivityManager::ChooseAppId(
return source.app_infos()[0].app_id;
}
void CastActivityManager::TerminateAllMirroringActivities() {
void CastActivityManager::TerminateAllLocalMirroringActivities() {
// Save all route IDs so we aren't iterating over |activities_| when it's
// modified.
std::vector<MediaRoute::Id> route_ids;
for (const auto& pair : activities_) {
// Anything that isn't an app activity is a mirroring activity.
if (app_activities_.find(pair.first) == app_activities_.end())
if (pair.second->route().is_local() &&
// Anything that isn't an app activity is a mirroring activity.
app_activities_.find(pair.first) == app_activities_.end()) {
route_ids.push_back(pair.first);
}
}
// Terminate the activities.
......
......@@ -273,7 +273,7 @@ class CastActivityManager : public CastActivityManagerBase,
std::string ChooseAppId(const CastMediaSource& source,
const MediaSinkInternal& sink) const;
void TerminateAllMirroringActivities();
void TerminateAllLocalMirroringActivities();
static CastActivityFactoryForTest* cast_activity_factory_for_test_;
......
......@@ -325,10 +325,20 @@ class CastActivityManagerTest : public testing::Test,
DCHECK(mirroring_activity_);
}
void ExpectMirroringActivityStopped() {
void AddRemoteMirroringSession() {
auto session =
CastSession::From(sink2_, MakeReceiverStatus(kCastStreamingAppId));
manager_->OnSessionAddedOrUpdated(sink2_, *session);
SetSessionForTest(sink2_.id(), std::move(session));
DCHECK(mirroring_activity_);
EXPECT_CALL(message_handler_, StopSession).Times(1);
EXPECT_CALL(*mirroring_activity_, SendStopSessionMessageToClients).Times(1);
DCHECK(!mirroring_activity_->route().is_local());
}
void ExpectMirroringActivityStoppedTimes(int times) {
DCHECK(mirroring_activity_);
EXPECT_CALL(message_handler_, StopSession).Times(times);
EXPECT_CALL(*mirroring_activity_, SendStopSessionMessageToClients)
.Times(times);
}
void TerminateSession(bool expect_success) {
......@@ -444,7 +454,7 @@ TEST_F(CastActivityManagerTest, LaunchSiteInitiatedMirroringSession) {
TEST_F(CastActivityManagerTest, MirroringSessionStopped) {
LaunchMirroringSession();
ExpectMirroringActivityStopped();
ExpectMirroringActivityStoppedTimes(1);
mirroring_activity_->DidStop();
}
......@@ -613,9 +623,15 @@ TEST_F(CastActivityManagerTest, TerminateSessionFails) {
TerminateSession(false);
}
TEST_F(CastActivityManagerTest, DestructorClosesMirroringSession) {
TEST_F(CastActivityManagerTest, DestructorClosesLocalMirroringSession) {
LaunchMirroringSession();
ExpectMirroringActivityStopped();
ExpectMirroringActivityStoppedTimes(1);
manager_.reset();
}
TEST_F(CastActivityManagerTest, DestructorIgnoresNonlocalMirroringSession) {
AddRemoteMirroringSession();
ExpectMirroringActivityStoppedTimes(0);
manager_.reset();
}
......
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