| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/media/media_stream_dispatcher_host.h" | 5 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" |
| 6 | 6 |
| 7 #include <algorithm> |
| 8 |
| 9 #include "base/command_line.h" |
| 10 #include "base/memory/ptr_util.h" |
| 7 #include "content/browser/browser_main_loop.h" | 11 #include "content/browser/browser_main_loop.h" |
| 12 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" |
| 8 #include "content/common/media/media_stream_messages.h" | 13 #include "content/common/media/media_stream_messages.h" |
| 9 #include "content/common/media/media_stream_options.h" | 14 #include "content/common/media/media_stream_options.h" |
| 10 #include "content/public/browser/render_process_host.h" | 15 #include "content/public/browser/render_process_host.h" |
| 16 #include "content/public/common/content_switches.h" |
| 11 #include "url/gurl.h" | 17 #include "url/gurl.h" |
| 12 | 18 |
| 13 namespace content { | 19 namespace content { |
| 14 | 20 |
| 15 MediaStreamDispatcherHost::MediaStreamDispatcherHost( | 21 MediaStreamDispatcherHost::MediaStreamDispatcherHost( |
| 16 int render_process_id, | 22 int render_process_id, |
| 17 const ResourceContext::SaltCallback& salt_callback, | 23 const ResourceContext::SaltCallback& salt_callback, |
| 18 MediaStreamManager* media_stream_manager) | 24 MediaStreamManager* media_stream_manager, |
| 25 bool use_fake_ui) |
| 19 : BrowserMessageFilter(MediaStreamMsgStart), | 26 : BrowserMessageFilter(MediaStreamMsgStart), |
| 20 render_process_id_(render_process_id), | 27 render_process_id_(render_process_id), |
| 21 salt_callback_(salt_callback), | 28 salt_callback_(salt_callback), |
| 22 media_stream_manager_(media_stream_manager) { | 29 media_stream_manager_(media_stream_manager), |
| 23 } | 30 use_fake_ui_(use_fake_ui), |
| 31 weak_factory_(this) {} |
| 24 | 32 |
| 25 void MediaStreamDispatcherHost::StreamGenerated( | 33 void MediaStreamDispatcherHost::StreamGenerated( |
| 26 int render_frame_id, | 34 int render_frame_id, |
| 27 int page_request_id, | 35 int page_request_id, |
| 28 const std::string& label, | 36 const std::string& label, |
| 29 const StreamDeviceInfoArray& audio_devices, | 37 const StreamDeviceInfoArray& audio_devices, |
| 30 const StreamDeviceInfoArray& video_devices) { | 38 const StreamDeviceInfoArray& video_devices) { |
| 31 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 39 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 32 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated(" | 40 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated(" |
| 33 << ", {label = " << label << "})"; | 41 << ", {label = " << label << "})"; |
| 34 | 42 |
| 35 Send(new MediaStreamMsg_StreamGenerated( | 43 Send(new MediaStreamMsg_StreamGenerated( |
| 36 render_frame_id, page_request_id, label, audio_devices, video_devices)); | 44 render_frame_id, page_request_id, label, audio_devices, video_devices)); |
| 37 } | 45 } |
| 38 | 46 |
| 39 void MediaStreamDispatcherHost::StreamGenerationFailed( | 47 void MediaStreamDispatcherHost::StreamGenerationFailed( |
| 40 int render_frame_id, | 48 int render_frame_id, |
| 41 int page_request_id, | 49 int page_request_id, |
| 42 content::MediaStreamRequestResult result) { | 50 content::MediaStreamRequestResult result) { |
| 43 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 51 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 44 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed(" | 52 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed(" |
| 45 << ", {page_request_id = " << page_request_id << "}" | 53 << ", {page_request_id = " << page_request_id << "}" |
| 46 << ", { result= " << result << "})"; | 54 << ", { result= " << result << "})"; |
| 47 | 55 |
| 48 | |
| 49 Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id, | 56 Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id, |
| 50 page_request_id, | 57 page_request_id, |
| 51 result)); | 58 result)); |
| 52 } | 59 } |
| 53 | 60 |
| 54 void MediaStreamDispatcherHost::DeviceStopped(int render_frame_id, | 61 void MediaStreamDispatcherHost::DeviceStopped(int render_frame_id, |
| 55 const std::string& label, | 62 const std::string& label, |
| 56 const StreamDeviceInfo& device) { | 63 const StreamDeviceInfo& device) { |
| 57 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 64 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 58 DVLOG(1) << "MediaStreamDispatcherHost::DeviceStopped(" | 65 DVLOG(1) << "MediaStreamDispatcherHost::DeviceStopped(" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 86 << ", {page_request_id = " << page_request_id << "})"; | 93 << ", {page_request_id = " << page_request_id << "})"; |
| 87 | 94 |
| 88 Send(new MediaStreamMsg_DeviceOpened( | 95 Send(new MediaStreamMsg_DeviceOpened( |
| 89 render_frame_id, page_request_id, label, video_device)); | 96 render_frame_id, page_request_id, label, video_device)); |
| 90 } | 97 } |
| 91 | 98 |
| 92 void MediaStreamDispatcherHost::DevicesChanged(MediaStreamType type) { | 99 void MediaStreamDispatcherHost::DevicesChanged(MediaStreamType type) { |
| 93 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 100 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 94 DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged(" | 101 DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged(" |
| 95 << "{type = " << type << "})"; | 102 << "{type = " << type << "})"; |
| 96 // TODO(guidou): check permissions and forward notifications to renderer. | 103 for (const auto& subscriber : device_change_subscribers_) { |
| 97 // crbug.com/388648 | 104 std::unique_ptr<MediaStreamUIProxy> ui_proxy = CreateMediaStreamUIProxy(); |
| 105 ui_proxy->CheckAccess( |
| 106 subscriber.security_origin, type, render_process_id_, |
| 107 subscriber.render_frame_id, |
| 108 base::Bind(&MediaStreamDispatcherHost::HandleCheckAccessResponse, |
| 109 weak_factory_.GetWeakPtr(), |
| 110 base::Passed(std::move(ui_proxy)), |
| 111 subscriber.render_frame_id)); |
| 112 } |
| 98 } | 113 } |
| 99 | 114 |
| 100 bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) { | 115 bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) { |
| 101 bool handled = true; | 116 bool handled = true; |
| 102 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcherHost, message) | 117 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcherHost, message) |
| 103 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream) | 118 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream) |
| 104 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelGenerateStream, | 119 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelGenerateStream, |
| 105 OnCancelGenerateStream) | 120 OnCancelGenerateStream) |
| 106 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopStreamDevice, | 121 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopStreamDevice, |
| 107 OnStopStreamDevice) | 122 OnStopStreamDevice) |
| 108 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_EnumerateDevices, | 123 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_EnumerateDevices, |
| 109 OnEnumerateDevices) | 124 OnEnumerateDevices) |
| 110 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelEnumerateDevices, | 125 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelEnumerateDevices, |
| 111 OnCancelEnumerateDevices) | 126 OnCancelEnumerateDevices) |
| 112 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_OpenDevice, | 127 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_OpenDevice, |
| 113 OnOpenDevice) | 128 OnOpenDevice) |
| 114 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice, | 129 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice, |
| 115 OnCloseDevice) | 130 OnCloseDevice) |
| 131 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_SubscribeToDeviceChangeNotifications, |
| 132 OnSubscribeToDeviceChangeNotifications) |
| 133 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelDeviceChangeNotifications, |
| 134 OnCancelDeviceChangeNotifications) |
| 116 IPC_MESSAGE_UNHANDLED(handled = false) | 135 IPC_MESSAGE_UNHANDLED(handled = false) |
| 117 IPC_END_MESSAGE_MAP() | 136 IPC_END_MESSAGE_MAP() |
| 118 return handled; | 137 return handled; |
| 119 } | 138 } |
| 120 | 139 |
| 121 void MediaStreamDispatcherHost::OnChannelClosing() { | 140 void MediaStreamDispatcherHost::OnChannelClosing() { |
| 122 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing"; | 141 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing"; |
| 123 | 142 |
| 124 // Since the IPC sender is gone, close all requesting/requested streams. | 143 // Since the IPC sender is gone, close all requesting/requested streams. |
| 125 media_stream_manager_->CancelAllRequests(render_process_id_); | 144 media_stream_manager_->CancelAllRequests(render_process_id_); |
| 145 if (!device_change_subscribers_.empty()) |
| 146 media_stream_manager_->CancelDeviceChangeNotifications(this); |
| 126 } | 147 } |
| 127 | 148 |
| 128 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { | 149 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { |
| 129 } | 150 } |
| 130 | 151 |
| 131 void MediaStreamDispatcherHost::OnGenerateStream( | 152 void MediaStreamDispatcherHost::OnGenerateStream( |
| 132 int render_frame_id, | 153 int render_frame_id, |
| 133 int page_request_id, | 154 int page_request_id, |
| 134 const StreamControls& controls, | 155 const StreamControls& controls, |
| 135 const url::Origin& security_origin, | 156 const url::Origin& security_origin, |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 void MediaStreamDispatcherHost::OnCloseDevice( | 236 void MediaStreamDispatcherHost::OnCloseDevice( |
| 216 int render_frame_id, | 237 int render_frame_id, |
| 217 const std::string& label) { | 238 const std::string& label) { |
| 218 DVLOG(1) << "MediaStreamDispatcherHost::OnCloseDevice(" | 239 DVLOG(1) << "MediaStreamDispatcherHost::OnCloseDevice(" |
| 219 << render_frame_id << ", " | 240 << render_frame_id << ", " |
| 220 << label << ")"; | 241 << label << ")"; |
| 221 | 242 |
| 222 media_stream_manager_->CancelRequest(label); | 243 media_stream_manager_->CancelRequest(label); |
| 223 } | 244 } |
| 224 | 245 |
| 246 void MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications( |
| 247 int render_frame_id, |
| 248 const url::Origin& security_origin) { |
| 249 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 250 DVLOG(1) |
| 251 << "MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications(" |
| 252 << render_frame_id << ", " << security_origin << ")"; |
| 253 DCHECK( |
| 254 std::find_if( |
| 255 device_change_subscribers_.begin(), device_change_subscribers_.end(), |
| 256 [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) { |
| 257 return subscriber_info.render_frame_id == render_frame_id; |
| 258 }) == device_change_subscribers_.end()); |
| 259 |
| 260 if (device_change_subscribers_.empty()) |
| 261 media_stream_manager_->SubscribeToDeviceChangeNotifications(this); |
| 262 |
| 263 device_change_subscribers_.push_back({render_frame_id, security_origin}); |
| 264 } |
| 265 |
| 266 void MediaStreamDispatcherHost::OnCancelDeviceChangeNotifications( |
| 267 int render_frame_id) { |
| 268 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 269 DVLOG(1) << "MediaStreamDispatcherHost::CancelDeviceChangeNotifications(" |
| 270 << render_frame_id << ")"; |
| 271 auto it = std::find_if( |
| 272 device_change_subscribers_.begin(), device_change_subscribers_.end(), |
| 273 [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) { |
| 274 return subscriber_info.render_frame_id == render_frame_id; |
| 275 }); |
| 276 CHECK(it != device_change_subscribers_.end()); |
| 277 device_change_subscribers_.erase(it); |
| 278 if (device_change_subscribers_.empty()) |
| 279 media_stream_manager_->CancelDeviceChangeNotifications(this); |
| 280 } |
| 281 |
| 282 std::unique_ptr<MediaStreamUIProxy> |
| 283 MediaStreamDispatcherHost::CreateMediaStreamUIProxy() { |
| 284 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 285 if (use_fake_ui_ || |
| 286 base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 287 switches::kUseFakeUIForMediaStream)) { |
| 288 return base::WrapUnique(new FakeMediaStreamUIProxy()); |
| 289 } |
| 290 |
| 291 return MediaStreamUIProxy::Create(); |
| 292 } |
| 293 |
| 294 void MediaStreamDispatcherHost::HandleCheckAccessResponse( |
| 295 std::unique_ptr<MediaStreamUIProxy> ui_proxy, |
| 296 int render_frame_id, |
| 297 bool have_access) { |
| 298 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 299 if (have_access) |
| 300 Send(new MediaStreamMsg_DevicesChanged(render_frame_id)); |
| 301 } |
| 302 |
| 225 } // namespace content | 303 } // namespace content |
| OLD | NEW |