Title: [290985] trunk
Revision
290985
Author
[email protected]
Date
2022-03-08 04:24:15 -0800 (Tue, 08 Mar 2022)

Log Message

Add a preference to mute video capture in case audio capture gets interrupted
https://bugs.webkit.org/show_bug.cgi?id=237524
<rdar://78421282>

Reviewed by Eric Carlson.

Source/WebCore:

In case we detect that a microphone track source gets muted due to interruption, we mute
capture video tracks based if allowed by the new MuteCameraOnMicrophoneInterruptionEnabled setting.

Add support for mock microphone interruption and remove previous in process internals API.

Test: fast/mediastream/media-stream-video-track-interrupted-from-audio.html

* Modules/mediastream/MediaStreamTrack.cpp:
* Modules/mediastream/MediaStreamTrack.h:
* platform/mediastream/mac/CoreAudioCaptureSource.cpp:
* platform/mediastream/mac/CoreAudioCaptureSource.h:
* platform/mock/MockRealtimeAudioSource.cpp:
(WebCore::MockRealtimeAudioSource::setIsInterrupted):
* platform/mock/MockRealtimeAudioSource.h:
* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted):
(WebCore::MockRealtimeMediaSourceCenter::setMockCameraIsInterrupted): Deleted.
* platform/mock/MockRealtimeMediaSourceCenter.h:

Source/WebKit:

Add support for interrupt mock microphone devices.
Send to WebProcess sources whether sources are interrupted each time the source muted value changes.
Store that value in remote sources.

* GPUProcess/GPUProcess.cpp:
* GPUProcess/GPUProcess.h:
* GPUProcess/GPUProcess.messages.in:
* UIProcess/API/C/WKPage.cpp:
* UIProcess/API/C/WKPagePrivate.h:
* UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
* UIProcess/GPU/GPUProcessProxy.cpp:
* UIProcess/GPU/GPUProcessProxy.h:
* UIProcess/WebPageProxy.cpp:
* UIProcess/WebPageProxy.h:
* WebProcess/WebPage/WebPage.cpp:
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/cocoa/RemoteRealtimeAudioSource.h:
* WebProcess/cocoa/RemoteRealtimeDisplaySource.h:
* WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp:
* WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h:
* WebProcess/cocoa/RemoteRealtimeVideoSource.h:
* WebProcess/cocoa/UserMediaCaptureManager.cpp:
* WebProcess/cocoa/UserMediaCaptureManager.h:
* WebProcess/cocoa/UserMediaCaptureManager.messages.in:

Source/WTF:

* Scripts/Preferences/WebPreferencesInternal.yaml:

Tools:

Add support for interrupt mock microphone devices.

* WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
* WebKitTestRunner/InjectedBundle/TestRunner.cpp:
* WebKitTestRunner/InjectedBundle/TestRunner.h:
* WebKitTestRunner/TestController.cpp:
* WebKitTestRunner/TestController.h:
* WebKitTestRunner/TestInvocation.cpp:

LayoutTests:

* fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt: Added.
* fast/mediastream/media-stream-video-track-interrupted-from-audio.html: Added.
* fast/mediastream/media-stream-video-track-interrupted.html: Migrated to testRunner API.
* fast/mediastream/track-ended-while-muted.html:
* platform/glib/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (290984 => 290985)


--- trunk/LayoutTests/ChangeLog	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/LayoutTests/ChangeLog	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1,5 +1,19 @@
 2022-03-08  Youenn Fablet  <[email protected]>
 
+        Add a preference to mute video capture in case audio capture gets interrupted
+        https://bugs.webkit.org/show_bug.cgi?id=237524
+        <rdar://78421282>
+
+        Reviewed by Eric Carlson.
+
+        * fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt: Added.
+        * fast/mediastream/media-stream-video-track-interrupted-from-audio.html: Added.
+        * fast/mediastream/media-stream-video-track-interrupted.html: Migrated to testRunner API.
+        * fast/mediastream/track-ended-while-muted.html:
+        * platform/glib/TestExpectations:
+
+2022-03-08  Youenn Fablet  <[email protected]>
+
         Improve WebRTC VPX media capabilities accuracy
         https://bugs.webkit.org/show_bug.cgi?id=237462
 

Modified: trunk/LayoutTests/fast/mediastream/media-stream-track-interrupted.html (290984 => 290985)


--- trunk/LayoutTests/fast/mediastream/media-stream-track-interrupted.html	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/LayoutTests/fast/mediastream/media-stream-track-interrupted.html	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1,5 +1,4 @@
-<!DOCTYPE html><!-- webkit-test-runner [ CaptureAudioInGPUProcessEnabled=false CaptureAudioInUIProcessEnabled=false ] -->
-<!DOCTYPE html>
+<!DOCTYPE html><!-- webkit-test-runner [ CaptureAudioInGPUProcessEnabled=true CaptureVideoInGPUProcessEnabled=true MuteCameraOnMicrophoneInterruptionEnabled=false ] -->
 <html>
 <head>
     <meta charset="utf-8">
