Commit 56004db8 authored by John Williams's avatar John Williams Committed by Commit Bot

[Cast MRP] Closing a tab or window terminates mirroring.

Bug: 1095222, b/159069899
Change-Id: I98eefb2eaa7b7086a26590a09bfc811b854e8e33
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2264497
Commit-Queue: John Williams <jrw@chromium.org>
Reviewed-by: default avatarTakumi Fujimoto <takumif@chromium.org>
Cr-Commit-Position: refs/heads/master@{#783092}
parent e4ec960d
...@@ -68,6 +68,7 @@ void ActivityRecord::SetOrUpdateSession(const CastSession& session, ...@@ -68,6 +68,7 @@ void ActivityRecord::SetOrUpdateSession(const CastSession& session,
DVLOG(2) << "SetOrUpdateSession old session_id = " DVLOG(2) << "SetOrUpdateSession old session_id = "
<< session_id_.value_or("<missing>") << session_id_.value_or("<missing>")
<< ", new session_id = " << session.session_id(); << ", new session_id = " << session.session_id();
DCHECK(sink.is_cast_sink());
route_.set_description(session.GetRouteDescription()); route_.set_description(session.GetRouteDescription());
sink_ = sink; sink_ = sink;
if (session_id_) { if (session_id_) {
......
...@@ -37,7 +37,8 @@ class ActivityRecordFactoryForTest { ...@@ -37,7 +37,8 @@ class ActivityRecordFactoryForTest {
const std::string& app_id) = 0; const std::string& app_id) = 0;
virtual std::unique_ptr<MirroringActivityRecord> MakeMirroringActivityRecord( virtual std::unique_ptr<MirroringActivityRecord> MakeMirroringActivityRecord(
const MediaRoute& route, const MediaRoute& route,
const std::string& app_id) = 0; const std::string& app_id,
base::OnceClosure on_stop) = 0;
}; };
class ActivityRecord { class ActivityRecord {
...@@ -143,6 +144,13 @@ class ActivityRecord { ...@@ -143,6 +144,13 @@ class ActivityRecord {
client_factory_for_test_ = factory; client_factory_for_test_ = factory;
} }
void SetSessionAndSinkForTest(const CastSession& session,
const MediaSinkInternal& sink,
const std::string& hash_code) {
session_id_ = session.session_id();
sink_ = sink;
}
protected: protected:
using ClientMap = using ClientMap =
base::flat_map<std::string, std::unique_ptr<CastSessionClient>>; base::flat_map<std::string, std::unique_ptr<CastSessionClient>>;
...@@ -178,8 +186,6 @@ class ActivityRecord { ...@@ -178,8 +186,6 @@ class ActivityRecord {
ClientMap connected_clients_; ClientMap connected_clients_;
private: private:
friend class CastActivityRecordTest;
static CastSessionClientFactoryForTest* client_factory_for_test_; static CastSessionClientFactoryForTest* client_factory_for_test_;
}; };
......
...@@ -338,13 +338,8 @@ void CastActivityManager::JoinSession( ...@@ -338,13 +338,8 @@ void CastActivityManager::JoinSession(
base::nullopt, RouteRequestResult::ResultCode::OK); base::nullopt, RouteRequestResult::ResultCode::OK);
} }
// TODO(jrw): Can this be merged with HandleStopSessionResponse? void CastActivityManager::OnActivityStopped(const std::string& route_id) {
void CastActivityManager::RemoveActivityByRouteId(const std::string& route_id) { TerminateSession(route_id, base::DoNothing());
auto it = activities_.find(route_id);
if (it != activities_.end()) {
RemoveActivity(it, PresentationConnectionState::TERMINATED,
PresentationConnectionCloseReason::CLOSED);
}
} }
void CastActivityManager::RemoveActivity( void CastActivityManager::RemoveActivity(
...@@ -449,8 +444,9 @@ CastActivityRecord* CastActivityManager::AddCastActivityRecord( ...@@ -449,8 +444,9 @@ CastActivityRecord* CastActivityManager::AddCastActivityRecord(
const MediaRoute& route, const MediaRoute& route,
const std::string& app_id) { const std::string& app_id) {
std::unique_ptr<CastActivityRecord> activity( std::unique_ptr<CastActivityRecord> activity(
activity_record_factory_ activity_record_factory_for_test_
? activity_record_factory_->MakeCastActivityRecord(route, app_id) ? activity_record_factory_for_test_->MakeCastActivityRecord(route,
app_id)
: std::make_unique<CastActivityRecord>( : std::make_unique<CastActivityRecord>(
route, app_id, message_handler_, session_tracker_)); route, app_id, message_handler_, session_tracker_));
auto* const activity_ptr = activity.get(); auto* const activity_ptr = activity.get();
...@@ -464,18 +460,18 @@ ActivityRecord* CastActivityManager::AddMirroringActivityRecord( ...@@ -464,18 +460,18 @@ ActivityRecord* CastActivityManager::AddMirroringActivityRecord(
const std::string& app_id, const std::string& app_id,
const int tab_id, const int tab_id,
const CastSinkExtraData& cast_data) { const CastSinkExtraData& cast_data) {
// NOTE(jrw): We could theoretically use base::Unretained() below instead of
// GetWeakPtr(), but that seems like an unnecessary optimization here.
auto on_stop =
base::BindOnce(&CastActivityManager::OnActivityStopped,
weak_ptr_factory_.GetWeakPtr(), route.media_route_id());
auto activity = auto activity =
activity_record_factory_ activity_record_factory_for_test_
? activity_record_factory_->MakeMirroringActivityRecord(route, app_id) ? activity_record_factory_for_test_->MakeMirroringActivityRecord(
route, app_id, std::move(on_stop))
: std::make_unique<MirroringActivityRecord>( : std::make_unique<MirroringActivityRecord>(
route, app_id, message_handler_, session_tracker_, tab_id, route, app_id, message_handler_, session_tracker_, tab_id,
cast_data, cast_data, std::move(on_stop));
// NOTE(jrw): We could theoretically use base::Unretained()
// below instead of GetWeakPtr(), but that seems like an
// unnecessary optimization here.
base::BindOnce(&CastActivityManager::RemoveActivityByRouteId,
weak_ptr_factory_.GetWeakPtr(),
route.media_route_id()));
if (route.is_local()) if (route.is_local())
activity->CreateMojoBindings(media_router_); activity->CreateMojoBindings(media_router_);
auto* const activity_ptr = activity.get(); auto* const activity_ptr = activity.get();
...@@ -834,7 +830,7 @@ CastActivityManager::DoLaunchSessionParams::DoLaunchSessionParams( ...@@ -834,7 +830,7 @@ CastActivityManager::DoLaunchSessionParams::DoLaunchSessionParams(
CastActivityManager::DoLaunchSessionParams::~DoLaunchSessionParams() = default; CastActivityManager::DoLaunchSessionParams::~DoLaunchSessionParams() = default;
// static // static
ActivityRecordFactoryForTest* CastActivityManager::activity_record_factory_ = ActivityRecordFactoryForTest*
nullptr; CastActivityManager::activity_record_factory_for_test_ = nullptr;
} // namespace media_router } // namespace media_router
...@@ -128,7 +128,7 @@ class CastActivityManager : public CastActivityManagerBase, ...@@ -128,7 +128,7 @@ class CastActivityManager : public CastActivityManagerBase,
static void SetActitivyRecordFactoryForTest( static void SetActitivyRecordFactoryForTest(
ActivityRecordFactoryForTest* factory) { ActivityRecordFactoryForTest* factory) {
activity_record_factory_ = factory; activity_record_factory_for_test_ = factory;
} }
cast_channel::ResultCallback MakeResultCallbackForRoute( cast_channel::ResultCallback MakeResultCallbackForRoute(
...@@ -204,8 +204,7 @@ class CastActivityManager : public CastActivityManagerBase, ...@@ -204,8 +204,7 @@ class CastActivityManager : public CastActivityManagerBase,
}; };
void DoLaunchSession(DoLaunchSessionParams params); void DoLaunchSession(DoLaunchSessionParams params);
void OnActivityStopped(const std::string& route_id);
void RemoveActivityByRouteId(const std::string& route_id);
// Removes an activity, terminating any associated connections, then // Removes an activity, terminating any associated connections, then
// notifies the media router that routes have been updated. // notifies the media router that routes have been updated.
...@@ -275,7 +274,7 @@ class CastActivityManager : public CastActivityManagerBase, ...@@ -275,7 +274,7 @@ class CastActivityManager : public CastActivityManagerBase,
std::string ChooseAppId(const CastMediaSource& source, std::string ChooseAppId(const CastMediaSource& source,
const MediaSinkInternal& sink) const; const MediaSinkInternal& sink) const;
static ActivityRecordFactoryForTest* activity_record_factory_; static ActivityRecordFactoryForTest* activity_record_factory_for_test_;
base::flat_set<MediaSource::Id> route_queries_; base::flat_set<MediaSource::Id> route_queries_;
......
...@@ -45,6 +45,7 @@ using testing::_; ...@@ -45,6 +45,7 @@ using testing::_;
using testing::AnyNumber; using testing::AnyNumber;
using testing::ByRef; using testing::ByRef;
using testing::ElementsAre; using testing::ElementsAre;
using testing::Invoke;
using testing::IsEmpty; using testing::IsEmpty;
using testing::Not; using testing::Not;
using testing::Return; using testing::Return;
...@@ -102,14 +103,15 @@ using MockCastActivityRecordCallback = ...@@ -102,14 +103,15 @@ using MockCastActivityRecordCallback =
class MockMirroringActivityRecord : public MirroringActivityRecord { class MockMirroringActivityRecord : public MirroringActivityRecord {
public: public:
MockMirroringActivityRecord(const MediaRoute& route, MockMirroringActivityRecord(const MediaRoute& route,
const std::string& app_id) const std::string& app_id,
OnStopCallback on_stop)
: MirroringActivityRecord(route, : MirroringActivityRecord(route,
app_id, app_id,
nullptr, nullptr,
nullptr, nullptr,
0, 0,
CastSinkExtraData(), CastSinkExtraData(),
base::DoNothing()) {} std::move(on_stop)) {}
void set_session_id(const std::string& new_id) { void set_session_id(const std::string& new_id) {
if (!session_id_) if (!session_id_)
...@@ -179,12 +181,10 @@ class CastActivityManagerTest : public testing::Test, ...@@ -179,12 +181,10 @@ class CastActivityManagerTest : public testing::Test,
const MediaRoute& route, const MediaRoute& route,
const std::string& app_id) override { const std::string& app_id) override {
auto activity = std::make_unique<MockCastActivityRecord>(route, app_id); auto activity = std::make_unique<MockCastActivityRecord>(route, app_id);
auto* activity_ptr = activity.get();
std::string route_id = route.media_route_id();
ON_CALL(*activity, SetOrUpdateSession) ON_CALL(*activity, SetOrUpdateSession)
.WillByDefault(WithArg<0>([activity_ptr](const auto& session) { .WillByDefault(
activity_ptr->set_session_id(session.session_id()); Invoke(activity.get(), &ActivityRecord::SetSessionAndSinkForTest));
})); auto* activity_ptr = activity.get();
cast_activities_.push_back(activity_ptr); cast_activities_.push_back(activity_ptr);
activity_record_callback_.Run(activity_ptr); activity_record_callback_.Run(activity_ptr);
return activity; return activity;
...@@ -193,14 +193,13 @@ class CastActivityManagerTest : public testing::Test, ...@@ -193,14 +193,13 @@ class CastActivityManagerTest : public testing::Test,
// from ActivityRecordFactoryForTest // from ActivityRecordFactoryForTest
std::unique_ptr<MirroringActivityRecord> MakeMirroringActivityRecord( std::unique_ptr<MirroringActivityRecord> MakeMirroringActivityRecord(
const MediaRoute& route, const MediaRoute& route,
const std::string& app_id) override { const std::string& app_id,
auto activity = MirroringActivityRecord::OnStopCallback on_stop) override {
std::make_unique<MockMirroringActivityRecord>(route, app_id); auto activity = std::make_unique<MockMirroringActivityRecord>(
auto* activity_ptr = activity.get(); route, app_id, std::move(on_stop));
ON_CALL(*activity, SetOrUpdateSession) ON_CALL(*activity, SetOrUpdateSession)
.WillByDefault(WithArg<0>([activity_ptr](const auto& session) { .WillByDefault(
activity_ptr->set_session_id(session.session_id()); Invoke(activity.get(), &ActivityRecord::SetSessionAndSinkForTest));
}));
mirroring_activity_ = activity.get(); mirroring_activity_ = activity.get();
return activity; return activity;
} }
...@@ -423,6 +422,20 @@ TEST_F(CastActivityManagerTest, LaunchMirroringSession) { ...@@ -423,6 +422,20 @@ TEST_F(CastActivityManagerTest, LaunchMirroringSession) {
EXPECT_EQ(RouteControllerType::kMirroring, route_->controller_type()); EXPECT_EQ(RouteControllerType::kMirroring, route_->controller_type());
} }
TEST_F(CastActivityManagerTest, MirroringSessionStopped) {
CallLaunchSession(kCastStreamingAppId);
auto response = GetSuccessLaunchResponse();
SetSessionForTest(route_->media_sink_id(),
CastSession::From(sink_, *response.receiver_status));
std::move(launch_session_callback_).Run(std::move(response));
RunUntilIdle();
ASSERT_TRUE(mirroring_activity_);
EXPECT_CALL(message_handler_, StopSession).Times(1);
mirroring_activity_->DidStop();
}
TEST_F(CastActivityManagerTest, LaunchSessionFails) { TEST_F(CastActivityManagerTest, LaunchSessionFails) {
// 3 things will happen: // 3 things will happen:
// (1) Route is removed // (1) Route is removed
......
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