Diff
Modified: trunk/Source/WebCore/ChangeLog (225394 => 225395)
--- trunk/Source/WebCore/ChangeLog 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/ChangeLog 2017-12-01 18:09:03 UTC (rev 225395)
@@ -1,3 +1,28 @@
+2017-12-01 Eric Carlson <[email protected]>
+
+ [MediaStream] Use CaptureDevice instead of device ID to identify devices
+ https://bugs.webkit.org/show_bug.cgi?id=180206
+ <rdar://problem/35775758>
+
+ Reviewed by Youenn Fablet.
+
+ No new tests, no change in behavior.
+
+ * Modules/mediastream/UserMediaRequest.cpp:
+ (WebCore::UserMediaRequest::allow):
+ * Modules/mediastream/UserMediaRequest.h:
+ (WebCore::UserMediaRequest::allowedAudioDeviceUID const): Deleted.
+ (WebCore::UserMediaRequest::allowedVideoDeviceUID const): Deleted.
+ * platform/mediastream/RealtimeMediaSource.h:
+ * platform/mediastream/RealtimeMediaSourceCenter.cpp:
+ (WebCore::RealtimeMediaSourceCenter::createMediaStream):
+ (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints):
+ * platform/mediastream/RealtimeMediaSourceCenter.h:
+ * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
+ * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+ * platform/mock/MockRealtimeAudioSource.cpp:
+ * platform/mock/MockRealtimeVideoSource.cpp:
+
2017-11-30 Alex Christensen <[email protected]>
Extra PerformanceEntryList entry after iframe navigation
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (225394 => 225395)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -36,6 +36,7 @@
#if ENABLE(MEDIA_STREAM)
+#include "CaptureDeviceManager.h"
#include "DeprecatedGlobalSettings.h"
#include "Document.h"
#include "DocumentLoader.h"
@@ -154,11 +155,11 @@
m_controller->requestUserMediaAccess(*this);
}
-void UserMediaRequest::allow(String&& audioDeviceUID, String&& videoDeviceUID, String&& deviceIdentifierHashSalt)
+void UserMediaRequest::allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt)
{
- RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDeviceUID.utf8().data(), videoDeviceUID.utf8().data());
- m_allowedAudioDeviceUID = WTFMove(audioDeviceUID);
- m_allowedVideoDeviceUID = WTFMove(videoDeviceUID);
+ RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDevice ? audioDevice.persistentId().utf8().data() : "", videoDevice ? videoDevice.persistentId().utf8().data() : "");
+ m_allowedAudioDevice = audioDevice;
+ m_allowedVideoDevice = videoDevice;
RefPtr<UserMediaRequest> protectedThis = this;
RealtimeMediaSourceCenter::NewMediaStreamHandler callback = [this, protectedThis = WTFMove(protectedThis)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
@@ -185,7 +186,7 @@
m_audioConstraints.deviceIDHashSalt = deviceIdentifierHashSalt;
m_videoConstraints.deviceIDHashSalt = WTFMove(deviceIdentifierHashSalt);
- RealtimeMediaSourceCenter::singleton().createMediaStream(WTFMove(callback), m_allowedAudioDeviceUID, m_allowedVideoDeviceUID, &m_audioConstraints, &m_videoConstraints);
+ RealtimeMediaSourceCenter::singleton().createMediaStream(WTFMove(callback), WTFMove(audioDevice), WTFMove(videoDevice), &m_audioConstraints, &m_videoConstraints);
if (!m_scriptExecutionContext)
return;
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (225394 => 225395)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -35,6 +35,7 @@
#if ENABLE(MEDIA_STREAM)
#include "ActiveDOMObject.h"
+#include "CaptureDevice.h"
#include "JSDOMPromiseDeferred.h"
#include "MediaConstraints.h"
@@ -53,7 +54,7 @@
void start();
WEBCORE_EXPORT void setAllowedMediaDeviceUIDs(const String& audioDeviceUID, const String& videoDeviceUID);
- WEBCORE_EXPORT void allow(String&& audioDeviceUID, String&& videoDeviceUID, String&& deviceIdentifierHashSalt);
+ WEBCORE_EXPORT void allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt);
enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, OtherFailure };
WEBCORE_EXPORT void deny(MediaAccessDenialReason, const String& invalidConstraint);
@@ -64,9 +65,6 @@
const MediaConstraints& audioConstraints() const { return m_audioConstraints; }
const MediaConstraints& videoConstraints() const { return m_videoConstraints; }
- const String& allowedAudioDeviceUID() const { return m_allowedAudioDeviceUID; }
- const String& allowedVideoDeviceUID() const { return m_allowedVideoDeviceUID; }
-
WEBCORE_EXPORT SecurityOrigin* userMediaDocumentOrigin() const;
WEBCORE_EXPORT SecurityOrigin* topLevelDocumentOrigin() const;
WEBCORE_EXPORT Document* document() const;
@@ -82,8 +80,8 @@
Vector<String> m_videoDeviceUIDs;
Vector<String> m_audioDeviceUIDs;
- String m_allowedVideoDeviceUID;
- String m_allowedAudioDeviceUID;
+ CaptureDevice m_allowedVideoDevice;
+ CaptureDevice m_allowedAudioDevice;
UserMediaController* m_controller;
DOMPromiseDeferred<IDLInterface<MediaStream>> m_promise;
Modified: trunk/Source/WebCore/platform/mediastream/CaptureDevice.h (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/CaptureDevice.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDevice.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -25,8 +25,6 @@
#pragma once
-#if ENABLE(MEDIA_STREAM)
-
#include <wtf/text/WTFString.h>
namespace WebCore {
@@ -60,6 +58,8 @@
bool enabled() const { return m_enabled; }
void setEnabled(bool enabled) { m_enabled = enabled; }
+ explicit operator bool() const { return m_type != DeviceType::Unknown; }
+
private:
String m_persistentId;
DeviceType m_type { DeviceType::Unknown };
@@ -70,4 +70,3 @@
} // namespace WebCore
-#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -66,7 +66,7 @@
return sourcesInfo;
}
-std::optional<CaptureDevice> CaptureDeviceManager::captureDeviceFromPersistentID(const String& captureDeviceID)
+CaptureDevice CaptureDeviceManager::captureDeviceFromPersistentID(const String& captureDeviceID)
{
for (auto& device : captureDevices()) {
if (device.persistentId() == captureDeviceID)
@@ -73,10 +73,10 @@
return device;
}
- return std::nullopt;
+ return { };
}
-std::optional<CaptureDevice> CaptureDeviceManager::deviceWithUID(const String& deviceUID, RealtimeMediaSource::Type type)
+CaptureDevice CaptureDeviceManager::deviceWithUID(const String& deviceUID, RealtimeMediaSource::Type type)
{
for (auto& captureDevice : captureDevices()) {
CaptureDevice::DeviceType deviceType;
@@ -101,7 +101,7 @@
return captureDevice;
}
- return std::nullopt;
+ return { };
}
static CaptureDeviceManager::ObserverToken nextObserverToken()
Modified: trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -43,11 +43,11 @@
virtual void refreshCaptureDevices() { }
virtual Vector<CaptureDevice> getAudioSourcesInfo();
virtual Vector<CaptureDevice> getVideoSourcesInfo();
- virtual std::optional<CaptureDevice> deviceWithUID(const String&, RealtimeMediaSource::Type);
+ virtual CaptureDevice deviceWithUID(const String&, RealtimeMediaSource::Type);
protected:
virtual ~CaptureDeviceManager();
- std::optional<CaptureDevice> captureDeviceFromPersistentID(const String& captureDeviceID);
+ CaptureDevice captureDeviceFromPersistentID(const String& captureDeviceID);
HashMap<ObserverToken, CaptureDeviceChangedCallback> m_observers;
};
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -113,7 +113,7 @@
{
public:
virtual ~AudioCaptureFactory() = default;
- virtual CaptureSourceOrError createAudioCaptureSource(const String& audioDeviceID, const MediaConstraints*) = 0;
+ virtual CaptureSourceOrError createAudioCaptureSource(const CaptureDevice&, const MediaConstraints*) = 0;
protected:
AudioCaptureFactory() = default;
@@ -126,7 +126,7 @@
{
public:
virtual ~VideoCaptureFactory() = default;
- virtual CaptureSourceOrError createVideoCaptureSource(const String& videoDeviceID, const MediaConstraints*) = 0;
+ virtual CaptureSourceOrError createVideoCaptureSource(const CaptureDevice&, const MediaConstraints*) = 0;
virtual void setVideoCapturePageState(bool, bool) { }
protected:
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -92,14 +92,14 @@
RealtimeMediaSourceCenter::~RealtimeMediaSourceCenter() = default;
-void RealtimeMediaSourceCenter::createMediaStream(NewMediaStreamHandler&& completionHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints)
+void RealtimeMediaSourceCenter::createMediaStream(NewMediaStreamHandler&& completionHandler, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints)
{
Vector<Ref<RealtimeMediaSource>> audioSources;
Vector<Ref<RealtimeMediaSource>> videoSources;
String invalidConstraint;
- if (!audioDeviceID.isEmpty()) {
- auto audioSource = audioFactory().createAudioCaptureSource(audioDeviceID, audioConstraints);
+ if (audioDevice) {
+ auto audioSource = audioFactory().createAudioCaptureSource(WTFMove(audioDevice), audioConstraints);
if (audioSource)
audioSources.append(audioSource.source());
else {
@@ -111,8 +111,9 @@
return;
}
}
- if (!videoDeviceID.isEmpty()) {
- auto videoSource = videoFactory().createVideoCaptureSource(videoDeviceID, videoConstraints);
+
+ if (videoDevice) {
+ auto videoSource = videoFactory().createVideoCaptureSource(WTFMove(videoDevice), videoConstraints);
if (videoSource)
videoSources.append(videoSource.source());
else {
@@ -170,7 +171,7 @@
return SHA1::hexDigest(digest).data();
}
-std::optional<CaptureDevice> RealtimeMediaSourceCenter::captureDeviceWithUniqueID(const String& uniqueID, const String& idHashSalt)
+CaptureDevice RealtimeMediaSourceCenter::captureDeviceWithUniqueID(const String& uniqueID, const String& idHashSalt)
{
for (auto& device : getMediaStreamDevices()) {
if (uniqueID == hashStringWithSalt(device.persistentId(), idHashSalt))
@@ -177,7 +178,7 @@
return device;
}
- return std::nullopt;
+ return { };
}
ExceptionOr<void> RealtimeMediaSourceCenter::setDeviceEnabled(const String& id, bool enabled)
@@ -221,7 +222,7 @@
{
struct DeviceInfo {
unsigned fitnessScore;
- String id;
+ CaptureDevice device;
};
struct {
@@ -242,13 +243,13 @@
String invalidConstraint;
CaptureSourceOrError sourceOrError;
if (device.type() == CaptureDevice::DeviceType::Video && videoConstraints.isValid) {
- auto sourceOrError = videoFactory().createVideoCaptureSource(device.persistentId(), nullptr);
+ auto sourceOrError = videoFactory().createVideoCaptureSource(device, nullptr);
if (sourceOrError && sourceOrError.captureSource->supportsConstraints(videoConstraints, invalidConstraint))
- videoDeviceInfo.append({sourceOrError.captureSource->fitnessScore(), device.persistentId()});
+ videoDeviceInfo.append({sourceOrError.captureSource->fitnessScore(), device});
} else if (device.type() == CaptureDevice::DeviceType::Audio && audioConstraints.isValid) {
- auto sourceOrError = audioFactory().createAudioCaptureSource(device.persistentId(), nullptr);
+ auto sourceOrError = audioFactory().createAudioCaptureSource(device, nullptr);
if (sourceOrError && sourceOrError.captureSource->supportsConstraints(audioConstraints, invalidConstraint))
- audioDeviceInfo.append({sourceOrError.captureSource->fitnessScore(), device.persistentId()});
+ audioDeviceInfo.append({sourceOrError.captureSource->fitnessScore(), device});
}
if (!invalidConstraint.isEmpty() && firstInvalidConstraint.isEmpty())
@@ -260,23 +261,23 @@
return;
}
- Vector<String> audioSourceIds;
+ Vector<CaptureDevice> audioDevices;
if (!audioDeviceInfo.isEmpty()) {
- audioSourceIds.reserveInitialCapacity(audioDeviceInfo.size());
std::sort(audioDeviceInfo.begin(), audioDeviceInfo.end(), sortBasedOnFitnessScore);
- for (auto& info : audioDeviceInfo)
- audioSourceIds.uncheckedAppend(WTFMove(info.id));
+ audioDevices = WTF::map(audioDeviceInfo, [] (auto& info) {
+ return info.device;
+ });
}
- Vector<String> videoSourceIds;
+ Vector<CaptureDevice> videoDevices;
if (!videoDeviceInfo.isEmpty()) {
- videoSourceIds.reserveInitialCapacity(videoDeviceInfo.size());
std::sort(videoDeviceInfo.begin(), videoDeviceInfo.end(), sortBasedOnFitnessScore);
- for (auto& info : videoDeviceInfo)
- videoSourceIds.uncheckedAppend(WTFMove(info.id));
+ videoDevices = WTF::map(videoDeviceInfo, [] (auto& info) {
+ return info.device;
+ });
}
- validHandler(WTFMove(audioSourceIds), WTFMove(videoSourceIds), WTFMove(deviceIdentifierHashSalt));
+ validHandler(WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(deviceIdentifierHashSalt));
}
void RealtimeMediaSourceCenter::setVideoCapturePageState(bool interrupted, bool pageMuted)
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -58,12 +58,12 @@
WEBCORE_EXPORT static RealtimeMediaSourceCenter& singleton();
static void setSharedStreamCenterOverride(RealtimeMediaSourceCenter*);
- using ValidConstraintsHandler = WTF::Function<void(Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&&)>;
+ using ValidConstraintsHandler = WTF::Function<void(Vector<CaptureDevice>&& audioDeviceUIDs, Vector<CaptureDevice>&& videoDeviceUIDs, String&&)>;
using InvalidConstraintsHandler = WTF::Function<void(const String& invalidConstraint)>;
virtual void validateRequestConstraints(ValidConstraintsHandler&&, InvalidConstraintsHandler&&, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints, String&&);
using NewMediaStreamHandler = std::function<void(RefPtr<MediaStreamPrivate>&&)>;
- virtual void createMediaStream(NewMediaStreamHandler&&, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints);
+ virtual void createMediaStream(NewMediaStreamHandler&&, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints);
WEBCORE_EXPORT virtual Vector<CaptureDevice> getMediaStreamDevices();
@@ -79,7 +79,7 @@
virtual CaptureDeviceManager& videoCaptureDeviceManager() = 0;
String hashStringWithSalt(const String& id, const String& hashSalt);
- WEBCORE_EXPORT std::optional<CaptureDevice> captureDeviceWithUniqueID(const String& id, const String& hashSalt);
+ WEBCORE_EXPORT CaptureDevice captureDeviceWithUniqueID(const String& id, const String& hashSalt);
WEBCORE_EXPORT ExceptionOr<void> setDeviceEnabled(const String&, bool);
using DevicesChangedObserverToken = unsigned;
Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm 2017-12-01 18:09:03 UTC (rev 225395)
@@ -127,8 +127,8 @@
if (!hasMatchingType)
continue;
- std::optional<CaptureDevice> existingCaptureDevice = captureDeviceFromPersistentID(platformDevice.uniqueID);
- if (existingCaptureDevice && existingCaptureDevice->type() == type)
+ CaptureDevice existingCaptureDevice = captureDeviceFromPersistentID(platformDevice.uniqueID);
+ if (existingCaptureDevice && existingCaptureDevice.type() == type)
continue;
CaptureDevice captureDevice(platformDevice.uniqueID, type, platformDevice.localizedName);
Modified: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -56,8 +56,9 @@
class CoreAudioCaptureSourceFactory : public RealtimeMediaSource::AudioCaptureFactory
{
public:
- CaptureSourceOrError createAudioCaptureSource(const String& deviceID, const MediaConstraints* constraints) final {
- return CoreAudioCaptureSource::create(deviceID, constraints);
+ CaptureSourceOrError createAudioCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final
+ {
+ return CoreAudioCaptureSource::create(device.persistentId(), constraints);
}
};
Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (225394 => 225395)
--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -47,9 +47,9 @@
class VideoCaptureSourceFactoryMac final : public RealtimeMediaSource::VideoCaptureFactory
{
public:
- CaptureSourceOrError createVideoCaptureSource(const String& id, const MediaConstraints* constraints) final
+ CaptureSourceOrError createVideoCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final
{
- return AVVideoCaptureSource::create(id, constraints);
+ return AVVideoCaptureSource::create(device.persistentId(), constraints);
}
#if PLATFORM(IOS)
Modified: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp (225394 => 225395)
--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -45,10 +45,11 @@
class MockRealtimeAudioSourceFactory : public RealtimeMediaSource::AudioCaptureFactory
{
public:
- CaptureSourceOrError createAudioCaptureSource(const String& deviceID, const MediaConstraints* constraints) final {
- for (auto& device : MockRealtimeMediaSource::audioDevices()) {
- if (device.persistentId() == deviceID)
- return MockRealtimeAudioSource::create(deviceID, device.label(), constraints);
+ CaptureSourceOrError createAudioCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final
+ {
+ for (auto& mockDevice : MockRealtimeMediaSource::audioDevices()) {
+ if (mockDevice.persistentId() == device.persistentId())
+ return MockRealtimeAudioSource::create(mockDevice.persistentId(), mockDevice.label(), constraints);
}
return { };
}
Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (225394 => 225395)
--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -52,13 +52,15 @@
class MockRealtimeVideoSourceFactory : public RealtimeMediaSource::VideoCaptureFactory
{
public:
- CaptureSourceOrError createVideoCaptureSource(const String& deviceID, const MediaConstraints* constraints) final {
- for (auto& device : MockRealtimeMediaSource::videoDevices()) {
- if (device.persistentId() == deviceID)
- return MockRealtimeVideoSource::create(deviceID, device.label(), constraints);
+ CaptureSourceOrError createVideoCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final
+ {
+ for (auto& mockDevice : MockRealtimeMediaSource::videoDevices()) {
+ if (mockDevice.persistentId() == device.persistentId())
+ return MockRealtimeVideoSource::create(mockDevice.persistentId(), mockDevice.label(), constraints);
}
return { };
}
+
#if PLATFORM(IOS)
private:
void setVideoCapturePageState(bool interrupted, bool pageMuted)
Modified: trunk/Source/WebCore/testing/Internals.cpp (225394 => 225395)
--- trunk/Source/WebCore/testing/Internals.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebCore/testing/Internals.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -4132,11 +4132,11 @@
return Exception { InvalidAccessError, makeString("\"" + property, "\" is not a valid property for this method.") };
auto salt = document->deviceIDHashSalt();
- std::optional<CaptureDevice> device = RealtimeMediaSourceCenter::singleton().captureDeviceWithUniqueID(id, salt);
+ CaptureDevice device = RealtimeMediaSourceCenter::singleton().captureDeviceWithUniqueID(id, salt);
if (!device)
return Exception { InvalidAccessError, makeString("device with ID \"" + id, "\" not found.") };
- auto result = RealtimeMediaSourceCenter::singleton().setDeviceEnabled(device->persistentId(), value);
+ auto result = RealtimeMediaSourceCenter::singleton().setDeviceEnabled(device.persistentId(), value);
if (result.hasException())
return result.releaseException();
Modified: trunk/Source/WebKit/ChangeLog (225394 => 225395)
--- trunk/Source/WebKit/ChangeLog 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/ChangeLog 2017-12-01 18:09:03 UTC (rev 225395)
@@ -1,3 +1,33 @@
+2017-12-01 Eric Carlson <[email protected]>
+
+ [MediaStream] Use CaptureDevice instead of device ID to identify devices
+ https://bugs.webkit.org/show_bug.cgi?id=180206
+ <rdar://problem/35775758>
+
+ Reviewed by Youenn Fablet.
+
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+ (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in:
+ * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+ (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted):
+ (WebKit::UserMediaPermissionRequestManagerProxy::grantAccess):
+ (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):
+ * UIProcess/UserMediaPermissionRequestManagerProxy.h:
+ * UIProcess/UserMediaPermissionRequestProxy.cpp:
+ (WebKit::UserMediaPermissionRequestProxy::allow):
+ * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:
+ (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted):
+ * WebProcess/MediaStream/UserMediaPermissionRequestManager.h:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::userMediaAccessWasGranted):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+ * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+ (WebKit::UserMediaCaptureManager::createCaptureSource):
+ * WebProcess/cocoa/UserMediaCaptureManager.h:
+
2017-12-01 Carlos Garcia Campos <[email protected]>
WebDriver: link and partial links queries don't work in xhtml documents
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (225394 => 225395)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -125,15 +125,15 @@
m_process.removeMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName());
}
-void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const String& deviceID, WebCore::RealtimeMediaSource::Type type, const MediaConstraints& constraints, bool& succeeded, String& invalidConstraints, WebCore::RealtimeMediaSourceSettings& settings)
+void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const CaptureDevice& device, WebCore::RealtimeMediaSource::Type type, const MediaConstraints& constraints, bool& succeeded, String& invalidConstraints, WebCore::RealtimeMediaSourceSettings& settings)
{
CaptureSourceOrError sourceOrError;
switch (type) {
case WebCore::RealtimeMediaSource::Type::Audio:
- sourceOrError = RealtimeMediaSourceCenter::singleton().audioFactory().createAudioCaptureSource(deviceID, &constraints);
+ sourceOrError = RealtimeMediaSourceCenter::singleton().audioFactory().createAudioCaptureSource(device, &constraints);
break;
case WebCore::RealtimeMediaSource::Type::Video:
- sourceOrError = RealtimeMediaSourceCenter::singleton().videoFactory().createVideoCaptureSource(deviceID, &constraints);
+ sourceOrError = RealtimeMediaSourceCenter::singleton().videoFactory().createVideoCaptureSource(device, &constraints);
break;
case WebCore::RealtimeMediaSource::Type::None:
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h (225394 => 225395)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -49,7 +49,7 @@
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
- void createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const String& deviceID, WebCore::RealtimeMediaSource::Type, const WebCore::MediaConstraints&, bool& succeeded, String& invalidConstraints, WebCore::RealtimeMediaSourceSettings&);
+ void createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const WebCore::CaptureDevice& deviceID, WebCore::RealtimeMediaSource::Type, const WebCore::MediaConstraints&, bool& succeeded, String& invalidConstraints, WebCore::RealtimeMediaSourceSettings&);
void startProducingData(uint64_t);
void stopProducingData(uint64_t);
void capabilities(uint64_t, WebCore::RealtimeMediaSourceCapabilities&);
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in (225394 => 225395)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in 2017-12-01 18:09:03 UTC (rev 225395)
@@ -22,7 +22,7 @@
# THE POSSIBILITY OF SUCH DAMAGE.
messages -> UserMediaCaptureManagerProxy {
- CreateMediaSourceForCaptureDeviceWithConstraints(uint64_t id, String deviceID, WebCore::RealtimeMediaSource::Type type, struct WebCore::MediaConstraints constraints) -> (bool success, String invalidConstraints, WebCore::RealtimeMediaSourceSettings settings)
+ CreateMediaSourceForCaptureDeviceWithConstraints(uint64_t id, WebCore::CaptureDevice device, WebCore::RealtimeMediaSource::Type type, struct WebCore::MediaConstraints constraints) -> (bool success, String invalidConstraints, WebCore::RealtimeMediaSourceSettings settings)
StartProducingData(uint64_t id)
StopProducingData(uint64_t id)
Capabilities(uint64_t id) -> (WebCore::RealtimeMediaSourceCapabilities capabilities)
Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (225394 => 225395)
--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -80,9 +80,9 @@
invalidatePendingRequests();
}
-Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
+Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin, Vector<CaptureDevice>&& audioDevices, Vector<CaptureDevice>&& videoDevices, String&& deviceIDHashSalt)
{
- auto request = UserMediaPermissionRequestProxy::create(*this, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIDHashSalt));
+ auto request = UserMediaPermissionRequestProxy::create(*this, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(deviceIDHashSalt));
m_pendingUserMediaRequests.add(userMediaID, request.ptr());
return request;
}
@@ -139,9 +139,9 @@
#endif
}
-void UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID)
+void UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted(uint64_t userMediaID, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice)
{
- ASSERT(!audioDeviceUID.isEmpty() || !videoDeviceUID.isEmpty());
+ ASSERT(audioDevice || videoDevice);
if (!m_page.isValid())
return;
@@ -151,12 +151,12 @@
if (!request)
return;
- grantAccess(userMediaID, audioDeviceUID, videoDeviceUID, request->deviceIdentifierHashSalt());
+ grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), request->deviceIdentifierHashSalt());
m_grantedRequests.append(request.releaseNonNull());
#else
UNUSED_PARAM(userMediaID);
- UNUSED_PARAM(audioDeviceUID);
- UNUSED_PARAM(videoDeviceUID);
+ UNUSED_PARAM(audioDevice);
+ UNUSED_PARAM(videoDevice);
#endif
}
@@ -185,10 +185,10 @@
if (grantedRequest->frameID() != frameID)
continue;
- if (!grantedRequest->videoDeviceUIDs().isEmpty())
+ if (grantedRequest->requiresVideo())
checkForVideo = false;
- if (!grantedRequest->audioDeviceUIDs().isEmpty())
+ if (grantedRequest->requiresAudio())
checkForAudio = false;
if (checkForVideo || checkForAudio)
@@ -216,10 +216,10 @@
return false;
}
-void UserMediaPermissionRequestManagerProxy::grantAccess(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID, const String& deviceIdentifierHashSalt)
+void UserMediaPermissionRequestManagerProxy::grantAccess(uint64_t userMediaID, const CaptureDevice audioDevice, const CaptureDevice videoDevice, const String& deviceIdentifierHashSalt)
{
- UserMediaProcessManager::singleton().willCreateMediaStream(*this, !audioDeviceUID.isEmpty(), !videoDeviceUID.isEmpty());
- m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(userMediaID, audioDeviceUID, videoDeviceUID, deviceIdentifierHashSalt), m_page.pageID());
+ UserMediaProcessManager::singleton().willCreateMediaStream(*this, !!audioDevice, !!videoDevice);
+ m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(userMediaID, audioDevice, videoDevice, deviceIdentifierHashSalt), m_page.pageID());
}
#endif
@@ -240,11 +240,6 @@
m_rejectionTimer.startOneShot(Seconds(mimimumDelayBeforeReplying + randomNumber()));
}
-static inline void allowRequest(UserMediaPermissionRequestProxy& request)
-{
- request.allow(request.audioDeviceUIDs().isEmpty() ? String() : request.audioDeviceUIDs()[0], request.videoDeviceUIDs().isEmpty() ? String() : request.videoDeviceUIDs()[0]);
-}
-
void UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, Ref<SecurityOrigin>&& userMediaDocumentOrigin, Ref<SecurityOrigin>&& topLevelDocumentOrigin, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints)
{
#if ENABLE(MEDIA_STREAM)
@@ -261,39 +256,42 @@
denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::InvalidConstraint, invalidConstraint);
};
- RealtimeMediaSourceCenter::ValidConstraintsHandler validHandler = [this, userMediaID, frameID, userMediaDocumentOrigin = userMediaDocumentOrigin.copyRef(), topLevelDocumentOrigin = topLevelDocumentOrigin.copyRef()](Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIdentifierHashSalt) mutable {
+ RealtimeMediaSourceCenter::ValidConstraintsHandler validHandler = [this, userMediaID, frameID, userMediaDocumentOrigin = userMediaDocumentOrigin.copyRef(), topLevelDocumentOrigin = topLevelDocumentOrigin.copyRef()](Vector<CaptureDevice>&& audioDevices, Vector<CaptureDevice>&& videoDevices, String&& deviceIdentifierHashSalt) mutable {
if (!m_page.isValid() || !m_page.mainFrame())
return;
- if (videoDeviceUIDs.isEmpty() && audioDeviceUIDs.isEmpty()) {
+ if (videoDevices.isEmpty() && audioDevices.isEmpty()) {
denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints, emptyString());
return;
}
- if (wasRequestDenied(m_page.mainFrame()->frameID(), userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDeviceUIDs.isEmpty(), !videoDeviceUIDs.isEmpty())) {
+ if (wasRequestDenied(m_page.mainFrame()->frameID(), userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDevices.isEmpty(), !videoDevices.isEmpty())) {
denyRequest(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied, emptyString());
return;
}
- auto* grantedRequest = searchForGrantedRequest(frameID, userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDeviceUIDs.isEmpty(), !videoDeviceUIDs.isEmpty());
+ auto* grantedRequest = searchForGrantedRequest(frameID, userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDevices.isEmpty(), !videoDevices.isEmpty());
if (grantedRequest) {
- if (m_page.isViewVisible())
+ if (m_page.isViewVisible()) {
// We select the first available devices, but the current client API allows client to select which device to pick.
// FIXME: Remove the possiblity for the client to do the device selection.
- grantAccess(userMediaID, audioDeviceUIDs.isEmpty() ? String() : audioDeviceUIDs[0], videoDeviceUIDs.isEmpty() ? String() : videoDeviceUIDs[0], grantedRequest->deviceIdentifierHashSalt());
- else
- m_pregrantedRequests.append(createRequest(userMediaID, m_page.mainFrame()->frameID(), frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), String(grantedRequest->deviceIdentifierHashSalt())));
+ auto audioDevice = !audioDevices.isEmpty() ? audioDevices[0] : CaptureDevice();
+ auto videoDevice = !videoDevices.isEmpty() ? videoDevices[0] : CaptureDevice();
+ grantAccess(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), grantedRequest->deviceIdentifierHashSalt());
+ } else
+ m_pregrantedRequests.append(createRequest(userMediaID, m_page.mainFrame()->frameID(), frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), String(grantedRequest->deviceIdentifierHashSalt())));
+
return;
}
auto userMediaOrigin = API::SecurityOrigin::create(userMediaDocumentOrigin.get());
auto topLevelOrigin = API::SecurityOrigin::create(topLevelDocumentOrigin.get());
- auto request = createRequest(userMediaID, m_page.mainFrame()->frameID(), frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIdentifierHashSalt));
+ auto request = createRequest(userMediaID, m_page.mainFrame()->frameID(), frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(deviceIdentifierHashSalt));
if (m_page.isControlledByAutomation()) {
if (WebAutomationSession* automationSession = m_page.process().processPool().automationSession()) {
if (automationSession->shouldAllowGetUserMediaForPage(m_page))
- allowRequest(request);
+ request->allow();
else
userMediaAccessWasDenied(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied);
@@ -302,7 +300,7 @@
}
if (m_page.preferences().mockCaptureDevicesEnabled() && !m_page.preferences().mockCaptureDevicesPromptEnabled()) {
- allowRequest(request);
+ request->allow();
return;
}
@@ -425,7 +423,7 @@
void UserMediaPermissionRequestManagerProxy::processPregrantedRequests()
{
for (auto& request : m_pregrantedRequests)
- allowRequest(request.get());
+ request->allow();
m_pregrantedRequests.clear();
}
Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h (225394 => 225395)
--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -51,7 +51,7 @@
void resetAccess(uint64_t mainFrameID);
void processPregrantedRequests();
- void userMediaAccessWasGranted(uint64_t, const String& audioDeviceUID, const String& videoDeviceUID);
+ void userMediaAccessWasGranted(uint64_t, WebCore::CaptureDevice&& audioDevice, WebCore::CaptureDevice&& videoDevice);
void userMediaAccessWasDenied(uint64_t, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason);
void enumerateMediaDevicesForFrame(uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin);
@@ -64,10 +64,10 @@
void captureStateChanged(WebCore::MediaProducer::MediaStateFlags oldState, WebCore::MediaProducer::MediaStateFlags newState);
private:
- Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&&);
+ Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, String&&);
void denyRequest(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason, const String& invalidConstraint);
#if ENABLE(MEDIA_STREAM)
- void grantAccess(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID, const String& deviceIdentifierHashSalt);
+ void grantAccess(uint64_t userMediaID, const WebCore::CaptureDevice audioDevice, const WebCore::CaptureDevice videoDevice, const String& deviceIdentifierHashSalt);
const UserMediaPermissionRequestProxy* searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const;
bool wasRequestDenied(uint64_t mainFrameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo);
Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp (225394 => 225395)
--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -21,6 +21,7 @@
#include "UserMediaPermissionRequestProxy.h"
#include "UserMediaPermissionRequestManagerProxy.h"
+#include <WebCore/CaptureDeviceManager.h>
#include <WebCore/RealtimeMediaSourceCenter.h>
#include <WebCore/SecurityOrigin.h>
#include <WebCore/SecurityOriginData.h>
@@ -30,7 +31,7 @@
namespace WebKit {
-UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
+UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, String&& deviceIDHashSalt)
: m_manager(&manager)
, m_userMediaID(userMediaID)
, m_mainFrameID(mainFrameID)
@@ -37,8 +38,8 @@
, m_frameID(frameID)
, m_userMediaDocumentSecurityOrigin(WTFMove(userMediaDocumentOrigin))
, m_topLevelDocumentSecurityOrigin(WTFMove(topLevelDocumentOrigin))
- , m_videoDeviceUIDs(WTFMove(videoDeviceUIDs))
- , m_audioDeviceUIDs(WTFMove(audioDeviceUIDs))
+ , m_eligibleVideoDevices(WTFMove(videoDevices))
+ , m_eligibleAudioDevices(WTFMove(audioDevices))
, m_deviceIdentifierHashSalt(WTFMove(deviceIDHashSalt))
{
}
@@ -49,10 +50,41 @@
if (!m_manager)
return;
- m_manager->userMediaAccessWasGranted(m_userMediaID, audioDeviceUID, videoDeviceUID);
+#if ENABLE(MEDIA_STREAM)
+ CaptureDevice audioDevice;
+ if (!audioDeviceUID.isEmpty()) {
+ audioDevice = RealtimeMediaSourceCenter::singleton().audioCaptureDeviceManager().deviceWithUID(audioDeviceUID, RealtimeMediaSource::Type::Audio);
+ ASSERT(audioDevice);
+ }
+
+ CaptureDevice videoDevice;
+ if (!videoDeviceUID.isEmpty()) {
+ videoDevice = RealtimeMediaSourceCenter::singleton().videoCaptureDeviceManager().deviceWithUID(videoDeviceUID, RealtimeMediaSource::Type::Video);
+ ASSERT(videoDevice);
+ }
+
+ m_manager->userMediaAccessWasGranted(m_userMediaID, WTFMove(audioDevice), WTFMove(videoDevice));
+#else
+ UNUSED_PARAM(audioDeviceUID);
+ UNUSED_PARAM(videoDeviceUID);
+#endif
+
invalidate();
}
+void UserMediaPermissionRequestProxy::allow()
+{
+ ASSERT(m_manager);
+ if (!m_manager)
+ return;
+
+ auto audioDevice = !m_eligibleAudioDevices.isEmpty() ? m_eligibleAudioDevices[0] : CaptureDevice();
+ auto videoDevice = !m_eligibleVideoDevices.isEmpty() ? m_eligibleVideoDevices[0] : CaptureDevice();
+
+ m_manager->userMediaAccessWasGranted(m_userMediaID, WTFMove(audioDevice), WTFMove(videoDevice));
+ invalidate();
+}
+
void UserMediaPermissionRequestProxy::deny(UserMediaAccessDenialReason reason)
{
if (!m_manager)
@@ -67,4 +99,18 @@
m_manager = nullptr;
}
+Vector<String> UserMediaPermissionRequestProxy::videoDeviceUIDs() const
+{
+ return WTF::map(m_eligibleVideoDevices, [] (auto& device) {
+ return device.persistentId();
+ });
+}
+
+Vector<String> UserMediaPermissionRequestProxy::audioDeviceUIDs() const
+{
+ return WTF::map(m_eligibleAudioDevices, [] (auto& device) {
+ return device.persistentId();
+ });
+}
+
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h (225394 => 225395)
--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -20,6 +20,7 @@
#pragma once
#include "APIObject.h"
+#include <WebCore/CaptureDevice.h>
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
@@ -33,12 +34,13 @@
class UserMediaPermissionRequestProxy : public API::ObjectImpl<API::Object::Type::UserMediaPermissionRequest> {
public:
- static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& videoDeviceUIDs, Vector<String>&& audioDeviceUIDs, String&& deviceIDHashSalt)
+ static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& videoDevices, Vector<WebCore::CaptureDevice>&& audioDevices, String&& deviceIDHashSalt)
{
- return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(videoDeviceUIDs), WTFMove(audioDeviceUIDs), WTFMove(deviceIDHashSalt)));
+ return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(videoDevices), WTFMove(audioDevices), WTFMove(deviceIDHashSalt)));
}
void allow(const String& videoDeviceUID, const String& audioDeviceUID);
+ void allow();
enum class UserMediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, OtherFailure };
void deny(UserMediaAccessDenialReason);
@@ -45,11 +47,11 @@
void invalidate();
- bool requiresAudio() const { return m_audioDeviceUIDs.size(); }
- bool requiresVideo() const { return m_videoDeviceUIDs.size(); }
+ bool requiresAudio() const { return m_eligibleAudioDevices.size(); }
+ bool requiresVideo() const { return m_eligibleVideoDevices.size(); }
- const Vector<String>& videoDeviceUIDs() const { return m_videoDeviceUIDs; }
- const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; }
+ Vector<String> videoDeviceUIDs() const;
+ Vector<String> audioDeviceUIDs() const;
uint64_t mainFrameID() const { return m_mainFrameID; }
uint64_t frameID() const { return m_frameID; }
@@ -59,7 +61,7 @@
const String& deviceIdentifierHashSalt() const { return m_deviceIdentifierHashSalt; }
private:
- UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& videoDeviceUIDs, Vector<String>&& audioDeviceUIDs, String&&);
+ UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& videoDevices, Vector<WebCore::CaptureDevice>&& audioDevices, String&&);
UserMediaPermissionRequestManagerProxy* m_manager;
uint64_t m_userMediaID;
@@ -67,8 +69,8 @@
uint64_t m_frameID;
Ref<WebCore::SecurityOrigin> m_userMediaDocumentSecurityOrigin;
Ref<WebCore::SecurityOrigin> m_topLevelDocumentSecurityOrigin;
- Vector<String> m_videoDeviceUIDs;
- Vector<String> m_audioDeviceUIDs;
+ Vector<WebCore::CaptureDevice> m_eligibleVideoDevices;
+ Vector<WebCore::CaptureDevice> m_eligibleAudioDevices;
String m_deviceIdentifierHashSalt;
};
Modified: trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp (225394 => 225395)
--- trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -146,7 +146,7 @@
m_userMediaRequestToIDMap.remove(&request);
}
-void UserMediaPermissionRequestManager::userMediaAccessWasGranted(uint64_t requestID, String&& audioDeviceUID, String&& videoDeviceUID, String&& deviceIdentifierHashSalt)
+void UserMediaPermissionRequestManager::userMediaAccessWasGranted(uint64_t requestID, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt)
{
auto request = m_idToUserMediaRequestMap.take(requestID);
if (!request)
@@ -153,7 +153,7 @@
return;
removeMediaRequestFromMaps(*request);
- request->allow(WTFMove(audioDeviceUID), WTFMove(videoDeviceUID), WTFMove(deviceIdentifierHashSalt));
+ request->allow(WTFMove(audioDevice), WTFMove(videoDevice), WTFMove(deviceIdentifierHashSalt));
}
void UserMediaPermissionRequestManager::userMediaAccessWasDenied(uint64_t requestID, WebCore::UserMediaRequest::MediaAccessDenialReason reason, String&& invalidConstraint)
Modified: trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h (225394 => 225395)
--- trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -45,7 +45,7 @@
void startUserMediaRequest(WebCore::UserMediaRequest&);
void cancelUserMediaRequest(WebCore::UserMediaRequest&);
- void userMediaAccessWasGranted(uint64_t, String&& audioDeviceUID, String&& videoDeviceUID, String&& deviceIdentifierHashSalt);
+ void userMediaAccessWasGranted(uint64_t, WebCore::CaptureDevice&& audioDevice, WebCore::CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt);
void userMediaAccessWasDenied(uint64_t, WebCore::UserMediaRequest::MediaAccessDenialReason, String&&);
void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&);
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (225394 => 225395)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -3588,9 +3588,9 @@
}
#endif
-void WebPage::userMediaAccessWasGranted(uint64_t userMediaID, String&& audioDeviceUID, String&& videoDeviceUID, String&& mediaDeviceIdentifierHashSalt)
+void WebPage::userMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice&& audioDevice, WebCore::CaptureDevice&& videoDevice, String&& mediaDeviceIdentifierHashSalt)
{
- m_userMediaPermissionRequestManager->userMediaAccessWasGranted(userMediaID, WTFMove(audioDeviceUID), WTFMove(videoDeviceUID), WTFMove(mediaDeviceIdentifierHashSalt));
+ m_userMediaPermissionRequestManager->userMediaAccessWasGranted(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), WTFMove(mediaDeviceIdentifierHashSalt));
}
void WebPage::userMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String&& invalidConstraint)
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (225394 => 225395)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -1226,7 +1226,7 @@
void didReceiveNotificationPermissionDecision(uint64_t notificationID, bool allowed);
#if ENABLE(MEDIA_STREAM)
- void userMediaAccessWasGranted(uint64_t userMediaID, String&& audioDeviceUID, String&& videoDeviceUID, String&& mediaDeviceIdentifierHashSalt);
+ void userMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice&& audioDeviceUID, WebCore::CaptureDevice&& videoDeviceUID, String&& mediaDeviceIdentifierHashSalt);
void userMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String&& invalidConstraint);
void didCompleteMediaDeviceEnumeration(uint64_t userMediaID, const Vector<WebCore::CaptureDevice>& devices, String&& deviceIdentifierHashSalt, bool originHasPersistentAccess);
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (225394 => 225395)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2017-12-01 18:09:03 UTC (rev 225395)
@@ -301,7 +301,7 @@
#if ENABLE(MEDIA_STREAM)
# MediaSteam
- UserMediaAccessWasGranted(uint64_t userMediaID, String audioDeviceUID, String videoDeviceUID, String mediaDeviceIdentifierHashSalt)
+ UserMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice audioDevice, WebCore::CaptureDevice videoDevice, String mediaDeviceIdentifierHashSalt)
UserMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String invalidConstraint)
DidCompleteMediaDeviceEnumeration(uint64_t userMediaID, Vector<WebCore::CaptureDevice> devices, String mediaDeviceIdentifierHashSalt, bool hasPersistentAccess)
#if ENABLE(SANDBOX_EXTENSIONS)
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (225394 => 225395)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2017-12-01 18:09:03 UTC (rev 225395)
@@ -175,7 +175,7 @@
RealtimeMediaSourceCenter::singleton().setAudioFactory(*this);
}
-WebCore::CaptureSourceOrError UserMediaCaptureManager::createCaptureSource(const String& deviceID, WebCore::RealtimeMediaSource::Type sourceType, const WebCore::MediaConstraints* constraints)
+WebCore::CaptureSourceOrError UserMediaCaptureManager::createCaptureSource(const CaptureDevice& device, WebCore::RealtimeMediaSource::Type sourceType, const WebCore::MediaConstraints* constraints)
{
if (!constraints)
return { };
@@ -184,7 +184,7 @@
RealtimeMediaSourceSettings settings;
String errorMessage;
bool succeeded;
- if (!m_process.sendSync(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(id, deviceID, sourceType, *constraints), Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints::Reply(succeeded, errorMessage, settings), 0))
+ if (!m_process.sendSync(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(id, device, sourceType, *constraints), Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints::Reply(succeeded, errorMessage, settings), 0))
return WTFMove(errorMessage);
auto source = adoptRef(*new Source(String::number(id), sourceType, settings.label(), id, *this));
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (225394 => 225395)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2017-12-01 17:51:17 UTC (rev 225394)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2017-12-01 18:09:03 UTC (rev 225395)
@@ -54,9 +54,9 @@
void initialize(const WebProcessCreationParameters&) final;
// WebCore::RealtimeMediaSource factories
- WebCore::CaptureSourceOrError createAudioCaptureSource(const String& deviceID, const WebCore::MediaConstraints* constraints) final { return createCaptureSource(deviceID, WebCore::RealtimeMediaSource::Type::Audio, constraints); }
- WebCore::CaptureSourceOrError createVideoCaptureSource(const String& deviceID, const WebCore::MediaConstraints* constraints) final { return createCaptureSource(deviceID, WebCore::RealtimeMediaSource::Type::Video, constraints); }
- WebCore::CaptureSourceOrError createCaptureSource(const String& deviceID, WebCore::RealtimeMediaSource::Type, const WebCore::MediaConstraints*);
+ WebCore::CaptureSourceOrError createAudioCaptureSource(const WebCore::CaptureDevice& device, const WebCore::MediaConstraints* constraints) final { return createCaptureSource(device, WebCore::RealtimeMediaSource::Type::Audio, constraints); }
+ WebCore::CaptureSourceOrError createVideoCaptureSource(const WebCore::CaptureDevice& device, const WebCore::MediaConstraints* constraints) final { return createCaptureSource(device, WebCore::RealtimeMediaSource::Type::Video, constraints); }
+ WebCore::CaptureSourceOrError createCaptureSource(const WebCore::CaptureDevice&, WebCore::RealtimeMediaSource::Type, const WebCore::MediaConstraints*);
// IPC::MessageReceiver
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;