@@ -12,11 +11,11 @@
     promise_test(async (test) => {
         const stream = await navigator.mediaDevices.getUserMedia({audio: true});
         const track = stream.getAudioTracks()[0];
-        if (!window.internals)
+        if (!window.testRunner)
             return;
 
         let promise = new Promise((resolve, reject) => { track._onmute_ = resolve; setTimeout(() => reject("no mute"), 5000) });
-        internals.setMediaStreamSourceInterrupted(track, true);
+        testRunner.setMockCaptureDevicesInterrupted(false, true);
         await promise;
 
         assert_true(track.muted, "track is muted");
@@ -23,7 +22,7 @@
         assert_true(internals.isMediaStreamSourceInterrupted(track), "source is interrupted");
 
         promise = new Promise((resolve, reject) => { track._onunmute_ = resolve; setTimeout(() => reject("no unmute"), 5000) });
-        internals.setMediaStreamSourceInterrupted(track, false);
+        testRunner.setMockCaptureDevicesInterrupted(false, false);
         await promise;
 
         assert_false(track.muted, "track is no longer muted");
@@ -74,14 +73,14 @@
                             assert_true(pageMediaState.includes(isVideo ? 'HasActiveAudioCaptureDevice' : 'HasActiveVideoCaptureDevice'));
                             assert_false(pageMediaState.includes(isVideo ? 'HasActiveVideoCaptureDevice' : 'HasActiveAudioCaptureDevice'));
                             pageState = internals.pageMediaState();
-                            internals.setMediaStreamSourceInterrupted(track, false)
+                            testRunner.setMockCaptureDevicesInterrupted(false, false);
                         }
                     })
                 }
 
-                if (window.internals) {
+                if (window.testRunner) {
                     pageState = internals.pageMediaState();
-                    internals.setMediaStreamSourceInterrupted(track, true);
+                    testRunner.setMockCaptureDevicesInterrupted(isVideo, !isVideo);
                 }
                 setTimeout(() => reject("Muted state did not change in 1 second"), 1000);
             });

Added: trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt (0 => 290985)


--- trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt	2022-03-08 12:24:15 UTC (rev 290985)
@@ -0,0 +1,3 @@
+
+PASS Mute/unmute video track if audio gets interrupted
+

Added: trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio.html (0 => 290985)


--- trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio.html	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio.html	2022-03-08 12:24:15 UTC (rev 290985)
@@ -0,0 +1,33 @@
+<!DOCTYPE html><!-- webkit-test-runner [ CaptureAudioInGPUProcessEnabled=true CaptureVideoInGPUProcessEnabled=true MuteCameraOnMicrophoneInterruptionEnabled=true ] -->
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>Video capture source interruption based on audio interruption</title>
+    <script src=""
+    <script src=""
+ </head>
+<body>
+    <script>
+    promise_test(async (test) => {
+        const stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
+        const track = stream.getVideoTracks()[0];
+        if (!window.testRunner)
+            return;
+
+        let promise = new Promise((resolve, reject) => { track._onmute_ = resolve; setTimeout(() => reject("no mute"), 5000) });
+        testRunner.setMockCaptureDevicesInterrupted(false, true);
+        await promise;
+
+        assert_true(track.muted, "track is muted");
+
+        promise = new Promise((resolve, reject) => { track._onunmute_ = resolve; setTimeout(() => reject("no unmute"), 5000) });
+        testRunner.setMockCaptureDevicesInterrupted(false, false);
+        await promise;
+
+        assert_false(track.muted, "track is not muted");
+
+        track.stop();
+    }, "Mute/unmute video track if audio gets interrupted");
+    </script>
+</body>
+</html>

Modified: trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted.html (290984 => 290985)


--- trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted.html	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/LayoutTests/fast/mediastream/media-stream-video-track-interrupted.html	2022-03-08 12:24:15 UTC (rev 290985)
@@ -15,13 +15,13 @@
             return;
 
         let promise = new Promise((resolve, reject) => { track._onmute_ = resolve; setTimeout(() => reject("no mute"), 5000) });
-        testRunner.setMockCameraIsInterrupted(true);
+        testRunner.setMockCaptureDevicesInterrupted(true, false);
         await promise;
 
         assert_true(track.muted, "track is muted");
 
         promise = new Promise((resolve, reject) => { track._onunmute_ = resolve; setTimeout(() => reject("no unmute"), 5000) });
-        testRunner.setMockCameraIsInterrupted(false);
+        testRunner.setMockCaptureDevicesInterrupted(false, false);
         await promise;
 
         assert_false(track.muted, "track is not muted");
@@ -45,7 +45,7 @@
 
         // getting an interruption, track should be muted.
         let promise = new Promise((resolve, reject) => { track._onmute_ = resolve; setTimeout(() => reject("no mute"), 5000) });
-        testRunner.setMockCameraIsInterrupted(true);
+        testRunner.setMockCaptureDevicesInterrupted(true, false);
         await promise;
 
         assert_true(track.muted, "track is muted");

Modified: trunk/LayoutTests/fast/mediastream/track-ended-while-muted.html (290984 => 290985)


