| 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 |