Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use an ephemeral device ID for the Continuity camera when it is not t…
…he system preferred https://bugs.webkit.org/show_bug.cgi?id=247208 rdar://100335624 Reviewed by Jer Noble. A "Continuity Camera", an iPhone used as a camera for a Macintosh, is listed as an AVCaptureDevice whenever it is in close enough to the Macintosh to be used, but it is only the "system preferred camera" when it is in an appropriate position and orientation to be used as a camera for the device. This means that a script may remember the device ID when a user has set up the phone to be used as a camera, and then pass it to getUserMedia later when the phone is near the Macintosh but not usable as a camera - e.g. in the user's pocket. To prevent this problem, use a device ID that is only valid for the lifetime of the current frame when a Continuity Camera is available but is not the system preferred camera. * LayoutTests/http/tests/media/media-stream/enumerate-devices-ephemeral-id-expected.txt: Added. * LayoutTests/http/tests/media/media-stream/enumerate-devices-ephemeral-id.html: Added. * LayoutTests/http/tests/media/media-stream/resources/enumerate-devices-ephemeral-id-iframe.html: Added. * Source/WTF/wtf/PlatformHave.h: Define HAVE_CONTINUITY_CAMEARA * Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp: (WebCore::CanvasCaptureMediaStreamTrack::Source::Source): Update for RealtimeMediaSource constructor changes. * Source/WebCore/Modules/mediastream/MediaDevices.cpp: (WebCore::MediaDevices::exposeDevices): Take a MediaDeviceHashSalts instead of a String because there are now two hash salts. (WebCore::MediaDevices::enumerateDevices): Ditto. * Source/WebCore/Modules/mediastream/MediaDevices.h: * Source/WebCore/Modules/mediastream/UserMediaClient.h: Ditto. * Source/WebCore/Modules/mediastream/UserMediaController.cpp: * Source/WebCore/Modules/mediastream/UserMediaController.h: (WebCore::UserMediaController::enumerateMediaDevices): Ditto. * Source/WebCore/Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::allow): Ditto. * Source/WebCore/Modules/mediastream/UserMediaRequest.h: * Source/WebCore/Modules/speech/SpeechRecognitionCaptureSource.cpp: (WebCore::SpeechRecognitionCaptureSource::createRealtimeMediaSource): Update for RealtimeMediaSource constructor changes. * Source/WebCore/Modules/webaudio/MediaStreamAudioSource.cpp: (WebCore::MediaStreamAudioSource::MediaStreamAudioSource): Ditto. * Source/WebCore/WebCore.xcodeproj/project.pbxproj: * Source/WebCore/platform/mediastream/CaptureDevice.h: (WebCore::CaptureDevice::CaptureDevice): Add `isEphemeral` parameter. (WebCore::CaptureDevice::setPersistentId): (WebCore::CaptureDevice::setLabel): (WebCore::CaptureDevice::isEphemeral const): (WebCore::CaptureDevice::setIsEphemeral): (WebCore::CaptureDevice::encode const): (WebCore::CaptureDevice::decode): (WebCore::CaptureDevice::isolatedCopy): * Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp: (WebCore::RealtimeIncomingAudioSource::RealtimeIncomingAudioSource): Update for RealtimeMediaSource constructor changes. * Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp: (WebCore::RealtimeIncomingVideoSource::RealtimeIncomingVideoSource): Ditto. * Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp: (WebCore::toSourceType): (WebCore::RealtimeMediaSource::RealtimeMediaSource): Take a CaptureDevice instead of a type, name, and device ID. Take a MediaDeviceHashSalts instead of a String for the salts. (WebCore::RealtimeMediaSource::setPersistentId): (WebCore::RealtimeMediaSource::initializePersistentId): Calculate persistent and ephemeral hashed IDs. (WebCore::RealtimeMediaSource::fitnessDistance): m_hashedID -> hashedID() (WebCore::RealtimeMediaSource::hashedId const): Consider ephemeral state. (WebCore::RealtimeMediaSource::deviceIDHashSalts const): (WebCore::RealtimeMediaSource::setLogger): (WebCore::RealtimeMediaSource::deviceIDHashSalt const): Deleted. * Source/WebCore/platform/mediastream/RealtimeMediaSource.h: * Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp: (WebCore::RealtimeMediaSourceCenter::createMediaStream): Take MediaDeviceHashSalts with the hash salts. (WebCore::RealtimeMediaSourceCenter::getDisplayMediaDevices): Ditto. (WebCore::RealtimeMediaSourceCenter::getUserMediaDevices): Ditto. (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints): Ditto. (WebCore::RealtimeMediaSourceCenter::validateRequestConstraintsAfterEnumeration): Ditto. * Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h: * Source/WebCore/platform/mediastream/RealtimeMediaSourceFactory.h: Ditto. * Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h: Ditto. * Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp: (WebCore::RealtimeVideoCaptureSource::RealtimeVideoCaptureSource): Update for RealtimeMediaSource constructor changes. * Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.h: * Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp: (WebCore::RealtimeVideoSource::RealtimeVideoSource): Ditto. * Source/WebCore/platform/mediastream/cocoa/DisplayCaptureSourceCocoa.cpp: (WebCore::DisplayCaptureSourceCocoa::create): Ditto. (WebCore::DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa): Ditto. * Source/WebCore/platform/mediastream/cocoa/DisplayCaptureSourceCocoa.h: * Source/WebCore/platform/mediastream/ios/CoreAudioCaptureSourceIOS.h: * Source/WebCore/platform/mediastream/ios/CoreAudioCaptureSourceIOS.mm: (WebCore::CoreAudioCaptureSourceFactoryIOS::createAudioCaptureSource): Ditto. * Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm: (WebCore::AVCaptureDeviceManager::updateCachedAVCaptureDevices): (WebCore::toCaptureDevice): Make Continuity Camera ephemeral when it is not the system preferred camera. (WebCore::AVCaptureDeviceManager::retrieveCaptureDevices): * Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h: * Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm: (WebCore::AVVideoCaptureSource::create): Update for RealtimeMediaSource constructor changes. (WebCore::AVVideoCaptureSource::AVVideoCaptureSource): Ditto. * Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp: (WebCore::CoreAudioCaptureSource::create): Ditto. (WebCore::CoreAudioCaptureSource::createForTesting): Ditto. (WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource): Ditto. * Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h: (WebCore::CoreAudioCaptureSourceFactory::createAudioCaptureSource): * Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.mm: (WebCore::MockRealtimeAudioSource::create): Ditto. * Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h: * Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm: (WebCore::MockRealtimeVideoSource::create): Ditto. (WebCore::MockRealtimeVideoSourceMac::createForMockDisplayCapturer): Ditto. (WebCore::MockRealtimeVideoSourceMac::MockRealtimeVideoSourceMac): Ditto. * Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: * Source/WebCore/platform/mock/MockMediaDevice.h: (WebCore::MockMediaDevice::captureDevice const): Allow to be ephemeral . (WebCore::MockMediaDevice::encode const): (WebCore::MockMediaDevice::decodeMockMediaDevice): (WebCore::MockMediaDevice::decode): * Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp: (WebCore::MockRealtimeAudioSource::create): Update for RealtimeMediaSource constructor changes. (WebCore::MockRealtimeAudioSource::MockRealtimeAudioSource): Ditto. * Source/WebCore/platform/mock/MockRealtimeAudioSource.h: * Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp: (WebCore::defaultDevices): No devices are ephemeral by default. (WebCore::MockDisplayCapturer::MockDisplayCapturer): Update for RealtimeMediaSource constructor changes. (WebCore::MockRealtimeMediaSourceCenter::setDeviceIsEphemeral): * Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h: * Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp: (WebCore::MockRealtimeVideoSource::create): Ditto. (WebCore::MockRealtimeVideoSource::MockRealtimeVideoSource): Ditto. * Source/WebCore/platform/mock/MockRealtimeVideoSource.h: * Source/WebKit/GPUProcess/GPUProcess.cpp: (WebKit::GPUProcess::setMockMediaDeviceIsEphemeral): Added for testing. * Source/WebKit/GPUProcess/GPUProcess.h: * Source/WebKit/GPUProcess/GPUProcess.messages.in: * Source/WebKit/UIProcess/API/C/WKMockMediaDevice.cpp: (WKAddMockMediaDevice): (WKSetMockMediaDeviceIsEphemeral): * Source/WebKit/UIProcess/API/C/WKMockMediaDevice.h: * Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: (WebKit::UserMediaCaptureManagerProxy::createMicrophoneSource): (WebKit::UserMediaCaptureManagerProxy::createCameraSource): (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints): * Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h: * Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in: * Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp: (WebKit::GPUProcessProxy::setMockMediaDeviceIsEphemeral): * Source/WebKit/UIProcess/GPU/GPUProcessProxy.h: * Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.cpp: (WebKit::SpeechRecognitionRemoteRealtimeMediaSource::SpeechRecognitionRemoteRealtimeMediaSource): (): Deleted. * Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp: (WebKit::UserMediaPermissionRequestManagerProxy::finishGrantingRequest): Take MediaDeviceHashSalts for hash salts. (WebKit::UserMediaPermissionRequestManagerProxy::didCommitLoadForFrame): Clear ephemeral salt for a frame. (WebKit::UserMediaPermissionRequestManagerProxy::resetAccess): Ditto. (WebKit::UserMediaPermissionRequestManagerProxy::ephemeralDeviceHashSaltForFrame): Calculate or lookup an ephemeral salt for a frame. (WebKit::UserMediaPermissionRequestManagerProxy::processUserMediaPermissionRequest): Use MediaDeviceHashSalts. (WebKit::UserMediaPermissionRequestManagerProxy::platformValidateUserMediaRequestConstraints): Ditto. (WebKit::UserMediaPermissionRequestManagerProxy::processUserMediaPermissionValidRequest): Ditto. (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): Ditto. * Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h: * Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h: (WebKit::UserMediaPermissionRequestProxy::setDeviceIdentifierHashSalts): *HashSalt -> *HashSalts (WebKit::UserMediaPermissionRequestProxy::deviceIdentifierHashSalts const): Ditto (WebKit::UserMediaPermissionRequestProxy::setDeviceIdentifierHashSalt): Deleted. (WebKit::UserMediaPermissionRequestProxy::deviceIdentifierHashSalt const): Deleted. * Source/WebKit/UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::didCommitLoadForFrame): Let UserMediaPermissionRequestManager know the frame has reloaded so it can clear the ephemeral salt ID. (WebKit::WebPageProxy::enumerateMediaDevicesForFrame): * Source/WebKit/UIProcess/WebPageProxy.h: * Source/WebKit/UIProcess/WebPageProxy.messages.in: * Source/WebKit/UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::setMockMediaDeviceIsEphemeral): * Source/WebKit/UIProcess/WebProcessPool.h: * Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): (WebKit::UserMediaPermissionRequestManager::enumerateMediaDevices): * Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h: * Source/WebKit/WebProcess/WebCoreSupport/WebUserMediaClient.cpp: (WebKit::WebUserMediaClient::enumerateMediaDevices): * Source/WebKit/WebProcess/WebCoreSupport/WebUserMediaClient.h: * Source/WebKit/WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::userMediaAccessWasGranted): * Source/WebKit/WebProcess/WebPage/WebPage.h: * Source/WebKit/WebProcess/WebPage/WebPage.messages.in: * Source/WebKit/WebProcess/WebProcess.cpp: (WebKit::WebProcess::setMockMediaDeviceIsEphemeral): * Source/WebKit/WebProcess/WebProcess.h: * Source/WebKit/WebProcess/WebProcess.messages.in: * Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.cpp: (WebKit::RemoteRealtimeAudioSource::create): Update for RealtimeMediaSource constructor change. (WebKit::RemoteRealtimeAudioSource::RemoteRealtimeAudioSource): Ditto. * Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h: * Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.cpp: (WebKit::RemoteRealtimeMediaSource::RemoteRealtimeMediaSource): Ditto. (WebKit::RemoteRealtimeMediaSource::createRemoteMediaSource): Ditto. (WebKit::toSourceType): Deleted. (WebKit::m_manager): Deleted. * Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h: * Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp: (WebKit::RemoteRealtimeMediaSourceProxy::createRemoteMediaSource): Ditto. * Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h: * Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp: (WebKit::RemoteRealtimeVideoSource::create): Ditto. (WebKit::RemoteRealtimeVideoSource::RemoteRealtimeVideoSource): Ditto. (WebKit::RemoteRealtimeVideoSource::clone): Ditto. * Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h: * Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::AudioFactory::createAudioCaptureSource): Ditto. (WebKit::UserMediaCaptureManager::VideoFactory::createVideoCaptureSource): Ditto. (WebKit::UserMediaCaptureManager::DisplayFactory::createDisplayCaptureSource): Ditto. * Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h: * Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: Add setMockMediaDeviceIsEphemeral. * Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp: (WTR::TestRunner::setMockMediaDeviceIsEphemeral): * Tools/WebKitTestRunner/InjectedBundle/TestRunner.h: * Tools/WebKitTestRunner/TestController.cpp: (WTR::TestController::setMockMediaDeviceIsEphemeral): * Tools/WebKitTestRunner/TestController.h: * Tools/WebKitTestRunner/TestInvocation.cpp: (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle): Canonical link: https://commits.webkit.org/256161@main
- Loading branch information