--- trunk/LayoutTests/fast/mediastream/track-ended-while-muted.html	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/LayoutTests/fast/mediastream/track-ended-while-muted.html	2022-03-08 12:24:15 UTC (rev 290985)
@@ -11,13 +11,13 @@
 promise_test(async (test) => {
     const stream = await navigator.mediaDevices.getUserMedia({audio: true});
     const track = stream.getAudioTracks()[0];
-    if (!window.internals)
+    if (!window.testRunner)
         return;
 
     const clone = track.clone();
 
     let promise = new Promise((resolve, reject) => { track._onmute_ = resolve; setTimeout(() => reject("no mute"), 5000) });
-    internals.setMediaStreamSourceInterrupted(track, true);
+    testRunner.setMockCaptureDevicesInterrupted(false, true);
     await promise;
 
     track.stop();

Modified: trunk/LayoutTests/platform/glib/TestExpectations (290984 => 290985)


--- trunk/LayoutTests/platform/glib/TestExpectations	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/LayoutTests/platform/glib/TestExpectations	2022-03-08 12:24:15 UTC (rev 290985)
@@ -798,6 +798,9 @@
 webkit.org/b/230415 fast/mediastream/RTCPeerConnection-iceconnectionstatechange-event.html [ Timeout ]
 webkit.org/b/79203 fast/mediastream/RTCRtpSender-replaceTrack.html [ Failure ]
 webkit.org/b/187603 fast/mediastream/media-stream-track-source-failure.html [ Timeout Failure Pass ]
+fast/mediastream/media-stream-video-track-interrupted-from-audio.html [ Failure ]
+fast/mediastream/media-stream-track-interrupted.html [ Failure ]
+fast/mediastream/track-ended-while-muted.html [ Failure ]
 
 webkit.org/b/223508 imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Failure Pass ]
 

Modified: trunk/Source/WTF/ChangeLog (290984 => 290985)


--- trunk/Source/WTF/ChangeLog	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WTF/ChangeLog	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1,3 +1,13 @@
+2022-03-08  Youenn Fablet  <[email protected]>
+
+        Add a preference to mute video capture in case audio capture gets interrupted
+        https://bugs.webkit.org/show_bug.cgi?id=237524
+        <rdar://78421282>
+
+        Reviewed by Eric Carlson.
+
+        * Scripts/Preferences/WebPreferencesInternal.yaml:
+
 2022-03-08  Sihui Liu  <[email protected]>
 
         Add early return for empty path in makeAllDirectories

Modified: trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml (290984 => 290985)


--- trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2022-03-08 12:24:15 UTC (rev 290985)
@@ -640,6 +640,18 @@
     WebKit:
       default: false
 
+MuteCameraOnMicrophoneInterruptionEnabled:
+  type: bool
+  condition: ENABLE(MEDIA_STREAM)
+  defaultValue:
+    WebKitLegacy:
+      default: false
+    WebKit:
+      "PLATFORM(IOS_FAMILY)": true
+      default: false
+    WebCore:
+      default: false
+
 NPAPIPlugInsEnabledForTestingInWebKitLegacy:
   type: bool
   humanReadableName: "NPAPI Plug-Ins Enabled In WebKitLegacy"

Modified: trunk/Source/WebCore/ChangeLog (290984 => 290985)


--- trunk/Source/WebCore/ChangeLog	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/ChangeLog	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1,3 +1,30 @@
+2022-03-08  Youenn Fablet  <[email protected]>
+
+        Add a preference to mute video capture in case audio capture gets interrupted
+        https://bugs.webkit.org/show_bug.cgi?id=237524
+        <rdar://78421282>
+
+        Reviewed by Eric Carlson.
+
+        In case we detect that a microphone track source gets muted due to interruption, we mute
+        capture video tracks based if allowed by the new MuteCameraOnMicrophoneInterruptionEnabled setting.
+
+        Add support for mock microphone interruption and remove previous in process internals API.
+
+        Test: fast/mediastream/media-stream-video-track-interrupted-from-audio.html
+
+        * Modules/mediastream/MediaStreamTrack.cpp:
+        * Modules/mediastream/MediaStreamTrack.h:
+        * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
+        * platform/mediastream/mac/CoreAudioCaptureSource.h:
+        * platform/mock/MockRealtimeAudioSource.cpp:
+        (WebCore::MockRealtimeAudioSource::setIsInterrupted):
+        * platform/mock/MockRealtimeAudioSource.h:
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted):
+        (WebCore::MockRealtimeMediaSourceCenter::setMockCameraIsInterrupted): Deleted.
+        * platform/mock/MockRealtimeMediaSourceCenter.h:
+
 2022-03-08  Enrique Ocaña González  <[email protected]>
 
         [GStreamer] Handle gst pad error as format error

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (290984 => 290985)


--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -91,6 +91,7 @@
     if (!isCaptureTrack())
         return;
 
+    m_isInterrupted = m_private->source().interrupted();
     allCaptureTracks().add(this);
 
     if (m_private->hasAudio())
@@ -509,6 +510,18 @@
 #endif
 }
 
