| 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" | |
| 11 #include "content/browser/browser_main_loop.h" | 7 #include "content/browser/browser_main_loop.h" |
| 12 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" | |
| 13 #include "content/common/media/media_stream_messages.h" | 8 #include "content/common/media/media_stream_messages.h" |
| 14 #include "content/common/media/media_stream_options.h" | 9 #include "content/common/media/media_stream_options.h" |
| 15 #include "content/public/browser/render_process_host.h" | 10 #include "content/public/browser/render_process_host.h" |
| 16 #include "content/public/common/content_switches.h" | |
| 17 #include "url/gurl.h" | 11 #include "url/gurl.h" |
| 18 | 12 |
| 19 namespace content { | 13 namespace content { |
| 20 | 14 |
| 21 MediaStreamDispatcherHost::MediaStreamDispatcherHost( | 15 MediaStreamDispatcherHost::MediaStreamDispatcherHost( |
| 22 int render_process_id, | 16 int render_process_id, |
| 23 const ResourceContext::SaltCallback& salt_callback, | 17 const ResourceContext::SaltCallback& salt_callback, |
| 24 MediaStreamManager* media_stream_manager, | 18 MediaStreamManager* media_stream_manager) |
| 25 bool use_fake_ui) | |
| 26 : BrowserMessageFilter(MediaStreamMsgStart), | 19 : BrowserMessageFilter(MediaStreamMsgStart), |
| 27 render_process_id_(render_process_id), | 20 render_process_id_(render_process_id), |
| 28 salt_callback_(salt_callback), | 21 salt_callback_(salt_callback), |
| 29 media_stream_manager_(media_stream_manager), | 22 media_stream_manager_(media_stream_manager) { |
| 30 use_fake_ui_(use_fake_ui), | 23 } |
| 31 weak_factory_(this) {} | |
| 32 | 24 |
| 33 void MediaStreamDispatcherHost::StreamGenerated( | 25 void MediaStreamDispatcherHost::StreamGenerated( |
| 34 int render_frame_id, | 26 int render_frame_id, |
| 35 int page_request_id, | 27 int page_request_id, |
| 36 const std::string& label, | 28 const std::string& label, |
| 37 const StreamDeviceInfoArray& audio_devices, | 29 const StreamDeviceInfoArray& audio_devices, |
| 38 const StreamDeviceInfoArray& video_devices) { | 30 const StreamDeviceInfoArray& video_devices) { |
| 39 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 31 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 40 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated(" | 32 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated(" |
| 41 << ", {label = " << label << "})"; | 33 << ", {label = " << label << "})"; |
| 42 | 34 |
| 43 Send(new MediaStreamMsg_StreamGenerated( | 35 Send(new MediaStreamMsg_StreamGenerated( |
| 44 render_frame_id, page_request_id, label, audio_devices, video_devices)); | 36 render_frame_id, page_request_id, label, audio_devices, video_devices)); |
| 45 } | 37 } |
| 46 | 38 |
| 47 void MediaStreamDispatcherHost::StreamGenerationFailed( | 39 void MediaStreamDispatcherHost::StreamGenerationFailed( |
| 48 int render_frame_id, | 40 int render_frame_id, |
| 49 int page_request_id, | 41 int page_request_id, |
| 50 content::MediaStreamRequestResult result) { | 42 content::MediaStreamRequestResult result) { |
| 51 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 43 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 52 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed(" | 44 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed(" |
| 53 << ", {page_request_id = " << page_request_id << "}" | 45 << ", {page_request_id = " << page_request_id << "}" |
| 54 << ", { result= " << result << "})"; | 46 << ", { result= " << result << "})"; |
| 55 | 47 |
| 48 |
| 56 Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id, | 49 Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id, |
| 57 page_request_id, | 50 page_request_id, |
| 58 result)); | 51 result)); |
| 59 } | 52 } |
| 60 | 53 |
| 61 void MediaStreamDispatcherHost::DeviceStopped(int render_frame_id, | 54 void MediaStreamDispatcherHost::DeviceStopped(int render_frame_id, |
| 62 const std::string& label, | 55 const std::string& label, |
| 63 const StreamDeviceInfo& device) { | 56 const StreamDeviceInfo& device) { |
| 64 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 57 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 65 DVLOG(1) << "MediaStreamDispatcherHost::DeviceStopped(" | 58 DVLOG(1) << "MediaStreamDispatcherHost::DeviceStopped(" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 93 << ", {page_request_id = " << page_request_id << "})"; | 86 << ", {page_request_id = " << page_request_id << "})"; |
| 94 | 87 |
| 95 Send(new MediaStreamMsg_DeviceOpened( | 88 Send(new MediaStreamMsg_DeviceOpened( |
| 96 render_frame_id, page_request_id, label, video_device)); | 89 render_frame_id, page_request_id, label, video_device)); |
| 97 } | 90 } |
| 98 | 91 |
| 99 void MediaStreamDispatcherHost::DevicesChanged(MediaStreamType type) { | 92 void MediaStreamDispatcherHost::DevicesChanged(MediaStreamType type) { |
| 100 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 93 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 101 DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged(" | 94 DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged(" |
| 102 << "{type = " << type << "})"; | 95 << "{type = " << type << "})"; |
| 103 for (const auto& subscriber : device_change_subscribers_) { | 96 // TODO(guidou): check permissions and forward notifications to renderer. |
| 104 std::unique_ptr<MediaStreamUIProxy> ui_proxy = CreateMediaStreamUIProxy(); | 97 // crbug.com/388648 |
| 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 } | |
| 113 } | 98 } |
| 114 | 99 |
| 115 bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) { | 100 bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) { |
| 116 bool handled = true; | 101 bool handled = true; |
| 117 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcherHost, message) | 102 IPC_BEGIN_MESSAGE_MAP(MediaStreamDispatcherHost, message) |
| 118 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream) | 103 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream) |
| 119 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelGenerateStream, | 104 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelGenerateStream, |
| 120 OnCancelGenerateStream) | 105 OnCancelGenerateStream) |
| 121 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopStreamDevice, | 106 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopStreamDevice, |
| 122 OnStopStreamDevice) | 107 OnStopStreamDevice) |
| 123 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_EnumerateDevices, | 108 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_EnumerateDevices, |
| 124 OnEnumerateDevices) | 109 OnEnumerateDevices) |
| 125 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelEnumerateDevices, | 110 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelEnumerateDevices, |
| 126 OnCancelEnumerateDevices) | 111 OnCancelEnumerateDevices) |
| 127 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_OpenDevice, | 112 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_OpenDevice, |
| 128 OnOpenDevice) | 113 OnOpenDevice) |
| 129 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice, | 114 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice, |
| 130 OnCloseDevice) | 115 OnCloseDevice) |
| 131 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_SubscribeToDeviceChangeNotifications, | |
| 132 OnSubscribeToDeviceChangeNotifications) | |
| 133 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelDeviceChangeNotifications, | |
| 134 OnCancelDeviceChangeNotifications) | |
| 135 IPC_MESSAGE_UNHANDLED(handled = false) | 116 IPC_MESSAGE_UNHANDLED(handled = false) |
| 136 IPC_END_MESSAGE_MAP() | 117 IPC_END_MESSAGE_MAP() |
| 137 return handled; | 118 return handled; |
| 138 } | 119 } |
| 139 | 120 |
| 140 void MediaStreamDispatcherHost::OnChannelClosing() { | 121 void MediaStreamDispatcherHost::OnChannelClosing() { |
| 141 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing"; | 122 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing"; |
| 142 | 123 |
| 143 // Since the IPC sender is gone, close all requesting/requested streams. | 124 // Since the IPC sender is gone, close all requesting/requested streams. |
| 144 media_stream_manager_->CancelAllRequests(render_process_id_); | 125 media_stream_manager_->CancelAllRequests(render_process_id_); |
| 145 if (!device_change_subscribers_.empty()) | |
| 146 media_stream_manager_->CancelDeviceChangeNotifications(this); | |
| 147 } | 126 } |
| 148 | 127 |
| 149 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { | 128 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { |
| 150 } | 129 } |
| 151 | 130 |
| 152 void MediaStreamDispatcherHost::OnGenerateStream( | 131 void MediaStreamDispatcherHost::OnGenerateStream( |
| 153 int render_frame_id, | 132 int render_frame_id, |
| 154 int page_request_id, | 133 int page_request_id, |
| 155 const StreamControls& controls, | 134 const StreamControls& controls, |
| 156 const url::Origin& security_origin, | 135 const url::Origin& security_origin, |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 void MediaStreamDispatcherHost::OnCloseDevice( | 215 void MediaStreamDispatcherHost::OnCloseDevice( |
| 237 int render_frame_id, | 216 int render_frame_id, |
| 238 const std::string& label) { | 217 const std::string& label) { |
| 239 DVLOG(1) << "MediaStreamDispatcherHost::OnCloseDevice(" | 218 DVLOG(1) << "MediaStreamDispatcherHost::OnCloseDevice(" |
| 240 << render_frame_id << ", " | 219 << render_frame_id << ", " |
| 241 << label << ")"; | 220 << label << ")"; |
| 242 | 221 |
| 243 media_stream_manager_->CancelRequest(label); | 222 media_stream_manager_->CancelRequest(label); |
| 244 } | 223 } |
| 245 | 224 |
| 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 | |
| 303 } // namespace content | 225 } // namespace content |
| OLD | NEW |