| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/media/router/presentation_service_delegate_impl.h" | 5 #include "chrome/browser/media/router/presentation_service_delegate_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <unordered_map> | 8 #include <unordered_map> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 | 53 |
| 54 // Returns the unique identifier for the supplied RenderFrameHost. | 54 // Returns the unique identifier for the supplied RenderFrameHost. |
| 55 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { | 55 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { |
| 56 int render_process_id = render_frame_host->GetProcess()->GetID(); | 56 int render_process_id = render_frame_host->GetProcess()->GetID(); |
| 57 int render_frame_id = render_frame_host->GetRoutingID(); | 57 int render_frame_id = render_frame_host->GetRoutingID(); |
| 58 return RenderFrameHostId(render_process_id, render_frame_id); | 58 return RenderFrameHostId(render_process_id, render_frame_id); |
| 59 } | 59 } |
| 60 | 60 |
| 61 // Gets the last committed URL for the render frame specified by | 61 // Gets the last committed URL for the render frame specified by |
| 62 // |render_frame_host_id|. | 62 // |render_frame_host_id|. |
| 63 GURL GetLastCommittedURLForFrame(RenderFrameHostId render_frame_host_id) { | 63 url::Origin GetLastCommittedURLForFrame( |
| 64 RenderFrameHostId render_frame_host_id) { |
| 64 RenderFrameHost* render_frame_host = RenderFrameHost::FromID( | 65 RenderFrameHost* render_frame_host = RenderFrameHost::FromID( |
| 65 render_frame_host_id.first, render_frame_host_id.second); | 66 render_frame_host_id.first, render_frame_host_id.second); |
| 66 if (!render_frame_host) | 67 DCHECK(render_frame_host); |
| 67 return GURL(); | 68 return render_frame_host->GetLastCommittedOrigin(); |
| 68 | |
| 69 // TODO(crbug.com/632623): Use url::Origin in place of GURL for origins | |
| 70 return render_frame_host->GetLastCommittedOrigin().GetURL(); | |
| 71 } | 69 } |
| 72 | 70 |
| 73 // Observes messages originating from the MediaSink connected to a MediaRoute | 71 // Observes messages originating from the MediaSink connected to a MediaRoute |
| 74 // that represents a presentation. Converts the messages into | 72 // that represents a presentation. Converts the messages into |
| 75 // content::PresentationSessionMessages and dispatches them via the provided | 73 // content::PresentationSessionMessages and dispatches them via the provided |
| 76 // PresentationSessionMessageCallback. | 74 // PresentationSessionMessageCallback. |
| 77 class PresentationSessionMessagesObserver : public RouteMessageObserver { | 75 class PresentationSessionMessagesObserver : public RouteMessageObserver { |
| 78 public: | 76 public: |
| 79 // |message_cb|: The callback to invoke whenever messages are received. | 77 // |message_cb|: The callback to invoke whenever messages are received. |
| 80 // |route_id|: ID of MediaRoute to listen for messages. | 78 // |route_id|: ID of MediaRoute to listen for messages. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 | 214 |
| 217 bool PresentationFrame::SetScreenAvailabilityListener( | 215 bool PresentationFrame::SetScreenAvailabilityListener( |
| 218 content::PresentationScreenAvailabilityListener* listener) { | 216 content::PresentationScreenAvailabilityListener* listener) { |
| 219 MediaSource source(GetMediaSourceFromListener(listener)); | 217 MediaSource source(GetMediaSourceFromListener(listener)); |
| 220 auto& sinks_observer = url_to_sinks_observer_[source.id()]; | 218 auto& sinks_observer = url_to_sinks_observer_[source.id()]; |
| 221 if (sinks_observer && sinks_observer->listener() == listener) | 219 if (sinks_observer && sinks_observer->listener() == listener) |
| 222 return false; | 220 return false; |
| 223 | 221 |
| 224 sinks_observer.reset(new PresentationMediaSinksObserver( | 222 sinks_observer.reset(new PresentationMediaSinksObserver( |
| 225 router_, listener, source, | 223 router_, listener, source, |
| 226 GetLastCommittedURLForFrame(render_frame_host_id_).GetOrigin())); | 224 GetLastCommittedURLForFrame(render_frame_host_id_))); |
| 227 | 225 |
| 228 if (!sinks_observer->Init()) { | 226 if (!sinks_observer->Init()) { |
| 229 url_to_sinks_observer_.erase(source.id()); | 227 url_to_sinks_observer_.erase(source.id()); |
| 230 listener->OnScreenAvailabilityNotSupported(); | 228 listener->OnScreenAvailabilityNotSupported(); |
| 231 return false; | 229 return false; |
| 232 } | 230 } |
| 233 | 231 |
| 234 return true; | 232 return true; |
| 235 } | 233 } |
| 236 | 234 |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 const RenderFrameHostId& render_frame_host_id, | 524 const RenderFrameHostId& render_frame_host_id, |
| 527 const std::vector<GURL>& default_presentation_urls, | 525 const std::vector<GURL>& default_presentation_urls, |
| 528 const content::PresentationSessionStartedCallback& callback) { | 526 const content::PresentationSessionStartedCallback& callback) { |
| 529 if (!IsMainFrame(render_frame_host_id)) | 527 if (!IsMainFrame(render_frame_host_id)) |
| 530 return; | 528 return; |
| 531 | 529 |
| 532 if (default_presentation_urls.empty()) { | 530 if (default_presentation_urls.empty()) { |
| 533 ClearDefaultPresentationRequest(); | 531 ClearDefaultPresentationRequest(); |
| 534 } else { | 532 } else { |
| 535 DCHECK(!callback.is_null()); | 533 DCHECK(!callback.is_null()); |
| 536 GURL frame_url(GetLastCommittedURLForFrame(render_frame_host_id)); | 534 const auto& frame_origin = |
| 535 GetLastCommittedURLForFrame(render_frame_host_id); |
| 537 PresentationRequest request(render_frame_host_id, default_presentation_urls, | 536 PresentationRequest request(render_frame_host_id, default_presentation_urls, |
| 538 frame_url); | 537 frame_origin); |
| 539 default_presentation_started_callback_ = callback; | 538 default_presentation_started_callback_ = callback; |
| 540 SetDefaultPresentationRequest(request); | 539 SetDefaultPresentationRequest(request); |
| 541 } | 540 } |
| 542 } | 541 } |
| 543 | 542 |
| 544 void PresentationFrameManager::AddDefaultPresentationRequestObserver( | 543 void PresentationFrameManager::AddDefaultPresentationRequestObserver( |
| 545 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* | 544 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* |
| 546 observer) { | 545 observer) { |
| 547 default_presentation_request_observers_.AddObserver(observer); | 546 default_presentation_request_observers_.AddObserver(observer); |
| 548 } | 547 } |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 const content::PresentationSessionStartedCallback& success_cb, | 780 const content::PresentationSessionStartedCallback& success_cb, |
| 782 const content::PresentationSessionErrorCallback& error_cb) { | 781 const content::PresentationSessionErrorCallback& error_cb) { |
| 783 DVLOG(2) << "PresentationServiceDelegateImpl::JoinSession"; | 782 DVLOG(2) << "PresentationServiceDelegateImpl::JoinSession"; |
| 784 if (presentation_urls.empty()) { | 783 if (presentation_urls.empty()) { |
| 785 error_cb.Run(content::PresentationError( | 784 error_cb.Run(content::PresentationError( |
| 786 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, | 785 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, |
| 787 "Invalid presentation arguments.")); | 786 "Invalid presentation arguments.")); |
| 788 return; | 787 return; |
| 789 } | 788 } |
| 790 | 789 |
| 791 const url::Origin& origin = url::Origin(GetLastCommittedURLForFrame( | 790 const url::Origin& origin = GetLastCommittedURLForFrame( |
| 792 RenderFrameHostId(render_process_id, render_frame_id))); | 791 RenderFrameHostId(render_process_id, render_frame_id)); |
| 793 | 792 |
| 794 #if !defined(OS_ANDROID) | 793 #if !defined(OS_ANDROID) |
| 795 if (IsAutoJoinPresentationId(presentation_id) && | 794 if (IsAutoJoinPresentationId(presentation_id) && |
| 796 ShouldCancelAutoJoinForOrigin(origin)) { | 795 ShouldCancelAutoJoinForOrigin(origin)) { |
| 797 error_cb.Run(content::PresentationError( | 796 error_cb.Run(content::PresentationError( |
| 798 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, | 797 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
| 799 "Auto-join request cancelled by user preferences.")); | 798 "Auto-join request cancelled by user preferences.")); |
| 800 return; | 799 return; |
| 801 } | 800 } |
| 802 #endif // !defined(OS_ANDROID) | 801 #endif // !defined(OS_ANDROID) |
| 803 | 802 |
| 804 // TODO(crbug.com/627655): Handle multiple URLs. | 803 // TODO(crbug.com/627655): Handle multiple URLs. |
| 805 const GURL& presentation_url = presentation_urls[0]; | 804 const GURL& presentation_url = presentation_urls[0]; |
| 806 bool incognito = web_contents_->GetBrowserContext()->IsOffTheRecord(); | 805 bool incognito = web_contents_->GetBrowserContext()->IsOffTheRecord(); |
| 807 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 806 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 808 route_response_callbacks.push_back( | 807 route_response_callbacks.push_back( |
| 809 base::Bind(&PresentationServiceDelegateImpl::OnJoinRouteResponse, | 808 base::Bind(&PresentationServiceDelegateImpl::OnJoinRouteResponse, |
| 810 weak_factory_.GetWeakPtr(), render_process_id, render_frame_id, | 809 weak_factory_.GetWeakPtr(), render_process_id, render_frame_id, |
| 811 presentation_url, presentation_id, success_cb, error_cb)); | 810 presentation_url, presentation_id, success_cb, error_cb)); |
| 812 router_->JoinRoute(MediaSourceForPresentationUrl(presentation_url).id(), | 811 router_->JoinRoute(MediaSourceForPresentationUrl(presentation_url).id(), |
| 813 presentation_id, origin.GetURL(), web_contents_, | 812 presentation_id, origin, web_contents_, |
| 814 route_response_callbacks, base::TimeDelta(), incognito); | 813 route_response_callbacks, base::TimeDelta(), incognito); |
| 815 } | 814 } |
| 816 | 815 |
| 817 void PresentationServiceDelegateImpl::CloseConnection( | 816 void PresentationServiceDelegateImpl::CloseConnection( |
| 818 int render_process_id, | 817 int render_process_id, |
| 819 int render_frame_id, | 818 int render_frame_id, |
| 820 const std::string& presentation_id) { | 819 const std::string& presentation_id) { |
| 821 const RenderFrameHostId rfh_id(render_process_id, render_frame_id); | 820 const RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
| 822 const MediaRoute::Id& route_id = | 821 const MediaRoute::Id& route_id = |
| 823 frame_manager_->GetRouteId(rfh_id, presentation_id); | 822 frame_manager_->GetRouteId(rfh_id, presentation_id); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 const base::ListValue* origins = | 968 const base::ListValue* origins = |
| 970 Profile::FromBrowserContext(web_contents_->GetBrowserContext()) | 969 Profile::FromBrowserContext(web_contents_->GetBrowserContext()) |
| 971 ->GetPrefs() | 970 ->GetPrefs() |
| 972 ->GetList(prefs::kMediaRouterTabMirroringSources); | 971 ->GetList(prefs::kMediaRouterTabMirroringSources); |
| 973 return origins && | 972 return origins && |
| 974 origins->Find(base::StringValue(origin.Serialize())) != origins->end(); | 973 origins->Find(base::StringValue(origin.Serialize())) != origins->end(); |
| 975 } | 974 } |
| 976 #endif // !defined(OS_ANDROID) | 975 #endif // !defined(OS_ANDROID) |
| 977 | 976 |
| 978 } // namespace media_router | 977 } // namespace media_router |
| OLD | NEW |