Title: [239024] trunk/Source
Revision
239024
Author
you...@apple.com
Date
2018-12-09 21:30:23 -0800 (Sun, 09 Dec 2018)

Log Message

Move capture manager from RealtimeMediaSourceCenter to capture factory
https://bugs.webkit.org/show_bug.cgi?id=192542

Reviewed by Eric Carlson.

Source/WebCore:

We should be able to run mock captures in wither UIProcess or WebProcess.
Currently, mock capture is only done in WebProcess.
This patch is a first step towards that goal.

It also simplifies RealtimeMediaSourceCenter implementation by starting to remove virtual methods.
Further refactoring will remove the need to subclass RealtimeMediaSourceCenter.
Instead, remaining virtual methods will become non virtual and their
implementation will become port specific.

Removed a JS internal method that is not longer used to further simplify RealtimeMediaSourceCenter.

No visible change of behavior.
Covered by existing tests.

* platform/mediastream/CaptureDeviceManager.h:
* platform/mediastream/RealtimeMediaSourceCenter.cpp:
(WebCore::RealtimeMediaSourceCenter::singleton):
(WebCore::RealtimeMediaSourceCenter::getMediaStreamDevices):
(WebCore::RealtimeMediaSourceCenter::getDisplayMediaDevices):
(WebCore::RealtimeMediaSourceCenter::getUserMediaDevices):
(WebCore::RealtimeMediaSourceCenter::captureDeviceWithPersistentID):
(WebCore::RealtimeMediaSourceCenter::unsetAudioFactory):
(WebCore::RealtimeMediaSourceCenter::unsetVideoFactory):
(WebCore::RealtimeMediaSourceCenter::unsetDisplayCaptureFactory):
* platform/mediastream/RealtimeMediaSourceCenter.h:
* platform/mediastream/RealtimeMediaSourceFactory.h:
* platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp:
* platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp:
* platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.cpp:
* platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.h:
* platform/mediastream/mac/CoreAudioCaptureSource.cpp:
(WebCore::CoreAudioCaptureSourceFactory::audioCaptureDeviceManager):
* platform/mediastream/mac/CoreAudioCaptureSource.h:
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:
* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled):
(WebCore::MockRealtimeMediaSourceCenter::audioFactory):
(WebCore::MockRealtimeMediaSourceCenter::videoFactory):
(WebCore::MockRealtimeMediaSourceCenter::displayCaptureFactory):
* platform/mock/MockRealtimeMediaSourceCenter.h:
(WebCore::MockRealtimeMediaSourceCenter::audioCaptureDeviceManager):
(WebCore::MockRealtimeMediaSourceCenter::videoCaptureDeviceManager):
(WebCore::MockRealtimeMediaSourceCenter::displayCaptureDeviceManager):
* testing/Internals.cpp:
* testing/Internals.h:
* testing/Internals.idl:

Source/WebKit:

Make sure to unregister for video capture as done for other capture types.
Implement manager which should be doing nothing as the manager is used for enumeration of devices
which should only happen in UIProcess.

Given that mock capture is interfering with UserMediaCaptureManager,
switching on/off mock capture will require creating a new process.
This shortcoming should be fixed once mock capture will be fully happening in
the same process as regular capture.

* WebProcess/cocoa/UserMediaCaptureManager.cpp:
(WebKit::UserMediaCaptureManager::~UserMediaCaptureManager):
* WebProcess/cocoa/UserMediaCaptureManager.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (239023 => 239024)