+static void updateVideoCaptureAccordingMicrophoneInterruption(Document& document, bool isMicrophoneInterrupted)
+{
+    auto* page = document.page();
+    for (auto* captureTrack : allCaptureTracks()) {
+        if (!captureTrack->document() || captureTrack->document()->page() != page)
+            continue;
+        auto& source = captureTrack->source();
+        if (!source.isEnded() && source.type() == RealtimeMediaSource::Type::Video)
+            source.setMuted(isMicrophoneInterrupted);
+    }
+}
+
 void MediaStreamTrack::updateToPageMutedState()
 {
     ASSERT(isCaptureTrack());
@@ -612,7 +625,8 @@
     
 void MediaStreamTrack::trackMutedChanged(MediaStreamTrackPrivate&)
 {
-    if (scriptExecutionContext()->activeDOMObjectsAreStopped() || m_ended)
+    auto* document = this->document();
+    if (document->activeDOMObjectsAreStopped() || m_ended)
         return;
 
     queueTaskKeepingObjectAlive(*this, TaskSource::Networking, [this, muted = m_private->muted()] {
@@ -622,6 +636,11 @@
         dispatchEvent(Event::create(muted ? eventNames().muteEvent : eventNames().unmuteEvent, Event::CanBubble::No, Event::IsCancelable::No));
     });
     configureTrackRendering();
+
+    bool wasInterrupted = m_isInterrupted;
+    m_isInterrupted = m_private->source().interrupted();
+    if (wasInterrupted != m_isInterrupted && m_private->source().type() == RealtimeMediaSource::Type::Audio && document->settings().muteCameraOnMicrophoneInterruptionEnabled())
+        updateVideoCaptureAccordingMicrophoneInterruption(*document, m_isInterrupted);
 }
 
 void MediaStreamTrack::trackSettingsChanged(MediaStreamTrackPrivate&)

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h (290984 => 290985)


--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -208,6 +208,7 @@
     bool m_muted { false };
     bool m_ended { false };
     const bool m_isCaptureTrack { false };
+    bool m_isInterrupted { false };
 };
 
 typedef Vector<RefPtr<MediaStreamTrack>> MediaStreamTrackVector;

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


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -702,15 +702,6 @@
     return m_overrideUnit ? *m_overrideUnit : CoreAudioSharedUnit::singleton();
 }
 
-void CoreAudioCaptureSource::setInterruptedForTesting(bool isInterrupted)
-{
-    if (isInterrupted) {
-        unit().suspend();
-        return;
-    }
-    unit().resume();
-}
-
 void CoreAudioCaptureSourceFactory::beginInterruption()
 {
     ensureOnMainThread([] {

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


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -74,7 +74,6 @@
     void stopProducingData() final;
 
     void delaySamples(Seconds) final;
-    void setInterruptedForTesting(bool) final;
 
     std::optional<Vector<int>> discreteSampleRates() const final { return { { 8000, 16000, 32000, 44100, 48000, 96000 } }; }
 

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp (290984 => 290985)


--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -42,6 +42,10 @@
 #include "RealtimeMediaSourceSettings.h"
 #include <wtf/UUID.h>
 
+#if PLATFORM(COCOA)
+#include "MockAudioSharedUnit.h"
+#endif
+
 namespace WebCore {
 
 #if !PLATFORM(MAC) && !PLATFORM(IOS_FAMILY) && !USE(GSTREAMER)
@@ -180,6 +184,17 @@
     m_delayUntil = MonotonicTime::now() + delta;
 }
 
+void MockRealtimeAudioSource::setIsInterrupted(bool isInterrupted)
+{
+    UNUSED_PARAM(isInterrupted);
+#if PLATFORM(COCOA)
+    if (isInterrupted)
+        MockAudioSharedUnit::singleton().suspend();
+    else
+        MockAudioSharedUnit::singleton().resume();
+#endif
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h (290984 => 290985)


--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -45,6 +45,8 @@
     static CaptureSourceOrError create(String&& deviceID, String&& name, String&& hashSalt, const MediaConstraints*);
     virtual ~MockRealtimeAudioSource();
 
+    static void setIsInterrupted(bool);
+
     WEBCORE_EXPORT void setChannelCount(unsigned);
 
 protected:

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (290984 => 290985)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -317,9 +317,10 @@
     RealtimeMediaSourceCenter::singleton().captureDevicesChanged();
 }
 
-void MockRealtimeMediaSourceCenter::setMockCameraIsInterrupted(bool isInterrupted)
+void MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    MockRealtimeVideoSource::setIsInterrupted(isInterrupted);
+    MockRealtimeVideoSource::setIsInterrupted(isCameraInterrupted);
+    MockRealtimeAudioSource::setIsInterrupted(isMicrophoneInterrupted);
 }
 
 void MockRealtimeMediaSourceCenter::setDevices(Vector<MockMediaDevice>&& newMockDevices)

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h (290984 => 290985)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -47,7 +47,7 @@
     WEBCORE_EXPORT static void addDevice(const MockMediaDevice&);
     WEBCORE_EXPORT static void removeDevice(const String& persistentId);
     WEBCORE_EXPORT static void resetDevices();
-    WEBCORE_EXPORT static void setMockCameraIsInterrupted(bool);
+    WEBCORE_EXPORT static void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
 
     void setMockAudioCaptureEnabled(bool isEnabled) { m_isMockAudioCaptureEnabled = isEnabled; }
     void setMockVideoCaptureEnabled(bool isEnabled) { m_isMockVideoCaptureEnabled = isEnabled; }

Modified: trunk/Source/WebKit/ChangeLog (290984 => 290985)


--- trunk/Source/WebKit/ChangeLog	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/ChangeLog	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1,3 +1,37 @@
+2022-03-08  Youenn Fablet  <[email protected]>
+
+        Add a preference to mute video capture in case audio capture gets interrupted
+        https://bugs.webkit.org/show_bug.cgi?id=237524
+        <rdar://78421282>
+
+        Reviewed by Eric Carlson.
+
+        Add support for interrupt mock microphone devices.
+        Send to WebProcess sources whether sources are interrupted each time the source muted value changes.
+        Store that value in remote sources.
+
+        * GPUProcess/GPUProcess.cpp:
+        * GPUProcess/GPUProcess.h:
+        * GPUProcess/GPUProcess.messages.in:
+        * UIProcess/API/C/WKPage.cpp:
+        * UIProcess/API/C/WKPagePrivate.h:
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+        * UIProcess/GPU/GPUProcessProxy.cpp:
+        * UIProcess/GPU/GPUProcessProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        * UIProcess/WebPageProxy.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/cocoa/RemoteRealtimeAudioSource.h:
+        * WebProcess/cocoa/RemoteRealtimeDisplaySource.h:
+        * WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp:
+        * WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h:
+        * WebProcess/cocoa/RemoteRealtimeVideoSource.h:
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+        * WebProcess/cocoa/UserMediaCaptureManager.h:
+        * WebProcess/cocoa/UserMediaCaptureManager.messages.in:
+
 2022-03-07  Simon Fraser  <[email protected]>
 
         Rename VolatilityState to SetNonVolatileResult

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.cpp (290984 => 290985)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -351,9 +351,9 @@
     MockRealtimeMediaSourceCenter::resetDevices();
 }
 
-void GPUProcess::setMockCameraIsInterrupted(bool isInterrupted)
+void GPUProcess::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    MockRealtimeMediaSourceCenter::setMockCameraIsInterrupted(isInterrupted);
+    MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
 }
 #endif // ENABLE(MEDIA_STREAM)
 

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.h (290984 => 290985)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -152,7 +152,7 @@
     void clearMockMediaDevices();
     void removeMockMediaDevice(const String& persistentId);
     void resetMockMediaDevices();
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
     bool setCaptureAttributionString(const String&);
 #endif
 #if HAVE(SC_CONTENT_SHARING_SESSION)

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in (290984 => 290985)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2022-03-08 12:24:15 UTC (rev 290985)
@@ -39,11 +39,11 @@
     UpdateSandboxAccess(Vector<WebKit::SandboxExtension::Handle> extensions);
     UpdateCaptureAccess(bool allowAudioCapture, bool allowVideoCapture, bool allowDisplayCapture, WebCore::ProcessIdentifier processID) -> ()
     UpdateCaptureOrigin(struct WebCore::SecurityOriginData originData, WebCore::ProcessIdentifier processID)
