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

[Cast MRP] Terminate all mirroring routes when the browser stops.

Bug: b/161367720
Change-Id: If21e72031c20b6e5da11fc477cf108145776a5d4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2346970Reviewed-by: default avatarTakumi Fujimoto <takumif@chromium.org>
Commit-Queue: John Williams <jrw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798861}
parent db7fbe90
...@@ -67,6 +67,13 @@ CastActivityManager::CastActivityManager( ...@@ -67,6 +67,13 @@ CastActivityManager::CastActivityManager(
CastActivityManager::~CastActivityManager() { CastActivityManager::~CastActivityManager() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// This call is needed to ensure mirroring activies are terminated when the
// 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();
message_handler_->RemoveObserver(this); message_handler_->RemoveObserver(this);
session_tracker_->RemoveObserver(this); session_tracker_->RemoveObserver(this);
} }
...@@ -624,6 +631,8 @@ void CastActivityManager::OnMediaStatusUpdated(const MediaSinkInternal& sink, ...@@ -624,6 +631,8 @@ void CastActivityManager::OnMediaStatusUpdated(const MediaSinkInternal& sink,
} }
} }
// TODO(jrw): This method is only called in one place. Just implement the
// functionality there.
cast_channel::ResultCallback CastActivityManager::MakeResultCallbackForRoute( cast_channel::ResultCallback CastActivityManager::MakeResultCallbackForRoute(
const std::string& route_id, const std::string& route_id,
mojom::MediaRouteProvider::TerminateRouteCallback callback) { mojom::MediaRouteProvider::TerminateRouteCallback callback) {
...@@ -896,6 +905,22 @@ std::string CastActivityManager::ChooseAppId( ...@@ -896,6 +905,22 @@ std::string CastActivityManager::ChooseAppId(
return source.app_infos()[0].app_id; return source.app_infos()[0].app_id;
} }
void CastActivityManager::TerminateAllMirroringActivities() {
// 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())
route_ids.push_back(pair.first);
}
// Terminate the activities.
for (const auto& id : route_ids) {
TerminateSession(id, base::DoNothing());
}
}
CastActivityManager::DoLaunchSessionParams::DoLaunchSessionParams( CastActivityManager::DoLaunchSessionParams::DoLaunchSessionParams(
const MediaRoute& route, const MediaRoute& route,
const CastMediaSource& cast_source, const CastMediaSource& cast_source,
......
...@@ -273,6 +273,8 @@ class CastActivityManager : public CastActivityManagerBase, ...@@ -273,6 +273,8 @@ class CastActivityManager : public CastActivityManagerBase,
std::string ChooseAppId(const CastMediaSource& source, std::string ChooseAppId(const CastMediaSource& source,
const MediaSinkInternal& sink) const; const MediaSinkInternal& sink) const;
void TerminateAllMirroringActivities();
static CastActivityFactoryForTest* cast_activity_factory_for_test_; static CastActivityFactoryForTest* cast_activity_factory_for_test_;
base::flat_set<MediaSource::Id> route_queries_; base::flat_set<MediaSource::Id> route_queries_;
......
...@@ -608,6 +608,18 @@ TEST_F(CastActivityManagerTest, TerminateSessionFails) { ...@@ -608,6 +608,18 @@ TEST_F(CastActivityManagerTest, TerminateSessionFails) {
TerminateSession(false); TerminateSession(false);
} }
TEST_F(CastActivityManagerTest, DestructorClosesMirroringSession) {
LaunchMirroringSession();
ExpectMirroringActivityStopped();
manager_.reset();
}
TEST_F(CastActivityManagerTest, DestructorIgnoresAppSession) {
LaunchAppSession();
ExpectAppActivityStoppedTimes(0);
manager_.reset();
}
TEST_F(CastActivityManagerTest, TerminateSessionBeforeLaunchResponse) { TEST_F(CastActivityManagerTest, TerminateSessionBeforeLaunchResponse) {
CallLaunchSession(); CallLaunchSession();
// Stop session message not sent because session has not launched yet. // Stop session message not sent because session has not launched yet.
......
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