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

[Local Screen Casting] Observe displays only when querying for sinks

This CL makes the WiredDisplayMRP observe displays only after
MediaRouter requests to query for sinks, so that we are not observing
displays during startup and looking up the primary display, which is
causing a crash in display-less Chrome OS.

Bug: 803881
Change-Id: I751d1cd295fa3db1c1bdee65570ee4ab7ad8cc23
Reviewed-on: https://chromium-review.googlesource.com/924524
Commit-Queue: Takumi Fujimoto <takumif@chromium.org>
Reviewed-by: default avatarDerek Cheng <imcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#537926}
parent f0794a01
......@@ -90,14 +90,15 @@ WiredDisplayMediaRouteProvider::WiredDisplayMediaRouteProvider(
: binding_(this, std::move(request)),
media_router_(std::move(media_router)),
profile_(profile) {
if (PresentationReceiverWindowEnabled())
display::Screen::GetScreen()->AddObserver(this);
ReportSinkAvailability(GetSinks());
media_router_->OnSinkAvailabilityUpdated(
kProviderId, mojom::MediaRouter::SinkAvailability::PER_SOURCE);
}
WiredDisplayMediaRouteProvider::~WiredDisplayMediaRouteProvider() {
if (PresentationReceiverWindowEnabled())
if (is_observing_displays_ && PresentationReceiverWindowEnabled()) {
display::Screen::GetScreen()->RemoveObserver(this);
is_observing_displays_ = false;
}
}
void WiredDisplayMediaRouteProvider::CreateRoute(
......@@ -201,8 +202,15 @@ void WiredDisplayMediaRouteProvider::SendRouteBinaryMessage(
void WiredDisplayMediaRouteProvider::StartObservingMediaSinks(
const std::string& media_source) {
if (IsPresentationSource(media_source))
sink_queries_.insert(media_source);
if (!IsPresentationSource(media_source))
return;
// Start observing displays if |this| isn't already observing.
if (!is_observing_displays_ && PresentationReceiverWindowEnabled()) {
display::Screen::GetScreen()->AddObserver(this);
is_observing_displays_ = true;
}
sink_queries_.insert(media_source);
UpdateMediaSinks(media_source);
}
......
......@@ -211,6 +211,10 @@ class WiredDisplayMediaRouteProvider : public mojom::MediaRouteProvider,
// Used for recording UMA metrics for the number of sinks available.
WiredDisplayDeviceCountMetrics device_count_metrics_;
// Keeps track of whether |this| is registered with display::Screen as a
// DisplayObserver.
bool is_observing_displays_ = false;
DISALLOW_COPY_AND_ASSIGN(WiredDisplayMediaRouteProvider);
};
......
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