--- trunk/Source/WebCore/ChangeLog	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/ChangeLog	2018-12-10 05:30:23 UTC (rev 239024)
@@ -1,3 +1,58 @@
+2018-12-09  Youenn Fablet  <you...@apple.com>
+
+        Move capture manager from RealtimeMediaSourceCenter to capture factory
+        https://bugs.webkit.org/show_bug.cgi?id=192542
+
+        Reviewed by Eric Carlson.
+
+        We should be able to run mock captures in wither UIProcess or WebProcess.
+        Currently, mock capture is only done in WebProcess.
+        This patch is a first step towards that goal.
+
+        It also simplifies RealtimeMediaSourceCenter implementation by starting to remove virtual methods.
+        Further refactoring will remove the need to subclass RealtimeMediaSourceCenter.
+        Instead, remaining virtual methods will become non virtual and their
+        implementation will become port specific.
+
+        Removed a JS internal method that is not longer used to further simplify RealtimeMediaSourceCenter.
+
+        No visible change of behavior.
+        Covered by existing tests.
+
+        * platform/mediastream/CaptureDeviceManager.h:
+        * platform/mediastream/RealtimeMediaSourceCenter.cpp:
+        (WebCore::RealtimeMediaSourceCenter::singleton):
+        (WebCore::RealtimeMediaSourceCenter::getMediaStreamDevices):
+        (WebCore::RealtimeMediaSourceCenter::getDisplayMediaDevices):
+        (WebCore::RealtimeMediaSourceCenter::getUserMediaDevices):
+        (WebCore::RealtimeMediaSourceCenter::captureDeviceWithPersistentID):
+        (WebCore::RealtimeMediaSourceCenter::unsetAudioFactory):
+        (WebCore::RealtimeMediaSourceCenter::unsetVideoFactory):
+        (WebCore::RealtimeMediaSourceCenter::unsetDisplayCaptureFactory):
+        * platform/mediastream/RealtimeMediaSourceCenter.h:
+        * platform/mediastream/RealtimeMediaSourceFactory.h:
+        * platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp:
+        * platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp:
+        * platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.cpp:
+        * platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.h:
+        * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
+        (WebCore::CoreAudioCaptureSourceFactory::audioCaptureDeviceManager):
+        * platform/mediastream/mac/CoreAudioCaptureSource.h:
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled):
+        (WebCore::MockRealtimeMediaSourceCenter::audioFactory):
+        (WebCore::MockRealtimeMediaSourceCenter::videoFactory):
+        (WebCore::MockRealtimeMediaSourceCenter::displayCaptureFactory):
+        * platform/mock/MockRealtimeMediaSourceCenter.h:
+        (WebCore::MockRealtimeMediaSourceCenter::audioCaptureDeviceManager):
+        (WebCore::MockRealtimeMediaSourceCenter::videoCaptureDeviceManager):
+        (WebCore::MockRealtimeMediaSourceCenter::displayCaptureDeviceManager):
+        * testing/Internals.cpp:
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
 2018-12-09  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, rolling out r239010.