-    AddMockMediaDevice(struct WebCore::MockMediaDevice device);
-    ClearMockMediaDevices();
-    RemoveMockMediaDevice(String persistentId);
-    ResetMockMediaDevices();
-    SetMockCameraIsInterrupted(bool isInterrupted);
+    AddMockMediaDevice(struct WebCore::MockMediaDevice device)
+    ClearMockMediaDevices()
+    RemoveMockMediaDevice(String persistentId)
+    ResetMockMediaDevices()
+    SetMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 #endif
 #if PLATFORM(MAC)
     DisplayConfigurationChanged(CGDirectDisplayID displayID, CGDisplayChangeSummaryFlags flags)

Modified: trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp (290984 => 290985)


--- trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -3139,15 +3139,15 @@
 #endif
 }
 
-void WKPageSetMockCameraIsInterrupted(WKPageRef pageRef, bool isInterrupted)
+void WKPageSetMockCaptureDevicesInterrupted(WKPageRef pageRef, bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
     CRASH_IF_SUSPENDED;
 #if ENABLE(MEDIA_STREAM) && ENABLE(GPU_PROCESS)
     auto& gpuProcess = toImpl(pageRef)->process().processPool().ensureGPUProcess();
-    gpuProcess.setMockCameraIsInterrupted(isInterrupted);
+    gpuProcess.setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
 #endif
 #if ENABLE(MEDIA_STREAM) && USE(GSTREAMER)
-    toImpl(pageRef)->setMockCameraIsInterrupted(isInterrupted);
+    toImpl(pageRef)->setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
 #endif
 }
 

Modified: trunk/Source/WebKit/UIProcess/API/C/WKPagePrivate.h (290984 => 290985)


--- trunk/Source/WebKit/UIProcess/API/C/WKPagePrivate.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPagePrivate.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -201,7 +201,7 @@
 
 WK_EXPORT void WKPageSetMockCameraOrientation(WKPageRef page, uint64_t orientation);
 WK_EXPORT bool WKPageIsMockRealtimeMediaSourceCenterEnabled(WKPageRef page);
-WK_EXPORT void WKPageSetMockCameraIsInterrupted(WKPageRef page, bool isInterrupted);
+WK_EXPORT void WKPageSetMockCaptureDevicesInterrupted(WKPageRef page, bool isCameraInterrupted, bool isMicrophoneInterrupted);
 
 typedef void (*WKPageLoadedSubresourceDomainsFunction)(WKArrayRef domains, void* functionContext);
 WK_EXPORT void WKPageLoadedSubresourceDomains(WKPageRef page, WKPageLoadedSubresourceDomainsFunction callback, void* callbackContext);

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (290984 => 290985)


--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -146,7 +146,7 @@
     }
 
     void sourceMutedChanged() final {
-        m_connection->send(Messages::UserMediaCaptureManager::SourceMutedChanged(m_id, m_source->muted()), 0);
+        m_connection->send(Messages::UserMediaCaptureManager::SourceMutedChanged(m_id, m_source->muted(), m_source->interrupted()), 0);
     }
 
     void sourceSettingsChanged() final {

Modified: trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp (290984 => 290985)


--- trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -350,9 +350,9 @@
     send(Messages::GPUProcess::ResetMockMediaDevices { }, 0);
 }
 
