| Index: chrome/browser/media/router/presentation_service_delegate_impl.cc
|
| diff --git a/chrome/browser/media/router/presentation_service_delegate_impl.cc b/chrome/browser/media/router/presentation_service_delegate_impl.cc
|
| index 5a5ffd65dd726b91c0ebbcb7ddc695f0e3d51b74..438313574df430505adb0c3d86bd90cf2c2bbc14 100644
|
| --- a/chrome/browser/media/router/presentation_service_delegate_impl.cc
|
| +++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc
|
| @@ -107,7 +107,9 @@ class PresentationFrame {
|
| content::PresentationScreenAvailabilityListener* listener) const;
|
| base::SmallMap<std::map<std::string, MediaRoute::Id>>
|
| presentation_id_to_route_id_;
|
| - scoped_ptr<PresentationMediaSinksObserver> sinks_observer_;
|
| + // TODO(btolsch): Use SmallMap here if move operation patch is accepted.
|
| + std::map<std::string, scoped_ptr<PresentationMediaSinksObserver>>
|
| + url_to_sinks_observer_;
|
| base::ScopedPtrHashMap<MediaRoute::Id,
|
| scoped_ptr<PresentationConnectionStateSubscription>>
|
| connection_state_subscriptions_;
|
| @@ -158,15 +160,16 @@ const std::vector<MediaRoute::Id> PresentationFrame::GetRouteIds() const {
|
|
|
| bool PresentationFrame::SetScreenAvailabilityListener(
|
| content::PresentationScreenAvailabilityListener* listener) {
|
| - if (sinks_observer_ && sinks_observer_->listener() == listener)
|
| + MediaSource source(GetMediaSourceFromListener(listener));
|
| + auto& sinks_observer = url_to_sinks_observer_[source.id()];
|
| + if (sinks_observer && sinks_observer->listener() == listener)
|
| return false;
|
|
|
| - MediaSource source(GetMediaSourceFromListener(listener));
|
| - sinks_observer_.reset(
|
| + sinks_observer.reset(
|
| new PresentationMediaSinksObserver(router_, listener, source));
|
|
|
| - if (!sinks_observer_->Init()) {
|
| - sinks_observer_.reset();
|
| + if (!sinks_observer->Init()) {
|
| + url_to_sinks_observer_.erase(source.id());
|
| listener->OnScreenAvailabilityNotSupported();
|
| return false;
|
| }
|
| @@ -176,8 +179,11 @@ bool PresentationFrame::SetScreenAvailabilityListener(
|
|
|
| bool PresentationFrame::RemoveScreenAvailabilityListener(
|
| content::PresentationScreenAvailabilityListener* listener) {
|
| - if (sinks_observer_ && sinks_observer_->listener() == listener) {
|
| - sinks_observer_.reset();
|
| + MediaSource source(GetMediaSourceFromListener(listener));
|
| + auto sinks_observer_it = url_to_sinks_observer_.find(source.id());
|
| + if (sinks_observer_it != url_to_sinks_observer_.end() &&
|
| + sinks_observer_it->second->listener() == listener) {
|
| + url_to_sinks_observer_.erase(sinks_observer_it);
|
| return true;
|
| }
|
| return false;
|
| @@ -185,7 +191,7 @@ bool PresentationFrame::RemoveScreenAvailabilityListener(
|
|
|
| bool PresentationFrame::HasScreenAvailabilityListenerForTest(
|
| const MediaSource::Id& source_id) const {
|
| - return sinks_observer_ && sinks_observer_->source().id() == source_id;
|
| + return url_to_sinks_observer_.find(source_id) != url_to_sinks_observer_.end();
|
| }
|
|
|
| void PresentationFrame::Reset() {
|
| @@ -193,7 +199,7 @@ void PresentationFrame::Reset() {
|
| router_->DetachRoute(pid_route_id.second);
|
|
|
| presentation_id_to_route_id_.clear();
|
| - sinks_observer_.reset();
|
| + url_to_sinks_observer_.clear();
|
| connection_state_subscriptions_.clear();
|
| session_messages_observers_.clear();
|
| }
|
|
|