Modified: trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -33,7 +33,7 @@
 
 namespace WebCore {
 
-class CaptureDeviceManager : public CanMakeWeakPtr<CaptureDeviceManager> {
+class WEBCORE_EXPORT CaptureDeviceManager : public CanMakeWeakPtr<CaptureDeviceManager> {
 public:
     virtual const Vector<CaptureDevice>& captureDevices() = 0;
     virtual std::optional<CaptureDevice> captureDeviceWithPersistentID(CaptureDevice::DeviceType, const String&) { return std::nullopt; }

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -35,11 +35,6 @@
 
 #if ENABLE(MEDIA_STREAM)
 
-// FIXME: GTK to implement its own RealtimeMediaSourceCenter.
-#if PLATFORM(GTK)
-#include "MockRealtimeMediaSourceCenter.h"
-#endif
-
 #include "CaptureDeviceManager.h"
 #include "Logging.h"
 #include "MediaStreamPrivate.h"
@@ -47,25 +42,12 @@
 
 namespace WebCore {
 
-static RealtimeMediaSourceCenter*& mediaStreamCenterOverride()
-{
-    static RealtimeMediaSourceCenter* override;
-    return override;
-}
 
 RealtimeMediaSourceCenter& RealtimeMediaSourceCenter::singleton()
 {
-    RealtimeMediaSourceCenter* override = mediaStreamCenterOverride();
-    if (override)
-        return *override;
     return RealtimeMediaSourceCenter::platformCenter();
 }
 
-void RealtimeMediaSourceCenter::setSharedStreamCenterOverride(RealtimeMediaSourceCenter* center)
-{
-    mediaStreamCenterOverride() = center;
-}
-
 RealtimeMediaSourceCenter::RealtimeMediaSourceCenter()
 {
     m_supportedConstraints.setSupportsWidth(true);
@@ -124,15 +106,15 @@
 Vector<CaptureDevice> RealtimeMediaSourceCenter::getMediaStreamDevices()
 {
     Vector<CaptureDevice> result;
-    for (auto& device : audioCaptureDeviceManager().captureDevices()) {
+    for (auto& device : audioFactory().audioCaptureDeviceManager().captureDevices()) {
         if (device.enabled())
             result.append(device);
     }
-    for (auto& device : videoCaptureDeviceManager().captureDevices()) {
+    for (auto& device : videoFactory().videoCaptureDeviceManager().captureDevices()) {
         if (device.enabled())
             result.append(device);
     }
-    for (auto& device : displayCaptureDeviceManager().captureDevices()) {
+    for (auto& device : displayCaptureFactory().displayCaptureDeviceManager().captureDevices()) {
         if (device.enabled())
             result.append(device);
     }
@@ -172,32 +154,6 @@
     return SHA1::hexDigest(digest).data();
 }
 
-CaptureDevice RealtimeMediaSourceCenter::captureDeviceWithUniqueID(const String& uniqueID, const String& idHashSalt)
-{
-    for (auto& device : getMediaStreamDevices()) {
-        if (uniqueID == hashStringWithSalt(device.persistentId(), idHashSalt))
-            return device;
-    }
-
-    return { };
-}
-
-ExceptionOr<void> RealtimeMediaSourceCenter::setDeviceEnabled(const String& id, bool enabled)
-{
-    for (auto& captureDevice : getMediaStreamDevices()) {
-        if (id == captureDevice.persistentId()) {
-            if (enabled != captureDevice.enabled()) {
-                captureDevice.setEnabled(enabled);
-                captureDevicesChanged();
-            }
-
-            return { };
-        }
-    }
-
-    return Exception { NotFoundError };
-}
-
 void RealtimeMediaSourceCenter::setDevicesChangedObserver(std::function<void()>&& observer)
 {
     ASSERT(isMainThread());
@@ -218,7 +174,7 @@
         return;
 
     String invalidConstraint;
-    for (auto& device : displayCaptureDeviceManager().captureDevices()) {
+    for (auto& device : displayCaptureFactory().displayCaptureDeviceManager().captureDevices()) {
         if (!device.enabled())
             return;
 
@@ -235,7 +191,7 @@
 {
     String invalidConstraint;
     if (request.audioConstraints.isValid) {
-        for (auto& device : audioCaptureDeviceManager().captureDevices()) {
+        for (auto& device : audioFactory().audioCaptureDeviceManager().captureDevices()) {
             if (!device.enabled())
                 continue;
 
@@ -249,7 +205,7 @@
     }
 
     if (request.videoConstraints.isValid) {
-        for (auto& device : videoCaptureDeviceManager().captureDevices()) {
+        for (auto& device : videoFactory().videoCaptureDeviceManager().captureDevices()) {
             if (!device.enabled())
                 continue;
 
@@ -314,16 +270,16 @@
 {
     switch (type) {
     case CaptureDevice::DeviceType::Camera:
-        return videoCaptureDeviceManager().captureDeviceWithPersistentID(type, id);
+        return videoFactory().videoCaptureDeviceManager().captureDeviceWithPersistentID(type, id);
         break;
     case CaptureDevice::DeviceType::Microphone:
-        return audioCaptureDeviceManager().captureDeviceWithPersistentID(type, id);
+        return audioFactory().audioCaptureDeviceManager().captureDeviceWithPersistentID(type, id);
         break;
     case CaptureDevice::DeviceType::Screen:
     case CaptureDevice::DeviceType::Application:
     case CaptureDevice::DeviceType::Window:
     case CaptureDevice::DeviceType::Browser:
-        return displayCaptureDeviceManager().captureDeviceWithPersistentID(type, id);
+        return displayCaptureFactory().displayCaptureDeviceManager().captureDeviceWithPersistentID(type, id);
         break;
     case CaptureDevice::DeviceType::Unknown:
         ASSERT_NOT_REACHED();
@@ -341,7 +297,8 @@
 void RealtimeMediaSourceCenter::unsetAudioFactory(AudioCaptureFactory& oldOverride)
 {
     ASSERT_UNUSED(oldOverride, audioFactoryOverride == &oldOverride);
-    audioFactoryOverride = nullptr;
+    if (&oldOverride == audioFactoryOverride)
+        audioFactoryOverride = nullptr;
 }
 
 AudioCaptureFactory& RealtimeMediaSourceCenter::audioFactory()
@@ -357,7 +314,8 @@
 void RealtimeMediaSourceCenter::unsetVideoFactory(VideoCaptureFactory& oldOverride)
 {
     ASSERT_UNUSED(oldOverride, videoFactoryOverride == &oldOverride);
-    videoFactoryOverride = nullptr;
+    if (&oldOverride == videoFactoryOverride)
+        videoFactoryOverride = nullptr;
 }
 
 VideoCaptureFactory& RealtimeMediaSourceCenter::videoFactory()
@@ -373,7 +331,8 @@
 void RealtimeMediaSourceCenter::unsetDisplayCaptureFactory(DisplayCaptureFactory& oldOverride)
 {
     ASSERT_UNUSED(oldOverride, displayCaptureFactoryOverride == &oldOverride);
-    displayCaptureFactoryOverride = nullptr;
+    if (&oldOverride == displayCaptureFactoryOverride)
+        displayCaptureFactoryOverride = nullptr;
 }
 
 DisplayCaptureFactory& RealtimeMediaSourceCenter::displayCaptureFactory()

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -55,10 +55,10 @@
     
 class RealtimeMediaSourceCenter {
 public:
+    static RealtimeMediaSourceCenter& platformCenter();
     virtual ~RealtimeMediaSourceCenter();
 
     WEBCORE_EXPORT static RealtimeMediaSourceCenter& singleton();
-    static void setSharedStreamCenterOverride(RealtimeMediaSourceCenter*);
 
     using ValidConstraintsHandler = WTF::Function<void(Vector<CaptureDevice>&& audioDeviceUIDs, Vector<CaptureDevice>&& videoDeviceUIDs, String&&)>;
     using InvalidConstraintsHandler = WTF::Function<void(const String& invalidConstraint)>;
@@ -67,7 +67,7 @@
     using NewMediaStreamHandler = WTF::Function<void(RefPtr<MediaStreamPrivate>&&)>;
     virtual void createMediaStream(NewMediaStreamHandler&&, String&&, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, const MediaStreamRequest&);
 
-    WEBCORE_EXPORT virtual Vector<CaptureDevice> getMediaStreamDevices();
+    WEBCORE_EXPORT Vector<CaptureDevice> getMediaStreamDevices();
     WEBCORE_EXPORT std::optional<CaptureDevice> captureDeviceWithPersistentID(CaptureDevice::DeviceType, const String&);
     
     const RealtimeMediaSourceSupportedConstraints& supportedConstraints() { return m_supportedConstraints; }
@@ -84,13 +84,7 @@
     WEBCORE_EXPORT static void setDisplayCaptureFactory(DisplayCaptureFactory&);
     WEBCORE_EXPORT static void unsetDisplayCaptureFactory(DisplayCaptureFactory&);
 
-    virtual CaptureDeviceManager& audioCaptureDeviceManager() = 0;
-    virtual CaptureDeviceManager& videoCaptureDeviceManager() = 0;
-    virtual CaptureDeviceManager& displayCaptureDeviceManager() = 0;
-
     WEBCORE_EXPORT String hashStringWithSalt(const String& id, const String& hashSalt);
-    WEBCORE_EXPORT CaptureDevice captureDeviceWithUniqueID(const String& id, const String& hashSalt);
-    WEBCORE_EXPORT ExceptionOr<void> setDeviceEnabled(const String&, bool);
 
     WEBCORE_EXPORT void setDevicesChangedObserver(std::function<void()>&&);
 
@@ -101,7 +95,6 @@
 protected:
     RealtimeMediaSourceCenter();
 
-    static RealtimeMediaSourceCenter& platformCenter();
     RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
 
     WEBCORE_EXPORT virtual AudioCaptureFactory& audioFactoryPrivate() = 0;

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceFactory.h (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceFactory.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceFactory.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -32,6 +32,7 @@
 namespace WebCore {
 
 class CaptureDevice;
+class CaptureDeviceManager;
 class RealtimeMediaSource;
 
 struct CaptureSourceOrError;
@@ -55,6 +56,7 @@
 public:
     virtual ~AudioCaptureFactory() = default;
     virtual CaptureSourceOrError createAudioCaptureSource(const CaptureDevice&, String&&, const MediaConstraints*) = 0;
+    virtual CaptureDeviceManager& audioCaptureDeviceManager() = 0;
 
 protected:
     AudioCaptureFactory() = default;
@@ -68,6 +70,7 @@
 public:
     virtual ~VideoCaptureFactory() = default;
     virtual CaptureSourceOrError createVideoCaptureSource(const CaptureDevice&, String&&, const MediaConstraints*) = 0;
+    virtual CaptureDeviceManager& videoCaptureDeviceManager() = 0;
     virtual void setVideoCapturePageState(bool, bool) { }
 
 protected:
@@ -78,6 +81,7 @@
 public:
     virtual ~DisplayCaptureFactory() = default;
     virtual CaptureSourceOrError createDisplayCaptureSource(const CaptureDevice&, const MediaConstraints*) = 0;
+    virtual CaptureDeviceManager& displayCaptureDeviceManager() = 0;
     virtual void setDisplayCapturePageState(bool , bool) { }
 
 protected:

Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -57,6 +57,8 @@
     {
         return GStreamerAudioCaptureSource::create(String { device.persistentId() }, WTFMove(hashSalt), constraints);
     }
+private:
+    CaptureDeviceManager& audioCaptureDeviceManager() final { return GStreamerAudioCaptureDeviceManager::singleton(); }
 };
 
 static GStreamerAudioCaptureSourceFactory& libWebRTCAudioCaptureSourceFactory()

Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -71,6 +71,8 @@
     {
         return GStreamerVideoCaptureSource::create(String { device.persistentId() }, WTFMove(hashSalt), constraints);
     }
+private:
+    CaptureDeviceManager& videoCaptureDeviceManager() final { return GStreamerVideoCaptureDeviceManager::singleton(); }
 };
 
 VideoCaptureFactory& libWebRTCVideoCaptureSourceFactory()
@@ -86,6 +88,8 @@
         // FIXME: Implement this.
         return { };
     }
+private:
+    CaptureDeviceManager& displayCaptureDeviceManager() final { return GStreamerDisplayCaptureDeviceManager::singleton(); }
 };
 
 DisplayCaptureFactory& libWebRTCDisplayCaptureSourceFactory()

Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.cpp (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -26,7 +26,6 @@
 
 #include "GStreamerAudioCaptureSource.h"
 #include "GStreamerCaptureDevice.h"
-#include "GStreamerCaptureDeviceManager.h"
 #include "GStreamerVideoCaptureSource.h"
 #include <wtf/MainThread.h>
 
@@ -67,21 +66,6 @@
     return GStreamerVideoCaptureSource::displayFactory();
 }
 
-CaptureDeviceManager& RealtimeMediaSourceCenterLibWebRTC::audioCaptureDeviceManager()
-{
-    return GStreamerAudioCaptureDeviceManager::singleton();
-}
-
-CaptureDeviceManager& RealtimeMediaSourceCenterLibWebRTC::videoCaptureDeviceManager()
-{
-    return GStreamerVideoCaptureDeviceManager::singleton();
-}
-
-CaptureDeviceManager& RealtimeMediaSourceCenterLibWebRTC::displayCaptureDeviceManager()
-{
-    return GStreamerDisplayCaptureDeviceManager::singleton();
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM) && USE(LIBWEBRTC)

Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.h (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/RealtimeMediaSourceCenterLibWebRTC.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -46,12 +46,6 @@
     AudioCaptureFactory& audioFactoryPrivate() final;
     VideoCaptureFactory& videoFactoryPrivate() final;
     DisplayCaptureFactory& displayCaptureFactoryPrivate() final;
-
-    CaptureDeviceManager& audioCaptureDeviceManager() final;
-    CaptureDeviceManager& videoCaptureDeviceManager() final;
-    CaptureDeviceManager& displayCaptureDeviceManager() final;
-
-    AudioCaptureFactory* m_audioFactoryOverride { nullptr };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -774,6 +774,15 @@
     return CoreAudioCaptureSourceFactory::singleton();
 }
 
+CaptureDeviceManager& CoreAudioCaptureSourceFactory::audioCaptureDeviceManager()
+{
+#if PLATFORM(MAC)
+    return CoreAudioCaptureDeviceManager::singleton();
+#else
+    return AVAudioSessionCaptureDeviceManager::singleton();
+#endif
+}
+
 CoreAudioCaptureSource::CoreAudioCaptureSource(String&& deviceID, String&& label, String&& hashSalt, uint32_t persistentID)
     : RealtimeMediaSource(RealtimeMediaSource::Type::Audio, WTFMove(label), WTFMove(deviceID), WTFMove(hashSalt))
     , m_captureDeviceID(persistentID)

Modified: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -130,6 +130,8 @@
     {
         return CoreAudioCaptureSource::create(String { device.persistentId() }, WTFMove(hashSalt), constraints);
     }
+
+    CaptureDeviceManager& audioCaptureDeviceManager() final;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -33,10 +33,8 @@
 #if ENABLE(MEDIA_STREAM)
 #include "RealtimeMediaSourceCenterMac.h"
 
-#include "AVAudioSessionCaptureDeviceManager.h"
 #include "AVCaptureDeviceManager.h"
 #include "AVVideoCaptureSource.h"
-#include "CoreAudioCaptureDeviceManager.h"
 #include "CoreAudioCaptureSource.h"
 #include "DisplayCaptureManagerCocoa.h"
 #include "Logging.h"
@@ -55,8 +53,8 @@
         return AVVideoCaptureSource::create(String { device.persistentId() }, WTFMove(hashSalt), constraints);
     }
 
+private:
 #if PLATFORM(IOS_FAMILY)
-private:
     void setVideoCapturePageState(bool interrupted, bool pageMuted)
     {
         if (activeSource())
@@ -63,6 +61,8 @@
             activeSource()->setInterrupted(interrupted, pageMuted);
     }
 #endif
+
+    CaptureDeviceManager& videoCaptureDeviceManager() { return AVCaptureDeviceManager::singleton(); }
 };
 
 class DisplayCaptureSourceFactoryMac final : public DisplayCaptureFactory {
@@ -93,6 +93,8 @@
 
         return { };
     }
+private:
+    CaptureDeviceManager& displayCaptureDeviceManager() { return DisplayCaptureManagerCocoa::singleton(); }
 };
 
 RealtimeMediaSourceCenterMac& RealtimeMediaSourceCenterMac::singleton()
@@ -129,25 +131,6 @@
     return factory.get();
 }
 
-CaptureDeviceManager& RealtimeMediaSourceCenterMac::audioCaptureDeviceManager()
-{
-#if PLATFORM(MAC)
-    return CoreAudioCaptureDeviceManager::singleton();
-#else
-    return AVAudioSessionCaptureDeviceManager::singleton();
-#endif
-}
-
-CaptureDeviceManager& RealtimeMediaSourceCenterMac::videoCaptureDeviceManager()
-{
-    return AVCaptureDeviceManager::singleton();
-}
-
-CaptureDeviceManager& RealtimeMediaSourceCenterMac::displayCaptureDeviceManager()
-{
-    return DisplayCaptureManagerCocoa::singleton();
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h (239023 => 239024)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -52,12 +52,6 @@
     AudioCaptureFactory& audioFactoryPrivate() final;
     VideoCaptureFactory& videoFactoryPrivate() final;
     DisplayCaptureFactory& displayCaptureFactoryPrivate() final;
-
-    CaptureDeviceManager& audioCaptureDeviceManager() final;
-    CaptureDeviceManager& videoCaptureDeviceManager() final;
-    CaptureDeviceManager& displayCaptureDeviceManager() final;
-
-    AudioCaptureFactory* m_audioFactoryOverride { nullptr };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (239023 => 239024)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -94,8 +94,8 @@
         return MockRealtimeVideoSource::create(String { device.persistentId() }, String { device.label() }, WTFMove(hashSalt), constraints);
     }
 
+private:
 #if PLATFORM(IOS_FAMILY)
-private:
     void setVideoCapturePageState(bool interrupted, bool pageMuted)
     {
         if (activeSource())
@@ -102,6 +102,7 @@
             activeSource()->setInterrupted(interrupted, pageMuted);
     }
 #endif
+    CaptureDeviceManager& videoCaptureDeviceManager() final { return MockRealtimeMediaSourceCenter::singleton().videoCaptureDeviceManager(); }
 };
 
 class MockRealtimeDisplaySourceFactory : public DisplayCaptureFactory {
@@ -126,6 +127,8 @@
 
         return { };
     }
+private:
+    CaptureDeviceManager& displayCaptureDeviceManager() final { return MockRealtimeMediaSourceCenter::singleton().displayCaptureDeviceManager(); }
 };
 
 class MockRealtimeAudioSourceFactory : public AudioCaptureFactory {
@@ -137,6 +140,8 @@
 
         return MockRealtimeAudioSource::create(String { device.persistentId() }, String { device.label() }, WTFMove(hashSalt), constraints);
     }
+private:
+    CaptureDeviceManager& audioCaptureDeviceManager() final { return MockRealtimeMediaSourceCenter::singleton().audioCaptureDeviceManager(); }
 };
 
 static Vector<MockMediaDevice>& devices()
@@ -179,10 +184,24 @@
 void MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(bool enabled)
 {
     static bool active = false;
-    if (active != enabled) {
-        active = enabled;
-        RealtimeMediaSourceCenter::setSharedStreamCenterOverride(enabled ? &singleton() : nullptr);
+    if (active == enabled)
+        return;
+
+    active = enabled;
+
+    RealtimeMediaSourceCenter& center = RealtimeMediaSourceCenter::singleton();
+    MockRealtimeMediaSourceCenter& mock = singleton();
+
+    if (active) {
+        center.setAudioFactory(mock.audioFactory());
+        center.setVideoFactory(mock.videoFactory());
+        center.setDisplayCaptureFactory(mock.displayCaptureFactory());
+        return;
     }
+
+    center.unsetAudioFactory(mock.audioFactory());
+    center.unsetVideoFactory(mock.videoFactory());
+    center.unsetDisplayCaptureFactory(mock.displayCaptureFactory());
 }
 
 static void createCaptureDevice(const MockMediaDevice& device)
@@ -310,19 +329,19 @@
     return displayDevices;
 }
 
-AudioCaptureFactory& MockRealtimeMediaSourceCenter::audioFactoryPrivate()
+AudioCaptureFactory& MockRealtimeMediaSourceCenter::audioFactory()
 {
     static NeverDestroyed<MockRealtimeAudioSourceFactory> factory;
     return factory.get();
 }
 
-VideoCaptureFactory& MockRealtimeMediaSourceCenter::videoFactoryPrivate()
+VideoCaptureFactory& MockRealtimeMediaSourceCenter::videoFactory()
 {
     static NeverDestroyed<MockRealtimeVideoSourceFactory> factory;
     return factory.get();
 }
 
-DisplayCaptureFactory& MockRealtimeMediaSourceCenter::displayCaptureFactoryPrivate()
+DisplayCaptureFactory& MockRealtimeMediaSourceCenter::displayCaptureFactory()
 {
     static NeverDestroyed<MockRealtimeDisplaySourceFactory> factory;
     return factory.get();

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h (239023 => 239024)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -36,8 +36,10 @@
 
 namespace WebCore {
 
-class MockRealtimeMediaSourceCenter final : public RealtimeMediaSourceCenter {
+class MockRealtimeMediaSourceCenter {
 public:
+    static MockRealtimeMediaSourceCenter& singleton();
+
     WEBCORE_EXPORT static void setMockRealtimeMediaSourceCenterEnabled(bool);
 
     WEBCORE_EXPORT static void setDevices(Vector<MockMediaDevice>&&);
@@ -52,20 +54,18 @@
     static std::optional<MockMediaDevice> mockDeviceWithPersistentID(const String&);
     static std::optional<CaptureDevice> captureDeviceWithPersistentID(CaptureDevice::DeviceType, const String&);
 
+    CaptureDeviceManager& audioCaptureDeviceManager() { return m_audioCaptureDeviceManager; }
+    CaptureDeviceManager& videoCaptureDeviceManager() { return m_videoCaptureDeviceManager; }
+    CaptureDeviceManager& displayCaptureDeviceManager() { return m_displayCaptureDeviceManager; }
+
 private:
     MockRealtimeMediaSourceCenter() = default;
     friend NeverDestroyed<MockRealtimeMediaSourceCenter>;
 
-    static MockRealtimeMediaSourceCenter& singleton();
+    AudioCaptureFactory& audioFactory();
+    VideoCaptureFactory& videoFactory();
+    DisplayCaptureFactory& displayCaptureFactory();
 
-    AudioCaptureFactory& audioFactoryPrivate() final;
-    VideoCaptureFactory& videoFactoryPrivate() final;
-    DisplayCaptureFactory& displayCaptureFactoryPrivate() final;
-
-    CaptureDeviceManager& audioCaptureDeviceManager() final { return m_audioCaptureDeviceManager; }
-    CaptureDeviceManager& videoCaptureDeviceManager() final { return m_videoCaptureDeviceManager; }
-    CaptureDeviceManager& displayCaptureDeviceManager() final { return m_displayCaptureDeviceManager; }
-
     class MockAudioCaptureDeviceManager final : public CaptureDeviceManager {
     private:
         const Vector<CaptureDevice>& captureDevices() final { return MockRealtimeMediaSourceCenter::audioDevices(); }

Modified: trunk/Source/WebCore/testing/Internals.cpp (239023 => 239024)


--- trunk/Source/WebCore/testing/Internals.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/testing/Internals.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -4533,27 +4533,6 @@
     m_nextTrackFramePromise = std::nullopt;
 }
 
-ExceptionOr<void> Internals::setMediaDeviceState(const String& id, const String& property, bool value)
-{
-    auto* document = contextDocument();
-    if (!document)
-        return Exception { InvalidAccessError, "No context document"_s };
-
-    if (!equalLettersIgnoringASCIICase(property, "enabled"))
-        return Exception { InvalidAccessError, makeString("\"" + property, "\" is not a valid property for this method.") };
-
-    auto salt = document->deviceIDHashSalt();
-    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);
-    if (result.hasException())
-        return result.releaseException();
-
-    return { };
-}
-
 void Internals::delayMediaStreamTrackSamples(MediaStreamTrack& track, float delay)
 {
     track.source().delaySamples(Seconds { delay });

Modified: trunk/Source/WebCore/testing/Internals.h (239023 => 239024)


--- trunk/Source/WebCore/testing/Internals.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/testing/Internals.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -677,7 +677,6 @@
 
 #if ENABLE(MEDIA_STREAM)
     void setCameraMediaStreamTrackOrientation(MediaStreamTrack&, int orientation);
-    ExceptionOr<void> setMediaDeviceState(const String& id, const String& property, bool value);
     unsigned long trackAudioSampleCount() const { return m_trackAudioSampleCount; }
     unsigned long trackVideoSampleCount() const { return m_trackVideoSampleCount; }
     void observeMediaStreamTrack(MediaStreamTrack&);

Modified: trunk/Source/WebCore/testing/Internals.idl (239023 => 239024)


--- trunk/Source/WebCore/testing/Internals.idl	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebCore/testing/Internals.idl	2018-12-10 05:30:23 UTC (rev 239024)
@@ -664,7 +664,6 @@
     [Conditional=MEDIA_STREAM] Promise<ImageData> grabNextMediaStreamTrackFrame();
     [Conditional=MEDIA_STREAM] readonly attribute unsigned long trackAudioSampleCount;
     [Conditional=MEDIA_STREAM] readonly attribute unsigned long trackVideoSampleCount;
-    [Conditional=MEDIA_STREAM, MayThrowException] void setMediaDeviceState(DOMString deviceID, DOMString property, boolean value);
     [Conditional=MEDIA_STREAM] void delayMediaStreamTrackSamples(MediaStreamTrack track, float delay);
     [Conditional=MEDIA_STREAM] void setMediaStreamTrackMuted(MediaStreamTrack track, boolean muted);
     [Conditional=MEDIA_STREAM] void removeMediaStreamTrack(MediaStream stream, MediaStreamTrack track);

Modified: trunk/Source/WebKit/ChangeLog (239023 => 239024)


--- trunk/Source/WebKit/ChangeLog	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebKit/ChangeLog	2018-12-10 05:30:23 UTC (rev 239024)
@@ -1,3 +1,23 @@
+2018-12-09  Youenn Fablet  <you...@apple.com>
+
+        Move capture manager from RealtimeMediaSourceCenter to capture factory
+        https://bugs.webkit.org/show_bug.cgi?id=192542
+
+        Reviewed by Eric Carlson.
+
+        Make sure to unregister for video capture as done for other capture types.
+        Implement manager which should be doing nothing as the manager is used for enumeration of devices
+        which should only happen in UIProcess.
+
+        Given that mock capture is interfering with UserMediaCaptureManager,
+        switching on/off mock capture will require creating a new process.
+        This shortcoming should be fixed once mock capture will be fully happening in
+        the same process as regular capture.
+
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+        (WebKit::UserMediaCaptureManager::~UserMediaCaptureManager):
+        * WebProcess/cocoa/UserMediaCaptureManager.h:
+
 2018-12-09  Saam barati  <sbar...@apple.com>
 
         Enable HTTP and HTTPS proxies on iOS and make it a property of the NSURLSession

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (239023 => 239024)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2018-12-10 05:30:23 UTC (rev 239024)
@@ -207,6 +207,7 @@
 {
     RealtimeMediaSourceCenter::unsetAudioFactory(*this);
     RealtimeMediaSourceCenter::unsetDisplayCaptureFactory(*this);
+    RealtimeMediaSourceCenter::unsetVideoFactory(*this);
     m_process.removeMessageReceiver(Messages::UserMediaCaptureManager::messageReceiverName());
 }
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (239023 => 239024)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2018-12-10 01:56:16 UTC (rev 239023)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2018-12-10 05:30:23 UTC (rev 239024)
@@ -30,6 +30,7 @@
 #include "MessageReceiver.h"
 #include "SharedMemory.h"
 #include "WebProcessSupplement.h"
+#include <WebCore/CaptureDeviceManager.h>
 #include <WebCore/RealtimeMediaSource.h>
 #include <WebCore/RealtimeMediaSourceFactory.h>
 #include <wtf/HashMap.h>
@@ -61,6 +62,23 @@
     WebCore::CaptureSourceOrError createDisplayCaptureSource(const WebCore::CaptureDevice& device, const WebCore::MediaConstraints* constraints) final  { return createCaptureSource(device, { }, constraints); }
     WebCore::CaptureSourceOrError createCaptureSource(const WebCore::CaptureDevice&, String&&, const WebCore::MediaConstraints*);
 
+    class NoOpCaptureDeviceManager : public WebCore::CaptureDeviceManager {
+    public:
+        NoOpCaptureDeviceManager() = default;
+
+    private:
+        const Vector<WebCore::CaptureDevice>& captureDevices() final
+        {
+            ASSERT_NOT_REACHED();
+            return m_emptyDevices;
+        }
+        Vector<WebCore::CaptureDevice> m_emptyDevices;
+    };
+
+    WebCore::CaptureDeviceManager& audioCaptureDeviceManager() final { return m_noOpCaptureDeviceManager; }
+    WebCore::CaptureDeviceManager& videoCaptureDeviceManager() final { return m_noOpCaptureDeviceManager; }
+    WebCore::CaptureDeviceManager& displayCaptureDeviceManager() final { return m_noOpCaptureDeviceManager; }
+
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
 
@@ -86,6 +104,7 @@
     friend class Source;
     HashMap<uint64_t, RefPtr<Source>> m_sources;
     WebProcess& m_process;
+    NoOpCaptureDeviceManager m_noOpCaptureDeviceManager;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to