| 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 6c6c379133c384e9ae444d0c0ab601dbfc617c2f..bc448a344e608d834b27a4999e036a3bb8927f9e 100644
|
| --- a/chrome/browser/media/router/presentation_service_delegate_impl.cc
|
| +++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc
|
| @@ -72,11 +72,13 @@ class PresentationFrame {
|
|
|
| // Mirror corresponding APIs in PresentationServiceDelegateImpl.
|
| bool SetScreenAvailabilityListener(
|
| - content::PresentationScreenAvailabilityListener* listener);
|
| + content::PresentationScreenAvailabilityListener* listener,
|
| + const GURL& origin);
|
| bool RemoveScreenAvailabilityListener(
|
| - content::PresentationScreenAvailabilityListener* listener);
|
| + content::PresentationScreenAvailabilityListener* listener,
|
| + const GURL& origin);
|
| bool HasScreenAvailabilityListenerForTest(
|
| - const MediaSource::Id& source_id) const;
|
| + const MediaSource& source) const;
|
| std::string GetDefaultPresentationId() const;
|
| void ListenForConnectionStateChange(
|
| const content::PresentationSessionInfo& connection,
|
| @@ -104,12 +106,13 @@ class PresentationFrame {
|
|
|
| private:
|
| MediaSource GetMediaSourceFromListener(
|
| - content::PresentationScreenAvailabilityListener* listener) const;
|
| + content::PresentationScreenAvailabilityListener* listener,
|
| + const GURL& origin) const;
|
| base::SmallMap<std::map<std::string, MediaRoute::Id>>
|
| presentation_id_to_route_id_;
|
| base::SmallMap<
|
| - std::map<std::string, scoped_ptr<PresentationMediaSinksObserver>>>
|
| - url_to_sinks_observer_;
|
| + std::map<MediaSource, scoped_ptr<PresentationMediaSinksObserver>>>
|
| + media_source_to_sinks_observer_;
|
| base::ScopedPtrHashMap<MediaRoute::Id,
|
| scoped_ptr<PresentationConnectionStateSubscription>>
|
| connection_state_subscriptions_;
|
| @@ -159,9 +162,10 @@ const std::vector<MediaRoute::Id> PresentationFrame::GetRouteIds() const {
|
| }
|
|
|
| bool PresentationFrame::SetScreenAvailabilityListener(
|
| - content::PresentationScreenAvailabilityListener* listener) {
|
| - MediaSource source(GetMediaSourceFromListener(listener));
|
| - auto& sinks_observer = url_to_sinks_observer_[source.id()];
|
| + content::PresentationScreenAvailabilityListener* listener,
|
| + const GURL& origin) {
|
| + MediaSource source(GetMediaSourceFromListener(listener, origin));
|
| + auto& sinks_observer = media_source_to_sinks_observer_[source];
|
| if (sinks_observer && sinks_observer->listener() == listener)
|
| return false;
|
|
|
| @@ -169,7 +173,7 @@ bool PresentationFrame::SetScreenAvailabilityListener(
|
| new PresentationMediaSinksObserver(router_, listener, source));
|
|
|
| if (!sinks_observer->Init()) {
|
| - url_to_sinks_observer_.erase(source.id());
|
| + media_source_to_sinks_observer_.erase(source);
|
| listener->OnScreenAvailabilityNotSupported();
|
| return false;
|
| }
|
| @@ -178,20 +182,22 @@ bool PresentationFrame::SetScreenAvailabilityListener(
|
| }
|
|
|
| bool PresentationFrame::RemoveScreenAvailabilityListener(
|
| - content::PresentationScreenAvailabilityListener* listener) {
|
| - MediaSource source(GetMediaSourceFromListener(listener));
|
| - auto sinks_observer_it = url_to_sinks_observer_.find(source.id());
|
| - if (sinks_observer_it != url_to_sinks_observer_.end() &&
|
| + content::PresentationScreenAvailabilityListener* listener,
|
| + const GURL& origin) {
|
| + MediaSource source(GetMediaSourceFromListener(listener, origin));
|
| + auto sinks_observer_it = media_source_to_sinks_observer_.find(source);
|
| + if (sinks_observer_it != media_source_to_sinks_observer_.end() &&
|
| sinks_observer_it->second->listener() == listener) {
|
| - url_to_sinks_observer_.erase(sinks_observer_it);
|
| + media_source_to_sinks_observer_.erase(sinks_observer_it);
|
| return true;
|
| }
|
| return false;
|
| }
|
|
|
| bool PresentationFrame::HasScreenAvailabilityListenerForTest(
|
| - const MediaSource::Id& source_id) const {
|
| - return url_to_sinks_observer_.find(source_id) != url_to_sinks_observer_.end();
|
| + const MediaSource& source) const {
|
| + return media_source_to_sinks_observer_.find(source) !=
|
| + media_source_to_sinks_observer_.end();
|
| }
|
|
|
| void PresentationFrame::Reset() {
|
| @@ -199,7 +205,7 @@ void PresentationFrame::Reset() {
|
| router_->DetachRoute(pid_route_id.second);
|
|
|
| presentation_id_to_route_id_.clear();
|
| - url_to_sinks_observer_.clear();
|
| + media_source_to_sinks_observer_.clear();
|
| connection_state_subscriptions_.clear();
|
| session_messages_observers_.clear();
|
| }
|
| @@ -261,12 +267,13 @@ void PresentationFrame::ListenForSessionMessages(
|
| }
|
|
|
| MediaSource PresentationFrame::GetMediaSourceFromListener(
|
| - content::PresentationScreenAvailabilityListener* listener) const {
|
| + content::PresentationScreenAvailabilityListener* listener,
|
| + const GURL& origin) const {
|
| // If the default presentation URL is empty then fall back to tab mirroring.
|
| std::string availability_url(listener->GetAvailabilityUrl());
|
| return availability_url.empty()
|
| ? MediaSourceForTab(SessionTabHelper::IdForTab(web_contents_))
|
| - : MediaSourceForPresentationUrl(availability_url);
|
| + : MediaSourceForPresentationUrl(availability_url, origin.spec());
|
| }
|
|
|
| // Used by PresentationServiceDelegateImpl to manage PresentationFrames.
|
| @@ -431,7 +438,8 @@ bool PresentationFrameManager::SetScreenAvailabilityListener(
|
| content::PresentationScreenAvailabilityListener* listener) {
|
| DCHECK(listener);
|
| auto presentation_frame = GetOrAddPresentationFrame(render_frame_host_id);
|
| - return presentation_frame->SetScreenAvailabilityListener(listener);
|
| + GURL frame_url(GetLastCommittedURLForFrame(render_frame_host_id));
|
| + return presentation_frame->SetScreenAvailabilityListener(listener, frame_url);
|
| }
|
|
|
| bool PresentationFrameManager::RemoveScreenAvailabilityListener(
|
| @@ -439,16 +447,21 @@ bool PresentationFrameManager::RemoveScreenAvailabilityListener(
|
| content::PresentationScreenAvailabilityListener* listener) {
|
| DCHECK(listener);
|
| auto presentation_frame = presentation_frames_.get(render_frame_host_id);
|
| + GURL frame_url(GetLastCommittedURLForFrame(render_frame_host_id));
|
| return presentation_frame &&
|
| - presentation_frame->RemoveScreenAvailabilityListener(listener);
|
| + presentation_frame->RemoveScreenAvailabilityListener(listener,
|
| + frame_url);
|
| }
|
|
|
| bool PresentationFrameManager::HasScreenAvailabilityListenerForTest(
|
| const RenderFrameHostId& render_frame_host_id,
|
| const MediaSource::Id& source_id) const {
|
| auto presentation_frame = presentation_frames_.get(render_frame_host_id);
|
| + GURL frame_url(GetLastCommittedURLForFrame(render_frame_host_id));
|
| + MediaSource source(source_id);
|
| + source.set_origin(frame_url.spec());
|
| return presentation_frame &&
|
| - presentation_frame->HasScreenAvailabilityListenerForTest(source_id);
|
| + presentation_frame->HasScreenAvailabilityListenerForTest(source);
|
| }
|
|
|
| void PresentationFrameManager::ListenForConnectionStateChange(
|
| @@ -748,13 +761,13 @@ void PresentationServiceDelegateImpl::JoinSession(
|
| weak_factory_.GetWeakPtr(), render_process_id, render_frame_id,
|
| content::PresentationSessionInfo(presentation_url, presentation_id),
|
| success_cb, error_cb));
|
| - router_->JoinRoute(MediaSourceForPresentationUrl(presentation_url).id(),
|
| - presentation_id,
|
| - GetLastCommittedURLForFrame(
|
| - RenderFrameHostId(render_process_id, render_frame_id))
|
| - .GetOrigin(),
|
| - web_contents_, route_response_callbacks, base::TimeDelta(),
|
| - off_the_record);
|
| + GURL origin(GetLastCommittedURLForFrame(
|
| + RenderFrameHostId(render_process_id, render_frame_id))
|
| + .GetOrigin());
|
| + router_->JoinRoute(
|
| + MediaSourceForPresentationUrl(presentation_url, origin.spec()).id(),
|
| + presentation_id, origin, web_contents_, route_response_callbacks,
|
| + base::TimeDelta(), off_the_record);
|
| }
|
|
|
| void PresentationServiceDelegateImpl::CloseConnection(
|
|
|