-void GPUProcessProxy::setMockCameraIsInterrupted(bool isInterrupted)
+void GPUProcessProxy::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    send(Messages::GPUProcess::SetMockCameraIsInterrupted { isInterrupted }, 0);
+    send(Messages::GPUProcess::SetMockCaptureDevicesInterrupted { isCameraInterrupted, isMicrophoneInterrupted }, 0);
 }
 #endif // ENABLE(MEDIA_STREAM)
 

Modified: trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h (290984 => 290985)


--- trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -86,7 +86,7 @@
     void clearMockMediaDevices();
     void removeMockMediaDevice(const String&);
     void resetMockMediaDevices();
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
     void updateSandboxAccess(bool allowAudioCapture, bool allowVideoCapture, bool allowDisplayCapture);
 #endif
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (290984 => 290985)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -10882,9 +10882,9 @@
 }
 
 #if ENABLE(MEDIA_STREAM) && USE(GSTREAMER)
-void WebPageProxy::setMockCameraIsInterrupted(bool isInterrupted)
+void WebPageProxy::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    send(Messages::WebPage::SetMockCameraIsInterrupted(isInterrupted));
+    send(Messages::WebPage::SetMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted));
 }
 #endif
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (290984 => 290985)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1892,7 +1892,7 @@
     void setOrientationForMediaCapture(uint64_t);
 
 #if ENABLE(MEDIA_STREAM) && USE(GSTREAMER)
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
 #endif
 
     bool isHandlingPreventableTouchStart() const { return m_handlingPreventableTouchStartCount; }

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -4914,9 +4914,9 @@
     });
 }
 
-void WebPage::setMockCameraIsInterrupted(bool isInterrupted)
+void WebPage::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    MockRealtimeMediaSourceCenter::setMockCameraIsInterrupted(isInterrupted);
+    MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
 }
 #endif // USE(GSTREAMER)
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1244,7 +1244,7 @@
 #endif
 #if ENABLE(MEDIA_STREAM) && USE(GSTREAMER)
     void setOrientationForMediaCapture(uint64_t rotation);
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
 #endif
 
     void addUserScript(String&& source, InjectedBundleScriptWorld&, WebCore::UserContentInjectedFrames, WebCore::UserScriptInjectionTime);

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-03-08 12:24:15 UTC (rev 290985)
@@ -407,7 +407,7 @@
     CaptureDevicesChanged()
 #if USE(GSTREAMER)
     SetOrientationForMediaCapture(int rotation)
-    SetMockCameraIsInterrupted(bool isInterrupted)
+    SetMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 #endif
 #endif
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -68,7 +68,7 @@
     void captureFailed() final;
 
     void remoteAudioSamplesAvailable(const MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t);
-    void sourceMutedChanged(bool value) { notifyMutedChange(value); }
+    void sourceMutedChanged(bool value, bool interrupted);
 
 private:
     RemoteRealtimeAudioSource(WebCore::RealtimeMediaSourceIdentifier, const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
@@ -85,6 +85,7 @@
     const WebCore::RealtimeMediaSourceCapabilities& capabilities() final { return m_capabilities; }
     void whenReady(CompletionHandler<void(String)>&& callback) final { m_proxy.whenReady(WTFMove(callback)); }
     WebCore::CaptureDevice::DeviceType deviceType() const final { return m_proxy.deviceType(); }
+    bool interrupted() const final { return m_proxy.interrupted(); }
 
 #if ENABLE(GPU_PROCESS)
     // GPUProcessConnection::Client
@@ -101,6 +102,12 @@
     WebCore::RealtimeMediaSourceSettings m_settings;
 };
 
+inline void RemoteRealtimeAudioSource::sourceMutedChanged(bool muted, bool interrupted)
+{
+    m_proxy.setInterrupted(interrupted);
+    notifyMutedChange(muted);
+}
+
 } // namespace WebKit
 
 #endif

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -62,7 +62,7 @@
     void captureFailed() final;
 
     void remoteVideoSampleAvailable(WebCore::MediaSample& sample, WebCore::VideoSampleMetadata metadata) { videoSampleAvailable(sample, metadata); }
-    void sourceMutedChanged(bool value) { notifyMutedChange(value); }
+    void sourceMutedChanged(bool value, bool interrupted);
 
 private:
     RemoteRealtimeDisplaySource(WebCore::RealtimeMediaSourceIdentifier, const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
@@ -79,6 +79,7 @@
     const WebCore::RealtimeMediaSourceCapabilities& capabilities() final { return m_capabilities; }
     void whenReady(CompletionHandler<void(String)>&& callback) final { m_proxy.whenReady(WTFMove(callback)); }
     WebCore::CaptureDevice::DeviceType deviceType() const final { return m_proxy.deviceType(); }
+    bool interrupted() const final { return m_proxy.interrupted(); }
 
 #if ENABLE(GPU_PROCESS)
     // GPUProcessConnection::Client
@@ -95,6 +96,12 @@
     WebCore::RealtimeMediaSourceSettings m_settings;
 };
 
