Commit d7c4f56d authored by Takumi Fujimoto's avatar Takumi Fujimoto Committed by Commit Bot

[Cast MRP] Instantiate MirroringActivityRecord for non-local sessions

Prior to this CL, CastActivityManager instantiated CastActivityRecord
for non-local routes, regardless of whether it's for flinging or
mirroring. This CL fixes that issue, instantiating a no-op
MirroringActivityRecord instead.

Bug: 1037967
Change-Id: Icfd45c150be9f9de107ca8a62487cfe1cd80a283
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2033656Reviewed-by: default avatarBrandon Tolsch <btolsch@chromium.org>
Commit-Queue: Takumi Fujimoto <takumif@chromium.org>
Cr-Commit-Position: refs/heads/master@{#738333}
parent 88764eb9
......@@ -562,8 +562,14 @@ void CastActivityManager::AddNonLocalActivityRecord(
/* is_local */ false, /* for_display */ true);
route.set_media_sink_name(sink.sink().name());
if (cast_source->ContainsStreamingApp()) {
route.set_controller_type(RouteControllerType::kMirroring);
AddMirroringActivityRecord(route, app_id, -1, sink.cast_data());
} else {
route.set_controller_type(RouteControllerType::kGeneric);
auto* activity_ptr = AddCastActivityRecord(route, app_id);
activity_ptr->SetOrUpdateSession(session, sink, hash_token_);
}
}
const MediaRoute* CastActivityManager::GetRoute(
......
......@@ -25,9 +25,7 @@ CastActivityRecord::CastActivityRecord(
const std::string& app_id,
cast_channel::CastMessageHandler* message_handler,
CastSessionTracker* session_tracker)
: ActivityRecord(route, app_id, message_handler, session_tracker) {
route_.set_controller_type(RouteControllerType::kGeneric);
}
: ActivityRecord(route, app_id, message_handler, session_tracker) {}
CastActivityRecord::~CastActivityRecord() = default;
......
......@@ -44,6 +44,8 @@ namespace media_router {
namespace {
using MirroringType = MirroringActivityRecord::MirroringType;
const std::string GetMirroringNamespace(const base::Value& message) {
const base::Value* const type_value =
message.FindKeyOfType("type", base::Value::Type::STRING);
......@@ -58,6 +60,12 @@ const std::string GetMirroringNamespace(const base::Value& message) {
}
}
MirroringType GetMirroringType(const MediaRoute& route, int tab_id) {
if (!route.is_local())
return MirroringType::kNonLocal;
return tab_id == -1 ? MirroringType::kDesktop : MirroringType::kTab;
}
} // namespace
MirroringActivityRecord::MirroringActivityRecord(
......@@ -73,8 +81,7 @@ MirroringActivityRecord::MirroringActivityRecord(
channel_id_(cast_data.cast_channel_id),
// TODO(jrw): MirroringType::kOffscreenTab should be a possible value here
// once the Presentation API 1UA mode is supported.
mirroring_type_(target_tab_id == -1 ? MirroringType::kDesktop
: MirroringType::kTab),
mirroring_type_(GetMirroringType(route, target_tab_id)),
on_stop_(std::move(callback)) {
// TODO(jrw): Detect and report errors.
......@@ -93,6 +100,10 @@ MirroringActivityRecord::MirroringActivityRecord(
media_router->GetMirroringServiceHostForTab(
target_tab_id, host_.BindNewPipeAndPassReceiver());
break;
case MirroringType::kNonLocal:
// Non-local activity doesn't need to handle messages, so return without
// setting up Mojo bindings.
return;
default:
NOTREACHED();
}
......@@ -155,6 +166,8 @@ void MirroringActivityRecord::Send(mirroring::mojom::CastMessagePtr message) {
void MirroringActivityRecord::OnAppMessage(
const cast::channel::CastMessage& message) {
if (!route_.is_local())
return;
if (message.namespace_() != mirroring::mojom::kWebRtcNamespace &&
message.namespace_() != mirroring::mojom::kRemotingNamespace) {
// Ignore message with wrong namespace.
......@@ -175,6 +188,8 @@ void MirroringActivityRecord::OnAppMessage(
void MirroringActivityRecord::OnInternalMessage(
const cast_channel::InternalMessage& message) {
if (!route_.is_local())
return;
DVLOG(2) << "Relaying internal message from receiver: " << message.message;
mirroring::mojom::CastMessagePtr ptr = mirroring::mojom::CastMessage::New();
ptr->message_namespace = message.message_namespace;
......
......@@ -33,6 +33,14 @@ class MirroringActivityRecord : public ActivityRecord,
public:
using OnStopCallback = base::OnceClosure;
enum class MirroringType {
kTab, // Mirror a single tab.
kDesktop, // Mirror the whole desktop.
kOffscreenTab, // Used for Presentation API 1UA mode.
kNonLocal, // Activity started by other sender devices.
kMaxValue = kNonLocal,
};
MirroringActivityRecord(const MediaRoute& route,
const std::string& app_id,
cast_channel::CastMessageHandler* message_handler,
......@@ -61,13 +69,6 @@ class MirroringActivityRecord : public ActivityRecord,
mojo::PendingRemote<mojom::MediaStatusObserver> observer) override;
private:
enum class MirroringType {
kTab, // Mirror a single tab.
kDesktop, // Mirror the whole desktop.
kOffscreenTab, // Used for Presentation API 1UA mode.
kMaxValue = kOffscreenTab,
};
void HandleParseJsonResult(const std::string& route_id,
data_decoder::DataDecoder::ValueOrError result);
......
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