| 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" | |
| 16 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 17 #include "chrome/browser/media/router/create_presentation_connection_request.h" | 16 #include "chrome/browser/media/router/create_presentation_connection_request.h" |
| 18 #include "chrome/browser/media/router/media_route.h" | 17 #include "chrome/browser/media/router/media_route.h" |
| 19 #include "chrome/browser/media/router/media_router.h" | 18 #include "chrome/browser/media/router/media_router.h" |
| 20 #include "chrome/browser/media/router/media_router_dialog_controller.h" | 19 #include "chrome/browser/media/router/media_router_dialog_controller.h" |
| 21 #include "chrome/browser/media/router/media_router_factory.h" | 20 #include "chrome/browser/media/router/media_router_factory.h" |
| 22 #include "chrome/browser/media/router/media_sink.h" | 21 #include "chrome/browser/media/router/media_sink.h" |
| 23 #include "chrome/browser/media/router/media_source_helper.h" | 22 #include "chrome/browser/media/router/media_source_helper.h" |
| 24 #include "chrome/browser/media/router/presentation_media_sinks_observer.h" | 23 #include "chrome/browser/media/router/presentation_media_sinks_observer.h" |
| 25 #include "chrome/browser/media/router/route_message.h" | 24 #include "chrome/browser/media/router/route_message.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 51 | 50 |
| 52 // Returns the unique identifier for the supplied RenderFrameHost. | 51 // Returns the unique identifier for the supplied RenderFrameHost. |
| 53 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { | 52 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { |
| 54 int render_process_id = render_frame_host->GetProcess()->GetID(); | 53 int render_process_id = render_frame_host->GetProcess()->GetID(); |
| 55 int render_frame_id = render_frame_host->GetRoutingID(); | 54 int render_frame_id = render_frame_host->GetRoutingID(); |
| 56 return RenderFrameHostId(render_process_id, render_frame_id); | 55 return RenderFrameHostId(render_process_id, render_frame_id); |
| 57 } | 56 } |
| 58 | 57 |
| 59 // Gets the last committed URL for the render frame specified by | 58 // Gets the last committed URL for the render frame specified by |
| 60 // |render_frame_host_id|. | 59 // |render_frame_host_id|. |
| 61 GURL GetLastCommittedURLForFrame(RenderFrameHostId render_frame_host_id, | 60 GURL GetLastCommittedURLForFrame(RenderFrameHostId render_frame_host_id) { |
| 62 content::WebContents* web_contents) { | |
| 63 RenderFrameHost* render_frame_host = RenderFrameHost::FromID( | 61 RenderFrameHost* render_frame_host = RenderFrameHost::FromID( |
| 64 render_frame_host_id.first, render_frame_host_id.second); | 62 render_frame_host_id.first, render_frame_host_id.second); |
| 65 // crbug.com/663740: The RFH may not be associated with the frame tree; in | 63 if (!render_frame_host) |
| 66 // that case, GetLastCommittedOrigin() may crash. | |
| 67 if (!render_frame_host || | |
| 68 !base::ContainsValue(web_contents->GetAllFrames(), render_frame_host)) | |
| 69 return GURL(); | 64 return GURL(); |
| 70 | 65 |
| 71 // TODO(crbug.com/632623): Use url::Origin in place of GURL for origins | 66 // TODO(crbug.com/632623): Use url::Origin in place of GURL for origins |
| 72 return render_frame_host->GetLastCommittedOrigin().GetURL(); | 67 return render_frame_host->GetLastCommittedOrigin().GetURL(); |
| 73 } | 68 } |
| 74 | 69 |
| 75 // Observes messages originating from the MediaSink connected to a MediaRoute | 70 // Observes messages originating from the MediaSink connected to a MediaRoute |
| 76 // that represents a presentation. Converts the messages into | 71 // that represents a presentation. Converts the messages into |
| 77 // content::PresentationSessionMessages and dispatches them via the provided | 72 // content::PresentationSessionMessages and dispatches them via the provided |
| 78 // PresentationSessionMessageCallback. | 73 // PresentationSessionMessageCallback. |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 | 228 |
| 234 bool PresentationFrame::SetScreenAvailabilityListener( | 229 bool PresentationFrame::SetScreenAvailabilityListener( |
| 235 content::PresentationScreenAvailabilityListener* listener) { | 230 content::PresentationScreenAvailabilityListener* listener) { |
| 236 MediaSource source(GetMediaSourceFromListener(listener)); | 231 MediaSource source(GetMediaSourceFromListener(listener)); |
| 237 auto& sinks_observer = url_to_sinks_observer_[source.id()]; | 232 auto& sinks_observer = url_to_sinks_observer_[source.id()]; |
| 238 if (sinks_observer && sinks_observer->listener() == listener) | 233 if (sinks_observer && sinks_observer->listener() == listener) |
| 239 return false; | 234 return false; |
| 240 | 235 |
| 241 sinks_observer.reset(new PresentationMediaSinksObserver( | 236 sinks_observer.reset(new PresentationMediaSinksObserver( |
| 242 router_, listener, source, | 237 router_, listener, source, |
| 243 GetLastCommittedURLForFrame(render_frame_host_id_, web_contents_) | 238 GetLastCommittedURLForFrame(render_frame_host_id_).GetOrigin())); |
| 244 .GetOrigin())); | |
| 245 | 239 |
| 246 if (!sinks_observer->Init()) { | 240 if (!sinks_observer->Init()) { |
| 247 url_to_sinks_observer_.erase(source.id()); | 241 url_to_sinks_observer_.erase(source.id()); |
| 248 listener->OnScreenAvailabilityNotSupported(); | 242 listener->OnScreenAvailabilityNotSupported(); |
| 249 return false; | 243 return false; |
| 250 } | 244 } |
| 251 | 245 |
| 252 return true; | 246 return true; |
| 253 } | 247 } |
| 254 | 248 |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 const RenderFrameHostId& render_frame_host_id, | 552 const RenderFrameHostId& render_frame_host_id, |
| 559 const std::vector<GURL>& default_presentation_urls, | 553 const std::vector<GURL>& default_presentation_urls, |
| 560 const content::PresentationSessionStartedCallback& callback) { | 554 const content::PresentationSessionStartedCallback& callback) { |
| 561 if (!IsMainFrame(render_frame_host_id)) | 555 if (!IsMainFrame(render_frame_host_id)) |
| 562 return; | 556 return; |
| 563 | 557 |
| 564 if (default_presentation_urls.empty()) { | 558 if (default_presentation_urls.empty()) { |
| 565 ClearDefaultPresentationRequest(); | 559 ClearDefaultPresentationRequest(); |
| 566 } else { | 560 } else { |
| 567 DCHECK(!callback.is_null()); | 561 DCHECK(!callback.is_null()); |
| 568 GURL frame_url( | 562 GURL frame_url(GetLastCommittedURLForFrame(render_frame_host_id)); |
| 569 GetLastCommittedURLForFrame(render_frame_host_id, web_contents_)); | |
| 570 PresentationRequest request(render_frame_host_id, default_presentation_urls, | 563 PresentationRequest request(render_frame_host_id, default_presentation_urls, |
| 571 frame_url); | 564 frame_url); |
| 572 default_presentation_started_callback_ = callback; | 565 default_presentation_started_callback_ = callback; |
| 573 SetDefaultPresentationRequest(request); | 566 SetDefaultPresentationRequest(request); |
| 574 } | 567 } |
| 575 } | 568 } |
| 576 | 569 |
| 577 void PresentationFrameManager::AddDelegateObserver( | 570 void PresentationFrameManager::AddDelegateObserver( |
| 578 const RenderFrameHostId& render_frame_host_id, | 571 const RenderFrameHostId& render_frame_host_id, |
| 579 DelegateObserver* observer) { | 572 DelegateObserver* observer) { |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 error_cb.Run(content::PresentationError( | 793 error_cb.Run(content::PresentationError( |
| 801 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, | 794 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, |
| 802 "Invalid presentation URL.")); | 795 "Invalid presentation URL.")); |
| 803 return; | 796 return; |
| 804 } | 797 } |
| 805 | 798 |
| 806 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); | 799 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
| 807 std::unique_ptr<CreatePresentationConnectionRequest> request( | 800 std::unique_ptr<CreatePresentationConnectionRequest> request( |
| 808 new CreatePresentationConnectionRequest( | 801 new CreatePresentationConnectionRequest( |
| 809 render_frame_host_id, presentation_urls, | 802 render_frame_host_id, presentation_urls, |
| 810 GetLastCommittedURLForFrame(render_frame_host_id, web_contents_), | 803 GetLastCommittedURLForFrame(render_frame_host_id), |
| 811 base::Bind(&PresentationServiceDelegateImpl::OnStartSessionSucceeded, | 804 base::Bind(&PresentationServiceDelegateImpl::OnStartSessionSucceeded, |
| 812 weak_factory_.GetWeakPtr(), render_process_id, | 805 weak_factory_.GetWeakPtr(), render_process_id, |
| 813 render_frame_id, success_cb), | 806 render_frame_id, success_cb), |
| 814 error_cb)); | 807 error_cb)); |
| 815 MediaRouterDialogController* controller = | 808 MediaRouterDialogController* controller = |
| 816 MediaRouterDialogController::GetOrCreateForWebContents(web_contents_); | 809 MediaRouterDialogController::GetOrCreateForWebContents(web_contents_); |
| 817 if (!controller->ShowMediaRouterDialogForPresentation(std::move(request))) { | 810 if (!controller->ShowMediaRouterDialogForPresentation(std::move(request))) { |
| 818 LOG(ERROR) << "Media router dialog already exists. Ignoring StartSession."; | 811 LOG(ERROR) << "Media router dialog already exists. Ignoring StartSession."; |
| 819 error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, | 812 error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, |
| 820 "Unable to create dialog.")); | 813 "Unable to create dialog.")); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 831 const content::PresentationSessionErrorCallback& error_cb) { | 824 const content::PresentationSessionErrorCallback& error_cb) { |
| 832 DVLOG(2) << "PresentationServiceDelegateImpl::JoinSession"; | 825 DVLOG(2) << "PresentationServiceDelegateImpl::JoinSession"; |
| 833 if (presentation_urls.empty()) { | 826 if (presentation_urls.empty()) { |
| 834 error_cb.Run(content::PresentationError( | 827 error_cb.Run(content::PresentationError( |
| 835 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, | 828 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, |
| 836 "Invalid presentation arguments.")); | 829 "Invalid presentation arguments.")); |
| 837 return; | 830 return; |
| 838 } | 831 } |
| 839 | 832 |
| 840 const url::Origin& origin = url::Origin(GetLastCommittedURLForFrame( | 833 const url::Origin& origin = url::Origin(GetLastCommittedURLForFrame( |
| 841 RenderFrameHostId(render_process_id, render_frame_id), web_contents_)); | 834 RenderFrameHostId(render_process_id, render_frame_id))); |
| 842 | 835 |
| 843 #if !defined(OS_ANDROID) | 836 #if !defined(OS_ANDROID) |
| 844 if (IsAutoJoinPresentationId(presentation_id) && | 837 if (IsAutoJoinPresentationId(presentation_id) && |
| 845 ShouldCancelAutoJoinForOrigin(origin)) { | 838 ShouldCancelAutoJoinForOrigin(origin)) { |
| 846 error_cb.Run(content::PresentationError( | 839 error_cb.Run(content::PresentationError( |
| 847 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, | 840 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
| 848 "Auto-join request cancelled by user preferences.")); | 841 "Auto-join request cancelled by user preferences.")); |
| 849 return; | 842 return; |
| 850 } | 843 } |
| 851 #endif // !defined(OS_ANDROID) | 844 #endif // !defined(OS_ANDROID) |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1002 const base::ListValue* origins = | 995 const base::ListValue* origins = |
| 1003 Profile::FromBrowserContext(web_contents_->GetBrowserContext()) | 996 Profile::FromBrowserContext(web_contents_->GetBrowserContext()) |
| 1004 ->GetPrefs() | 997 ->GetPrefs() |
| 1005 ->GetList(prefs::kMediaRouterTabMirroringSources); | 998 ->GetList(prefs::kMediaRouterTabMirroringSources); |
| 1006 return origins && | 999 return origins && |
| 1007 origins->Find(base::StringValue(origin.Serialize())) != origins->end(); | 1000 origins->Find(base::StringValue(origin.Serialize())) != origins->end(); |
| 1008 } | 1001 } |
| 1009 #endif // !defined(OS_ANDROID) | 1002 #endif // !defined(OS_ANDROID) |
| 1010 | 1003 |
| 1011 } // namespace media_router | 1004 } // namespace media_router |
| OLD | NEW |