haikuwebkit/LayoutTests/fast/mediastream/get-user-media-device-id.html

102 lines
4.6 KiB
HTML
Raw Permalink Normal View History

[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test passing capture device IDs to getUserMedia</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
let deviceIds = [];
if (window.testRunner)
testRunner.setUserMediaPermission(true);
promise_test(async (test) => {
const devices = await navigator.mediaDevices.enumerateDevices();
assert_true(devices.length <= 2, "before getting permission, at most 1 camera and 1 microphone are exposed");
devices.forEach((device) => {
assert_true(device.deviceId.length == 0 , "device.deviceId is empty before permission to capture");
});
}, "Device IDs should be empty initially");
promise_test((test) => {
return navigator.mediaDevices.getUserMedia({ audio:true, video:true })
.then((stream) => {
return navigator.mediaDevices.enumerateDevices();
}).then(devices => {
[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
devices.forEach((device) => {
Source/WebCore: [HANG] 496ms to 1360ms in WebCore::AVAudioSessionCaptureDeviceManager::refreshAudioCaptureDevices() https://bugs.webkit.org/show_bug.cgi?id=220471 Reviewed by Youenn Fablet. Refactor RealtimeMediaSourceCenter::getMediaStreamDevices() to take a completion handler, rather than synchronously return a Vector of CaptureDevices. This also requires all CaptureDeviceManager subclasses to support taking a completion handler themselves. By default, all CaptureDeviceManagers will support the CompletionHandler path by just synchronously calling the completion handler with the existing synchronous method. But for AVAudioSessionCaptureDeviceManager, override that default implementation by activating the AVAudioSession on a background thread, and querying that session's inputs on a background thread as well. * platform/mediastream/CaptureDeviceManager.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::getMediaStreamDevices): * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceFactory.h: (WebCore::AudioCaptureFactory::getSpeakerDevices const): * platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.h: * platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm: (WebCore::AVAudioSessionCaptureDeviceManager::audioSessionDeviceWithUID): (WebCore::AVAudioSessionCaptureDeviceManager::scheduleUpdateCaptureDevices): (WebCore::AVAudioSessionCaptureDeviceManager::refreshAudioCaptureDevices): (WebCore::AVAudioSessionCaptureDeviceManager::getCaptureDevices): (WebCore::AVAudioSessionCaptureDeviceManager::activateAudioSession): (WebCore::AVAudioSessionCaptureDeviceManager::retrieveAudioSessionCaptureDevices const): (WebCore::AVAudioSessionCaptureDeviceManager::setAudioCaptureDevices): (WebCore::AVAudioSessionCaptureDeviceManager::audioSessionCaptureDevices): Deleted. Source/WebKit: [HANG] 496ms to 1360ms in WebCore::AVAudioSessionCaptureDeviceManager::refreshAudioCaptureDevices() https://bugs.webkit.org/show_bug.cgi?id=220471 Reviewed by Youenn Fablet. Use the completion-handler version of RealtimeMediaSourceCenter::getMediaStreamDevices(). * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::UserMediaPermissionRequestManagerProxy::computeFilteredDeviceList): (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): * UIProcess/UserMediaPermissionRequestManagerProxy.h: * UIProcess/UserMediaProcessManager.cpp: (WebKit::UserMediaProcessManager::updateCaptureDevices): (WebKit::UserMediaProcessManager::beginMonitoringCaptureDevices): * UIProcess/UserMediaProcessManager.h: LayoutTests: [Cocoa] Support key rotation with HLS-backed encrypted media streams https://bugs.webkit.org/show_bug.cgi?id=220493 <rdar://68227709> Reviewed by Youenn Fablet. Fix a broken layout test; the test enumerates devices, then uses the deviceIds returned to generate constraints for a call to getUserMedia(). However, it assumes all devices will either be of kind 'audioinput' or 'videoinput'. If an 'audiooutput' device is returned (as the MockRealtimeMediaSourceCenter does), then the test turns that into a video capture constraint, which fails. * fast/mediastream/get-user-media-device-id.html: Canonical link: https://commits.webkit.org/233026@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@271471 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-01-14 00:01:37 +00:00
if (device.kind == "audiooutput")
return;
[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
let kind = device.kind == "audioinput" ? "audio" : "video";
deviceIds.push({ type: kind, id : device.deviceId});
});
});
}, "Collect device IDs");
[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
let constraints = { };
promise_test((test) => {
deviceIds.forEach((info) => {
constraints[info.type] = { deviceId: { exact: info.id } };
});
MediaStreamTrack.getSettings should compute its deviceId/groupId like enumerateDevices https://bugs.webkit.org/show_bug.cgi?id=177433 Patch by Youenn Fablet <youenn@apple.com> on 2017-09-25 Reviewed by Jer Noble. Source/WebCore: Covered by improved test. Hash the deviceId returned by getSettings as done by enumerateDevices/getUserMedia. Do the same thing for groupId. Make sure mock sources have their deviceId set consistently with mock devices. * Modules/mediastream/MediaStreamTrack.cpp: (WebCore::MediaStreamTrack::getSettings const): * Modules/mediastream/MediaStreamTrack.h: * Modules/mediastream/MediaStreamTrack.idl: * platform/mediastream/mac/MockRealtimeAudioSourceMac.h: * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: (WebCore::MockRealtimeAudioSource::create): (WebCore::MockRealtimeAudioSourceMac::MockRealtimeAudioSourceMac): * platform/mediastream/mac/MockRealtimeVideoSourceMac.h: * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm: (WebCore::MockRealtimeVideoSource::create): (WebCore::MockRealtimeVideoSourceMac::MockRealtimeVideoSourceMac): * platform/mock/MockRealtimeAudioSource.cpp: (WebCore::MockRealtimeAudioSource::create): (WebCore::MockRealtimeAudioSource::createMuted): (WebCore::MockRealtimeAudioSource::MockRealtimeAudioSource): * platform/mock/MockRealtimeAudioSource.h: * platform/mock/MockRealtimeVideoSource.cpp: (WebCore::MockRealtimeVideoSource::create): (WebCore::MockRealtimeVideoSource::createMuted): (WebCore::MockRealtimeVideoSource::MockRealtimeVideoSource): * platform/mock/MockRealtimeVideoSource.h: LayoutTests: * fast/mediastream/get-user-media-device-id.html: Canonical link: https://commits.webkit.org/193765@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222471 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-25 21:46:46 +00:00
var audioTrack, videoTrack;
[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
return navigator.mediaDevices.getUserMedia(constraints)
.then((stream) => {
assert_equals(stream.getAudioTracks().length, 1, "correct number of audio tracks");
assert_equals(stream.getVideoTracks().length, 1, "correct number of audio tracks");
MediaStreamTrack.getSettings should compute its deviceId/groupId like enumerateDevices https://bugs.webkit.org/show_bug.cgi?id=177433 Patch by Youenn Fablet <youenn@apple.com> on 2017-09-25 Reviewed by Jer Noble. Source/WebCore: Covered by improved test. Hash the deviceId returned by getSettings as done by enumerateDevices/getUserMedia. Do the same thing for groupId. Make sure mock sources have their deviceId set consistently with mock devices. * Modules/mediastream/MediaStreamTrack.cpp: (WebCore::MediaStreamTrack::getSettings const): * Modules/mediastream/MediaStreamTrack.h: * Modules/mediastream/MediaStreamTrack.idl: * platform/mediastream/mac/MockRealtimeAudioSourceMac.h: * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: (WebCore::MockRealtimeAudioSource::create): (WebCore::MockRealtimeAudioSourceMac::MockRealtimeAudioSourceMac): * platform/mediastream/mac/MockRealtimeVideoSourceMac.h: * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm: (WebCore::MockRealtimeVideoSource::create): (WebCore::MockRealtimeVideoSourceMac::MockRealtimeVideoSourceMac): * platform/mock/MockRealtimeAudioSource.cpp: (WebCore::MockRealtimeAudioSource::create): (WebCore::MockRealtimeAudioSource::createMuted): (WebCore::MockRealtimeAudioSource::MockRealtimeAudioSource): * platform/mock/MockRealtimeAudioSource.h: * platform/mock/MockRealtimeVideoSource.cpp: (WebCore::MockRealtimeVideoSource::create): (WebCore::MockRealtimeVideoSource::createMuted): (WebCore::MockRealtimeVideoSource::MockRealtimeVideoSource): * platform/mock/MockRealtimeVideoSource.h: LayoutTests: * fast/mediastream/get-user-media-device-id.html: Canonical link: https://commits.webkit.org/193765@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222471 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-25 21:46:46 +00:00
videoTrack = stream.getVideoTracks()[0];
audioTrack = stream.getAudioTracks()[0];
return navigator.mediaDevices.enumerateDevices();
}).then(devices => {
var ids = devices.map(device => device.deviceId);
assert_true(ids.indexOf(videoTrack.getSettings().deviceId) !== -1 , "deviceId for video track should be respected");
assert_true(ids.indexOf(audioTrack.getSettings().deviceId) !== -1 , "deviceId for audio track should be respected");
assert_equals(audioTrack.getSettings().groupId, videoTrack.getSettings().groupId, "groupId should match");
[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
})
}, "Pass device IDs as exact constraints");
promise_test((test) => {
deviceIds.forEach((info) => {
constraints[info.type] = { deviceId: info.id };
});
return navigator.mediaDevices.getUserMedia(constraints)
.then((stream) => {
assert_equals(stream.getAudioTracks().length, 1, "correct number of audio tracks");
getUserMedia with an ideal deviceId constraint doesn't always select the correct device https://bugs.webkit.org/show_bug.cgi?id=193614 Source/WebCore: Reviewed by Eric Carlson. Compute a fitness score based on constraints. For each constraint, a fitness score is computed from the distance. The smaller the distance, the higher the score. Fitness scores are then summed to give a device fitness score. Matching devices are then sorted according the fitness score. For important constraints, deviceId and facingMode, add a more important weight. This ensures that should any of these ideal constraints are set, they will be respected. Restrict our automatic setting of default constraints to not add a default ideal facingMode in case of existing deviceId constraint. Do not set a default ideal frameRate if width and height are already set. Covered by updated test. * platform/mediastream/MediaConstraints.cpp: (WebCore::FlattenedConstraint::set): (WebCore::MediaConstraints::setDefaultVideoConstraints): * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): (WebCore::RealtimeMediaSource::selectSettings): (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): LayoutTests: Reviewed by Eric Carlson. * fast/mediastream/get-user-media-device-id-expected.txt: * fast/mediastream/get-user-media-device-id.html: Canonical link: https://commits.webkit.org/209035@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241489 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-02-14 01:25:39 +00:00
assert_equals(stream.getVideoTracks().length, 1, "correct number of video tracks");
[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
})
}, "Pass device IDs as optional constraints");
promise_test(async (test) => {
await navigator.mediaDevices.getUserMedia({ audio: {deviceId: {exact: ""}}});
await navigator.mediaDevices.getUserMedia({ video: {deviceId: {exact: [""]}}});
await navigator.mediaDevices.getUserMedia({ audio: {deviceId: {exact: undefined}}});
await navigator.mediaDevices.getUserMedia({ audio: {deviceId: {exact: null}}}).then(assert_unreached, () => { });
await navigator.mediaDevices.getUserMedia({ audio: {deviceId: {exact: "test"}}}).then(assert_unreached, () => { });
}, "Exact device IDs with special values: empty string, null, undefined");
getUserMedia with an ideal deviceId constraint doesn't always select the correct device https://bugs.webkit.org/show_bug.cgi?id=193614 Source/WebCore: Reviewed by Eric Carlson. Compute a fitness score based on constraints. For each constraint, a fitness score is computed from the distance. The smaller the distance, the higher the score. Fitness scores are then summed to give a device fitness score. Matching devices are then sorted according the fitness score. For important constraints, deviceId and facingMode, add a more important weight. This ensures that should any of these ideal constraints are set, they will be respected. Restrict our automatic setting of default constraints to not add a default ideal facingMode in case of existing deviceId constraint. Do not set a default ideal frameRate if width and height are already set. Covered by updated test. * platform/mediastream/MediaConstraints.cpp: (WebCore::FlattenedConstraint::set): (WebCore::MediaConstraints::setDefaultVideoConstraints): * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): (WebCore::RealtimeMediaSource::selectSettings): (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): LayoutTests: Reviewed by Eric Carlson. * fast/mediastream/get-user-media-device-id-expected.txt: * fast/mediastream/get-user-media-device-id.html: Canonical link: https://commits.webkit.org/209035@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241489 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-02-14 01:25:39 +00:00
promise_test(async (test) => {
await navigator.mediaDevices.getUserMedia({video: true});
const devices = await navigator.mediaDevices.enumerateDevices();
for (let device of devices) {
if (device.kind === "audioinput") {
const stream = await navigator.mediaDevices.getUserMedia({audio: {deviceId: device.deviceId}});
assert_equals(stream.getAudioTracks()[0].getSettings().deviceId, device.deviceId, "Matching audio device id");
enumerateDevices should expose audiooutput devices that are tied to an audio input device https://bugs.webkit.org/show_bug.cgi?id=215806 Reviewed by Eric Carlson. LayoutTests/imported/w3c: * web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https-expected.txt: * web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html: Source/WebCore: Add support for a speaker selection feature policy, as per https://w3c.github.io/mediacapture-output/#permissions-policy-integration. Add support for speaker mock devices and for listing speakers on MacOS in CoreAudioCaptureDeviceManager. Add support for groupId to group microphones and speakers for both mock audio manager and CoreAudioCaptureDeviceManager. For mock speakers, we add two audiooutput devices that are related to a microphone and one audiooutput that is not related to any microphone. Test: fast/mediastream/enumerate-speaker.html * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::MediaDevices): (WebCore::checkSpeakerAccess): (WebCore::toMediaDeviceInfoKind): (WebCore::MediaDevices::refreshDevices): * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaStreamTrack.cpp: (WebCore::sourceCaptureState): (WebCore::MediaStreamTrack::updateToPageMutedState): * html/FeaturePolicy.cpp: (WebCore::policyTypeName): (WebCore::FeaturePolicy::parse): (WebCore::FeaturePolicy::allows const): * html/FeaturePolicy.h: * page/Settings.yaml: * platform/mediastream/CaptureDevice.h: (WebCore::CaptureDevice::label const): (WebCore::CaptureDevice::setGroupId): * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::getMediaStreamDevices): * platform/mediastream/RealtimeMediaSourceFactory.h: * platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp: (WebCore::GStreamerAudioCaptureSourceFactory::speakerDevices const): * platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.h: * platform/mediastream/mac/CoreAudioCaptureDevice.cpp: (WebCore::CoreAudioCaptureDevice::create): (WebCore::CoreAudioCaptureDevice::CoreAudioCaptureDevice): (WebCore::CoreAudioCaptureDevice::relatedAudioDeviceIDs): * platform/mediastream/mac/CoreAudioCaptureDevice.h: * platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp: (WebCore::CoreAudioCaptureDeviceManager::captureDevices): (WebCore::deviceHasOutputStreams): (WebCore::getDefaultCaptureInputDevice): (WebCore::hasDevice): (WebCore::CoreAudioCaptureDeviceManager::refreshAudioCaptureDevices): * platform/mediastream/mac/CoreAudioCaptureDeviceManager.h: * platform/mediastream/mac/CoreAudioCaptureSource.cpp: (WebCore::CoreAudioCaptureSourceFactory::speakerDevices const): * platform/mediastream/mac/CoreAudioCaptureSource.h: * platform/mediastream/mac/DisplayCaptureManagerCocoa.cpp: (WebCore::DisplayCaptureManagerCocoa::captureDeviceWithPersistentID): * platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp: (WebCore::DisplayCaptureSourceCocoa::create): * platform/mock/MockMediaDevice.h: (WebCore::MockSpeakerProperties::encode const): (WebCore::MockSpeakerProperties::decode): (WebCore::MockMediaDevice::isSpeaker const): (WebCore::MockMediaDevice::captureDevice const): (WebCore::MockMediaDevice::type const): (WebCore::MockMediaDevice::speakerProperties const): (WebCore::MockMediaDevice::encode const): (WebCore::MockMediaDevice::decode): * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::defaultDevices): (WebCore::deviceListForDevice): (WebCore::toCaptureDevice): (WebCore::createMockDevice): (WebCore::MockRealtimeMediaSourceCenter::setDevices): (WebCore::MockRealtimeMediaSourceCenter::addDevice): (WebCore::MockRealtimeMediaSourceCenter::captureDeviceWithPersistentID): (WebCore::MockRealtimeMediaSourceCenter::microphoneDevices): (WebCore::MockRealtimeMediaSourceCenter::speakerDevices): (WebCore::MockRealtimeMediaSourceCenter::videoDevices): * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit: Introduce an experimental flag (off by default) to cover speaker selection, including exposing speaker devices to web pages. Update UserMediaPermissionRequestManagerProxy::computeFilteredDeviceList to only expose speakers that are tied to a microphone that is exposed. This aligns with https://w3c.github.io/mediacapture-output/#privacy-obtaining-consent. * GPUProcess/GPUConnectionToWebProcess.cpp: * Shared/WebPreferences.yaml: * UIProcess/API/C/WKMockMediaDevice.cpp: (WKAddMockMediaDevice): * UIProcess/API/C/WKPreferences.cpp: (WKPreferencesSetExposeSpeakersEnabled): (WKPreferencesGetExposeSpeakersEnabled): * UIProcess/API/C/WKPreferencesRefPrivate.h: * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints): * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::isMicrophoneDevice): (WebKit::UserMediaPermissionRequestManagerProxy::computeFilteredDeviceList): * WebProcess/cocoa/RemoteRealtimeMediaSource.cpp: (WebKit::sourceTypeFromDeviceType): (WebKit::RemoteRealtimeMediaSource::RemoteRealtimeMediaSource): (WebKit::RemoteRealtimeMediaSource::~RemoteRealtimeMediaSource): * WebProcess/cocoa/UserMediaCaptureManager.h: Tools: Enable experimental flag. * WebKitTestRunner/TestController.cpp: (WTR::TestController::resetPreferencesToConsistentValues): LayoutTests: * fast/mediastream/enumerate-speaker-expected.txt: Added. * fast/mediastream/enumerate-speaker.html: Added. * fast/mediastream/get-user-media-device-id.html: * http/tests/media/media-stream/enumerate-devices-source-id.html: * http/tests/media/media-stream/enumerate-devices-iframe-allow-attribute-expected.txt: * http/tests/media/media-stream/enumerate-devices-iframe-allow-attribute.html: Rewrite test to use testharness and ensure order of the iframe tests so that console messages are ordered. * http/tests/media/media-stream/resources/enumerate-devices-iframe.html: Canonical link: https://commits.webkit.org/228635@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266166 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-26 11:16:03 +00:00
} else if (device.kind === "videoinput") {
getUserMedia with an ideal deviceId constraint doesn't always select the correct device https://bugs.webkit.org/show_bug.cgi?id=193614 Source/WebCore: Reviewed by Eric Carlson. Compute a fitness score based on constraints. For each constraint, a fitness score is computed from the distance. The smaller the distance, the higher the score. Fitness scores are then summed to give a device fitness score. Matching devices are then sorted according the fitness score. For important constraints, deviceId and facingMode, add a more important weight. This ensures that should any of these ideal constraints are set, they will be respected. Restrict our automatic setting of default constraints to not add a default ideal facingMode in case of existing deviceId constraint. Do not set a default ideal frameRate if width and height are already set. Covered by updated test. * platform/mediastream/MediaConstraints.cpp: (WebCore::FlattenedConstraint::set): (WebCore::MediaConstraints::setDefaultVideoConstraints): * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): (WebCore::RealtimeMediaSource::selectSettings): (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): LayoutTests: Reviewed by Eric Carlson. * fast/mediastream/get-user-media-device-id-expected.txt: * fast/mediastream/get-user-media-device-id.html: Canonical link: https://commits.webkit.org/209035@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241489 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-02-14 01:25:39 +00:00
const stream = await navigator.mediaDevices.getUserMedia({video: {deviceId: device.deviceId}});
assert_equals(stream.getVideoTracks()[0].getSettings().deviceId, device.deviceId, "Matching video device id");
}
}
}, "Ideal deviceId constraints");
[MediaStream] deviceId constraint doesn't work with getUserMedia https://bugs.webkit.org/show_bug.cgi?id=171877 <rdar://problem/31899730> Reviewed by Jer Noble. Source/WebCore: Test: fast/mediastream/get-user-media-device-id.html * Modules/mediastream/MediaConstraintsImpl.h: (WebCore::MediaConstraintsData::MediaConstraintsData): Add a constructor that takes a const MediaConstraints&. * Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::~MediaDevices): m_deviceChangedToken is a std::optional<>. * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Don't return NULL for the main frame so the origin matches that returned for a UserMediaRequest. * Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::setDeviceIDHashSalt): Deleted, not used. (WebCore::UserMediaController::deviceIDHashSalt): Deleted, not used. * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Add device ID hash salt parameter, set it on constraints. * Modules/mediastream/UserMediaRequest.h: * platform/mediastream/MediaConstraints.h: * platform/mediastream/RealtimeMediaSource.cpp: (WebCore::RealtimeMediaSource::fitnessDistance): ASSERT if called for DeviceId. (WebCore::RealtimeMediaSource::selectSettings): Special case DeviceId because it we have to hash the device ID before comparing, and because the DeviceId can't be changed so it should never be added to the flattened constraints. (WebCore::RealtimeMediaSource::supportsConstraints): (WebCore::RealtimeMediaSource::applyConstraints): * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Implement. * platform/mediastream/RealtimeMediaSourceCenter.h: * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp: (WebCore::RealtimeMediaSourceSupportedConstraints::nameForConstraint): Deleted, unused. (WebCore::RealtimeMediaSourceSupportedConstraints::constraintFromName): Deleted, unused. * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h: * platform/mediastream/mac/AVVideoCaptureSource.mm: * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints): Pass device id, not empty string. (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Deleted. * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: * platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Deleted. * platform/mock/MockRealtimeMediaSourceCenter.h: Source/WebKit2: * Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<MediaConstraintsData>::encode): Encode deviceIDHashSalt. (IPC::ArgumentCoder<MediaConstraintsData>::decode): Decode deviceIDHashSalt. * UIProcess/UserMediaPermissionCheckProxy.cpp: (WebKit::UserMediaPermissionCheckProxy::UserMediaPermissionCheckProxy): Initialize completion handler, frame ID, and security origins. (WebKit::UserMediaPermissionCheckProxy::setUserMediaAccessInfo): Complete by calling completion handler because we now sometimes request access info before calling gUM. (WebKit::UserMediaPermissionCheckProxy::invalidate): Clear completion handler. * UIProcess/UserMediaPermissionCheckProxy.h: * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::FrameAuthorizationState::FrameAuthorizationState): Take security origins, not UserMediaPermissionRequestProxy, so it can be constructed with a UserMediaPermissionCheckProxy. (WebKit::FrameAuthorizationState::ensureSecurityOriginsAreEqual): Ditto. Clear has salt when origins don't match. (WebKit::UserMediaPermissionRequestManagerProxy::stateForRequest): Templatize. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied): Fix typo. (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. Don't set state for empty UIDs. Pass hash salt to web process. (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): The device ID hash salt is now required to validate constraints, so get it first. (WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo): Helper method used to get the device ID hash salt. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Restructure to use getUserMediaPermissionInfo. (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Deleted. * UIProcess/UserMediaPermissionRequestManagerProxy.h: * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): Add device ID hash salt parameter. * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): Ditto. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::createCaptureSource): Use new MediaConstraintsData constructor. Tools: The device ID hash salt is now required for getUserMedia to check deviceId constraint, so implement the "checkUserMediaPermission" callback. * TestWebKitAPI/Tests/WebKit2/UserMedia.cpp: (TestWebKitAPI::decidePolicyForUserMediaPermissionRequestCallBack): (TestWebKitAPI::checkUserMediaPermissionCallback): (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKit2Cocoa/UserMediaDisabled.mm: (-[UserMediaUIDelegate _webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:]): LayoutTests: * fast/mediastream/get-user-media-device-id-expected.txt: Added. * fast/mediastream/get-user-media-device-id.html: Added. * fast/mediastream/apply-constraints-video-expected.txt: Updated. * fast/mediastream/apply-constraints-video.html: Ditto. Canonical link: https://commits.webkit.org/189021@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216836 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-14 05:27:18 +00:00
</script>
</head>
<body>
</body>
</html>