Title: [225395] trunk/Source
Revision
225395
Author
[email protected]
Date
2017-12-01 10:09:03 -0800 (Fri, 01 Dec 2017)

Log Message

[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.

Source/WebCore:

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:

Source/WebKit:

* 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:

Modified Paths

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;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to