OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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_devices_dispatcher_host.h" | 5 #include "content/browser/renderer_host/media/media_devices_dispatcher_host.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 static_cast<MediaDeviceType>(i), this); | 135 static_cast<MediaDeviceType>(i), this); |
136 } | 136 } |
137 } | 137 } |
138 } | 138 } |
139 | 139 |
140 void MediaDevicesDispatcherHost::EnumerateDevices( | 140 void MediaDevicesDispatcherHost::EnumerateDevices( |
141 bool request_audio_input, | 141 bool request_audio_input, |
142 bool request_video_input, | 142 bool request_video_input, |
143 bool request_audio_output, | 143 bool request_audio_output, |
144 const url::Origin& security_origin, | 144 const url::Origin& security_origin, |
145 const EnumerateDevicesCallback& client_callback) { | 145 EnumerateDevicesCallback client_callback) { |
146 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 146 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
147 | 147 |
148 if (!request_audio_input && !request_video_input && !request_audio_output) { | 148 if (!request_audio_input && !request_video_input && !request_audio_output) { |
149 bad_message::ReceivedBadMessage( | 149 bad_message::ReceivedBadMessage( |
150 render_process_id_, bad_message::MDDH_INVALID_DEVICE_TYPE_REQUEST); | 150 render_process_id_, bad_message::MDDH_INVALID_DEVICE_TYPE_REQUEST); |
151 return; | 151 return; |
152 } | 152 } |
153 | 153 |
154 // Ignore requests from unique origins, but do not crash the renderer. | 154 // Ignore requests from unique origins, but do not crash the renderer. |
155 if (security_origin.unique()) | 155 if (security_origin.unique()) |
156 return; | 156 return; |
157 | 157 |
158 if (!MediaStreamManager::IsOriginAllowed(render_process_id_, | 158 if (!MediaStreamManager::IsOriginAllowed(render_process_id_, |
159 security_origin)) { | 159 security_origin)) { |
160 bad_message::ReceivedBadMessage(render_process_id_, | 160 bad_message::ReceivedBadMessage(render_process_id_, |
161 bad_message::MDDH_UNAUTHORIZED_ORIGIN); | 161 bad_message::MDDH_UNAUTHORIZED_ORIGIN); |
162 return; | 162 return; |
163 } | 163 } |
164 | 164 |
165 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; | 165 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; |
166 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = request_audio_input; | 166 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = request_audio_input; |
167 devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = request_video_input; | 167 devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = request_video_input; |
168 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = request_audio_output; | 168 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = request_audio_output; |
169 | 169 |
170 permission_checker_->CheckPermissions( | 170 permission_checker_->CheckPermissions( |
171 devices_to_enumerate, render_process_id_, render_frame_id_, | 171 devices_to_enumerate, render_process_id_, render_frame_id_, |
172 security_origin, | 172 security_origin, |
173 base::Bind(&MediaDevicesDispatcherHost::DoEnumerateDevices, | 173 base::Bind(&MediaDevicesDispatcherHost::DoEnumerateDevices, |
174 weak_factory_.GetWeakPtr(), devices_to_enumerate, | 174 weak_factory_.GetWeakPtr(), devices_to_enumerate, |
175 security_origin, client_callback)); | 175 security_origin, base::Passed(&client_callback))); |
176 } | 176 } |
177 | 177 |
178 void MediaDevicesDispatcherHost::GetVideoInputCapabilities( | 178 void MediaDevicesDispatcherHost::GetVideoInputCapabilities( |
179 const url::Origin& security_origin, | 179 const url::Origin& security_origin, |
180 const GetVideoInputCapabilitiesCallback& client_callback) { | 180 GetVideoInputCapabilitiesCallback client_callback) { |
181 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 181 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
182 if (!MediaStreamManager::IsOriginAllowed(render_process_id_, | 182 if (!MediaStreamManager::IsOriginAllowed(render_process_id_, |
183 security_origin)) { | 183 security_origin)) { |
184 bad_message::ReceivedBadMessage(render_process_id_, | 184 bad_message::ReceivedBadMessage(render_process_id_, |
185 bad_message::MDDH_UNAUTHORIZED_ORIGIN); | 185 bad_message::MDDH_UNAUTHORIZED_ORIGIN); |
186 return; | 186 return; |
187 } | 187 } |
188 | 188 |
189 GetDefaultMediaDeviceID( | 189 GetDefaultMediaDeviceID( |
190 MEDIA_DEVICE_TYPE_VIDEO_INPUT, render_process_id_, render_frame_id_, | 190 MEDIA_DEVICE_TYPE_VIDEO_INPUT, render_process_id_, render_frame_id_, |
191 base::Bind(&MediaDevicesDispatcherHost::GotDefaultVideoInputDeviceID, | 191 base::Bind(&MediaDevicesDispatcherHost::GotDefaultVideoInputDeviceID, |
192 weak_factory_.GetWeakPtr(), security_origin, client_callback)); | 192 weak_factory_.GetWeakPtr(), security_origin, |
| 193 base::Passed(&client_callback))); |
193 } | 194 } |
194 | 195 |
195 void MediaDevicesDispatcherHost::SubscribeDeviceChangeNotifications( | 196 void MediaDevicesDispatcherHost::SubscribeDeviceChangeNotifications( |
196 MediaDeviceType type, | 197 MediaDeviceType type, |
197 uint32_t subscription_id, | 198 uint32_t subscription_id, |
198 const url::Origin& security_origin) { | 199 const url::Origin& security_origin) { |
199 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 200 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
200 DCHECK(IsValidMediaDeviceType(type)); | 201 DCHECK(IsValidMediaDeviceType(type)); |
201 if (!MediaStreamManager::IsOriginAllowed(render_process_id_, | 202 if (!MediaStreamManager::IsOriginAllowed(render_process_id_, |
202 security_origin)) { | 203 security_origin)) { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 | 306 |
306 void MediaDevicesDispatcherHost::SetDeviceChangeListenerForTesting( | 307 void MediaDevicesDispatcherHost::SetDeviceChangeListenerForTesting( |
307 ::mojom::MediaDevicesListenerPtr listener) { | 308 ::mojom::MediaDevicesListenerPtr listener) { |
308 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 309 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
309 device_change_listener_ = std::move(listener); | 310 device_change_listener_ = std::move(listener); |
310 } | 311 } |
311 | 312 |
312 void MediaDevicesDispatcherHost::DoEnumerateDevices( | 313 void MediaDevicesDispatcherHost::DoEnumerateDevices( |
313 const MediaDevicesManager::BoolDeviceTypes& requested_types, | 314 const MediaDevicesManager::BoolDeviceTypes& requested_types, |
314 const url::Origin& security_origin, | 315 const url::Origin& security_origin, |
315 const EnumerateDevicesCallback& client_callback, | 316 EnumerateDevicesCallback client_callback, |
316 const MediaDevicesManager::BoolDeviceTypes& has_permissions) { | 317 const MediaDevicesManager::BoolDeviceTypes& has_permissions) { |
317 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 318 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
318 media_stream_manager_->media_devices_manager()->EnumerateDevices( | 319 media_stream_manager_->media_devices_manager()->EnumerateDevices( |
319 requested_types, | 320 requested_types, |
320 base::Bind(&MediaDevicesDispatcherHost::DevicesEnumerated, | 321 base::Bind(&MediaDevicesDispatcherHost::DevicesEnumerated, |
321 weak_factory_.GetWeakPtr(), requested_types, security_origin, | 322 weak_factory_.GetWeakPtr(), requested_types, security_origin, |
322 client_callback, has_permissions)); | 323 base::Passed(&client_callback), has_permissions)); |
323 } | 324 } |
324 | 325 |
325 void MediaDevicesDispatcherHost::DevicesEnumerated( | 326 void MediaDevicesDispatcherHost::DevicesEnumerated( |
326 const MediaDevicesManager::BoolDeviceTypes& requested_types, | 327 const MediaDevicesManager::BoolDeviceTypes& requested_types, |
327 const url::Origin& security_origin, | 328 const url::Origin& security_origin, |
328 const EnumerateDevicesCallback& client_callback, | 329 EnumerateDevicesCallback client_callback, |
329 const MediaDevicesManager::BoolDeviceTypes& has_permissions, | 330 const MediaDevicesManager::BoolDeviceTypes& has_permissions, |
330 const MediaDeviceEnumeration& enumeration) { | 331 const MediaDeviceEnumeration& enumeration) { |
331 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 332 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
332 std::vector<std::vector<MediaDeviceInfo>> result(NUM_MEDIA_DEVICE_TYPES); | 333 std::vector<std::vector<MediaDeviceInfo>> result(NUM_MEDIA_DEVICE_TYPES); |
333 for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) { | 334 for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) { |
334 if (!requested_types[i]) | 335 if (!requested_types[i]) |
335 continue; | 336 continue; |
336 | 337 |
337 for (const auto& device_info : enumeration[i]) { | 338 for (const auto& device_info : enumeration[i]) { |
338 result[i].push_back(TranslateDeviceInfo(has_permissions[i], | 339 result[i].push_back(TranslateDeviceInfo(has_permissions[i], |
339 device_id_salt_, group_id_salt_, | 340 device_id_salt_, group_id_salt_, |
340 security_origin, device_info)); | 341 security_origin, device_info)); |
341 } | 342 } |
342 } | 343 } |
343 client_callback.Run(result); | 344 std::move(client_callback).Run(result); |
344 } | 345 } |
345 | 346 |
346 void MediaDevicesDispatcherHost::GotDefaultVideoInputDeviceID( | 347 void MediaDevicesDispatcherHost::GotDefaultVideoInputDeviceID( |
347 const url::Origin& security_origin, | 348 const url::Origin& security_origin, |
348 const GetVideoInputCapabilitiesCallback& client_callback, | 349 GetVideoInputCapabilitiesCallback client_callback, |
349 const std::string& default_device_id) { | 350 const std::string& default_device_id) { |
350 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; | 351 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; |
351 devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = true; | 352 devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = true; |
352 media_stream_manager_->video_capture_manager()->EnumerateDevices( | 353 media_stream_manager_->video_capture_manager()->EnumerateDevices( |
353 base::Bind(&MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities, | 354 base::Bind(&MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities, |
354 weak_factory_.GetWeakPtr(), security_origin, client_callback, | 355 weak_factory_.GetWeakPtr(), security_origin, |
355 default_device_id)); | 356 base::Passed(&client_callback), default_device_id)); |
356 } | 357 } |
357 | 358 |
358 void MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities( | 359 void MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities( |
359 const url::Origin& security_origin, | 360 const url::Origin& security_origin, |
360 const GetVideoInputCapabilitiesCallback& client_callback, | 361 GetVideoInputCapabilitiesCallback client_callback, |
361 const std::string& default_device_id, | 362 const std::string& default_device_id, |
362 const media::VideoCaptureDeviceDescriptors& device_descriptors) { | 363 const media::VideoCaptureDeviceDescriptors& device_descriptors) { |
363 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 364 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
364 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> | 365 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> |
365 video_input_capabilities; | 366 video_input_capabilities; |
366 for (const auto& descriptor : device_descriptors) { | 367 for (const auto& descriptor : device_descriptors) { |
367 std::string hmac_device_id = GetHMACForMediaDeviceID( | 368 std::string hmac_device_id = GetHMACForMediaDeviceID( |
368 device_id_salt_, security_origin, descriptor.device_id); | 369 device_id_salt_, security_origin, descriptor.device_id); |
369 ::mojom::VideoInputDeviceCapabilitiesPtr capabilities = | 370 ::mojom::VideoInputDeviceCapabilitiesPtr capabilities = |
370 ::mojom::VideoInputDeviceCapabilities::New(); | 371 ::mojom::VideoInputDeviceCapabilities::New(); |
(...skipping 22 matching lines...) Expand all Loading... |
393 capabilities->facing_mode = ::mojom::FacingMode::ENVIRONMENT; | 394 capabilities->facing_mode = ::mojom::FacingMode::ENVIRONMENT; |
394 #endif | 395 #endif |
395 if (descriptor.device_id == default_device_id) { | 396 if (descriptor.device_id == default_device_id) { |
396 video_input_capabilities.insert(video_input_capabilities.begin(), | 397 video_input_capabilities.insert(video_input_capabilities.begin(), |
397 std::move(capabilities)); | 398 std::move(capabilities)); |
398 } else { | 399 } else { |
399 video_input_capabilities.push_back(std::move(capabilities)); | 400 video_input_capabilities.push_back(std::move(capabilities)); |
400 } | 401 } |
401 } | 402 } |
402 | 403 |
403 client_callback.Run(std::move(video_input_capabilities)); | 404 std::move(client_callback).Run(std::move(video_input_capabilities)); |
404 } | 405 } |
405 | 406 |
406 media::VideoCaptureFormats MediaDevicesDispatcherHost::GetVideoInputFormats( | 407 media::VideoCaptureFormats MediaDevicesDispatcherHost::GetVideoInputFormats( |
407 const std::string& device_id) { | 408 const std::string& device_id) { |
408 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 409 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
409 media::VideoCaptureFormats formats; | 410 media::VideoCaptureFormats formats; |
410 base::Optional<media::VideoCaptureFormat> format = | 411 base::Optional<media::VideoCaptureFormat> format = |
411 media_stream_manager_->video_capture_manager()->GetDeviceFormatInUse( | 412 media_stream_manager_->video_capture_manager()->GetDeviceFormatInUse( |
412 MEDIA_DEVICE_VIDEO_CAPTURE, device_id); | 413 MEDIA_DEVICE_VIDEO_CAPTURE, device_id); |
413 if (format.has_value()) { | 414 if (format.has_value()) { |
414 formats.push_back(format.value()); | 415 formats.push_back(format.value()); |
415 return formats; | 416 return formats; |
416 } | 417 } |
417 | 418 |
418 media_stream_manager_->video_capture_manager()->GetDeviceSupportedFormats( | 419 media_stream_manager_->video_capture_manager()->GetDeviceSupportedFormats( |
419 device_id, &formats); | 420 device_id, &formats); |
420 return formats; | 421 return formats; |
421 } | 422 } |
422 | 423 |
423 } // namespace content | 424 } // namespace content |
OLD | NEW |