| 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> |
| 11 | 11 |
| 12 #include "base/containers/small_map.h" | 12 #include "base/containers/small_map.h" |
| 13 #include "base/guid.h" | 13 #include "base/guid.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/stl_util.h" |
| 15 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
| 16 #include "chrome/browser/media/router/create_presentation_connection_request.h" | 17 #include "chrome/browser/media/router/create_presentation_connection_request.h" |
| 17 #include "chrome/browser/media/router/media_route.h" | 18 #include "chrome/browser/media/router/media_route.h" |
| 18 #include "chrome/browser/media/router/media_router.h" | 19 #include "chrome/browser/media/router/media_router.h" |
| 19 #include "chrome/browser/media/router/media_router_dialog_controller.h" | 20 #include "chrome/browser/media/router/media_router_dialog_controller.h" |
| 20 #include "chrome/browser/media/router/media_router_factory.h" | 21 #include "chrome/browser/media/router/media_router_factory.h" |
| 21 #include "chrome/browser/media/router/media_sink.h" | 22 #include "chrome/browser/media/router/media_sink.h" |
| 22 #include "chrome/browser/media/router/media_source_helper.h" | 23 #include "chrome/browser/media/router/media_source_helper.h" |
| 23 #include "chrome/browser/media/router/presentation_media_sinks_observer.h" | 24 #include "chrome/browser/media/router/presentation_media_sinks_observer.h" |
| 24 #include "chrome/browser/media/router/route_message.h" | 25 #include "chrome/browser/media/router/route_message.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 44 | 45 |
| 45 // Returns the unique identifier for the supplied RenderFrameHost. | 46 // Returns the unique identifier for the supplied RenderFrameHost. |
| 46 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { | 47 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { |
| 47 int render_process_id = render_frame_host->GetProcess()->GetID(); | 48 int render_process_id = render_frame_host->GetProcess()->GetID(); |
| 48 int render_frame_id = render_frame_host->GetRoutingID(); | 49 int render_frame_id = render_frame_host->GetRoutingID(); |
| 49 return RenderFrameHostId(render_process_id, render_frame_id); | 50 return RenderFrameHostId(render_process_id, render_frame_id); |
| 50 } | 51 } |
| 51 | 52 |
| 52 // Gets the last committed URL for the render frame specified by | 53 // Gets the last committed URL for the render frame specified by |
| 53 // |render_frame_host_id|. | 54 // |render_frame_host_id|. |
| 54 GURL GetLastCommittedURLForFrame(RenderFrameHostId render_frame_host_id) { | 55 GURL GetLastCommittedURLForFrame(RenderFrameHostId render_frame_host_id, |
| 56 content::WebContents* web_contents) { |
| 55 RenderFrameHost* render_frame_host = RenderFrameHost::FromID( | 57 RenderFrameHost* render_frame_host = RenderFrameHost::FromID( |
| 56 render_frame_host_id.first, render_frame_host_id.second); | 58 render_frame_host_id.first, render_frame_host_id.second); |
| 59 // crbug.com/663740: The RFH may not be associated with the frame tree; in |
| 60 // that case, GetLastCommittedOrigin() may crash. |
| 61 if (!render_frame_host || |
| 62 !base::ContainsValue(web_contents->GetAllFrames(), render_frame_host)) |
| 63 return GURL(); |
| 64 |
| 57 // TODO(crbug.com/632623): Use url::Origin in place of GURL for origins | 65 // TODO(crbug.com/632623): Use url::Origin in place of GURL for origins |
| 58 return render_frame_host | 66 return render_frame_host->GetLastCommittedOrigin().GetURL(); |
| 59 ? render_frame_host->GetLastCommittedOrigin().GetURL() | |
| 60 : GURL(); | |
| 61 } | 67 } |
| 62 | 68 |
| 63 // Observes messages originating from the MediaSink connected to a MediaRoute | 69 // Observes messages originating from the MediaSink connected to a MediaRoute |
| 64 // that represents a presentation. Converts the messages into | 70 // that represents a presentation. Converts the messages into |
| 65 // content::PresentationSessionMessages and dispatches them via the provided | 71 // content::PresentationSessionMessages and dispatches them via the provided |
| 66 // PresentationSessionMessageCallback. | 72 // PresentationSessionMessageCallback. |
| 67 class PresentationSessionMessagesObserver : public RouteMessageObserver { | 73 class PresentationSessionMessagesObserver : public RouteMessageObserver { |
| 68 public: | 74 public: |
| 69 // |message_cb|: The callback to invoke whenever messages are received. | 75 // |message_cb|: The callback to invoke whenever messages are received. |
| 70 // |route_id|: ID of MediaRoute to listen for messages. | 76 // |route_id|: ID of MediaRoute to listen for messages. |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 std::unique_ptr<PresentationConnectionStateSubscription>> | 169 std::unique_ptr<PresentationConnectionStateSubscription>> |
| 164 connection_state_subscriptions_; | 170 connection_state_subscriptions_; |
| 165 std::unordered_map< | 171 std::unordered_map< |
| 166 MediaRoute::Id, | 172 MediaRoute::Id, |
| 167 std::unique_ptr<PresentationSessionMessagesObserver>> | 173 std::unique_ptr<PresentationSessionMessagesObserver>> |
| 168 session_messages_observers_; | 174 session_messages_observers_; |
| 169 | 175 |
| 170 RenderFrameHostId render_frame_host_id_; | 176 RenderFrameHostId render_frame_host_id_; |
| 171 | 177 |
| 172 // References to the owning WebContents, and the corresponding MediaRouter. | 178 // References to the owning WebContents, and the corresponding MediaRouter. |
| 173 const content::WebContents* web_contents_; | 179 content::WebContents* web_contents_; |
| 174 MediaRouter* router_; | 180 MediaRouter* router_; |
| 175 | 181 |
| 176 DelegateObserver* delegate_observer_; | 182 DelegateObserver* delegate_observer_; |
| 177 }; | 183 }; |
| 178 | 184 |
| 179 PresentationFrame::PresentationFrame( | 185 PresentationFrame::PresentationFrame( |
| 180 const RenderFrameHostId& render_frame_host_id, | 186 const RenderFrameHostId& render_frame_host_id, |
| 181 content::WebContents* web_contents, | 187 content::WebContents* web_contents, |
| 182 MediaRouter* router) | 188 MediaRouter* router) |
| 183 : render_frame_host_id_(render_frame_host_id), | 189 : render_frame_host_id_(render_frame_host_id), |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 | 224 |
| 219 bool PresentationFrame::SetScreenAvailabilityListener( | 225 bool PresentationFrame::SetScreenAvailabilityListener( |
| 220 content::PresentationScreenAvailabilityListener* listener) { | 226 content::PresentationScreenAvailabilityListener* listener) { |
| 221 MediaSource source(GetMediaSourceFromListener(listener)); | 227 MediaSource source(GetMediaSourceFromListener(listener)); |
| 222 auto& sinks_observer = url_to_sinks_observer_[source.id()]; | 228 auto& sinks_observer = url_to_sinks_observer_[source.id()]; |
| 223 if (sinks_observer && sinks_observer->listener() == listener) | 229 if (sinks_observer && sinks_observer->listener() == listener) |
| 224 return false; | 230 return false; |
| 225 | 231 |
| 226 sinks_observer.reset(new PresentationMediaSinksObserver( | 232 sinks_observer.reset(new PresentationMediaSinksObserver( |
| 227 router_, listener, source, | 233 router_, listener, source, |
| 228 GetLastCommittedURLForFrame(render_frame_host_id_).GetOrigin())); | 234 GetLastCommittedURLForFrame(render_frame_host_id_, web_contents_) |
| 235 .GetOrigin())); |
| 229 | 236 |
| 230 if (!sinks_observer->Init()) { | 237 if (!sinks_observer->Init()) { |
| 231 url_to_sinks_observer_.erase(source.id()); | 238 url_to_sinks_observer_.erase(source.id()); |
| 232 listener->OnScreenAvailabilityNotSupported(); | 239 listener->OnScreenAvailabilityNotSupported(); |
| 233 return false; | 240 return false; |
| 234 } | 241 } |
| 235 | 242 |
| 236 return true; | 243 return true; |
| 237 } | 244 } |
| 238 | 245 |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 const RenderFrameHostId& render_frame_host_id, | 549 const RenderFrameHostId& render_frame_host_id, |
| 543 const GURL& default_presentation_url, | 550 const GURL& default_presentation_url, |
| 544 const content::PresentationSessionStartedCallback& callback) { | 551 const content::PresentationSessionStartedCallback& callback) { |
| 545 if (!IsMainFrame(render_frame_host_id)) | 552 if (!IsMainFrame(render_frame_host_id)) |
| 546 return; | 553 return; |
| 547 | 554 |
| 548 if (default_presentation_url.is_empty()) { | 555 if (default_presentation_url.is_empty()) { |
| 549 ClearDefaultPresentationRequest(); | 556 ClearDefaultPresentationRequest(); |
| 550 } else { | 557 } else { |
| 551 DCHECK(!callback.is_null()); | 558 DCHECK(!callback.is_null()); |
| 552 GURL frame_url(GetLastCommittedURLForFrame(render_frame_host_id)); | 559 GURL frame_url( |
| 560 GetLastCommittedURLForFrame(render_frame_host_id, web_contents_)); |
| 553 PresentationRequest request(render_frame_host_id, | 561 PresentationRequest request(render_frame_host_id, |
| 554 std::vector<GURL>({default_presentation_url}), | 562 std::vector<GURL>({default_presentation_url}), |
| 555 frame_url); | 563 frame_url); |
| 556 default_presentation_started_callback_ = callback; | 564 default_presentation_started_callback_ = callback; |
| 557 SetDefaultPresentationRequest(request); | 565 SetDefaultPresentationRequest(request); |
| 558 } | 566 } |
| 559 } | 567 } |
| 560 | 568 |
| 561 void PresentationFrameManager::AddDelegateObserver( | 569 void PresentationFrameManager::AddDelegateObserver( |
| 562 const RenderFrameHostId& render_frame_host_id, | 570 const RenderFrameHostId& render_frame_host_id, |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 !IsValidPresentationUrl(presentation_url)) { | 796 !IsValidPresentationUrl(presentation_url)) { |
| 789 error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, | 797 error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, |
| 790 "Invalid presentation arguments.")); | 798 "Invalid presentation arguments.")); |
| 791 return; | 799 return; |
| 792 } | 800 } |
| 793 | 801 |
| 794 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); | 802 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
| 795 std::unique_ptr<CreatePresentationConnectionRequest> request( | 803 std::unique_ptr<CreatePresentationConnectionRequest> request( |
| 796 new CreatePresentationConnectionRequest( | 804 new CreatePresentationConnectionRequest( |
| 797 render_frame_host_id, presentation_url, | 805 render_frame_host_id, presentation_url, |
| 798 GetLastCommittedURLForFrame(render_frame_host_id), | 806 GetLastCommittedURLForFrame(render_frame_host_id, web_contents_), |
| 799 base::Bind(&PresentationServiceDelegateImpl::OnStartSessionSucceeded, | 807 base::Bind(&PresentationServiceDelegateImpl::OnStartSessionSucceeded, |
| 800 weak_factory_.GetWeakPtr(), render_process_id, | 808 weak_factory_.GetWeakPtr(), render_process_id, |
| 801 render_frame_id, success_cb), | 809 render_frame_id, success_cb), |
| 802 error_cb)); | 810 error_cb)); |
| 803 MediaRouterDialogController* controller = | 811 MediaRouterDialogController* controller = |
| 804 MediaRouterDialogController::GetOrCreateForWebContents(web_contents_); | 812 MediaRouterDialogController::GetOrCreateForWebContents(web_contents_); |
| 805 if (!controller->ShowMediaRouterDialogForPresentation(std::move(request))) { | 813 if (!controller->ShowMediaRouterDialogForPresentation(std::move(request))) { |
| 806 LOG(ERROR) << "Media router dialog already exists. Ignoring StartSession."; | 814 LOG(ERROR) << "Media router dialog already exists. Ignoring StartSession."; |
| 807 error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, | 815 error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, |
| 808 "Unable to create dialog.")); | 816 "Unable to create dialog.")); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 827 const GURL& presentation_url = presentation_urls[0]; | 835 const GURL& presentation_url = presentation_urls[0]; |
| 828 bool incognito = web_contents_->GetBrowserContext()->IsOffTheRecord(); | 836 bool incognito = web_contents_->GetBrowserContext()->IsOffTheRecord(); |
| 829 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 837 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 830 route_response_callbacks.push_back( | 838 route_response_callbacks.push_back( |
| 831 base::Bind(&PresentationServiceDelegateImpl::OnJoinRouteResponse, | 839 base::Bind(&PresentationServiceDelegateImpl::OnJoinRouteResponse, |
| 832 weak_factory_.GetWeakPtr(), render_process_id, render_frame_id, | 840 weak_factory_.GetWeakPtr(), render_process_id, render_frame_id, |
| 833 presentation_url, presentation_id, success_cb, error_cb)); | 841 presentation_url, presentation_id, success_cb, error_cb)); |
| 834 router_->JoinRoute( | 842 router_->JoinRoute( |
| 835 MediaSourceForPresentationUrl(presentation_url).id(), presentation_id, | 843 MediaSourceForPresentationUrl(presentation_url).id(), presentation_id, |
| 836 GetLastCommittedURLForFrame( | 844 GetLastCommittedURLForFrame( |
| 837 RenderFrameHostId(render_process_id, render_frame_id)) | 845 RenderFrameHostId(render_process_id, render_frame_id), web_contents_) |
| 838 .GetOrigin(), | 846 .GetOrigin(), |
| 839 web_contents_, route_response_callbacks, base::TimeDelta(), incognito); | 847 web_contents_, route_response_callbacks, base::TimeDelta(), incognito); |
| 840 } | 848 } |
| 841 | 849 |
| 842 void PresentationServiceDelegateImpl::CloseConnection( | 850 void PresentationServiceDelegateImpl::CloseConnection( |
| 843 int render_process_id, | 851 int render_process_id, |
| 844 int render_frame_id, | 852 int render_frame_id, |
| 845 const std::string& presentation_id) { | 853 const std::string& presentation_id) { |
| 846 const RenderFrameHostId rfh_id(render_process_id, render_frame_id); | 854 const RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
| 847 const MediaRoute::Id& route_id = | 855 const MediaRoute::Id& route_id = |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest( | 971 bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest( |
| 964 int render_process_id, | 972 int render_process_id, |
| 965 int render_frame_id, | 973 int render_frame_id, |
| 966 const MediaSource::Id& source_id) const { | 974 const MediaSource::Id& source_id) const { |
| 967 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); | 975 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
| 968 return frame_manager_->HasScreenAvailabilityListenerForTest( | 976 return frame_manager_->HasScreenAvailabilityListenerForTest( |
| 969 render_frame_host_id, source_id); | 977 render_frame_host_id, source_id); |
| 970 } | 978 } |
| 971 | 979 |
| 972 } // namespace media_router | 980 } // namespace media_router |
| OLD | NEW |