Diff
Modified: trunk/Source/WebCore/ChangeLog (187167 => 187168)
--- trunk/Source/WebCore/ChangeLog 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/ChangeLog 2015-07-22 18:09:08 UTC (rev 187168)
@@ -1,3 +1,27 @@
+2015-07-22 Matthew Daiter <mdai...@apple.com>
+
+ Need the ability to give only best source UIDs to UserMedia request
+ https://bugs.webkit.org/show_bug.cgi?id=147171
+ <rdar://problem/21931121>
+
+ Reviewed by Eric Carlson.
+
+ * Modules/mediastream/UserMediaRequest.cpp:
+ (WebCore::UserMediaRequest::constraintsValidated):
+ * Modules/mediastream/UserMediaRequest.h:
+ (WebCore::UserMediaRequest::videoDeviceUIDs):
+ (WebCore::UserMediaRequest::audioDeviceUIDs):
+ * platform/mediastream/MediaStreamCreationClient.h:
+ * platform/mediastream/mac/AVCaptureDeviceManager.h:
+ * platform/mediastream/mac/AVCaptureDeviceManager.mm:
+ (WebCore::AVCaptureDeviceManager::bestSourcesForTypeAndConstraints):
+ (WebCore::AVCaptureDeviceManager::bestSourceForTypeAndConstraints): Deleted.
+ * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+ (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints):
+ (WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
+ * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+ (WebCore::MockRealtimeMediaSourceCenter::validateRequestConstraints):
+
2015-07-22 Mark Dittmer <mark.s.ditt...@gmail.com>
Fix toJSDOMWindow() in the case of an object that has the actual JS DOM window in its prototype chain.
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (187167 => 187168)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2015-07-22 18:09:08 UTC (rev 187168)
@@ -121,8 +121,12 @@
RealtimeMediaSourceCenter::singleton().validateRequestConstraints(this, m_audioConstraints, m_videoConstraints);
}
-void UserMediaRequest::constraintsValidated()
+void UserMediaRequest::constraintsValidated(const Vector<RefPtr<RealtimeMediaSource>>& videoTracks, const Vector<RefPtr<RealtimeMediaSource>>& audioTracks)
{
+ for (auto& audioTrack : audioTracks)
+ m_audioDeviceUIDs.append(audioTrack->id());
+ for (auto& videoTrack : videoTracks)
+ m_videoDeviceUIDs.append(videoTrack->id());
RefPtr<UserMediaRequest> protectedThis(this);
callOnMainThread([protectedThis] {
// 2 - The constraints are valid, ask the user for access to media.
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (187167 => 187168)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2015-07-22 18:09:08 UTC (rev 187168)
@@ -69,12 +69,15 @@
bool requiresAudio() const { return m_audioConstraints; }
bool requiresVideo() const { return m_videoConstraints; }
+
+ const Vector<String>& videoDeviceUIDs() const { return m_videoDeviceUIDs; }
+ const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; }
private:
UserMediaRequest(ScriptExecutionContext*, UserMediaController*, PassRefPtr<MediaConstraints> audioConstraints, PassRefPtr<MediaConstraints> videoConstraints, MediaDevices::Promise&&);
// MediaStreamCreationClient
- virtual void constraintsValidated() override final;
+ virtual void constraintsValidated(const Vector<RefPtr<RealtimeMediaSource>>&, const Vector<RefPtr<RealtimeMediaSource>>&) override final;
virtual void constraintsInvalid(const String& constraintName) override final;
virtual void didCreateStream(PassRefPtr<MediaStreamPrivate>) override final;
virtual void failedToCreateStreamWithConstraintsError(const String& constraintName) override final;
@@ -86,6 +89,9 @@
RefPtr<MediaConstraints> m_audioConstraints;
RefPtr<MediaConstraints> m_videoConstraints;
+ Vector<String> m_videoDeviceUIDs;
+ Vector<String> m_audioDeviceUIDs;
+
UserMediaController* m_controller;
MediaDevices::Promise m_promise;
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamCreationClient.h (187167 => 187168)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamCreationClient.h 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamCreationClient.h 2015-07-22 18:09:08 UTC (rev 187168)
@@ -38,7 +38,7 @@
public:
virtual ~MediaStreamCreationClient() { }
- virtual void constraintsValidated() = 0;
+ virtual void constraintsValidated(const Vector<RefPtr<RealtimeMediaSource>>& videoTracks, const Vector<RefPtr<RealtimeMediaSource>>& audioTracks) = 0;
virtual void constraintsInvalid(const String& constraintName) = 0;
virtual void didCreateStream(PassRefPtr<MediaStreamPrivate>) = 0;
Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h (187167 => 187168)
--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h 2015-07-22 18:09:08 UTC (rev 187168)
@@ -49,7 +49,7 @@
Vector<RefPtr<TrackSourceInfo>> getSourcesInfo(const String&);
bool verifyConstraintsForMediaType(RealtimeMediaSource::Type, MediaConstraints*, String&);
- RefPtr<RealtimeMediaSource> bestSourceForTypeAndConstraints(RealtimeMediaSource::Type, PassRefPtr<MediaConstraints>);
+ Vector<RefPtr<RealtimeMediaSource>> bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type, PassRefPtr<MediaConstraints>);
RefPtr<RealtimeMediaSource> sourceWithUID(String&, RealtimeMediaSource::Type, MediaConstraints*);
enum ValidConstraints { Width = 0, Height, FrameRate, FacingMode, Gain };
Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm (187167 => 187168)
--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm 2015-07-22 18:09:08 UTC (rev 187168)
@@ -378,39 +378,39 @@
return true;
}
-RefPtr<RealtimeMediaSource> AVCaptureDeviceManager::bestSourceForTypeAndConstraints(RealtimeMediaSource::Type type, PassRefPtr<MediaConstraints> constraints)
+Vector<RefPtr<RealtimeMediaSource>> AVCaptureDeviceManager::bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type type, PassRefPtr<MediaConstraints> constraints)
{
+ Vector<RefPtr<RealtimeMediaSource>> bestSourcesList;
+
if (!isAvailable())
- return 0;
+ return bestSourcesList;
- Vector<CaptureDevice>& devices = captureDeviceList();
- size_t count = devices.size();
- for (size_t i = 0; i < count; ++i) {
- if (!devices[i].m_enabled)
+ for (auto& captureDevice : captureDeviceList()) {
+ if (!captureDevice.m_enabled)
continue;
// FIXME: consider the constraints when choosing among multiple devices. For now just select the first available
// device of the appropriate type.
- if (type == RealtimeMediaSource::Audio && !devices[i].m_audioSourceId.isEmpty()) {
- if (!devices[i].m_audioSource) {
- AVCaptureDeviceType *device = [AVCaptureDevice deviceWithUniqueID:devices[i].m_captureDeviceID];
+ if (type == RealtimeMediaSource::Audio && !captureDevice.m_audioSourceId.isEmpty()) {
+ if (!captureDevice.m_audioSource) {
+ AVCaptureDeviceType *device = [AVCaptureDevice deviceWithUniqueID:captureDevice.m_captureDeviceID];
ASSERT(device);
- devices[i].m_audioSource = AVAudioCaptureSource::create(device, devices[i].m_audioSourceId, constraints);
+ captureDevice.m_audioSource = AVAudioCaptureSource::create(device, captureDevice.m_audioSourceId, constraints);
}
- return devices[i].m_audioSource;
+ bestSourcesList.append(captureDevice.m_audioSource);
}
- if (type == RealtimeMediaSource::Video && !devices[i].m_videoSourceId.isEmpty()) {
- if (!devices[i].m_videoSource) {
- AVCaptureDeviceType *device = [AVCaptureDevice deviceWithUniqueID:devices[i].m_captureDeviceID];
+ if (type == RealtimeMediaSource::Video && !captureDevice.m_videoSourceId.isEmpty()) {
+ if (!captureDevice.m_videoSource) {
+ AVCaptureDeviceType *device = [AVCaptureDevice deviceWithUniqueID:captureDevice.m_captureDeviceID];
ASSERT(device);
- devices[i].m_videoSource = AVVideoCaptureSource::create(device, devices[i].m_videoSourceId, constraints);
+ captureDevice.m_videoSource = AVVideoCaptureSource::create(device, captureDevice.m_videoSourceId, constraints);
}
- return devices[i].m_videoSource;
+ bestSourcesList.append(captureDevice.m_videoSource);
}
}
- return 0;
+ return bestSourcesList;
}
RefPtr<RealtimeMediaSource> AVCaptureDeviceManager::sourceWithUID(String &deviceUID, RealtimeMediaSource::Type type, MediaConstraints* constraints)
Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (187167 => 187168)
--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp 2015-07-22 18:09:08 UTC (rev 187168)
@@ -79,10 +79,11 @@
return;
}
}
+ Vector<RefPtr<RealtimeMediaSource>> bestVideoSources = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Video, videoConstraints);
+ Vector<RefPtr<RealtimeMediaSource>> bestAudioSources = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Audio, audioConstraints);
+ client->constraintsValidated(bestVideoSources, bestAudioSources);
+}
- client->constraintsValidated();
-}
-
void RealtimeMediaSourceCenterMac::createMediaStream(PassRefPtr<MediaStreamCreationClient> prpQueryClient, PassRefPtr<MediaConstraints> audioConstraints, PassRefPtr<MediaConstraints> videoConstraints)
{
RefPtr<MediaStreamCreationClient> client = prpQueryClient;
@@ -99,8 +100,9 @@
client->failedToCreateStreamWithConstraintsError(invalidConstraint);
return;
}
-
- RefPtr<RealtimeMediaSource> audioSource = AVCaptureDeviceManager::singleton().bestSourceForTypeAndConstraints(RealtimeMediaSource::Audio, audioConstraints.get());
+ // FIXME: Consider the constraints when choosing among multiple devices. For now just select the first available
+ // device of the appropriate type.
+ RefPtr<RealtimeMediaSource> audioSource = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Audio, audioConstraints.get()).at(0);
ASSERT(audioSource);
audioSources.append(audioSource.release());
@@ -113,8 +115,9 @@
client->failedToCreateStreamWithConstraintsError(invalidConstraint);
return;
}
-
- RefPtr<RealtimeMediaSource> videoSource = AVCaptureDeviceManager::singleton().bestSourceForTypeAndConstraints(RealtimeMediaSource::Video, videoConstraints.get());
+ // FIXME: Consider the constraints when choosing among multiple devices. For now just select the first available
+ // device of the appropriate type.
+ RefPtr<RealtimeMediaSource> videoSource = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Video, videoConstraints.get()).at(0);
ASSERT(videoSource);
videoSources.append(videoSource.release());
Modified: trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp (187167 => 187168)
--- trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/platform/mediastream/openwebrtc/RealtimeMediaSourceCenterOwr.cpp 2015-07-22 18:09:08 UTC (rev 187168)
@@ -168,7 +168,7 @@
}
// TODO: Make sure contraints are actually validated by checking source types.
- m_client->constraintsValidated();
+ m_client->constraintsValidated(Vector<RefPtr<RealtimeMediaSource>>(), Vector<RefPtr<RealtimeMediaSource>>());
}
PassRefPtr<RealtimeMediaSource> RealtimeMediaSourceCenterOwr::firstSource(RealtimeMediaSource::Type type)
Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (187167 => 187168)
--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp 2015-07-22 18:04:12 UTC (rev 187167)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp 2015-07-22 18:09:08 UTC (rev 187168)
@@ -149,7 +149,7 @@
}
}
- client->constraintsValidated();
+ client->constraintsValidated(Vector<RefPtr<RealtimeMediaSource>>(), Vector<RefPtr<RealtimeMediaSource>>());
}
void MockRealtimeMediaSourceCenter::createMediaStream(PassRefPtr<MediaStreamCreationClient> prpQueryClient, PassRefPtr<MediaConstraints> audioConstraints, PassRefPtr<MediaConstraints> videoConstraints)