+inline void RemoteRealtimeDisplaySource::sourceMutedChanged(bool muted, bool interrupted)
+{
+    m_proxy.setInterrupted(interrupted);
+    notifyMutedChange(muted);
+}
+
 } // namespace WebKit
 
 #endif

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -60,11 +60,13 @@
 
 void RemoteRealtimeMediaSourceProxy::startProducingData()
 {
+    m_interrupted = false;
     connection()->send(Messages::UserMediaCaptureManagerProxy::StartProducingData { m_identifier }, 0);
 }
 
 void RemoteRealtimeMediaSourceProxy::stopProducingData()
 {
+    m_interrupted = false;
     connection()->send(Messages::UserMediaCaptureManagerProxy::StopProducingData { m_identifier }, 0);
 }
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -71,6 +71,9 @@
 
     void didFail(String&& errorMessage);
 
+    bool interrupted() const { return m_interrupted; }
+    void setInterrupted(bool interrupted) { m_interrupted = interrupted; }
+
 private:
     WebCore::RealtimeMediaSourceIdentifier m_identifier;
     WebCore::CaptureDevice m_device;
@@ -81,6 +84,7 @@
     bool m_isReady { false };
     CompletionHandler<void(String)> m_callback;
     String m_errorMessage;
+    bool m_interrupted { false };
 };
 
 inline RemoteRealtimeMediaSourceProxy::RemoteRealtimeMediaSourceProxy(WebCore::RealtimeMediaSourceIdentifier identifier, const WebCore::CaptureDevice& device, bool shouldCaptureInGPUProcess, const WebCore::MediaConstraints* constraints)

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -67,7 +67,7 @@
     void captureFailed() final;
 
     void videoSampleAvailable(WebCore::MediaSample&, WebCore::IntSize, WebCore::VideoSampleMetadata);
-    void sourceMutedChanged(bool value) { notifyMutedChange(value); }
+    void sourceMutedChanged(bool value, bool interrupted);
 
 private:
     RemoteRealtimeVideoSource(WebCore::RealtimeMediaSourceIdentifier, const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
@@ -90,6 +90,7 @@
     WebCore::MediaSample::VideoRotation sampleRotation() const final { return m_sampleRotation; }
     void setFrameRateWithPreset(double, RefPtr<WebCore::VideoPreset>) final;
     bool prefersPreset(WebCore::VideoPreset&) final;
+    bool interrupted() const final { return m_proxy.interrupted(); }
 
 #if ENABLE(GPU_PROCESS)
     // GPUProcessConnection::Client
@@ -110,6 +111,12 @@
     WebCore::MediaSample::VideoRotation m_sampleRotation { WebCore::MediaSample::VideoRotation::None };
 };
 
+inline void RemoteRealtimeVideoSource::sourceMutedChanged(bool muted, bool interrupted)
+{
+    m_proxy.setInterrupted(interrupted);
+    notifyMutedChange(muted);
+}
+
 } // namespace WebKit
 
 #endif

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -154,18 +154,18 @@
     }, [](std::nullptr_t) { });
 }
 
