Changeset 207463 in webkit
- Timestamp:
- Oct 18, 2016, 7:53:06 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 3 deleted
- 54 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r207461 r207463 1 2016-10-18 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Resolve constraints and enumerate devices in the UI process 4 https://bugs.webkit.org/show_bug.cgi?id=162147 5 <rdar://problem/28803569> 6 7 Reviewed by Darin Adler. 8 9 * fast/mediastream/getusermedia-expected.txt: Updated. 10 * fast/mediastream/getusermedia.html: Ditto. 11 * fast/mediastream/mock-media-source-expected.txt: Ditto. 12 1 13 2016-10-18 Caitlin Potter <caitp@igalia.com> 2 14 -
trunk/LayoutTests/fast/mediastream/getusermedia-expected.txt
r204516 r207463 29 29 PASS navigator.webkitGetUserMedia({audio:true, video:{width:{exact:11}}}, gotStreamInError, error1); did not throw exception. 30 30 PASS Error callback called. 31 FAIL errorArg.name should be OverConstrainedError. Was DataError. 31 FAIL errorArg.name should be OverconstrainedError. Was Error. 32 PASS errorArg.message is "Invalid constraint" 32 33 PASS navigator.webkitGetUserMedia({audio:{volume:{exact:1}}, video:true}, gotStream5, 0); threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function. 33 34 PASS navigator.webkitGetUserMedia({audio:{volume:{exact:1}}, video:true}, gotStream5, error); did not throw exception. -
trunk/LayoutTests/fast/mediastream/getusermedia.html
r204516 r207463 45 45 errorArg = e; 46 46 testPassed('Error callback called.'); 47 shouldBeEqualToString('errorArg.name', 'OverConstrainedError'); 47 shouldBeEqualToString('errorArg.name', 'OverconstrainedError'); 48 shouldBeEqualToString('errorArg.message', 'Invalid constraint'); 48 49 49 50 shouldThrow("navigator.webkitGetUserMedia({audio:{volume:{exact:1}}, video:true}, gotStream5, 0);"); -
trunk/LayoutTests/fast/mediastream/mock-media-source-expected.txt
r201080 r207463 11 11 *** Disable mock capture devices 12 12 internals.setMockMediaCaptureDevicesEnabled(false) 13 PASS mediaDevices.getUserMedia() failed with Not AllowedError13 PASS mediaDevices.getUserMedia() failed with NotReadableError 14 14 15 15 *** Enable mock capture devices -
trunk/Source/WebCore/CMakeLists.txt
r207438 r207463 886 886 Modules/mediastream/MediaDeviceInfo.cpp 887 887 Modules/mediastream/MediaDevices.cpp 888 Modules/mediastream/MediaDevicesEnumerationRequest.cpp 888 889 Modules/mediastream/MediaDevicesRequest.cpp 889 890 Modules/mediastream/MediaEndpointPeerConnection.cpp … … 917 918 Modules/mediastream/SDPProcessor.cpp 918 919 Modules/mediastream/UserMediaController.cpp 919 Modules/mediastream/UserMediaPermissionCheck.cpp920 920 Modules/mediastream/UserMediaRequest.cpp 921 921 -
trunk/Source/WebCore/ChangeLog
r207462 r207463 1 2016-10-18 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Resolve constraints and enumerate devices in the UI process 4 https://bugs.webkit.org/show_bug.cgi?id=162147 5 <rdar://problem/28803569> 6 7 Reviewed by Darin Adler. 8 9 Restructure gUM constraint validation and MediaDevices.enumerateDevices so all media device 10 access happens in the UI process. 11 12 No new tests, updated results of existing tests. 13 14 * CMakeLists.txt: Add MediaDevicesEnumerationRequest.cpp, delete UserMediaPermissionCheck.cpp. 15 16 * Modules/mediastream/MediaConstraintsImpl.cpp: 17 (WebCore::MediaConstraintsImpl::create): Only create from MediaConstraintsData. 18 (WebCore::MediaConstraintsImpl::initialize): Deleted. 19 * Modules/mediastream/MediaConstraintsImpl.h: 20 21 * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: Added. 22 (WebCore::MediaDevicesEnumerationRequest::create): 23 (WebCore::MediaDevicesEnumerationRequest::MediaDevicesEnumerationRequest): 24 (WebCore::MediaDevicesEnumerationRequest::~MediaDevicesEnumerationRequest): 25 (WebCore::MediaDevicesEnumerationRequest::userMediaDocumentOrigin): 26 (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): 27 (WebCore::MediaDevicesEnumerationRequest::contextDestroyed): 28 (WebCore::MediaDevicesEnumerationRequest::start): 29 (WebCore::MediaDevicesEnumerationRequest::cancel): 30 (WebCore::MediaDevicesEnumerationRequest::setDeviceInfo): 31 (WebCore::MediaDevicesEnumerationRequest::finish): 32 * Modules/mediastream/MediaDevicesEnumerationRequest.h: Added. 33 34 * Modules/mediastream/MediaDevicesRequest.cpp: 35 (WebCore::MediaDevicesRequest::~MediaDevicesRequest): Clear the enumeration request. 36 (WebCore::MediaDevicesRequest::contextDestroyed): Ditto. 37 (WebCore::MediaDevicesRequest::start): Create and use a MediaDevicesEnumerationRequest. 38 (WebCore::MediaDevicesRequest::didCompletePermissionCheck): Deleted. 39 * Modules/mediastream/MediaDevicesRequest.h: 40 41 * Modules/mediastream/UserMediaClient.h: 42 * Modules/mediastream/UserMediaController.h: 43 (WebCore::UserMediaController::enumerateMediaDevices): New. 44 (WebCore::UserMediaController::cancelMediaDevicesEnumerationRequest): New. 45 (WebCore::UserMediaController::checkUserMediaPermission): Deleted. 46 (WebCore::UserMediaController::cancelUserMediaPermissionCheck): Deleted. 47 48 * Modules/mediastream/UserMediaPermissionCheck.h: Deleted. 49 * Modules/mediastream/UserMediaPermissionCheck.cpp: Deleted. 50 51 * Modules/mediastream/UserMediaRequest.cpp: 52 (WebCore::UserMediaRequest::UserMediaRequest): 53 (WebCore::UserMediaRequest::start): 54 (WebCore::UserMediaRequest::allow): 55 (WebCore::UserMediaRequest::deny): 56 (WebCore::UserMediaRequest::constraintsValidated): Deleted. 57 (WebCore::UserMediaRequest::userMediaAccessGranted): Deleted. 58 (WebCore::UserMediaRequest::userMediaAccessDenied): Deleted. 59 (WebCore::UserMediaRequest::constraintsInvalid): Deleted. 60 (WebCore::UserMediaRequest::didCreateStream): Deleted. 61 (WebCore::UserMediaRequest::failedToCreateStreamWithConstraintsError): Deleted. 62 (WebCore::UserMediaRequest::failedToCreateStreamWithPermissionError): Deleted. 63 * Modules/mediastream/UserMediaRequest.h: 64 65 * WebCore.xcodeproj/project.pbxproj: Add MediaDevicesEnumerationRequest.*. 66 67 * platform/mediastream/CaptureDevice.h: 68 (WebCore::CaptureDevice::CaptureDevice): 69 (WebCore::CaptureDevice::setPersistentId): Add setter for argument decoder. 70 (WebCore::CaptureDevice::setLabel): Ditto. 71 (WebCore::CaptureDevice::setGroupId): Ditto. 72 (WebCore::CaptureDevice::setKind): Ditto. 73 74 * platform/mediastream/CaptureDeviceManager.h: Remove unnecessary include. 75 76 * platform/mediastream/MediaConstraints.h: 77 (WebCore::MediaConstraint::encode): New. 78 (WebCore::MediaConstraint::decode): Ditto. 79 (WebCore::NumericConstraint::encode): Ditto. 80 (WebCore::NumericConstraint::decode): Ditto. 81 82 * platform/mediastream/MediaStreamCreationClient.h: Deleted. 83 84 * platform/mediastream/RealtimeMediaSourceCenter.h: Use completion handlers instead of client interface. 85 86 * platform/mediastream/mac/AVCaptureDeviceManager.mm: 87 (WebCore::AVCaptureDeviceManager::refreshCaptureDeviceList): Drive-by fix: don't initialize 88 group id, we don't support it. 89 90 * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp: 91 (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints): Update for interface change. 92 (WebCore::RealtimeMediaSourceCenterMac::createMediaStream): Ditto. 93 * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h: 94 95 * platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp: 96 (WebCore::RealtimeMediaSourceCenterOwr::validateRequestConstraints): Ditto. 97 (WebCore::RealtimeMediaSourceCenterOwr::createMediaStream): Ditto. 98 (WebCore::RealtimeMediaSourceCenterOwr::mediaSourcesAvailable): Ditto. 99 * platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h: 100 101 * platform/mock/MockRealtimeMediaSourceCenter.cpp: 102 (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints): Ditto. 103 (WebCore::MockRealtimeMediaSourceCenter::createMediaStream): Ditto. 104 * platform/mock/MockRealtimeMediaSourceCenter.h: 105 1 106 2016-10-18 Zan Dobersek <zdobersek@igalia.com> 2 107 -
trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.cpp
r206445 r207463 1 1 /* 2 2 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 36 37 37 38 #include "ArrayValue.h" 38 #include "Dictionary.h"39 39 #include "ExceptionCode.h" 40 40 #include "Logging.h" 41 41 42 42 namespace WebCore { 43 44 Ref<MediaConstraintsImpl> MediaConstraintsImpl::create()45 {46 return adoptRef(*new MediaConstraintsImpl());47 }48 43 49 44 Ref<MediaConstraintsImpl> MediaConstraintsImpl::create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid) … … 52 47 } 53 48 54 MediaConstraintsImpl::~MediaConstraintsImpl()49 Ref<MediaConstraintsImpl> MediaConstraintsImpl::create(const MediaConstraintsData& data) 55 50 { 51 return adoptRef(*new MediaConstraintsImpl(data)); 56 52 } 57 53 -
trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.h
r206445 r207463 40 40 namespace WebCore { 41 41 42 class ArrayValue; 43 class Dictionary; 42 struct MediaConstraintsData { 43 MediaTrackConstraintSetMap mandatoryConstraints; 44 Vector<MediaTrackConstraintSetMap> advancedConstraints; 45 bool isValid { false }; 46 }; 44 47 45 48 class MediaConstraintsImpl final : public MediaConstraints { 46 49 public: 47 static Ref<MediaConstraintsImpl> create();48 50 static Ref<MediaConstraintsImpl> create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid); 51 WEBCORE_EXPORT static Ref<MediaConstraintsImpl> create(const MediaConstraintsData&); 49 52 50 virtual ~MediaConstraintsImpl(); 53 MediaConstraintsImpl() = default; 54 virtual ~MediaConstraintsImpl() = default; 51 55 52 const MediaTrackConstraintSetMap& mandatoryConstraints() const final { return m_mandatoryConstraints; } 53 const Vector<MediaTrackConstraintSetMap>& advancedConstraints() const final { return m_advancedConstraints; } 54 bool isValid() const final { return m_isValid; } 56 const MediaTrackConstraintSetMap& mandatoryConstraints() const final { return m_data.mandatoryConstraints; } 57 const Vector<MediaTrackConstraintSetMap>& advancedConstraints() const final { return m_data.advancedConstraints; } 58 bool isValid() const final { return m_data.isValid; } 59 const MediaConstraintsData& data() const { return m_data; } 55 60 56 61 private: 57 MediaConstraintsImpl() { }58 62 MediaConstraintsImpl(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid) 59 : m_mandatoryConstraints(WTFMove(mandatoryConstraints)) 60 , m_advancedConstraints(WTFMove(advancedConstraints)) 61 , m_isValid(isValid) 63 : m_data({ WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), isValid }) 64 { 65 } 66 explicit MediaConstraintsImpl(const MediaConstraintsData& data) 67 : m_data(data) 62 68 { 63 69 } 64 70 65 MediaTrackConstraintSetMap m_mandatoryConstraints; 66 Vector<MediaTrackConstraintSetMap> m_advancedConstraints; 67 bool m_isValid; 71 MediaConstraintsData m_data; 68 72 }; 69 73 -
trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp
r205929 r207463 35 35 #include "Frame.h" 36 36 #include "JSMediaDeviceInfo.h" 37 #include " RealtimeMediaSourceCenter.h"37 #include "MediaDevicesEnumerationRequest.h" 38 38 #include "SecurityOrigin.h" 39 39 #include "UserMediaController.h" … … 56 56 MediaDevicesRequest::~MediaDevicesRequest() 57 57 { 58 if (m_ permissionCheck)59 m_ permissionCheck->setClient(nullptr);58 if (m_enumerationRequest) 59 m_enumerationRequest->cancel(); 60 60 } 61 61 … … 70 70 void MediaDevicesRequest::contextDestroyed() 71 71 { 72 if (m_enumerationRequest) { 73 m_enumerationRequest->cancel(); 74 m_enumerationRequest = nullptr; 75 } 72 76 ContextDestructionObserver::contextDestroyed(); 73 if (m_permissionCheck) {74 m_permissionCheck->setClient(nullptr);75 m_permissionCheck = nullptr;76 }77 m_protector = nullptr;78 77 } 79 78 80 79 void MediaDevicesRequest::start() 81 80 { 82 m_protector = this; 83 m_permissionCheck = UserMediaPermissionCheck::create(*downcast<Document>(scriptExecutionContext()), *this); 84 m_permissionCheck->start(); 81 RefPtr<MediaDevicesRequest> protectedThis = this; 82 auto completion = [this, protectedThis = WTFMove(protectedThis)] (const Vector<CaptureDevice>& captureDevices, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess) mutable { 83 84 m_enumerationRequest = nullptr; 85 86 if (!scriptExecutionContext()) 87 return; 88 89 Document& document = downcast<Document>(*scriptExecutionContext()); 90 UserMediaController* controller = UserMediaController::from(document.page()); 91 if (!controller) 92 return; 93 94 m_idHashSalt = deviceIdentifierHashSalt; 95 96 Vector<RefPtr<MediaDeviceInfo>> devices; 97 for (auto& deviceInfo : captureDevices) { 98 auto label = emptyString(); 99 if (originHasPersistentAccess || document.hasHadActiveMediaStreamTrack()) 100 label = deviceInfo.label(); 101 102 auto id = hashID(deviceInfo.persistentId()); 103 if (id.isEmpty()) 104 continue; 105 106 auto groupId = hashID(deviceInfo.groupId()); 107 auto deviceType = deviceInfo.kind() == CaptureDevice::SourceKind::Audio ? MediaDeviceInfo::Kind::Audioinput : MediaDeviceInfo::Kind::Videoinput; 108 devices.append(MediaDeviceInfo::create(scriptExecutionContext(), label, id, groupId, deviceType)); 109 } 110 111 callOnMainThread([protectedThis = makeRef(*this), devices = WTFMove(devices)]() mutable { 112 protectedThis->m_promise.resolve(devices); 113 }); 114 }; 115 116 m_enumerationRequest = MediaDevicesEnumerationRequest::create(*downcast<Document>(scriptExecutionContext()), WTFMove(completion)); 117 m_enumerationRequest->start(); 85 118 } 86 119 … … 117 150 } 118 151 119 void MediaDevicesRequest::didCompletePermissionCheck(const String& salt, bool canAccess)120 {121 m_permissionCheck->setClient(nullptr);122 m_permissionCheck = nullptr;123 124 m_idHashSalt = salt;125 m_havePersistentPermission = canAccess;126 127 if (!scriptExecutionContext()) {128 m_protector = nullptr;129 return;130 }131 132 Document& document = downcast<Document>(*scriptExecutionContext());133 UserMediaController* controller = UserMediaController::from(document.page());134 if (!controller) {135 m_protector = nullptr;136 return;137 }138 139 Vector<RefPtr<MediaDeviceInfo>> devices;140 auto captureDevices = RealtimeMediaSourceCenter::singleton().getMediaStreamDevices();141 for (auto& deviceInfo : captureDevices) {142 auto label = emptyString();143 if (m_havePersistentPermission || document.hasHadActiveMediaStreamTrack())144 label = deviceInfo.label();145 146 auto id = hashID(deviceInfo.persistentId());147 if (id.isEmpty())148 continue;149 150 auto groupId = hashID(deviceInfo.groupId());151 auto deviceType = deviceInfo.kind() == CaptureDevice::SourceKind::Audio ? MediaDeviceInfo::Kind::Audioinput : MediaDeviceInfo::Kind::Videoinput;152 devices.append(MediaDeviceInfo::create(scriptExecutionContext(), label, id, groupId, deviceType));153 }154 155 callOnMainThread([protectedThis = makeRef(*this), devices = WTFMove(devices)]() mutable {156 protectedThis->m_promise.resolve(devices);157 });158 m_protector = nullptr;159 }160 161 152 } // namespace WebCore 162 153 -
trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h
r205929 r207463 32 32 #include "ActiveDOMObject.h" 33 33 #include "MediaDevices.h" 34 #include "MediaStreamCreationClient.h"35 #include "UserMediaPermissionCheck.h"36 34 #include <wtf/RefCounted.h> 37 35 #include <wtf/text/WTFString.h> … … 41 39 class Document; 42 40 class Frame; 41 class MediaDevicesEnumerationRequest; 43 42 class SecurityOrigin; 44 43 45 44 typedef int ExceptionCode; 46 45 47 class MediaDevicesRequest : public RefCounted<MediaDevicesRequest>, p ublic UserMediaPermissionCheckClient, publicContextDestructionObserver {46 class MediaDevicesRequest : public RefCounted<MediaDevicesRequest>, private ContextDestructionObserver { 48 47 public: 49 48 static RefPtr<MediaDevicesRequest> create(Document*, MediaDevices::EnumerateDevicesPromise&&, ExceptionCode&); … … 61 60 void contextDestroyed() final; 62 61 63 // UserMediaPermissionCheckClient64 void didCompletePermissionCheck(const String&, bool) final;65 66 62 String hashID(const String&); 67 63 68 64 MediaDevices::EnumerateDevicesPromise m_promise; 69 65 RefPtr<MediaDevicesRequest> m_protector; 70 RefPtr< UserMediaPermissionCheck> m_permissionCheck;66 RefPtr<MediaDevicesEnumerationRequest> m_enumerationRequest; 71 67 72 68 String m_idHashSalt; 73 bool m_havePersistentPermission { false };74 69 }; 75 70 -
trunk/Source/WebCore/Modules/mediastream/UserMediaClient.h
r204239 r207463 1 1 /* 2 2 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 34 35 #if ENABLE(MEDIA_STREAM) 35 36 37 #include <functional> 38 #include <wtf/Vector.h> 39 #include <wtf/text/WTFString.h> 40 36 41 namespace WebCore { 37 42 43 class MediaDevicesEnumerationRequest; 44 class MediaConstraints; 38 45 class Page; 39 class UserMediaPermissionCheck;46 class RealtimeMediaSource; 40 47 class UserMediaRequest; 41 48 … … 47 54 virtual void cancelUserMediaAccessRequest(UserMediaRequest&) = 0; 48 55 49 virtual void checkUserMediaPermission(UserMediaPermissionCheck&) = 0;50 virtual void cancel UserMediaPermissionCheck(UserMediaPermissionCheck&) = 0;56 virtual void enumerateMediaDevices(MediaDevicesEnumerationRequest&) = 0; 57 virtual void cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest&) = 0; 51 58 52 59 protected: -
trunk/Source/WebCore/Modules/mediastream/UserMediaController.h
r193944 r207463 1 1 /* 2 2 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 30 31 #include "Page.h" 31 32 #include "UserMediaClient.h" 32 #include "UserMediaPermissionCheck.h"33 33 #include "UserMediaRequest.h" 34 34 … … 45 45 void cancelUserMediaAccessRequest(UserMediaRequest&); 46 46 47 void checkUserMediaPermission(UserMediaPermissionCheck&);48 void cancel UserMediaPermissionCheck(UserMediaPermissionCheck&);47 void enumerateMediaDevices(MediaDevicesEnumerationRequest&); 48 void cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest&); 49 49 50 50 WEBCORE_EXPORT static const char* supplementName(); … … 65 65 } 66 66 67 inline void UserMediaController:: checkUserMediaPermission(UserMediaPermissionCheck& request)67 inline void UserMediaController::enumerateMediaDevices(MediaDevicesEnumerationRequest& request) 68 68 { 69 m_client-> checkUserMediaPermission(request);69 m_client->enumerateMediaDevices(request); 70 70 } 71 71 72 inline void UserMediaController::cancel UserMediaPermissionCheck(UserMediaPermissionCheck& request)72 inline void UserMediaController::cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest& request) 73 73 { 74 m_client->cancel UserMediaPermissionCheck(request);74 m_client->cancelMediaDevicesEnumerationRequest(request); 75 75 } 76 76 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
r204516 r207463 38 38 #include "UserMediaRequest.h" 39 39 40 #include "Dictionary.h"41 40 #include "Document.h" 42 41 #include "ExceptionCode.h" 43 42 #include "Frame.h" 44 #include "JSMediaDeviceInfo.h"45 43 #include "JSMediaStream.h" 44 #include "JSOverconstrainedError.h" 46 45 #include "MainFrame.h" 47 #include "MediaConstraintsImpl.h"48 46 #include "MediaStream.h" 49 47 #include "MediaStreamPrivate.h" 48 #include "OverconstrainedError.h" 50 49 #include "RealtimeMediaSourceCenter.h" 51 50 #include "SecurityOrigin.h" … … 72 71 } 73 72 74 UserMediaRequest::UserMediaRequest(ScriptExecutionContext* context, UserMediaController* controller, Ref<MediaConstraints >&& audioConstraints, Ref<MediaConstraints>&& videoConstraints, MediaDevices::Promise&& promise)73 UserMediaRequest::UserMediaRequest(ScriptExecutionContext* context, UserMediaController* controller, Ref<MediaConstraintsImpl>&& audioConstraints, Ref<MediaConstraintsImpl>&& videoConstraints, MediaDevices::Promise&& promise) 75 74 : ContextDestructionObserver(context) 76 75 , m_audioConstraints(WTFMove(audioConstraints)) … … 103 102 void UserMediaRequest::start() 104 103 { 105 // 1 - make sure the system is capable of supporting the audio and video constraints. We don't want to ask for 106 // user permission if the constraints can not be suported. 107 RealtimeMediaSourceCenter::singleton().validateRequestConstraints(this, m_audioConstraints, m_videoConstraints); 104 if (m_controller) 105 m_controller->requestUserMediaAccess(*this); 106 else 107 deny(MediaAccessDenialReason::OtherFailure, emptyString()); 108 108 } 109 109 110 void UserMediaRequest:: constraintsValidated(const Vector<RefPtr<RealtimeMediaSource>>& audioTracks, const Vector<RefPtr<RealtimeMediaSource>>& videoTracks)110 void UserMediaRequest::allow(const String& audioDeviceUID, const String& videoDeviceUID) 111 111 { 112 for (auto& audioTrack : audioTracks) 113 m_audioDeviceUIDs.append(audioTrack->persistentID()); 114 for (auto& videoTrack : videoTracks) 115 m_videoDeviceUIDs.append(videoTrack->persistentID()); 112 m_allowedAudioDeviceUID = audioDeviceUID; 113 m_allowedVideoDeviceUID = videoDeviceUID; 116 114 117 callOnMainThread([protectedThis = makeRef(*this)]() mutable { 118 // 2 - The constraints are valid, ask the user for access to media. 119 if (UserMediaController* controller = protectedThis->m_controller) 120 controller->requestUserMediaAccess(protectedThis.get()); 121 }); 115 RefPtr<UserMediaRequest> protectedThis = this; 116 RealtimeMediaSourceCenter::NewMediaStreamHandler callback = [this, protectedThis = WTFMove(protectedThis)](RefPtr<MediaStreamPrivate>&& privateStream) mutable { 117 if (!m_scriptExecutionContext) 118 return; 119 120 if (!privateStream) { 121 deny(MediaAccessDenialReason::HardwareError, emptyString()); 122 return; 123 } 124 125 auto stream = MediaStream::create(*m_scriptExecutionContext, WTFMove(privateStream)); 126 if (stream->getTracks().isEmpty()) { 127 deny(MediaAccessDenialReason::HardwareError, emptyString()); 128 return; 129 } 130 131 for (auto& track : stream->getAudioTracks()) { 132 track->applyConstraints(m_audioConstraints); 133 track->source().startProducingData(); 134 } 135 136 for (auto& track : stream->getVideoTracks()) { 137 track->applyConstraints(m_videoConstraints); 138 track->source().startProducingData(); 139 } 140 141 m_promise.resolve(stream); 142 }; 143 144 RealtimeMediaSourceCenter::singleton().createMediaStream(WTFMove(callback), m_allowedAudioDeviceUID, m_allowedVideoDeviceUID); 122 145 } 123 146 124 void UserMediaRequest::userMediaAccessGranted(const String& audioDeviceUID, const String& videoDeviceUID) 125 { 126 m_allowedVideoDeviceUID = videoDeviceUID; 127 m_audioDeviceUIDAllowed = audioDeviceUID; 128 129 callOnMainThread([protectedThis = makeRef(*this), audioDeviceUID, videoDeviceUID]() mutable { 130 // 3 - the user granted access, ask platform to create the media stream descriptors. 131 RealtimeMediaSourceCenter::singleton().createMediaStream(protectedThis.ptr(), audioDeviceUID, videoDeviceUID); 132 }); 133 } 134 135 void UserMediaRequest::userMediaAccessDenied() 136 { 137 failedToCreateStreamWithPermissionError(); 138 } 139 140 void UserMediaRequest::constraintsInvalid(const String& constraintName) 141 { 142 failedToCreateStreamWithConstraintsError(constraintName); 143 } 144 145 void UserMediaRequest::didCreateStream(RefPtr<MediaStreamPrivate>&& privateStream) 147 void UserMediaRequest::deny(MediaAccessDenialReason reason, const String& invalidConstraint) 146 148 { 147 149 if (!m_scriptExecutionContext) 148 150 return; 149 151 150 // 4 - Create the MediaStream and pass it to the success callback. 151 Ref<MediaStream> stream = MediaStream::create(*m_scriptExecutionContext, WTFMove(privateStream)); 152 153 for (auto& track : stream->getAudioTracks()) { 154 track->applyConstraints(m_audioConstraints); 155 track->source().startProducingData(); 152 switch (reason) { 153 case MediaAccessDenialReason::NoConstraints: 154 m_promise.reject(TypeError); 155 break; 156 case MediaAccessDenialReason::UserMediaDisabled: 157 m_promise.reject(SECURITY_ERR); 158 break; 159 case MediaAccessDenialReason::NoCaptureDevices: 160 m_promise.reject(NOT_FOUND_ERR); 161 break; 162 case MediaAccessDenialReason::InvalidConstraint: 163 m_promise.reject(OverconstrainedError::create(invalidConstraint, ASCIILiteral("Invalid constraint")).get()); 164 break; 165 case MediaAccessDenialReason::HardwareError: 166 m_promise.reject(NotReadableError); 167 break; 168 case MediaAccessDenialReason::OtherFailure: 169 m_promise.reject(ABORT_ERR); 170 break; 171 case MediaAccessDenialReason::PermissionDenied: 172 m_promise.reject(NotAllowedError); 173 break; 156 174 } 157 158 for (auto& track : stream->getVideoTracks()) {159 track->applyConstraints(m_videoConstraints);160 track->source().startProducingData();161 }162 163 m_promise.resolve(stream);164 }165 166 void UserMediaRequest::failedToCreateStreamWithConstraintsError(const String& constraintName)167 {168 UNUSED_PARAM(constraintName);169 ASSERT(!constraintName.isEmpty());170 if (!m_scriptExecutionContext)171 return;172 173 // FIXME: The promise should be rejected with an OverconstrainedError, https://bugs.webkit.org/show_bug.cgi?id=157839.174 m_promise.reject(DataError);175 }176 177 void UserMediaRequest::failedToCreateStreamWithPermissionError()178 {179 if (!m_scriptExecutionContext)180 return;181 182 m_promise.reject(NotAllowedError);183 175 } 184 176 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h
r204516 r207463 37 37 38 38 #include "ActiveDOMObject.h" 39 #include "Document.h" 40 #include "MediaConstraintsImpl.h" 39 41 #include "MediaDevices.h" 40 #include "MediaStreamCreationClient.h"41 42 #include <wtf/RefCounted.h> 42 43 #include <wtf/text/WTFString.h> … … 54 55 typedef int ExceptionCode; 55 56 56 class UserMediaRequest : public MediaStreamCreationClient, publicContextDestructionObserver {57 class UserMediaRequest : public RefCounted<UserMediaRequest>, private ContextDestructionObserver { 57 58 public: 58 59 static void start(Document*, Ref<MediaConstraintsImpl>&& audioConstraints, Ref<MediaConstraintsImpl>&& videoConstraints, MediaDevices::Promise&&, ExceptionCode&); … … 60 61 ~UserMediaRequest(); 61 62 62 WEBCORE_EXPORT SecurityOrigin* userMediaDocumentOrigin() const; 63 WEBCORE_EXPORT SecurityOrigin* topLevelDocumentOrigin() const; 63 void start(); 64 64 65 void start(); 66 WEBCORE_EXPORT void userMediaAccessGranted(const String& audioDeviceUID, const String& videoDeviceUID); 67 WEBCORE_EXPORT void userMediaAccessDenied(); 65 WEBCORE_EXPORT void setAllowedMediaDeviceUIDs(const String& audioDeviceUID, const String& videoDeviceUID); 66 WEBCORE_EXPORT void allow(const String& audioDeviceUID, const String& videoDeviceUID); 67 68 enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, OtherFailure }; 69 WEBCORE_EXPORT void deny(MediaAccessDenialReason, const String& invalidConstraint); 68 70 69 71 const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; } 70 72 const Vector<String>& videoDeviceUIDs() const { return m_videoDeviceUIDs; } 71 73 72 const String& allowedAudioDeviceUID() const { return m_audioDeviceUIDAllowed; } 74 const MediaConstraintsImpl& audioConstraints() const { return m_audioConstraints; } 75 const MediaConstraintsImpl& videoConstraints() const { return m_videoConstraints; } 76 77 const String& allowedAudioDeviceUID() const { return m_allowedAudioDeviceUID; } 73 78 const String& allowedVideoDeviceUID() const { return m_allowedVideoDeviceUID; } 74 79 80 WEBCORE_EXPORT SecurityOrigin* userMediaDocumentOrigin() const; 81 WEBCORE_EXPORT SecurityOrigin* topLevelDocumentOrigin() const; 82 WEBCORE_EXPORT Document* document() const { return downcast<Document>(scriptExecutionContext()); } 83 75 84 private: 76 UserMediaRequest(ScriptExecutionContext*, UserMediaController*, Ref<MediaConstraints>&& audioConstraints, Ref<MediaConstraints>&& videoConstraints, MediaDevices::Promise&&); 77 78 // MediaStreamCreationClient 79 void constraintsValidated(const Vector<RefPtr<RealtimeMediaSource>>& audioTracks, const Vector<RefPtr<RealtimeMediaSource>>& videoTracks) final; 80 void constraintsInvalid(const String& constraintName) final; 81 void didCreateStream(RefPtr<MediaStreamPrivate>&&) final; 82 void failedToCreateStreamWithConstraintsError(const String& constraintName) final; 83 void failedToCreateStreamWithPermissionError() final; 85 UserMediaRequest(ScriptExecutionContext*, UserMediaController*, Ref<MediaConstraintsImpl>&& audioConstraints, Ref<MediaConstraintsImpl>&& videoConstraints, MediaDevices::Promise&&); 84 86 85 87 // ContextDestructionObserver 86 88 void contextDestroyed() final; 87 89 88 Ref<MediaConstraints > m_audioConstraints;89 Ref<MediaConstraints > m_videoConstraints;90 Ref<MediaConstraintsImpl> m_audioConstraints; 91 Ref<MediaConstraintsImpl> m_videoConstraints; 90 92 91 93 Vector<String> m_videoDeviceUIDs; … … 93 95 94 96 String m_allowedVideoDeviceUID; 95 String m_a udioDeviceUIDAllowed;97 String m_allowedAudioDeviceUID; 96 98 97 99 UserMediaController* m_controller; 98 100 MediaDevices::Promise m_promise; 101 RefPtr<UserMediaRequest> m_protector; 99 102 }; 100 103 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r207462 r207463 137 137 07277E5417D018CC0015534D /* JSMediaStreamTrackEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07277E4817D018CC0015534D /* JSMediaStreamTrackEvent.cpp */; }; 138 138 07277E5517D018CC0015534D /* JSMediaStreamTrackEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 07277E4917D018CC0015534D /* JSMediaStreamTrackEvent.h */; }; 139 07297FA71C1881C5003F0735 /* UserMediaPermissionCheck.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07297FA51C1881C5003F0735 /* UserMediaPermissionCheck.cpp */; };140 07297FA81C1881C5003F0735 /* UserMediaPermissionCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 07297FA61C1881C5003F0735 /* UserMediaPermissionCheck.h */; settings = {ATTRIBUTES = (Private, ); }; };141 139 072A70401D6E8F6200DF0AFC /* OverconstrainedErrorEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 072A703E1D6E8F6200DF0AFC /* OverconstrainedErrorEvent.h */; }; 142 140 072A70431D7396B300DF0AFC /* JSMediaDevicesCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = 072A70421D7396B200DF0AFC /* JSMediaDevicesCustom.h */; }; … … 236 234 078E093017D14D1C00420AA1 /* UserMediaRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221B9117CEC32700848E51 /* UserMediaRequest.h */; settings = {ATTRIBUTES = (Private, ); }; }; 237 235 078E093717D16B2C00420AA1 /* MediaStreamPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221B9D17CF0AD400848E51 /* MediaStreamPrivate.h */; }; 238 078E093917D16B2C00420AA1 /* MediaStreamCreationClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BA017CF0AD400848E51 /* MediaStreamCreationClient.h */; settings = {ATTRIBUTES = (Private, ); }; };239 236 078E093A17D16E1C00420AA1 /* MediaConstraints.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221B9917CF0AD400848E51 /* MediaConstraints.h */; settings = {ATTRIBUTES = (Private, ); }; }; 240 237 078E093C17D16E1C00420AA1 /* RTCDataChannelHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BA217CF0AD400848E51 /* RTCDataChannelHandler.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 291 288 07AB996F18DA3C740018771E /* RTCConfigurationPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996D18DA3C740018771E /* RTCConfigurationPrivate.h */; }; 292 289 07AB997018DA3C740018771E /* RTCIceServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996E18DA3C740018771E /* RTCIceServerPrivate.h */; }; 290 07ABEF6C1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07ABEF6B1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp */; }; 291 07ABEF6E1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07ABEF6D1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h */; settings = {ATTRIBUTES = (Private, ); }; }; 293 292 07AC47011952102100EE9723 /* ISOVTTCue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */; }; 294 293 07AC47021952102100EE9723 /* ISOVTTCue.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AC47001952102100EE9723 /* ISOVTTCue.h */; }; … … 300 299 07B5A2DC1464320A00A81ECE /* JSTextTrackList.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B5A2DA1464320A00A81ECE /* JSTextTrackList.h */; }; 301 300 07B5A30D14687D7100A81ECE /* JSTextTrackListCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B5A30C14687D7100A81ECE /* JSTextTrackListCustom.cpp */; }; 302 07B7116D1D899E63009F0FFB /* CaptureDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B7116A1D899E63009F0FFB /* CaptureDevice.h */; };301 07B7116D1D899E63009F0FFB /* CaptureDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B7116A1D899E63009F0FFB /* CaptureDevice.h */; settings = {ATTRIBUTES = (Private, ); }; }; 303 302 07B7116E1D899E63009F0FFB /* CaptureDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B7116B1D899E63009F0FFB /* CaptureDeviceManager.cpp */; }; 304 303 07B7116F1D899E63009F0FFB /* CaptureDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B7116C1D899E63009F0FFB /* CaptureDeviceManager.h */; }; … … 1889 1888 4A0DA2FF129B241900AB61E1 /* FormAssociatedElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A0DA2FD129B241900AB61E1 /* FormAssociatedElement.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1890 1889 4A0FFA9D1AAF5E750062803B /* MockRealtimeMediaSourceCenter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A0FFA9B1AAF5E6C0062803B /* MockRealtimeMediaSourceCenter.cpp */; }; 1891 4A0FFA9E1AAF5E7E0062803B /* MockRealtimeMediaSourceCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A0FFA9C1AAF5E6C0062803B /* MockRealtimeMediaSourceCenter.h */; };1890 4A0FFA9E1AAF5E7E0062803B /* MockRealtimeMediaSourceCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A0FFA9C1AAF5E6C0062803B /* MockRealtimeMediaSourceCenter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1892 1891 4A0FFAA11AAF5EA20062803B /* RealtimeMediaSourceCenter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A0FFA9F1AAF5EA20062803B /* RealtimeMediaSourceCenter.cpp */; }; 1893 1892 4A0FFAA21AAF5EA20062803B /* RealtimeMediaSourceCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A0FFAA01AAF5EA20062803B /* RealtimeMediaSourceCenter.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 6991 6990 07221B9917CF0AD400848E51 /* MediaConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaConstraints.h; sourceTree = "<group>"; }; 6992 6991 07221B9D17CF0AD400848E51 /* MediaStreamPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamPrivate.h; sourceTree = "<group>"; }; 6993 07221BA017CF0AD400848E51 /* MediaStreamCreationClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamCreationClient.h; sourceTree = "<group>"; };6994 6992 07221BA217CF0AD400848E51 /* RTCDataChannelHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDataChannelHandler.h; sourceTree = "<group>"; }; 6995 6993 07221BA317CF0AD400848E51 /* RTCDataChannelHandlerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDataChannelHandlerClient.h; sourceTree = "<group>"; }; … … 7018 7016 07277E4917D018CC0015534D /* JSMediaStreamTrackEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSMediaStreamTrackEvent.h; sourceTree = "<group>"; }; 7019 7017 072847E216EBC5B00043CFA4 /* PlatformTextTrack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformTextTrack.h; sourceTree = "<group>"; }; 7020 07297FA51C1881C5003F0735 /* UserMediaPermissionCheck.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMediaPermissionCheck.cpp; sourceTree = "<group>"; };7021 07297FA61C1881C5003F0735 /* UserMediaPermissionCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMediaPermissionCheck.h; sourceTree = "<group>"; };7022 7018 072A703E1D6E8F6200DF0AFC /* OverconstrainedErrorEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverconstrainedErrorEvent.h; sourceTree = "<group>"; }; 7023 7019 072A703F1D6E8F6200DF0AFC /* OverconstrainedErrorEvent.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = OverconstrainedErrorEvent.idl; sourceTree = "<group>"; }; … … 7128 7124 07AB996D18DA3C740018771E /* RTCConfigurationPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCConfigurationPrivate.h; sourceTree = "<group>"; }; 7129 7125 07AB996E18DA3C740018771E /* RTCIceServerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCIceServerPrivate.h; sourceTree = "<group>"; }; 7126 07ABEF6B1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaDevicesEnumerationRequest.cpp; sourceTree = "<group>"; }; 7127 07ABEF6D1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaDevicesEnumerationRequest.h; sourceTree = "<group>"; }; 7130 7128 07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ISOVTTCue.cpp; sourceTree = "<group>"; }; 7131 7129 07AC47001952102100EE9723 /* ISOVTTCue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISOVTTCue.h; sourceTree = "<group>"; }; … … 14695 14693 5EA725CE1ACABCD900EAD17B /* MediaDevices.h */, 14696 14694 5EA725CF1ACABCD900EAD17B /* MediaDevices.idl */, 14695 07ABEF6B1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp */, 14696 07ABEF6D1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h */, 14697 14697 07394EC71BAB2CCD00BE99CD /* MediaDevicesRequest.cpp */, 14698 14698 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */, … … 14797 14797 07221B8E17CEC32700848E51 /* UserMediaController.cpp */, 14798 14798 07221B8F17CEC32700848E51 /* UserMediaController.h */, 14799 07297FA51C1881C5003F0735 /* UserMediaPermissionCheck.cpp */,14800 07297FA61C1881C5003F0735 /* UserMediaPermissionCheck.h */,14801 14799 07221B9017CEC32700848E51 /* UserMediaRequest.cpp */, 14802 14800 07221B9117CEC32700848E51 /* UserMediaRequest.h */, … … 14823 14821 5EBB892F1C7777D000C65D41 /* MediaPayload.h */, 14824 14822 070F549717F12F6B00169E04 /* MediaStreamConstraintsValidationClient.h */, 14825 07221BA017CF0AD400848E51 /* MediaStreamCreationClient.h */,14826 14823 0711588F17DF633700EDFE2B /* MediaStreamPrivate.cpp */, 14827 14824 07221B9D17CF0AD400848E51 /* MediaStreamPrivate.h */, … … 25502 25499 2E37E00612DBC5A400A6B233 /* JSDOMURL.h in Headers */, 25503 25500 BC6932740D7E293900AE44D1 /* JSDOMWindowBase.h in Headers */, 25501 07ABEF6E1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h in Headers */, 25504 25502 652FBBBC0DE27CB60001D386 /* JSDOMWindowCustom.h in Headers */, 25505 25503 460CBF361D4BCD0E0092E88E /* JSDOMWindowProperties.h in Headers */, … … 26170 26168 FD671A78159BB07000197559 /* MediaStreamAudioSourceNode.h in Headers */, 26171 26169 070F549817F12F6B00169E04 /* MediaStreamConstraintsValidationClient.h in Headers */, 26172 078E093917D16B2C00420AA1 /* MediaStreamCreationClient.h in Headers */,26173 26170 078E091617D14D1C00420AA1 /* MediaStreamEvent.h in Headers */, 26174 26171 078E093717D16B2C00420AA1 /* MediaStreamPrivate.h in Headers */, … … 27417 27414 078E092E17D14D1C00420AA1 /* UserMediaClient.h in Headers */, 27418 27415 078E092F17D14D1C00420AA1 /* UserMediaController.h in Headers */, 27419 07297FA81C1881C5003F0735 /* UserMediaPermissionCheck.h in Headers */,27420 27416 078E093017D14D1C00420AA1 /* UserMediaRequest.h in Headers */, 27421 27417 7C3B79721908757B00B47A2D /* UserMessageHandler.h in Headers */, … … 29868 29864 159AE82B1B3A402F0037478B /* MediaDeviceInfo.cpp in Sources */, 29869 29865 5EA725D21ACABD4700EAD17B /* MediaDevices.cpp in Sources */, 29866 07ABEF6C1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp in Sources */, 29870 29867 07394EC81BAB2CCD00BE99CD /* MediaDevicesRequest.cpp in Sources */, 29871 29868 97205AB71239291000B17380 /* MediaDocument.cpp in Sources */, … … 30881 30878 9920398218B95BC600B39AF9 /* UserInputBridge.cpp in Sources */, 30882 30879 078E091217D14CEE00420AA1 /* UserMediaController.cpp in Sources */, 30883 07297FA71C1881C5003F0735 /* UserMediaPermissionCheck.cpp in Sources */,30884 30880 078E091317D14CEE00420AA1 /* UserMediaRequest.cpp in Sources */, 30885 30881 7C3B79711908757B00B47A2D /* UserMessageHandler.cpp in Sources */, -
trunk/Source/WebCore/platform/mediastream/CaptureDevice.h
r205929 r207463 28 28 #if ENABLE(MEDIA_STREAM) 29 29 30 #include <RealtimeMediaSource.h>31 30 #include <wtf/text/WTFString.h> 32 31 … … 35 34 class CaptureDevice { 36 35 public: 37 enum class SourceKind { Audio, Video };36 enum class SourceKind { Unknown, Audio, Video }; 38 37 39 38 CaptureDevice(const String& persistentId, SourceKind kind, const String& label, const String& groupId) … … 45 44 } 46 45 46 CaptureDevice() = default; 47 47 48 const String& persistentId() const { return m_persistentId; } 49 void setPersistentId(const String& id) { m_persistentId = id; } 50 48 51 const String& label() const { return m_label; } 52 void setLabel(const String& label) { m_label = label; } 53 49 54 const String& groupId() const { return m_groupId; } 55 void setGroupId(const String& id) { m_groupId = id; } 56 50 57 SourceKind kind() const { return m_kind; } 58 void setKind(SourceKind kind) { m_kind = kind; } 51 59 52 60 private: 53 61 String m_persistentId; 54 SourceKind m_kind ;62 SourceKind m_kind { SourceKind::Unknown }; 55 63 String m_label; 56 64 String m_groupId; -
trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h
r205929 r207463 29 29 30 30 #include "CaptureDevice.h" 31 #include "RealtimeMediaSource.h" 31 32 32 33 namespace WebCore { -
trunk/Source/WebCore/platform/mediastream/MediaConstraints.cpp
r206445 r207463 39 39 namespace WebCore { 40 40 41 bool BooleanConstraint::getExact(bool& exact) const42 {43 if (!m_exact)44 return false;45 46 exact = m_exact.value();47 return true;48 }49 50 bool BooleanConstraint::getIdeal(bool& ideal) const51 {52 if (!m_ideal)53 return false;54 55 ideal = m_ideal.value();56 return true;57 }58 59 void StringConstraint::setExact(const String& value)60 {61 m_exact.clear();62 m_exact.append(value);63 }64 65 void StringConstraint::appendExact(const String& value)66 {67 m_exact.clear();68 m_exact.append(value);69 }70 71 void StringConstraint::setIdeal(const String& value)72 {73 m_ideal.clear();74 m_ideal.append(value);75 }76 77 void StringConstraint::appendIdeal(const String& value)78 {79 m_ideal.append(value);80 }81 82 bool StringConstraint::getExact(Vector<String>& exact) const83 {84 if (!m_exact.isEmpty())85 return false;86 87 exact = m_exact;88 return true;89 }90 91 bool StringConstraint::getIdeal(Vector<String>& ideal) const92 {93 if (!m_ideal.isEmpty())94 return false;95 96 ideal = m_ideal;97 return true;98 }99 100 41 const String& StringConstraint::find(std::function<bool(const String&)> filter) const 101 42 { … … 154 95 const StringConstraint& typedOther = downcast<StringConstraint>(other); 155 96 156 if ( other.isEmpty())97 if (typedOther.isEmpty()) 157 98 return; 158 99 … … 230 171 231 172 m_variants.append(ConstraintHolder::create(constraint)); 232 233 173 } 234 174 235 175 void MediaTrackConstraintSetMap::forEach(std::function<void(const MediaConstraint&)> callback) const 236 176 { 237 if (m_width && !m_width->isEmpty()) 238 callback(*m_width); 239 if (m_height && !m_height->isEmpty()) 240 callback(*m_height); 241 if (m_sampleRate && !m_sampleRate->isEmpty()) 242 callback(*m_sampleRate); 243 if (m_sampleSize && !m_sampleSize->isEmpty()) 244 callback(*m_sampleSize); 245 246 if (m_aspectRatio && !m_aspectRatio->isEmpty()) 247 callback(*m_aspectRatio); 248 if (m_frameRate && !m_frameRate->isEmpty()) 249 callback(*m_frameRate); 250 if (m_volume && !m_volume->isEmpty()) 251 callback(*m_volume); 252 253 if (m_echoCancellation && !m_echoCancellation->isEmpty()) 254 callback(*m_echoCancellation); 255 256 if (m_facingMode && !m_facingMode->isEmpty()) 257 callback(*m_facingMode); 258 if (m_deviceId && !m_deviceId->isEmpty()) 259 callback(*m_deviceId); 260 if (m_groupId && !m_groupId->isEmpty()) 261 callback(*m_groupId); 177 filter([callback] (const MediaConstraint& constraint) mutable { 178 callback(constraint); 179 return false; 180 }); 262 181 } 263 182 … … 289 208 if (m_groupId && !m_groupId->isEmpty() && callback(*m_groupId)) 290 209 return; 291 }292 293 bool MediaTrackConstraintSetMap::isEmpty() const294 {295 return (!m_width || m_width->isEmpty())296 && (!m_height || m_height->isEmpty())297 && (!m_sampleRate || m_sampleRate->isEmpty())298 && (!m_sampleSize || m_sampleSize->isEmpty())299 && (!m_aspectRatio || m_aspectRatio->isEmpty())300 && (!m_frameRate || m_frameRate->isEmpty())301 && (!m_volume || m_volume->isEmpty())302 && (!m_echoCancellation || m_echoCancellation->isEmpty())303 && (!m_facingMode || m_facingMode->isEmpty())304 && (!m_deviceId || m_deviceId->isEmpty())305 && (!m_groupId || m_groupId->isEmpty());306 210 } 307 211 … … 412 316 } 413 317 318 size_t MediaTrackConstraintSetMap::size() const 319 { 320 size_t count = 0; 321 forEach([&count] (const MediaConstraint&) mutable { 322 ++count; 323 }); 324 325 return count; 326 } 327 328 bool MediaTrackConstraintSetMap::isEmpty() const 329 { 330 return !size(); 331 } 332 414 333 } 415 334 -
trunk/Source/WebCore/platform/mediastream/MediaConstraints.h
r206445 r207463 49 49 enum class DataType { None, Integer, Double, Boolean, String }; 50 50 51 virtual ~MediaConstraint() { };52 53 virtual bool isEmpty() const { return true; }54 virtual bool isMandatory() const { return false; }55 virtual void merge(const MediaConstraint&) { }56 57 51 bool isInt() const { return m_dataType == DataType::Integer; } 58 52 bool isDouble() const { return m_dataType == DataType::Double; } … … 64 58 const String& name() const { return m_name; } 65 59 60 template <class Encoder> void encode(Encoder& encoder) const 61 { 62 encoder.encodeEnum(m_constraintType); 63 encoder << m_name; 64 encoder.encodeEnum(m_dataType); 65 } 66 67 template <class Decoder> static bool decode(Decoder& decoder, MediaConstraint& constraint) 68 { 69 if (!decoder.decodeEnum(constraint.m_constraintType)) 70 return false; 71 72 if (!decoder.decode(constraint.m_name)) 73 return false; 74 75 if (!decoder.decodeEnum(constraint.m_dataType)) 76 return false; 77 78 return true; 79 } 80 66 81 protected: 67 explicit MediaConstraint(const AtomicString& name, MediaConstraintType constraintType, DataType dataType)82 MediaConstraint(const String& name, MediaConstraintType constraintType, DataType dataType) 68 83 : m_name(name) 69 84 , m_constraintType(constraintType) … … 72 87 } 73 88 89 MediaConstraint() = default; 90 ~MediaConstraint() = default; 74 91 75 92 private: 76 AtomicString m_name;77 MediaConstraintType m_constraintType ;78 DataType m_dataType ;93 String m_name; 94 MediaConstraintType m_constraintType { MediaConstraintType::Unknown }; 95 DataType m_dataType { DataType::None }; 79 96 }; 80 97 … … 213 230 } 214 231 215 bool isEmpty() const override { return !m_min && !m_max && !m_exact && !m_ideal; } 216 bool isMandatory() const override { return m_min || m_max || m_exact; } 232 bool isEmpty() const { return !m_min && !m_max && !m_exact && !m_ideal; } 233 bool isMandatory() const { return m_min || m_max || m_exact; } 234 235 template <class Encoder> void encode(Encoder& encoder) const 236 { 237 MediaConstraint::encode(encoder); 238 239 encoder << m_min; 240 encoder << m_max; 241 encoder << m_exact; 242 encoder << m_ideal; 243 } 244 245 template <class Decoder> static bool decode(Decoder& decoder, NumericConstraint& constraint) 246 { 247 if (!MediaConstraint::decode(decoder, constraint)) 248 return false; 249 250 if (!decoder.decode(constraint.m_min)) 251 return false; 252 if (!decoder.decode(constraint.m_max)) 253 return false; 254 if (!decoder.decode(constraint.m_exact)) 255 return false; 256 if (!decoder.decode(constraint.m_ideal)) 257 return false; 258 259 return true; 260 } 217 261 218 262 protected: 219 explicit NumericConstraint(const AtomicString& name, MediaConstraintType type, DataType dataType)263 NumericConstraint(const String& name, MediaConstraintType type, DataType dataType) 220 264 : MediaConstraint(name, type, dataType) 221 265 { 222 266 } 267 268 NumericConstraint() = default; 223 269 224 270 void innerMerge(const NumericConstraint& other) … … 256 302 class IntConstraint final : public NumericConstraint<int> { 257 303 public: 258 explicit IntConstraint(const AtomicString& name, MediaConstraintType type)304 IntConstraint(const String& name, MediaConstraintType type) 259 305 : NumericConstraint<int>(name, type, DataType::Integer) 260 306 { 261 307 } 262 308 263 void merge(const MediaConstraint& other) final { 309 IntConstraint() = default; 310 311 void merge(const MediaConstraint& other) 312 { 264 313 ASSERT(other.isInt()); 265 314 NumericConstraint::innerMerge(downcast<const IntConstraint>(other)); … … 269 318 class DoubleConstraint final : public NumericConstraint<double> { 270 319 public: 271 explicit DoubleConstraint(const AtomicString& name, MediaConstraintType type)320 DoubleConstraint(const String& name, MediaConstraintType type) 272 321 : NumericConstraint<double>(name, type, DataType::Double) 273 322 { 274 323 } 275 324 276 void merge(const MediaConstraint& other) final { 325 DoubleConstraint() = default; 326 327 void merge(const MediaConstraint& other) 328 { 277 329 ASSERT(other.isDouble()); 278 330 NumericConstraint::innerMerge(downcast<DoubleConstraint>(other)); … … 282 334 class BooleanConstraint final : public MediaConstraint { 283 335 public: 284 explicit BooleanConstraint(const AtomicString& name, MediaConstraintType type)336 BooleanConstraint(const String& name, MediaConstraintType type) 285 337 : MediaConstraint(name, type, DataType::Boolean) 286 338 { 287 339 } 340 341 BooleanConstraint() = default; 288 342 289 343 void setExact(bool value) { m_exact = value; } 290 344 void setIdeal(bool value) { m_ideal = value; } 291 345 292 bool getExact(bool&) const; 293 bool getIdeal(bool&) const; 346 bool getExact(bool& exact) const 347 { 348 if (!m_exact) 349 return false; 350 351 exact = m_exact.value(); 352 return true; 353 } 354 355 bool getIdeal(bool& ideal) const 356 { 357 if (!m_ideal) 358 return false; 359 360 ideal = m_ideal.value(); 361 return true; 362 } 294 363 295 364 double fitnessDistance(bool value) const … … 316 385 } 317 386 318 void merge(const MediaConstraint& other) final { 387 void merge(const MediaConstraint& other) 388 { 319 389 ASSERT(other.isBoolean()); 320 390 const BooleanConstraint& typedOther = downcast<BooleanConstraint>(other); … … 333 403 } 334 404 335 bool isEmpty() const final { return !m_exact && !m_ideal; }; 336 bool isMandatory() const final { return bool(m_exact); } 405 bool isEmpty() const { return !m_exact && !m_ideal; }; 406 bool isMandatory() const { return bool(m_exact); } 407 408 template <class Encoder> void encode(Encoder& encoder) const 409 { 410 MediaConstraint::encode(encoder); 411 encoder << m_exact; 412 encoder << m_ideal; 413 } 414 415 template <class Decoder> static bool decode(Decoder& decoder, BooleanConstraint& constraint) 416 { 417 if (!MediaConstraint::decode(decoder, constraint)) 418 return false; 419 420 if (!decoder.decode(constraint.m_exact)) 421 return false; 422 if (!decoder.decode(constraint.m_ideal)) 423 return false; 424 425 return true; 426 } 337 427 338 428 private: … … 341 431 }; 342 432 343 class StringConstraint final: public MediaConstraint {344 public: 345 explicit StringConstraint(const AtomicString& name, MediaConstraintType type)433 class StringConstraint : public MediaConstraint { 434 public: 435 StringConstraint(const String& name, MediaConstraintType type) 346 436 : MediaConstraint(name, type, DataType::String) 347 437 { 348 438 } 349 439 350 void setExact(const String&); 351 void appendExact(const String&); 352 void setIdeal(const String&); 353 void appendIdeal(const String&); 354 355 bool getExact(Vector<String>&) const; 356 bool getIdeal(Vector<String>&) const; 440 StringConstraint() = default; 441 442 void setExact(const String& value) 443 { 444 m_exact.clear(); 445 m_exact.append(value); 446 } 447 448 void appendExact(const String& value) 449 { 450 m_exact.clear(); 451 m_exact.append(value); 452 } 453 454 void setIdeal(const String& value) 455 { 456 m_ideal.clear(); 457 m_ideal.append(value); 458 } 459 460 void appendIdeal(const String& value) 461 { 462 m_ideal.append(value); 463 } 464 465 bool getExact(Vector<String>& exact) const 466 { 467 if (!m_exact.isEmpty()) 468 return false; 469 470 exact = m_exact; 471 return true; 472 } 473 474 bool getIdeal(Vector<String>& ideal) const 475 { 476 if (!m_ideal.isEmpty()) 477 return false; 478 479 ideal = m_ideal; 480 return true; 481 } 357 482 358 483 double fitnessDistance(const String&) const; … … 360 485 361 486 const String& find(std::function<bool(const String&)>) const; 362 void merge(const MediaConstraint&) final; 363 364 bool isEmpty() const final { return m_exact.isEmpty() && m_ideal.isEmpty(); } 365 bool isMandatory() const final { return !m_exact.isEmpty(); } 487 488 bool isEmpty() const { return m_exact.isEmpty() && m_ideal.isEmpty(); } 489 bool isMandatory() const { return !m_exact.isEmpty(); } 490 WEBCORE_EXPORT void merge(const MediaConstraint&); 491 492 template <class Encoder> void encode(Encoder& encoder) const 493 { 494 MediaConstraint::encode(encoder); 495 496 encoder << m_exact; 497 encoder << m_ideal; 498 } 499 500 template <class Decoder> static bool decode(Decoder& decoder, StringConstraint& constraint) 501 { 502 if (!MediaConstraint::decode(decoder, constraint)) 503 return false; 504 505 if (!decoder.decode(constraint.m_exact)) 506 return false; 507 if (!decoder.decode(constraint.m_ideal)) 508 return false; 509 510 return true; 511 } 366 512 367 513 private: … … 372 518 class UnknownConstraint final : public MediaConstraint { 373 519 public: 374 explicit UnknownConstraint(const AtomicString& name, MediaConstraintType type)520 UnknownConstraint(const String& name, MediaConstraintType type) 375 521 : MediaConstraint(name, type, DataType::None) 376 522 { … … 378 524 379 525 private: 380 bool isEmpty() const final{ return true; }381 bool isMandatory() const final{ return false; }382 void merge(const MediaConstraint&) final{ }526 bool isEmpty() const { return true; } 527 bool isMandatory() const { return false; } 528 void merge(const MediaConstraint&) { } 383 529 }; 384 530 385 531 class MediaTrackConstraintSetMap { 386 532 public: 387 void forEach(std::function<void(const MediaConstraint&)>) const;533 WEBCORE_EXPORT void forEach(std::function<void(const MediaConstraint&)>) const; 388 534 void filter(std::function<bool(const MediaConstraint&)>) const; 389 535 bool isEmpty() const; 390 391 void set(MediaConstraintType, Optional<IntConstraint>&&); 392 void set(MediaConstraintType, Optional<DoubleConstraint>&&); 393 void set(MediaConstraintType, Optional<BooleanConstraint>&&); 394 void set(MediaConstraintType, Optional<StringConstraint>&&); 536 WEBCORE_EXPORT size_t size() const; 537 538 WEBCORE_EXPORT void set(MediaConstraintType, Optional<IntConstraint>&&); 539 WEBCORE_EXPORT void set(MediaConstraintType, Optional<DoubleConstraint>&&); 540 WEBCORE_EXPORT void set(MediaConstraintType, Optional<BooleanConstraint>&&); 541 WEBCORE_EXPORT void set(MediaConstraintType, Optional<StringConstraint>&&); 542 543 template <class Encoder> void encode(Encoder& encoder) const 544 { 545 encoder << m_width; 546 encoder << m_height; 547 encoder << m_sampleRate; 548 encoder << m_sampleSize; 549 550 encoder << m_aspectRatio; 551 encoder << m_frameRate; 552 encoder << m_volume; 553 554 encoder << m_echoCancellation; 555 556 encoder << m_facingMode; 557 encoder << m_deviceId; 558 encoder << m_groupId; 559 } 560 561 template <class Decoder> static bool decode(Decoder& decoder, MediaTrackConstraintSetMap& map) 562 { 563 if (!decoder.decode(map.m_width)) 564 return false; 565 if (!decoder.decode(map.m_height)) 566 return false; 567 if (!decoder.decode(map.m_sampleRate)) 568 return false; 569 if (!decoder.decode(map.m_sampleSize)) 570 return false; 571 572 if (!decoder.decode(map.m_aspectRatio)) 573 return false; 574 if (!decoder.decode(map.m_frameRate)) 575 return false; 576 if (!decoder.decode(map.m_volume)) 577 return false; 578 579 if (!decoder.decode(map.m_echoCancellation)) 580 return false; 581 582 if (!decoder.decode(map.m_facingMode)) 583 return false; 584 if (!decoder.decode(map.m_deviceId)) 585 return false; 586 if (!decoder.decode(map.m_groupId)) 587 return false; 588 589 return true; 590 } 395 591 396 592 private: -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h
r205929 r207463 44 44 class CaptureDevice; 45 45 class MediaConstraints; 46 class MediaStreamCreationClient;47 46 class RealtimeMediaSourceSettings; 48 47 class RealtimeMediaSourceSupportedConstraints; … … 56 55 static void setSharedStreamCenterOverride(RealtimeMediaSourceCenter*); 57 56 58 virtual void validateRequestConstraints(MediaStreamCreationClient*, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) = 0; 57 using ValidConstraintsHandler = std::function<void(const Vector<RefPtr<RealtimeMediaSource>>&& audioTracks, const Vector<RefPtr<RealtimeMediaSource>>&& videoTracks)>; 58 using InvalidConstraintsHandler = std::function<void(const String& invalidConstraint)>; 59 virtual void validateRequestConstraints(ValidConstraintsHandler, InvalidConstraintsHandler, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) = 0; 59 60 60 virtual void createMediaStream(MediaStreamCreationClient*, const String& audioDeviceID, const String& videoDeviceID) = 0; 61 62 virtual void createMediaStream(PassRefPtr<MediaStreamCreationClient>, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) = 0; 61 using NewMediaStreamHandler = std::function<void(RefPtr<MediaStreamPrivate>&&)>; 62 virtual void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID) = 0; 63 63 64 64 virtual Vector<CaptureDevice> getMediaStreamDevices() = 0; -
trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm
r206445 r207463 175 175 captureDevice.m_persistentDeviceID = platformDevice.uniqueID; 176 176 captureDevice.m_enabled = true; 177 captureDevice.m_groupID = createCanonicalUUIDString();178 177 captureDevice.m_localizedName = platformDevice.localizedName; 179 178 if ([platformDevice position] == AVCaptureDevicePositionFront) -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp
r205929 r207463 1 1 /* 2 * Copyright (C) 2013 Apple, Inc. All rights reserved.2 * Copyright (C) 2013-2016 Apple, Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 35 35 36 36 #include "AVCaptureDeviceManager.h" 37 #include "MediaStreamCreationClient.h"38 37 #include "MediaStreamPrivate.h" 39 38 #include <wtf/MainThread.h> … … 67 66 } 68 67 69 void RealtimeMediaSourceCenterMac::validateRequestConstraints( MediaStreamCreationClient* client, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints)68 void RealtimeMediaSourceCenterMac::validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) 70 69 { 71 ASSERT(client);72 73 70 Vector<RefPtr<RealtimeMediaSource>> audioSources; 74 71 Vector<RefPtr<RealtimeMediaSource>> videoSources; … … 78 75 AVCaptureDeviceManager::singleton().verifyConstraintsForMediaType(RealtimeMediaSource::Audio, audioConstraints, nullptr, invalidConstraint); 79 76 if (!invalidConstraint.isEmpty()) { 80 client->constraintsInvalid(invalidConstraint);77 invalidHandler(invalidConstraint); 81 78 return; 82 79 } … … 89 86 AVCaptureDeviceManager::singleton().verifyConstraintsForMediaType(RealtimeMediaSource::Video, videoConstraints, nullptr, invalidConstraint); 90 87 if (!invalidConstraint.isEmpty()) { 91 client->constraintsInvalid(invalidConstraint);88 invalidHandler(invalidConstraint); 92 89 return; 93 90 } … … 95 92 videoSources = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Video, videoConstraints); 96 93 } 97 client->constraintsValidated(audioSources, videoSources); 94 95 validHandler(WTFMove(audioSources), WTFMove(videoSources)); 98 96 } 99 97 100 void RealtimeMediaSourceCenterMac::createMediaStream( PassRefPtr<MediaStreamCreationClient> prpQueryClient, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints)98 void RealtimeMediaSourceCenterMac::createMediaStream(NewMediaStreamHandler completionHandler, const String& audioDeviceID, const String& videoDeviceID) 101 99 { 102 RefPtr<MediaStreamCreationClient> client = prpQueryClient;103 104 ASSERT(client);105 106 Vector<RefPtr<RealtimeMediaSource>> audioSources;107 Vector<RefPtr<RealtimeMediaSource>> videoSources;108 109 if (audioConstraints.isValid()) {110 String invalidConstraint;111 AVCaptureDeviceManager::singleton().verifyConstraintsForMediaType(RealtimeMediaSource::Audio, audioConstraints, nullptr, invalidConstraint);112 if (!invalidConstraint.isEmpty()) {113 client->failedToCreateStreamWithConstraintsError(invalidConstraint);114 return;115 }116 // FIXME: Consider the constraints when choosing among multiple devices. For now just select the first available117 // device of the appropriate type.118 auto audioSource = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Audio, audioConstraints).at(0);119 ASSERT(audioSource);120 121 audioSources.append(WTFMove(audioSource));122 }123 124 if (videoConstraints.isValid()) {125 String invalidConstraint;126 AVCaptureDeviceManager::singleton().verifyConstraintsForMediaType(RealtimeMediaSource::Video, videoConstraints, nullptr, invalidConstraint);127 if (!invalidConstraint.isEmpty()) {128 client->failedToCreateStreamWithConstraintsError(invalidConstraint);129 return;130 }131 // FIXME: Consider the constraints when choosing among multiple devices. For now just select the first available132 // device of the appropriate type.133 auto videoSource = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Video, videoConstraints).at(0);134 ASSERT(videoSource);135 136 videoSources.append(WTFMove(videoSource));137 }138 139 client->didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));140 }141 142 void RealtimeMediaSourceCenterMac::createMediaStream(MediaStreamCreationClient* client, const String& audioDeviceID, const String& videoDeviceID)143 {144 ASSERT(client);145 100 Vector<RefPtr<RealtimeMediaSource>> audioSources; 146 101 Vector<RefPtr<RealtimeMediaSource>> videoSources; … … 157 112 } 158 113 159 client->didCreateStream(MediaStreamPrivate::create(audioSources, videoSources)); 114 if (videoSources.isEmpty() && audioSources.isEmpty()) 115 completionHandler(nullptr); 116 else 117 completionHandler(MediaStreamPrivate::create(audioSources, videoSources)); 160 118 } 161 119 -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h
r205929 r207463 1 1 /* 2 * Copyright (C) 2013 Apple, Inc. All rights reserved.2 * Copyright (C) 2013-2016 Apple, Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 48 48 ~RealtimeMediaSourceCenterMac(); 49 49 50 void validateRequestConstraints(MediaStreamCreationClient*, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) final; 51 void createMediaStream(PassRefPtr<MediaStreamCreationClient>, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) final; 52 void createMediaStream(MediaStreamCreationClient*, const String& audioDeviceID, const String& videoDeviceID) final; 50 void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) final; 51 void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID) final; 53 52 Vector<CaptureDevice> getMediaStreamDevices() final; 54 53 }; -
trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp
r206204 r207463 38 38 39 39 #include "CaptureDevice.h" 40 #include "MediaStreamCreationClient.h"41 40 #include "MediaStreamPrivate.h" 42 41 #include "NotImplemented.h" … … 78 77 } 79 78 80 void RealtimeMediaSourceCenterOwr::validateRequestConstraints( MediaStreamCreationClient* client, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints)79 void RealtimeMediaSourceCenterOwr::validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) 81 80 { 82 m_client = client; 81 m_validConstraintsHandler = WTFMove(validHandler); 82 m_invalidConstraintsHandler = WTFMove(invalidHandler); 83 83 84 84 // FIXME: Actually do constraints validation. The MediaConstraints … … 94 94 } 95 95 96 void RealtimeMediaSourceCenterOwr::createMediaStream( PassRefPtr<MediaStreamCreationClient> prpQueryClient, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints)96 void RealtimeMediaSourceCenterOwr::createMediaStream(NewMediaStreamHandler completionHandler, const String& audioDeviceID, const String& videoDeviceID) 97 97 { 98 RefPtr<MediaStreamCreationClient> client = prpQueryClient;99 ASSERT(client);100 101 UNUSED_PARAM(audioConstraints);102 UNUSED_PARAM(videoConstraints);103 104 Vector<RefPtr<RealtimeMediaSource>> audioSources;105 Vector<RefPtr<RealtimeMediaSource>> videoSources;106 107 if (audioConstraints.isValid()) {108 // TODO: verify constraints according to registered109 // sources. For now, unconditionally pick the first source, see bug #123345.110 RefPtr<RealtimeMediaSource> audioSource = firstSource(RealtimeMediaSource::Audio);111 if (audioSource) {112 audioSource->reset();113 audioSources.append(audioSource.release());114 }115 }116 117 if (videoConstraints.isValid()) {118 // TODO: verify constraints according to registered119 // sources. For now, unconditionally pick the first source, see bug #123345.120 RefPtr<RealtimeMediaSource> videoSource = firstSource(RealtimeMediaSource::Video);121 if (videoSource) {122 videoSource->reset();123 videoSources.append(videoSource.release());124 }125 }126 127 client->didCreateStream(MediaStreamPrivate::create(audioSources, videoSources));128 }129 130 void RealtimeMediaSourceCenterOwr::createMediaStream(MediaStreamCreationClient* client, const String& audioDeviceID, const String& videoDeviceID)131 {132 ASSERT(client);133 98 Vector<RefPtr<RealtimeMediaSource>> audioSources; 134 99 Vector<RefPtr<RealtimeMediaSource>> videoSources; … … 151 116 } 152 117 153 client->didCreateStream(MediaStreamPrivate::create(audioSources, videoSources)); 118 if (videoSources.isEmpty() && audioSources.isEmpty()) 119 completionHandler(nullptr); 120 else 121 completionHandler(MediaStreamPrivate::create(audioSources, videoSources)); 154 122 } 155 123 … … 197 165 198 166 // TODO: Make sure contraints are actually validated by checking source types. 199 m_client->constraintsValidated(audioSources, videoSources); 167 m_validConstraintsHandler(WTFMove(audioSources), WTFMove(videoSources)); 168 m_validConstraintsHandler = nullptr; 169 m_invalidConstraintsHandler = nullptr; 200 170 } 201 171 -
trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.h
r205929 r207463 55 55 ~RealtimeMediaSourceCenterOwr(); 56 56 57 void validateRequestConstraints( MediaStreamCreationClient*, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) final;57 void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) final; 58 58 59 void createMediaStream(PassRefPtr<MediaStreamCreationClient>, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) final; 60 void createMediaStream(MediaStreamCreationClient*, const String& audioDeviceID, const String& videoDeviceID) final; 59 void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID) final; 61 60 62 61 Vector<CaptureDevice> getMediaStreamDevices() final; … … 67 66 PassRefPtr<RealtimeMediaSource> firstSource(RealtimeMediaSource::Type); 68 67 RealtimeMediaSourceOwrMap m_sourceMap; 69 RefPtr<MediaStreamCreationClient> m_client; 68 ValidConstraintsHandler m_validConstraintsHandler; 69 InvalidConstraintsHandler m_invalidConstraintsHandler; 70 70 }; 71 71 -
trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp
r206445 r207463 34 34 #include "MediaConstraintsMock.h" 35 35 #include "MediaStream.h" 36 #include "MediaStreamCreationClient.h"37 36 #include "MediaStreamPrivate.h" 38 37 #include "MediaStreamTrack.h" … … 68 67 } 69 68 70 void MockRealtimeMediaSourceCenter::validateRequestConstraints( MediaStreamCreationClient* client, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints)69 void MockRealtimeMediaSourceCenter::validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) 71 70 { 72 ASSERT(client);73 74 71 Vector<RefPtr<RealtimeMediaSource>> audioSources; 75 72 Vector<RefPtr<RealtimeMediaSource>> videoSources; … … 78 75 String invalidQuery = MediaConstraintsMock::verifyConstraints(RealtimeMediaSource::Audio, audioConstraints); 79 76 if (!invalidQuery.isEmpty()) { 80 client->constraintsInvalid(invalidQuery);77 invalidHandler(invalidQuery); 81 78 return; 82 79 } … … 89 86 String invalidQuery = MediaConstraintsMock::verifyConstraints(RealtimeMediaSource::Video, videoConstraints); 90 87 if (!invalidQuery.isEmpty()) { 91 client->constraintsInvalid(invalidQuery);88 invalidHandler(invalidQuery); 92 89 return; 93 90 } … … 97 94 } 98 95 99 client->constraintsValidated(audioSources, videoSources);96 validHandler(WTFMove(audioSources), WTFMove(videoSources)); 100 97 } 101 98 102 void MockRealtimeMediaSourceCenter::createMediaStream( PassRefPtr<MediaStreamCreationClient> prpQueryClient, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints)99 void MockRealtimeMediaSourceCenter::createMediaStream(NewMediaStreamHandler completionHandler, const String& audioDeviceID, const String& videoDeviceID) 103 100 { 104 RefPtr<MediaStreamCreationClient> client = prpQueryClient;105 106 ASSERT(client);107 108 101 Vector<RefPtr<RealtimeMediaSource>> audioSources; 109 102 Vector<RefPtr<RealtimeMediaSource>> videoSources; 110 103 111 if (audioConstraints.isValid()) { 112 const String invalidQuery = MediaConstraintsMock::verifyConstraints(RealtimeMediaSource::Audio, audioConstraints); 113 if (!invalidQuery.isEmpty()) { 114 client->failedToCreateStreamWithConstraintsError(invalidQuery); 115 return; 116 } 104 if (audioDeviceID == MockRealtimeMediaSource::mockAudioSourcePersistentID()) 105 audioSources.append(MockRealtimeAudioSource::create()); 117 106 118 auto audioSource = MockRealtimeAudioSource::create(); 119 audioSources.append(WTFMove(audioSource)); 120 } 107 if (videoDeviceID == MockRealtimeMediaSource::mockVideoSourcePersistentID()) 108 videoSources.append(MockRealtimeVideoSource::create()); 121 109 122 if (videoConstraints.isValid()) { 123 const String invalidQuery = MediaConstraintsMock::verifyConstraints(RealtimeMediaSource::Video, videoConstraints); 124 if (!invalidQuery.isEmpty()) { 125 client->failedToCreateStreamWithConstraintsError(invalidQuery); 126 return; 127 } 128 129 auto videoSource = MockRealtimeVideoSource::create(); 130 videoSources.append(WTFMove(videoSource)); 131 } 132 133 client->didCreateStream(MediaStreamPrivate::create(audioSources, videoSources)); 134 } 135 136 void MockRealtimeMediaSourceCenter::createMediaStream(MediaStreamCreationClient* client, const String& audioDeviceID, const String& videoDeviceID) 137 { 138 ASSERT(client); 139 Vector<RefPtr<RealtimeMediaSource>> audioSources; 140 Vector<RefPtr<RealtimeMediaSource>> videoSources; 141 142 if (!audioDeviceID.isEmpty() && audioDeviceID == MockRealtimeMediaSource::mockAudioSourcePersistentID()) { 143 auto audioSource = MockRealtimeAudioSource::create(); 144 audioSources.append(WTFMove(audioSource)); 145 } 146 if (!videoDeviceID.isEmpty() && videoDeviceID == MockRealtimeMediaSource::mockVideoSourcePersistentID()) { 147 auto videoSource = MockRealtimeVideoSource::create(); 148 videoSources.append(WTFMove(videoSource)); 149 } 150 151 client->didCreateStream(MediaStreamPrivate::create(audioSources, videoSources)); 110 if (videoSources.isEmpty() && audioSources.isEmpty()) 111 completionHandler(nullptr); 112 else 113 completionHandler(MediaStreamPrivate::create(audioSources, videoSources)); 152 114 } 153 115 -
trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h
r205929 r207463 42 42 MockRealtimeMediaSourceCenter(); 43 43 44 void validateRequestConstraints(MediaStreamCreationClient*, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) override; 45 void createMediaStream(PassRefPtr<MediaStreamCreationClient>, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) override; 44 void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, MediaConstraints& audioConstraints, MediaConstraints& videoConstraints) override; 46 45 Vector<CaptureDevice> getMediaStreamDevices() override; 47 void createMediaStream( MediaStreamCreationClient*, const String& audioDeviceID, const String& videoDeviceID) override;46 void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID) override; 48 47 }; 49 48 -
trunk/Source/WebKit/mac/ChangeLog
r207458 r207463 1 2016-10-18 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Resolve constraints and enumerate devices in the UI process 4 https://bugs.webkit.org/show_bug.cgi?id=162147 5 <rdar://problem/28803569> 6 7 Reviewed by Darin Adler. 8 9 * WebCoreSupport/WebUserMediaClient.h: 10 * WebCoreSupport/WebUserMediaClient.mm: 11 (AddPermissionCheckToMap): 12 (RemovePermissionCheckFromMap): 13 (WebUserMediaClient::pageDestroyed): 14 (WebUserMediaClient::requestUserMediaAccess): 15 (WebUserMediaClient::enumerateMediaDevices): 16 (WebUserMediaClient::cancelMediaDevicesEnumerationRequest): 17 (-[WebUserMediaPolicyListener allow]): 18 (-[WebUserMediaPolicyListener deny]): 19 (-[WebUserMediaPolicyCheckerListener initWithMediaDevicesEnumerationRequest:]): 20 (-[WebUserMediaPolicyCheckerListener cancelMediaDevicesEnumerationRequest]): 21 (-[WebUserMediaPolicyCheckerListener allow]): 22 (-[WebUserMediaPolicyCheckerListener deny]): 23 (WebUserMediaClient::checkUserMediaPermission): Deleted. 24 (WebUserMediaClient::cancelUserMediaPermissionCheck): Deleted. 25 (-[WebUserMediaPolicyCheckerListener initWithUserMediaPermissionCheck:]): Deleted. 26 (-[WebUserMediaPolicyCheckerListener cancelUserMediaPermissionCheck]): Deleted. 27 1 28 2016-10-17 Antti Koivisto <antti@apple.com> 2 29 -
trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.h
r204466 r207463 1 1 /* 2 * Copyright (C) 2013 Apple Inc. All rights reserved.2 * Copyright (C) 2013-2016 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 31 31 #import <WebCore/UserMediaClient.h> 32 32 33 namespace WebCore {34 class UserMediaClient;35 class UserMediaPermissionCheck;36 class UserMediaRequest;37 }38 39 33 @class WebView; 40 34 … … 45 39 46 40 // UserMediaClient 47 void requestUserMediaAccess(WebCore::UserMediaRequest&) override;48 void cancelUserMediaAccessRequest(WebCore::UserMediaRequest&) override;41 void requestUserMediaAccess(WebCore::UserMediaRequest&) final; 42 void cancelUserMediaAccessRequest(WebCore::UserMediaRequest&) final; 49 43 50 void checkUserMediaPermission(WebCore::UserMediaPermissionCheck&) override;51 void cancel UserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&) override;44 void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&) final; 45 void cancelMediaDevicesEnumerationRequest(WebCore::MediaDevicesEnumerationRequest&) final; 52 46 53 void pageDestroyed() override;47 void pageDestroyed() final; 54 48 55 49 private: -
trunk/Source/WebKit/mac/WebCoreSupport/WebUserMediaClient.mm
r201038 r207463 32 32 #import "WebUIDelegatePrivate.h" 33 33 #import "WebViewInternal.h" 34 #import <WebCore/CaptureDevice.h> 35 #import <WebCore/MediaDevicesEnumerationRequest.h> 34 36 #import <WebCore/Page.h> 37 #import <WebCore/RealtimeMediaSourceCenter.h> 35 38 #import <WebCore/ScriptExecutionContext.h> 36 #import <WebCore/UserMediaPermissionCheck.h>37 39 #import <WebCore/UserMediaRequest.h> 38 40 #import <wtf/BlockObjCExceptions.h> … … 54 56 55 57 @interface WebUserMediaPolicyCheckerListener : NSObject <WebAllowDenyPolicyListener> { 56 RefPtr< UserMediaPermissionCheck> _request;57 } 58 - (id)initWith UserMediaPermissionCheck:(PassRefPtr<UserMediaPermissionCheck>)request;59 - (void)cancel UserMediaPermissionCheck;58 RefPtr<MediaDevicesEnumerationRequest> _request; 59 } 60 - (id)initWithMediaDevicesEnumerationRequest:(PassRefPtr<MediaDevicesEnumerationRequest>)request; 61 - (void)cancelMediaDevicesEnumerationRequest; 60 62 - (void)deny; 61 63 @end … … 79 81 } 80 82 81 typedef HashMap<RefPtr< UserMediaPermissionCheck>, RetainPtr<WebUserMediaPolicyCheckerListener>> UserMediaCheckMap;83 typedef HashMap<RefPtr<MediaDevicesEnumerationRequest>, RetainPtr<WebUserMediaPolicyCheckerListener>> UserMediaCheckMap; 82 84 83 85 static UserMediaCheckMap& userMediaCheckMap() … … 87 89 } 88 90 89 static void AddPermissionCheckToMap( UserMediaPermissionCheck* request, RetainPtr<WebUserMediaPolicyCheckerListener> listener)91 static void AddPermissionCheckToMap(MediaDevicesEnumerationRequest* request, RetainPtr<WebUserMediaPolicyCheckerListener> listener) 90 92 { 91 93 userMediaCheckMap().set(request, listener); 92 94 } 93 95 94 static void RemovePermissionCheckFromMap( UserMediaPermissionCheck* request)96 static void RemovePermissionCheckFromMap(MediaDevicesEnumerationRequest* request) 95 97 { 96 98 userMediaCheckMap().remove(request); … … 124 126 125 127 for (auto& check : pendingChecks) 126 [check cancel UserMediaPermissionCheck];128 [check cancelMediaDevicesEnumerationRequest]; 127 129 128 130 ASSERT(userMediaCheckMap().isEmpty()); … … 137 139 SEL selector = @selector(webView:decidePolicyForUserMediaRequestFromOrigin:listener:); 138 140 if (![[m_webView UIDelegate] respondsToSelector:selector]) { 139 request. userMediaAccessDenied();141 request.deny(UserMediaRequest::MediaAccessDenialReason::UserMediaDisabled, ""); 140 142 return; 141 143 } … … 164 166 } 165 167 166 void WebUserMediaClient:: checkUserMediaPermission(UserMediaPermissionCheck& request)168 void WebUserMediaClient::enumerateMediaDevices(MediaDevicesEnumerationRequest& request) 167 169 { 168 170 BEGIN_BLOCK_OBJC_EXCEPTIONS; … … 170 172 SEL selector = @selector(webView:checkPolicyForUserMediaRequestFromOrigin:listener:); 171 173 if (![[m_webView UIDelegate] respondsToSelector:selector]) { 172 request.set UserMediaAccessInfo(emptyString(), false);174 request.setDeviceInfo(Vector<CaptureDevice>(), emptyString(), false); 173 175 return; 174 176 } 175 177 176 WebUserMediaPolicyCheckerListener *listener = [[WebUserMediaPolicyCheckerListener alloc] initWith UserMediaPermissionCheck:&request];178 WebUserMediaPolicyCheckerListener *listener = [[WebUserMediaPolicyCheckerListener alloc] initWithMediaDevicesEnumerationRequest:&request]; 177 179 WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:request.userMediaDocumentOrigin()]; 178 180 … … 186 188 } 187 189 188 void WebUserMediaClient::cancel UserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)190 void WebUserMediaClient::cancelMediaDevicesEnumerationRequest(WebCore::MediaDevicesEnumerationRequest& request) 189 191 { 190 192 UserMediaCheckMap& requestsMap = userMediaCheckMap(); … … 193 195 return; 194 196 195 [it->value cancel UserMediaPermissionCheck];197 [it->value cancelMediaDevicesEnumerationRequest]; 196 198 requestsMap.remove(it); 197 199 } … … 227 229 return; 228 230 229 _request->userMediaAccessGranted(_request->allowedAudioDeviceUID(), _request->allowedVideoDeviceUID());231 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=162154 230 232 RemoveRequestFromRequestMap(_request.get()); 231 233 #endif … … 238 240 return; 239 241 240 _request->userMediaAccessDenied();242 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=162154 241 243 RemoveRequestFromRequestMap(_request.get()); 242 244 #endif … … 261 263 @implementation WebUserMediaPolicyCheckerListener 262 264 263 - (id)initWith UserMediaPermissionCheck:(PassRefPtr<UserMediaPermissionCheck>)request265 - (id)initWithMediaDevicesEnumerationRequest:(PassRefPtr<MediaDevicesEnumerationRequest>)request 264 266 { 265 267 #if ENABLE(MEDIA_STREAM) … … 272 274 } 273 275 274 - (void)cancel UserMediaPermissionCheck276 - (void)cancelMediaDevicesEnumerationRequest 275 277 { 276 278 #if ENABLE(MEDIA_STREAM) … … 289 291 return; 290 292 291 _request->setUserMediaAccessInfo(_request->mediaDeviceIdentifierHashSalt(), true);293 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=162154 292 294 RemovePermissionCheckFromMap(_request.get()); 293 295 #endif … … 300 302 return; 301 303 302 _request->setUserMediaAccessInfo(emptyString(), true);304 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=162154 303 305 RemovePermissionCheckFromMap(_request.get()); 304 306 #endif -
trunk/Source/WebKit2/ChangeLog
r207458 r207463 1 2016-10-18 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Resolve constraints and enumerate devices in the UI process 4 https://bugs.webkit.org/show_bug.cgi?id=162147 5 <rdar://problem/28803569> 6 7 Reviewed by Darin Adler. 8 9 Restructure gUM constraint validation and MediaDevices.enumerateDevices so all media device 10 access happens in the UI process. 11 12 * Scripts/webkit/messages.py: 13 (headers_for_type): Special case MediaConstraintsData. 14 15 * Shared/WebCoreArgumentCoders.cpp: 16 (IPC::encodeMediaTrackConstraintSetMap): MediaTrackConstraintSetMap encoder. 17 (IPC::ArgumentCoder<MediaConstraintsData>::encode): MediaConstraintsData encoder. 18 (IPC::decodeMediaTrackConstraintSetMap): MediaTrackConstraintSetMap decoder. 19 (IPC::ArgumentCoder<MediaConstraintsData>::decode): MediaConstraintsData decoder. 20 (IPC::ArgumentCoder<CaptureDevice>::encode): CaptureDevice enoder. 21 (IPC::ArgumentCoder<CaptureDevice>::decode): CaptureDevice decoder. 22 * Shared/WebCoreArgumentCoders.h: 23 24 * UIProcess/API/APIUIClient.h: Remove UserMediaPermissionCheckProxy forward declaration. 25 26 * UIProcess/API/C/WKUserMediaPermissionRequest.cpp: 27 (toWK): Translate UserMediaPermissionRequestDenialReason to UserMediaAccessDenialReason. 28 (WKUserMediaPermissionRequestDeny): Add "reason" parameter. 29 * UIProcess/API/C/WKUserMediaPermissionRequest.h: 30 31 * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: 32 (WebKit::UserMediaPermissionRequestManagerProxy::invalidateRequests): Invalidate pending device requests. 33 (WebKit::UserMediaPermissionRequestManagerProxy::createRequest): Make private. 34 (WebKit::toWebCore): Map from UserMediaAccessDenialReason to MediaAccessDenialReason, cast to 35 uint64_t to pass to web process. 36 (WebKit::UserMediaPermissionRequestManagerProxy::denyRequest): Send to web process. 37 (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted): Ditto. 38 (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame): Validate 39 constraints and make sure gUM is enabled before prompting user. 40 (WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame): New. 41 (WebKit::UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck): Send 42 results of device enumeration to web process. 43 (WebKit::UserMediaPermissionRequestManagerProxy::didReceiveUserMediaPermissionDecision): Deleted. 44 (WebKit::UserMediaPermissionRequestManagerProxy::createUserMediaPermissionCheck): Deleted. 45 * UIProcess/UserMediaPermissionRequestManagerProxy.h: 46 47 * UIProcess/UserMediaPermissionRequestProxy.cpp: 48 (WebKit::UserMediaPermissionRequestProxy::allow): 49 (WebKit::UserMediaPermissionRequestProxy::deny): Take "reason" parameter. 50 * UIProcess/UserMediaPermissionRequestProxy.h: 51 52 * UIProcess/WebPageProxy.cpp: 53 (WebKit::WebPageProxy::requestUserMediaPermissionForFrame): 54 (WebKit::WebPageProxy::enumerateMediaDevicesForFrame): 55 (WebKit::WebPageProxy::checkUserMediaPermissionForFrame): Deleted. 56 * UIProcess/WebPageProxy.h: 57 * UIProcess/WebPageProxy.messages.in: 58 59 * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: 60 (WebKit::UserMediaPermissionRequestManager::startUserMediaRequest): userMediaAccessDenied -> deny. 61 Pass the audio and video constraints to the UI process. 62 (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): 63 (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasDenied): 64 (WebKit::UserMediaPermissionRequestManager::enumerateMediaDevices): Send the enumeration request 65 to the UI process. 66 (WebKit::UserMediaPermissionRequestManager::cancelMediaDevicesEnumeration): 67 (WebKit::UserMediaPermissionRequestManager::didCompleteMediaDeviceEnumeration): 68 (WebKit::UserMediaPermissionRequestManager::didReceiveUserMediaPermissionDecision): Deleted. 69 (WebKit::UserMediaPermissionRequestManager::startUserMediaPermissionCheck): Deleted. 70 (WebKit::UserMediaPermissionRequestManager::cancelUserMediaPermissionCheck): Deleted. 71 (WebKit::UserMediaPermissionRequestManager::didCompleteUserMediaPermissionCheck): Deleted. 72 * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: 73 74 * WebProcess/WebCoreSupport/WebUserMediaClient.cpp: 75 (WebKit::WebUserMediaClient::enumerateMediaDevices): New. 76 (WebKit::WebUserMediaClient::cancelMediaDevicesEnumerationRequest): New. 77 (WebKit::WebUserMediaClient::checkUserMediaPermission): Deleted. 78 (WebKit::WebUserMediaClient::cancelUserMediaPermissionCheck): Deleted. 79 * WebProcess/WebCoreSupport/WebUserMediaClient.h: 80 81 * WebProcess/WebPage/WebPage.cpp: 82 (WebKit::WebPage::userMediaAccessWasGranted): New. 83 (WebKit::WebPage::userMediaAccessWasDenied): Ditto. 84 (WebKit::WebPage::didCompleteMediaDeviceEnumeration): 85 (WebKit::WebPage::didReceiveUserMediaPermissionDecision): Deleted. 86 (WebKit::WebPage::didCompleteUserMediaPermissionCheck): Deleted. 87 * WebProcess/WebPage/WebPage.h: 88 * WebProcess/WebPage/WebPage.messages.in: 89 1 90 2016-10-17 Antti Koivisto <antti@apple.com> 2 91 -
trunk/Source/WebKit2/Scripts/webkit/messages.py
r206030 r207463 356 356 'WebCore::KeyframeValueList': ['<WebCore/GraphicsLayer.h>'], 357 357 'WebCore::KeypressCommand': ['<WebCore/KeyboardEvent.h>'], 358 'WebCore::MediaConstraintsData': ['<WebCore/MediaConstraintsImpl.h>'], 358 359 'WebCore::PasteboardImage': ['<WebCore/Pasteboard.h>'], 359 360 'WebCore::PasteboardWebContent': ['<WebCore/Pasteboard.h>'], -
trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp
r204668 r207463 94 94 #endif 95 95 96 #if ENABLE(MEDIA_STREAM) 97 #include <WebCore/CaptureDevice.h> 98 #include <WebCore/MediaConstraintsImpl.h> 99 #endif 100 96 101 using namespace WebCore; 97 102 using namespace WebKit; … … 2220 2225 } 2221 2226 2227 #if ENABLE(MEDIA_STREAM) 2228 void ArgumentCoder<MediaConstraintsData>::encode(Encoder& encoder, const WebCore::MediaConstraintsData& constraint) 2229 { 2230 encoder << constraint.mandatoryConstraints; 2231 2232 auto& advancedConstraints = constraint.advancedConstraints; 2233 encoder << static_cast<uint64_t>(advancedConstraints.size()); 2234 for (const auto& advancedConstraint : advancedConstraints) 2235 encoder << advancedConstraint; 2236 2237 encoder << constraint.isValid; 2238 } 2239 2240 bool ArgumentCoder<MediaConstraintsData>::decode(Decoder& decoder, WebCore::MediaConstraintsData& constraints) 2241 { 2242 MediaTrackConstraintSetMap mandatoryConstraints; 2243 if (!decoder.decode(mandatoryConstraints)) 2244 return false; 2245 2246 uint64_t advancedCount; 2247 if (!decoder.decode(advancedCount)) 2248 return false; 2249 2250 Vector<MediaTrackConstraintSetMap> advancedConstraints; 2251 advancedConstraints.reserveInitialCapacity(advancedCount); 2252 for (size_t i = 0; i < advancedCount; ++i) { 2253 MediaTrackConstraintSetMap map; 2254 if (!decoder.decode(map)) 2255 return false; 2256 2257 advancedConstraints.uncheckedAppend(WTFMove(map)); 2258 } 2259 2260 bool isValid; 2261 if (!decoder.decode(isValid)) 2262 return false; 2263 2264 constraints.mandatoryConstraints = WTFMove(mandatoryConstraints); 2265 constraints.advancedConstraints = WTFMove(advancedConstraints); 2266 constraints.isValid = isValid; 2267 2268 return true; 2269 } 2270 2271 void ArgumentCoder<CaptureDevice>::encode(Encoder& encoder, const WebCore::CaptureDevice& device) 2272 { 2273 encoder << device.persistentId(); 2274 encoder << device.label(); 2275 encoder << device.groupId(); 2276 encoder.encodeEnum(device.kind()); 2277 } 2278 2279 bool ArgumentCoder<CaptureDevice>::decode(Decoder& decoder, WebCore::CaptureDevice& device) 2280 { 2281 String persistentId; 2282 if (!decoder.decode(persistentId)) 2283 return false; 2284 2285 String label; 2286 if (!decoder.decode(label)) 2287 return false; 2288 2289 String groupId; 2290 if (!decoder.decode(groupId)) 2291 return false; 2292 2293 CaptureDevice::SourceKind kind; 2294 if (!decoder.decodeEnum(kind)) 2295 return false; 2296 2297 device.setPersistentId(persistentId); 2298 device.setLabel(label); 2299 device.setGroupId(groupId); 2300 device.setKind(kind); 2301 2302 return true; 2303 } 2304 #endif 2305 2222 2306 2223 2307 } // namespace IPC -
trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h
r206006 r207463 128 128 #endif 129 129 130 #if ENABLE(MEDIA_STREAM) 131 namespace WebCore { 132 class CaptureDevice; 133 struct MediaConstraintsData; 134 } 135 #endif 136 130 137 namespace IPC { 131 138 … … 529 536 #endif 530 537 538 #if ENABLE(MEDIA_STREAM) 539 template<> struct ArgumentCoder<WebCore::MediaConstraintsData> { 540 static void encode(Encoder&, const WebCore::MediaConstraintsData&); 541 static bool decode(Decoder&, WebCore::MediaConstraintsData&); 542 }; 543 544 template<> struct ArgumentCoder<WebCore::CaptureDevice> { 545 static void encode(Encoder&, const WebCore::CaptureDevice&); 546 static bool decode(Decoder&, WebCore::CaptureDevice&); 547 }; 548 #endif 549 531 550 } // namespace IPC 532 551 -
trunk/Source/WebKit2/UIProcess/API/APIUIClient.h
r205327 r207463 52 52 class NativeWebWheelEvent; 53 53 class NotificationPermissionRequest; 54 class UserMediaPermissionCheckProxy;55 54 class UserMediaPermissionRequestProxy; 56 55 class WebColorPickerResultListenerProxy; -
trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionRequest.cpp
r190262 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 39 40 } 40 41 41 void WKUserMediaPermissionRequestDeny(WKUserMediaPermissionRequestRef userMediaPermissionRequestRef)42 static UserMediaPermissionRequestProxy::UserMediaAccessDenialReason toWK(UserMediaPermissionRequestDenialReason reason) 42 43 { 43 toImpl(userMediaPermissionRequestRef)->deny(); 44 switch (reason) { 45 case kWKNoConstraints: 46 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints; 47 break; 48 case kWKUserMediaDisabled: 49 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled; 50 break; 51 case kWKNoCaptureDevices: 52 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoCaptureDevices; 53 break; 54 case kWKInvalidConstraint: 55 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::InvalidConstraint; 56 break; 57 case kWKHardwareError: 58 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::HardwareError; 59 break; 60 case kWKPermissionDenied: 61 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied; 62 break; 63 case kWKOtherFailure: 64 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::OtherFailure; 65 break; 66 } 67 68 ASSERT_NOT_REACHED(); 69 return UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::OtherFailure; 70 71 } 72 73 void WKUserMediaPermissionRequestDeny(WKUserMediaPermissionRequestRef userMediaPermissionRequestRef, UserMediaPermissionRequestDenialReason reason) 74 { 75 toImpl(userMediaPermissionRequestRef)->deny(toWK(reason)); 44 76 } 45 77 -
trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionRequest.h
r190262 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 28 29 WK_EXPORT WKTypeID WKUserMediaPermissionRequestGetTypeID(); 29 30 31 enum { 32 kWKNoConstraints = 0, 33 kWKUserMediaDisabled, 34 kWKNoCaptureDevices, 35 kWKInvalidConstraint, 36 kWKHardwareError, 37 kWKPermissionDenied, 38 kWKOtherFailure 39 }; 40 typedef uint32_t UserMediaPermissionRequestDenialReason; 41 30 42 WK_EXPORT void WKUserMediaPermissionRequestAllow(WKUserMediaPermissionRequestRef, WKStringRef audioDeviceUID, WKStringRef videoDeviceUID); 31 WK_EXPORT void WKUserMediaPermissionRequestDeny(WKUserMediaPermissionRequestRef );43 WK_EXPORT void WKUserMediaPermissionRequestDeny(WKUserMediaPermissionRequestRef, UserMediaPermissionRequestDenialReason); 32 44 33 45 WK_EXPORT WKArrayRef WKUserMediaPermissionRequestVideoDeviceUIDs(WKUserMediaPermissionRequestRef); -
trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp
r198527 r207463 92 92 93 93 priv->madeDecision = true; 94 priv->request->deny( );94 priv->request->deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied); 95 95 } 96 96 -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
r197114 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 20 21 #include "UserMediaPermissionRequestManagerProxy.h" 21 22 23 #include "APISecurityOrigin.h" 24 #include "APIUIClient.h" 22 25 #include "WebPageMessages.h" 23 26 #include "WebPageProxy.h" 24 27 #include "WebProcessProxy.h" 28 #include <WebCore/MediaConstraintsImpl.h> 29 #include <WebCore/MockRealtimeMediaSourceCenter.h> 30 #include <WebCore/RealtimeMediaSource.h> 31 32 using namespace WebCore; 25 33 26 34 namespace WebKit { … … 35 43 for (auto& request : m_pendingUserMediaRequests.values()) 36 44 request->invalidate(); 37 38 45 m_pendingUserMediaRequests.clear(); 46 47 for (auto& request : m_pendingDeviceRequests.values()) 48 request->invalidate(); 49 m_pendingDeviceRequests.clear(); 39 50 } 40 51 … … 46 57 } 47 58 48 void UserMediaPermissionRequestManagerProxy::didReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID) 59 Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID) 60 { 61 Ref<UserMediaPermissionRequestProxy> request = UserMediaPermissionRequestProxy::create(*this, userMediaID, Vector<String>(), Vector<String>()); 62 m_pendingUserMediaRequests.add(userMediaID, request.ptr()); 63 return request; 64 } 65 66 #if ENABLE(MEDIA_STREAM) 67 static uint64_t toWebCore(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason reason) 68 { 69 switch (reason) { 70 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints: 71 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::NoConstraints); 72 break; 73 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled: 74 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::UserMediaDisabled); 75 break; 76 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoCaptureDevices: 77 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::NoCaptureDevices); 78 break; 79 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::InvalidConstraint: 80 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::InvalidConstraint); 81 break; 82 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::HardwareError: 83 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::HardwareError); 84 break; 85 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied: 86 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::PermissionDenied); 87 break; 88 case UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::OtherFailure: 89 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::OtherFailure); 90 break; 91 } 92 93 ASSERT_NOT_REACHED(); 94 return static_cast<uint64_t>(UserMediaRequest::MediaAccessDenialReason::OtherFailure); 95 } 96 #endif 97 98 void UserMediaPermissionRequestManagerProxy::userMediaAccessWasDenied(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason reason) 49 99 { 50 100 if (!m_page.isValid()) … … 54 104 return; 55 105 56 #if ENABLE(MEDIA_STREAM) 57 m_page.process().send(Messages::WebPage::DidReceiveUserMediaPermissionDecision(userMediaID, allowed, audioDeviceUID, videoDeviceUID), m_page.pageID()); 58 #else 59 UNUSED_PARAM(allowed); 60 #endif 61 } 62 63 Ref<UserMediaPermissionCheckProxy> UserMediaPermissionRequestManagerProxy::createUserMediaPermissionCheck(uint64_t userMediaID) 64 { 65 Ref<UserMediaPermissionCheckProxy> request = UserMediaPermissionCheckProxy::create(*this, userMediaID); 106 denyRequest(userMediaID, reason, ""); 107 } 108 109 void UserMediaPermissionRequestManagerProxy::denyRequest(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason reason, const String& invalidConstraint) 110 { 111 ASSERT(m_page.isValid()); 112 113 #if ENABLE(MEDIA_STREAM) 114 m_page.process().send(Messages::WebPage::UserMediaAccessWasDenied(userMediaID, toWebCore(reason), invalidConstraint), m_page.pageID()); 115 #else 116 UNUSED_PARAM(reason); 117 UNUSED_PARAM(invalidConstraint); 118 #endif 119 } 120 121 void UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID) 122 { 123 if (!m_page.isValid()) 124 return; 125 126 if (!m_pendingUserMediaRequests.take(userMediaID)) 127 return; 128 129 #if ENABLE(MEDIA_STREAM) 130 m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(userMediaID, audioDeviceUID, videoDeviceUID), m_page.pageID()); 131 #else 132 UNUSED_PARAM(audioDeviceUID); 133 UNUSED_PARAM(videoDeviceUID); 134 #endif 135 } 136 137 void UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const WebCore::MediaConstraintsData& audioConstraintsData, const WebCore::MediaConstraintsData& videoConstraintsData) 138 { 139 #if ENABLE(MEDIA_STREAM) 140 RealtimeMediaSourceCenter::InvalidConstraintsHandler invalidHandler = [this, userMediaID, frameID, userMediaDocumentOriginIdentifier, topLevelDocumentOriginIdentifier](const String& invalidConstraint) { 141 if (!m_page.isValid()) 142 return; 143 144 denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::InvalidConstraint, invalidConstraint); 145 }; 146 147 RealtimeMediaSourceCenter::ValidConstraintsHandler validHandler = [this, userMediaID, frameID, userMediaDocumentOriginIdentifier, topLevelDocumentOriginIdentifier](const Vector<RefPtr<RealtimeMediaSource>>&& audioTracks, const Vector<RefPtr<RealtimeMediaSource>>&& videoTracks) { 148 if (!m_page.isValid()) 149 return; 150 151 Vector<String> videoDeviceUIDs; 152 Vector<String> audioDeviceUIDs; 153 for (auto& audioTrack : audioTracks) 154 audioDeviceUIDs.append(audioTrack->persistentID()); 155 for (auto& videoTrack : videoTracks) 156 videoDeviceUIDs.append(videoTrack->persistentID()); 157 158 if (videoDeviceUIDs.isEmpty() && audioDeviceUIDs.isEmpty()) { 159 denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints, ""); 160 return; 161 } 162 163 auto userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier)); 164 auto topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier)); 165 auto request = createRequest(userMediaID, audioDeviceUIDs, videoDeviceUIDs); 166 167 if (!m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), *userMediaOrigin.get(), *topLevelOrigin.get(), request.get())) { 168 m_pendingUserMediaRequests.take(userMediaID); 169 request->deny(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled); 170 } 171 }; 172 173 auto audioConstraints = MediaConstraintsImpl::create(audioConstraintsData); 174 auto videoConstraints = MediaConstraintsImpl::create(videoConstraintsData); 175 176 syncWithWebCorePrefs(); 177 RealtimeMediaSourceCenter::singleton().validateRequestConstraints(validHandler, invalidHandler, audioConstraints, videoConstraints); 178 #else 179 UNUSED_PARAM(userMediaID); 180 UNUSED_PARAM(frameID); 181 UNUSED_PARAM(userMediaDocumentOriginIdentifier); 182 UNUSED_PARAM(topLevelDocumentOriginIdentifier); 183 UNUSED_PARAM(audioConstraintsData); 184 UNUSED_PARAM(videoConstraintsData); 185 #endif 186 } 187 188 void UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier) 189 { 190 #if ENABLE(MEDIA_STREAM) 191 auto request = UserMediaPermissionCheckProxy::create(*this, userMediaID); 66 192 m_pendingDeviceRequests.add(userMediaID, request.ptr()); 67 return request; 68 } 69 70 void UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String& mediaDeviceIdentifierHashSalt, bool allowed) 193 194 auto userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier)); 195 auto topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier)); 196 197 if (!m_page.uiClient().checkUserMediaPermissionForOrigin(m_page, *m_page.process().webFrame(frameID), *userMediaOrigin.get(), *topLevelOrigin.get(), request.get())) { 198 m_pendingDeviceRequests.take(userMediaID); 199 m_page.process().send(Messages::WebPage::DidCompleteMediaDeviceEnumeration(userMediaID, Vector<WebCore::CaptureDevice>(), emptyString(), false), m_page.pageID()); 200 } 201 #else 202 UNUSED_PARAM(userMediaID); 203 UNUSED_PARAM(frameID); 204 UNUSED_PARAM(userMediaDocumentOriginIdentifier); 205 UNUSED_PARAM(topLevelDocumentOriginIdentifier); 206 #endif 207 } 208 209 void UserMediaPermissionRequestManagerProxy::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess) 71 210 { 72 211 if (!m_page.isValid()) … … 77 216 78 217 #if ENABLE(MEDIA_STREAM) 79 m_page.process().send(Messages::WebPage::DidCompleteUserMediaPermissionCheck(userMediaID, mediaDeviceIdentifierHashSalt, allowed), m_page.pageID()); 80 #else 81 UNUSED_PARAM(allowed); 218 syncWithWebCorePrefs(); 219 auto deviceInfo = RealtimeMediaSourceCenter::singleton().getMediaStreamDevices(); 220 m_page.process().send(Messages::WebPage::DidCompleteMediaDeviceEnumeration(userMediaID, deviceInfo, deviceIdentifierHashSalt, originHasPersistentAccess), m_page.pageID()); 221 #else 222 UNUSED_PARAM(deviceIdentifierHashSalt); 223 UNUSED_PARAM(originHasPersistentAccess); 224 #endif 225 } 226 227 void UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs() const 228 { 229 #if ENABLE(MEDIA_STREAM) 230 // Enable/disable the mock capture devices for the UI process as per the WebCore preferences. Note that 231 // this is a noop if the preference hasn't changed since the last time this was called. 232 bool mockDevicesEnabled = m_page.preferences().mockCaptureDevicesEnabled(); 233 WebCore::MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(mockDevicesEnabled); 82 234 #endif 83 235 } -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h
r197114 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 22 23 #include "UserMediaPermissionCheckProxy.h" 23 24 #include "UserMediaPermissionRequestProxy.h" 25 #include <WebCore/UserMediaRequest.h> 24 26 #include <wtf/HashMap.h> 27 28 namespace WebCore { 29 class CaptureDevice; 30 struct MediaConstraintsData; 31 }; 25 32 26 33 namespace WebKit { … … 34 41 void invalidateRequests(); 35 42 36 Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs); 37 void didReceiveUserMediaPermissionDecision(uint64_t, bool allow, const String& audioDeviceUID, const String& videoDeviceUID); 43 void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const WebCore::MediaConstraintsData& audioConstraintsData, const WebCore::MediaConstraintsData& videoConstraintsData); 38 44 45 void userMediaAccessWasGranted(uint64_t, const String& audioDeviceUID, const String& videoDeviceUID); 46 void userMediaAccessWasDenied(uint64_t, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason); 39 47 40 Ref<UserMediaPermissionCheckProxy> createUserMediaPermissionCheck(uint64_t userMediaID); 48 void enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier); 49 41 50 void didCompleteUserMediaPermissionCheck(uint64_t, const String&, bool allow); 42 51 43 52 private: 53 Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs); 54 Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID); 55 void denyRequest(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason, const String& invalidConstraint); 56 Ref<UserMediaPermissionCheckProxy> createUserMediaPermissionCheck(uint64_t userMediaID); 57 void syncWithWebCorePrefs() const; 58 44 59 HashMap<uint64_t, RefPtr<UserMediaPermissionRequestProxy>> m_pendingUserMediaRequests; 45 60 HashMap<uint64_t, RefPtr<UserMediaPermissionCheckProxy>> m_pendingDeviceRequests; 61 46 62 WebPageProxy& m_page; 47 63 }; -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.cpp
r205929 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 40 41 return; 41 42 42 m_manager-> didReceiveUserMediaPermissionDecision(m_userMediaID, true, audioDeviceUID, videoDeviceUID);43 m_manager = nullptr;43 m_manager->userMediaAccessWasGranted(m_userMediaID, audioDeviceUID, videoDeviceUID); 44 invalidate(); 44 45 } 45 46 46 void UserMediaPermissionRequestProxy::deny( )47 void UserMediaPermissionRequestProxy::deny(UserMediaAccessDenialReason reason) 47 48 { 48 49 ASSERT(m_manager); … … 50 51 return; 51 52 52 m_manager-> didReceiveUserMediaPermissionDecision(m_userMediaID, false, emptyString(), emptyString());53 m_manager = nullptr;53 m_manager->userMediaAccessWasDenied(m_userMediaID, reason); 54 invalidate(); 54 55 } 55 56 -
trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h
r197114 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 21 22 22 23 #include "APIObject.h" 23 #include <WebCore/ RealtimeMediaSource.h>24 #include <WebCore/UserMediaRequest.h> 24 25 #include <wtf/Vector.h> 25 26 #include <wtf/text/WTFString.h> … … 37 38 38 39 void allow(const String& videoDeviceUID, const String& audioDeviceUID); 39 void deny(); 40 41 enum class UserMediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, OtherFailure }; 42 void deny(UserMediaAccessDenialReason); 40 43 41 44 void invalidate(); -
trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp
r207445 r207463 179 179 #endif 180 180 181 #if ENABLE(MEDIA_STREAM) 182 #include <WebCore/MediaConstraintsImpl.h> 183 #endif 184 181 185 // This controls what strategy we use for mouse wheel coalescing. 182 186 #define MERGE_WHEEL_EVENTS 1 … … 5631 5635 } 5632 5636 5633 void WebPageProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs)5637 void WebPageProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const WebCore::MediaConstraintsData& audioConstraintsData, const WebCore::MediaConstraintsData& videoConstraintsData) 5634 5638 { 5635 5639 #if ENABLE(MEDIA_STREAM) 5636 WebFrameProxy* frame = m_process->webFrame(frameID); 5637 MESSAGE_CHECK(frame); 5638 5639 RefPtr<API::SecurityOrigin> userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier)); 5640 RefPtr<API::SecurityOrigin> topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier)); 5641 RefPtr<UserMediaPermissionRequestProxy> request = m_userMediaPermissionRequestManager.createRequest(userMediaID, audioDeviceUIDs, videoDeviceUIDs); 5642 5643 if (!m_uiClient->decidePolicyForUserMediaPermissionRequest(*this, *frame, *userMediaOrigin.get(), *topLevelOrigin.get(), *request.get())) 5644 request->deny(); 5640 MESSAGE_CHECK(m_process->webFrame(frameID)); 5641 5642 m_userMediaPermissionRequestManager.requestUserMediaPermissionForFrame(userMediaID, frameID, userMediaDocumentOriginIdentifier, topLevelDocumentOriginIdentifier, audioConstraintsData, videoConstraintsData); 5645 5643 #else 5646 5644 UNUSED_PARAM(userMediaID); … … 5648 5646 UNUSED_PARAM(userMediaDocumentOriginIdentifier); 5649 5647 UNUSED_PARAM(topLevelDocumentOriginIdentifier); 5650 UNUSED_PARAM(audio DeviceUIDs);5651 UNUSED_PARAM(video DeviceUIDs);5652 #endif 5653 } 5654 5655 void WebPageProxy:: checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier)5648 UNUSED_PARAM(audioConstraintsData); 5649 UNUSED_PARAM(videoConstraintsData); 5650 #endif 5651 } 5652 5653 void WebPageProxy::enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier) 5656 5654 { 5657 5655 #if ENABLE(MEDIA_STREAM) … … 5659 5657 MESSAGE_CHECK(frame); 5660 5658 5661 RefPtr<UserMediaPermissionCheckProxy> request = m_userMediaPermissionRequestManager.createUserMediaPermissionCheck(userMediaID); 5662 RefPtr<API::SecurityOrigin> userMediaOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(userMediaDocumentOriginIdentifier)); 5663 RefPtr<API::SecurityOrigin> topLevelOrigin = API::SecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(topLevelDocumentOriginIdentifier)); 5664 if (!m_uiClient->checkUserMediaPermissionForOrigin(*this, *frame, *userMediaOrigin.get(), *topLevelOrigin.get(), *request.get())) 5665 request->setUserMediaAccessInfo(emptyString(), false); 5659 m_userMediaPermissionRequestManager.enumerateMediaDevicesForFrame(userMediaID, frameID, userMediaDocumentOriginIdentifier, topLevelDocumentOriginIdentifier); 5666 5660 #else 5667 5661 UNUSED_PARAM(userMediaID); … … 5671 5665 #endif 5672 5666 } 5667 5673 5668 5674 5669 void WebPageProxy::requestNotificationPermission(uint64_t requestID, const String& originString) -
trunk/Source/WebKit2/UIProcess/WebPageProxy.h
r207424 r207463 157 157 struct ExceptionDetails; 158 158 struct FileChooserSettings; 159 struct MediaConstraintsData; 159 160 struct SecurityOriginData; 160 161 struct TextAlternativeWithRange; … … 1250 1251 void requestGeolocationPermissionForFrame(uint64_t geolocationID, uint64_t frameID, String originIdentifier); 1251 1252 1252 void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const Vector<String>& audioDeviceUIDs, const Vector<String>& videoDeviceUIDs);1253 void checkUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier);1253 void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, const WebCore::MediaConstraintsData& audioConstraints, const WebCore::MediaConstraintsData& videoConstraints); 1254 void enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier); 1254 1255 1255 1256 void runModal(); -
trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in
r207424 r207463 272 272 #if ENABLE(MEDIA_STREAM) 273 273 # MediaSteam messages 274 RequestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, Vector<String> audioDeviceUIDs, Vector<String> videoDeviceUIDs)275 CheckUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier)274 RequestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier, struct WebCore::MediaConstraintsData audioConstraintsData, struct WebCore::MediaConstraintsData videoConstraintsData) 275 EnumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, String userMediaDocumentOriginIdentifier, String topLevelDocumentOriginIdentifier) 276 276 #endif 277 277 -
trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp
r197114 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 22 23 #if ENABLE(MEDIA_STREAM) 23 24 24 #include "WebCoreArgumentCoders.h"25 25 #include "WebFrame.h" 26 26 #include "WebPage.h" 27 27 #include "WebPageProxyMessages.h" 28 #include <WebCore/CaptureDevice.h> 28 29 #include <WebCore/Document.h> 29 30 #include <WebCore/Frame.h> … … 34 35 35 36 namespace WebKit { 37 38 using namespace WebCore; 36 39 37 40 static uint64_t generateRequestID() … … 46 49 } 47 50 51 UserMediaPermissionRequestManager::~UserMediaPermissionRequestManager() 52 { 53 } 54 48 55 void UserMediaPermissionRequestManager::startUserMediaRequest(UserMediaRequest& request) 49 56 { 50 Document* document = downcast<Document>(request.scriptExecutionContext());57 Document* document = request.document(); 51 58 Frame* frame = document ? document->frame() : nullptr; 52 59 53 60 if (!frame) { 54 request. userMediaAccessDenied();61 request.deny(UserMediaRequest::OtherFailure, emptyString()); 55 62 return; 56 63 } … … 65 72 SecurityOrigin* topLevelDocumentOrigin = request.topLevelDocumentOrigin(); 66 73 String topLevelDocumentOriginString = topLevelDocumentOrigin ? topLevelDocumentOrigin->databaseIdentifier() : emptyString(); 67 m_page.send(Messages::WebPageProxy::RequestUserMediaPermissionForFrame(requestID, webFrame->frameID(), request.userMediaDocumentOrigin()->databaseIdentifier(), topLevelDocumentOriginString, request.audio DeviceUIDs(), request.videoDeviceUIDs()));74 m_page.send(Messages::WebPageProxy::RequestUserMediaPermissionForFrame(requestID, webFrame->frameID(), request.userMediaDocumentOrigin()->databaseIdentifier(), topLevelDocumentOriginString, request.audioConstraints().data(), request.videoConstraints().data())); 68 75 } 69 76 … … 76 83 } 77 84 78 void UserMediaPermissionRequestManager:: didReceiveUserMediaPermissionDecision(uint64_t requestID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID)85 void UserMediaPermissionRequestManager::userMediaAccessWasGranted(uint64_t requestID, const String& audioDeviceUID, const String& videoDeviceUID) 79 86 { 80 RefPtr<UserMediaRequest>request = m_idToUserMediaRequestMap.take(requestID);87 auto request = m_idToUserMediaRequestMap.take(requestID); 81 88 if (!request) 82 89 return; 83 90 m_userMediaRequestToIDMap.remove(request); 84 91 85 if (allowed) 86 request->userMediaAccessGranted(audioDeviceUID, videoDeviceUID); 87 else 88 request->userMediaAccessDenied(); 92 request->allow(audioDeviceUID, videoDeviceUID); 89 93 } 90 94 91 void UserMediaPermissionRequestManager:: startUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)95 void UserMediaPermissionRequestManager::userMediaAccessWasDenied(uint64_t requestID, WebCore::UserMediaRequest::MediaAccessDenialReason reason, const String& invalidConstraint) 92 96 { 93 Document* document = downcast<Document>(request.scriptExecutionContext()); 94 Frame* frame = document ? document->frame() : nullptr; 97 auto request = m_idToUserMediaRequestMap.take(requestID); 98 if (!request) 99 return; 100 m_userMediaRequestToIDMap.remove(request); 101 102 request->deny(reason, invalidConstraint); 103 } 104 105 void UserMediaPermissionRequestManager::enumerateMediaDevices(MediaDevicesEnumerationRequest& request) 106 { 107 auto* document = downcast<Document>(request.scriptExecutionContext()); 108 auto* frame = document ? document->frame() : nullptr; 95 109 96 110 if (!frame) { 97 request.set UserMediaAccessInfo(emptyString(), false);111 request.setDeviceInfo(Vector<CaptureDevice>(), emptyString(), false); 98 112 return; 99 113 } 100 114 101 115 uint64_t requestID = generateRequestID(); 102 m_idTo UserMediaPermissionCheckMap.add(requestID, &request);103 m_ userMediaPermissionCheckToIDMap.add(&request, requestID);116 m_idToMediaDevicesEnumerationRequestMap.add(requestID, &request); 117 m_mediaDevicesEnumerationRequestToIDMap.add(&request, requestID); 104 118 105 119 WebFrame* webFrame = WebFrame::fromCoreFrame(*frame); … … 108 122 SecurityOrigin* topLevelDocumentOrigin = request.topLevelDocumentOrigin(); 109 123 String topLevelDocumentOriginString = topLevelDocumentOrigin ? topLevelDocumentOrigin->databaseIdentifier() : emptyString(); 110 m_page.send(Messages::WebPageProxy:: CheckUserMediaPermissionForFrame(requestID, webFrame->frameID(), request.userMediaDocumentOrigin()->databaseIdentifier(), topLevelDocumentOriginString));124 m_page.send(Messages::WebPageProxy::EnumerateMediaDevicesForFrame(requestID, webFrame->frameID(), request.userMediaDocumentOrigin()->databaseIdentifier(), topLevelDocumentOriginString)); 111 125 } 112 126 113 void UserMediaPermissionRequestManager::cancel UserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)127 void UserMediaPermissionRequestManager::cancelMediaDevicesEnumeration(WebCore::MediaDevicesEnumerationRequest& request) 114 128 { 115 uint64_t requestID = m_ userMediaPermissionCheckToIDMap.take(&request);129 uint64_t requestID = m_mediaDevicesEnumerationRequestToIDMap.take(&request); 116 130 if (!requestID) 117 131 return; 118 m_idTo UserMediaPermissionCheckMap.remove(requestID);132 m_idToMediaDevicesEnumerationRequestMap.remove(requestID); 119 133 } 120 134 121 void UserMediaPermissionRequestManager::didComplete UserMediaPermissionCheck(uint64_t requestID, const String& mediaDeviceIdentifierHashSalt, bool allowed)135 void UserMediaPermissionRequestManager::didCompleteMediaDeviceEnumeration(uint64_t requestID, const Vector<CaptureDevice>& deviceList, const String& mediaDeviceIdentifierHashSalt, bool hasPersistentAccess) 122 136 { 123 RefPtr< UserMediaPermissionCheck> request = m_idToUserMediaPermissionCheckMap.take(requestID);137 RefPtr<MediaDevicesEnumerationRequest> request = m_idToMediaDevicesEnumerationRequestMap.take(requestID); 124 138 if (!request) 125 139 return; 126 m_ userMediaPermissionCheckToIDMap.remove(request);140 m_mediaDevicesEnumerationRequestToIDMap.remove(request); 127 141 128 request->set UserMediaAccessInfo(mediaDeviceIdentifierHashSalt, allowed);142 request->setDeviceInfo(deviceList, mediaDeviceIdentifierHashSalt, hasPersistentAccess); 129 143 } 130 144 -
trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
r197114 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 22 23 #if ENABLE(MEDIA_STREAM) 23 24 24 #include <WebCore/UserMediaPermissionCheck.h> 25 #include <WebCore/MediaConstraints.h> 26 #include <WebCore/MediaDevicesEnumerationRequest.h> 27 #include <WebCore/UserMediaClient.h> 25 28 #include <WebCore/UserMediaRequest.h> 26 29 #include <wtf/HashMap.h> … … 35 38 public: 36 39 explicit UserMediaPermissionRequestManager(WebPage&); 40 ~UserMediaPermissionRequestManager(); 37 41 38 42 void startUserMediaRequest(WebCore::UserMediaRequest&); 39 43 void cancelUserMediaRequest(WebCore::UserMediaRequest&); 40 void didReceiveUserMediaPermissionDecision(uint64_t requestID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID); 44 void userMediaAccessWasGranted(uint64_t, const String& audioDeviceUID, const String& videoDeviceUID); 45 void userMediaAccessWasDenied(uint64_t, WebCore::UserMediaRequest::MediaAccessDenialReason, const String&); 41 46 42 void startUserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&);43 void cancel UserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&);44 void didComplete UserMediaPermissionCheck(uint64_t requestID, const String&, bool allowed);47 void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&); 48 void cancelMediaDevicesEnumeration(WebCore::MediaDevicesEnumerationRequest&); 49 void didCompleteMediaDeviceEnumeration(uint64_t, const Vector<WebCore::CaptureDevice>& deviceList, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess); 45 50 46 51 private: … … 50 55 HashMap<RefPtr<WebCore::UserMediaRequest>, uint64_t> m_userMediaRequestToIDMap; 51 56 52 HashMap<uint64_t, RefPtr<WebCore:: UserMediaPermissionCheck>> m_idToUserMediaPermissionCheckMap;53 HashMap<RefPtr<WebCore:: UserMediaPermissionCheck>, uint64_t> m_userMediaPermissionCheckToIDMap;57 HashMap<uint64_t, RefPtr<WebCore::MediaDevicesEnumerationRequest>> m_idToMediaDevicesEnumerationRequestMap; 58 HashMap<RefPtr<WebCore::MediaDevicesEnumerationRequest>, uint64_t> m_mediaDevicesEnumerationRequestToIDMap; 54 59 }; 55 60 -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp
r193944 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 50 51 } 51 52 52 void WebUserMediaClient:: checkUserMediaPermission(WebCore::UserMediaPermissionCheck& request)53 void WebUserMediaClient::enumerateMediaDevices(MediaDevicesEnumerationRequest& request) 53 54 { 54 m_page.userMediaPermissionRequestManager(). startUserMediaPermissionCheck(request);55 m_page.userMediaPermissionRequestManager().enumerateMediaDevices(request); 55 56 } 56 57 57 void WebUserMediaClient::cancel UserMediaPermissionCheck(WebCore::UserMediaPermissionCheck& request)58 void WebUserMediaClient::cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest& request) 58 59 { 59 m_page.userMediaPermissionRequestManager().cancel UserMediaPermissionCheck(request);60 m_page.userMediaPermissionRequestManager().cancelMediaDevicesEnumeration(request); 60 61 } 61 62 -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.h
r204466 r207463 1 1 /* 2 2 * Copyright (C) 2014 Igalia S.L. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 31 32 public: 32 33 WebUserMediaClient(WebPage&); 34 ~WebUserMediaClient() { } 33 35 34 36 private: … … 38 40 void cancelUserMediaAccessRequest(WebCore::UserMediaRequest&) override; 39 41 40 void checkUserMediaPermission(WebCore::UserMediaPermissionCheck&) override;41 void cancel UserMediaPermissionCheck(WebCore::UserMediaPermissionCheck&) override;42 void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&) final; 43 void cancelMediaDevicesEnumerationRequest(WebCore::MediaDevicesEnumerationRequest&) final; 42 44 43 45 WebPage& m_page; -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
r207443 r207463 3682 3682 3683 3683 #if ENABLE(MEDIA_STREAM) 3684 void WebPage::didReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID) 3685 { 3686 m_userMediaPermissionRequestManager.didReceiveUserMediaPermissionDecision(userMediaID, allowed, audioDeviceUID, videoDeviceUID); 3687 } 3688 3689 void WebPage::didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String& mediaDeviceIdentifierHashSalt, bool allowed) 3690 { 3691 m_userMediaPermissionRequestManager.didCompleteUserMediaPermissionCheck(userMediaID, mediaDeviceIdentifierHashSalt, allowed); 3684 void WebPage::userMediaAccessWasGranted(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID) 3685 { 3686 m_userMediaPermissionRequestManager.userMediaAccessWasGranted(userMediaID, audioDeviceUID, videoDeviceUID); 3687 } 3688 3689 void WebPage::userMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String invalidConstraint) 3690 { 3691 m_userMediaPermissionRequestManager.userMediaAccessWasDenied(userMediaID, static_cast<UserMediaRequest::MediaAccessDenialReason>(reason), invalidConstraint); 3692 } 3693 3694 void WebPage::didCompleteMediaDeviceEnumeration(uint64_t userMediaID, const Vector<CaptureDevice>& devices, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess) 3695 { 3696 m_userMediaPermissionRequestManager.didCompleteMediaDeviceEnumeration(userMediaID, devices, deviceIdentifierHashSalt, originHasPersistentAccess); 3692 3697 } 3693 3698 #endif -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h
r207443 r207463 1160 1160 1161 1161 #if ENABLE(MEDIA_STREAM) 1162 void didReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, const String& audioDeviceUID, const String& videoDeviceUID); 1163 void didCompleteUserMediaPermissionCheck(uint64_t userMediaID, const String&, bool allowed); 1162 void userMediaAccessWasGranted(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID); 1163 void userMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String invalidConstraint); 1164 1165 void didCompleteMediaDeviceEnumeration(uint64_t userMediaID, const Vector<WebCore::CaptureDevice>& devices, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess); 1164 1166 #endif 1165 1167 -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in
r207424 r207463 289 289 #if ENABLE(MEDIA_STREAM) 290 290 # MediaSteam 291 DidReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, String audioDeviceUID, String videoDeviceUID) 292 DidCompleteUserMediaPermissionCheck(uint64_t userMediaID, String mediaDeviceIdentifierHashSalt, bool allowed) 291 UserMediaAccessWasGranted(uint64_t userMediaID, String audioDeviceUID, String videoDeviceUID) 292 UserMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String invalidConstraint) 293 DidCompleteMediaDeviceEnumeration(uint64_t userMediaID, Vector<WebCore::CaptureDevice> devices, String mediaDeviceIdentifierHashSalt, bool hasPersistentAccess) 293 294 #endif 294 295 -
trunk/Tools/ChangeLog
r207447 r207463 1 2016-10-18 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Resolve constraints and enumerate devices in the UI process 4 https://bugs.webkit.org/show_bug.cgi?id=162147 5 <rdar://problem/28803569> 6 7 Reviewed by Darin Adler. 8 9 * WebKitTestRunner/TestController.cpp: 10 (WTR::TestController::resetPreferencesToConsistentValues): Enable mock capture devices. 11 (WTR::TestController::decidePolicyForUserMediaPermissionRequestIfPossible): Update for API changes. 12 1 13 2016-10-17 Megan Gardner <megan_gardner@apple.com> 2 14 -
trunk/Tools/WebKitTestRunner/TestController.cpp
r207305 r207463 687 687 WKCookieManagerDeleteAllCookies(WKContextGetCookieManager(m_context.get())); 688 688 689 WKPreferencesSetMockCaptureDevicesEnabled(preferences, true); 690 689 691 platformResetPreferencesToConsistentValues(); 690 692 } … … 1957 1959 persistentPermission = settings->persistentPermission(); 1958 1960 1961 if (!m_isUserMediaPermissionAllowed && !persistentPermission) { 1962 WKUserMediaPermissionRequestDeny(request, kWKPermissionDenied); 1963 continue; 1964 } 1965 1959 1966 WKRetainPtr<WKArrayRef> audioDeviceUIDs = WKUserMediaPermissionRequestAudioDeviceUIDs(request); 1960 1967 WKRetainPtr<WKArrayRef> videoDeviceUIDs = WKUserMediaPermissionRequestVideoDeviceUIDs(request); 1961 1968 1962 if ((m_isUserMediaPermissionAllowed || persistentPermission) && (WKArrayGetSize(videoDeviceUIDs.get()) || WKArrayGetSize(audioDeviceUIDs.get()))) { 1963 WKRetainPtr<WKStringRef> videoDeviceUID; 1964 if (WKArrayGetSize(videoDeviceUIDs.get())) 1965 videoDeviceUID = reinterpret_cast<WKStringRef>(WKArrayGetItemAtIndex(videoDeviceUIDs.get(), 0)); 1966 else 1967 videoDeviceUID = WKStringCreateWithUTF8CString(""); 1968 1969 WKRetainPtr<WKStringRef> audioDeviceUID; 1970 if (WKArrayGetSize(audioDeviceUIDs.get())) 1971 audioDeviceUID = reinterpret_cast<WKStringRef>(WKArrayGetItemAtIndex(audioDeviceUIDs.get(), 0)); 1972 else 1973 audioDeviceUID = WKStringCreateWithUTF8CString(""); 1974 1975 WKUserMediaPermissionRequestAllow(request, audioDeviceUID.get(), videoDeviceUID.get()); 1976 1977 } else 1978 WKUserMediaPermissionRequestDeny(request); 1969 if (!WKArrayGetSize(videoDeviceUIDs.get()) && !WKArrayGetSize(audioDeviceUIDs.get())) { 1970 WKUserMediaPermissionRequestDeny(request, kWKNoConstraints); 1971 continue; 1972 } 1973 1974 WKRetainPtr<WKStringRef> videoDeviceUID; 1975 if (WKArrayGetSize(videoDeviceUIDs.get())) 1976 videoDeviceUID = reinterpret_cast<WKStringRef>(WKArrayGetItemAtIndex(videoDeviceUIDs.get(), 0)); 1977 else 1978 videoDeviceUID = WKStringCreateWithUTF8CString(""); 1979 1980 WKRetainPtr<WKStringRef> audioDeviceUID; 1981 if (WKArrayGetSize(audioDeviceUIDs.get())) 1982 audioDeviceUID = reinterpret_cast<WKStringRef>(WKArrayGetItemAtIndex(audioDeviceUIDs.get(), 0)); 1983 else 1984 audioDeviceUID = WKStringCreateWithUTF8CString(""); 1985 1986 WKUserMediaPermissionRequestAllow(request, audioDeviceUID.get(), videoDeviceUID.get()); 1979 1987 } 1980 1988 m_userMediaPermissionRequests.clear();
Note:
See TracChangeset
for help on using the changeset viewer.