-void UserMediaCaptureManager::sourceMutedChanged(RealtimeMediaSourceIdentifier identifier, bool muted)
+void UserMediaCaptureManager::sourceMutedChanged(RealtimeMediaSourceIdentifier identifier, bool muted, bool interrupted)
 {
     auto iterator = m_sources.find(identifier);
     if (iterator == m_sources.end())
         return;
 
-    switchOn(iterator->value, [muted](Ref<RemoteRealtimeAudioSource>& source) {
-        source->sourceMutedChanged(muted);
-    }, [muted](Ref<RemoteRealtimeVideoSource>& source) {
-        source->sourceMutedChanged(muted);
-    }, [muted](Ref<RemoteRealtimeDisplaySource>& source) {
-        source->sourceMutedChanged(muted);
+    switchOn(iterator->value, [muted, interrupted](Ref<RemoteRealtimeAudioSource>& source) {
+        source->sourceMutedChanged(muted, interrupted);
+    }, [muted, interrupted](Ref<RemoteRealtimeVideoSource>& source) {
+        source->sourceMutedChanged(muted, interrupted);
+    }, [muted, interrupted](Ref<RemoteRealtimeDisplaySource>& source) {
+        source->sourceMutedChanged(muted, interrupted);
     }, [](std::nullptr_t) { });
 }
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -126,7 +126,8 @@
     // Messages::UserMediaCaptureManager
     void captureFailed(WebCore::RealtimeMediaSourceIdentifier);
     void sourceStopped(WebCore::RealtimeMediaSourceIdentifier);
-    void sourceMutedChanged(WebCore::RealtimeMediaSourceIdentifier, bool muted);
+    void sourceMutedChanged(WebCore::RealtimeMediaSourceIdentifier, bool muted, bool interrupted);
+
     void sourceSettingsChanged(WebCore::RealtimeMediaSourceIdentifier, WebCore::RealtimeMediaSourceSettings&&);
     void applyConstraintsSucceeded(WebCore::RealtimeMediaSourceIdentifier, WebCore::RealtimeMediaSourceSettings&&);
     void applyConstraintsFailed(WebCore::RealtimeMediaSourceIdentifier, String&&, String&&);

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.messages.in (290984 => 290985)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.messages.in	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.messages.in	2022-03-08 12:24:15 UTC (rev 290985)
@@ -26,7 +26,7 @@
 messages -> UserMediaCaptureManager NotRefCounted {
     CaptureFailed(WebCore::RealtimeMediaSourceIdentifier id)
     SourceStopped(WebCore::RealtimeMediaSourceIdentifier id)
-    SourceMutedChanged(WebCore::RealtimeMediaSourceIdentifier id, bool muted)
+    SourceMutedChanged(WebCore::RealtimeMediaSourceIdentifier id, bool muted, bool interrupted)
     SourceSettingsChanged(WebCore::RealtimeMediaSourceIdentifier id, WebCore::RealtimeMediaSourceSettings settings)
     ApplyConstraintsSucceeded(WebCore::RealtimeMediaSourceIdentifier id, WebCore::RealtimeMediaSourceSettings settings)
     ApplyConstraintsFailed(WebCore::RealtimeMediaSourceIdentifier id, String failedConstraint, String message)

Modified: trunk/Tools/ChangeLog (290984 => 290985)


--- trunk/Tools/ChangeLog	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Tools/ChangeLog	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1,3 +1,20 @@
+2022-03-08  Youenn Fablet  <[email protected]>
+
+        Add a preference to mute video capture in case audio capture gets interrupted
+        https://bugs.webkit.org/show_bug.cgi?id=237524
+        <rdar://78421282>
+
+        Reviewed by Eric Carlson.
+
+        Add support for interrupt mock microphone devices.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        * WebKitTestRunner/TestController.cpp:
+        * WebKitTestRunner/TestController.h:
+        * WebKitTestRunner/TestInvocation.cpp:
+
 2022-03-08  Carlos Garcia Campos  <[email protected]>
 
         [GTK][WPE] Do not add new modules under ThirdParty to the tarball

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl (290984 => 290985)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl	2022-03-08 12:24:15 UTC (rev 290985)
@@ -387,7 +387,7 @@
     undefined resetMockMediaDevices();
     undefined setMockCameraOrientation(unsigned long orientation);
     boolean isMockRealtimeMediaSourceCenterEnabled();
-    undefined setMockCameraIsInterrupted(boolean isInterrupted);
+    undefined setMockCaptureDevicesInterrupted(boolean isCameraInterrupted, boolean isMicrophoneInterrupted);
 
     boolean hasAppBoundSession();
     undefined clearAppBoundSession();

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp (290984 => 290985)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -1832,9 +1832,12 @@
     return postSynchronousMessageReturningBoolean("IsMockRealtimeMediaSourceCenterEnabled");
 }
 
-void TestRunner::setMockCameraIsInterrupted(bool isInterrupted)
+void TestRunner::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    postSynchronousMessage("SetMockCameraIsInterrupted", isInterrupted);
+    postSynchronousMessage("SetMockCaptureDevicesInterrupted", createWKDictionary({
+        { "camera", adoptWK(WKBooleanCreate(isCameraInterrupted)) },
+        { "microphone", adoptWK(WKBooleanCreate(isMicrophoneInterrupted)) },
+    }));
 }
 
 #if ENABLE(GAMEPAD)

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h (290984 => 290985)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -499,7 +499,7 @@
     void resetMockMediaDevices();
     void setMockCameraOrientation(unsigned);
     bool isMockRealtimeMediaSourceCenterEnabled();
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
 
     bool hasAppBoundSession();
     void clearAppBoundSession();

Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (290984 => 290985)


--- trunk/Tools/WebKitTestRunner/TestController.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -3620,9 +3620,9 @@
     return WKPageIsMockRealtimeMediaSourceCenterEnabled(m_mainWebView->page());
 }
 
-void TestController::setMockCameraIsInterrupted(bool isInterrupted)
+void TestController::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    WKPageSetMockCameraIsInterrupted(m_mainWebView->page(), isInterrupted);
+    WKPageSetMockCaptureDevicesInterrupted(m_mainWebView->page(), isCameraInterrupted, isMicrophoneInterrupted);
 }
 
 struct InAppBrowserPrivacyCallbackContext {

Modified: trunk/Tools/WebKitTestRunner/TestController.h (290984 => 290985)


--- trunk/Tools/WebKitTestRunner/TestController.h	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Tools/WebKitTestRunner/TestController.h	2022-03-08 12:24:15 UTC (rev 290985)
@@ -312,7 +312,7 @@
     void resetMockMediaDevices();
     void setMockCameraOrientation(uint64_t);
     bool isMockRealtimeMediaSourceCenterEnabled() const;
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
     bool hasAppBoundSession();
 
     void injectUserScript(WKStringRef);

Modified: trunk/Tools/WebKitTestRunner/TestInvocation.cpp (290984 => 290985)


--- trunk/Tools/WebKitTestRunner/TestInvocation.cpp	2022-03-08 12:21:51 UTC (rev 290984)
+++ trunk/Tools/WebKitTestRunner/TestInvocation.cpp	2022-03-08 12:24:15 UTC (rev 290985)
@@ -973,8 +973,11 @@
     if (WKStringIsEqualToUTF8CString(messageName, "IsMockRealtimeMediaSourceCenterEnabled"))
         return adoptWK(WKBooleanCreate(TestController::singleton().isMockRealtimeMediaSourceCenterEnabled()));
     
-    if (WKStringIsEqualToUTF8CString(messageName, "SetMockCameraIsInterrupted")) {
-        TestController::singleton().setMockCameraIsInterrupted(booleanValue(messageBody));
+    if (WKStringIsEqualToUTF8CString(messageName, "SetMockCaptureDevicesInterrupted")) {
+        auto messageBodyDictionary = dictionaryValue(messageBody);
+        bool isCameraInterrupted = booleanValue(messageBodyDictionary, "camera");
+        bool isMicrophoneInterrupted = booleanValue(messageBodyDictionary, "microphone");
+        TestController::singleton().setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
         return nullptr;
     }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to