Title: [291923] branches/safari-613-branch
Revision
291923
Author
[email protected]
Date
2022-03-25 18:51:54 -0700 (Fri, 25 Mar 2022)

Log Message

Cherry-pick r290985. rdar://problem/78421282

    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:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290985 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Added Paths

Diff

Modified: branches/safari-613-branch/LayoutTests/ChangeLog (291922 => 291923)


--- branches/safari-613-branch/LayoutTests/ChangeLog	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/LayoutTests/ChangeLog	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1,5 +1,103 @@
 2022-03-23  Alan Coon  <[email protected]>
 
+        Cherry-pick r290985. rdar://problem/78421282
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290985 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-23  Alan Coon  <[email protected]>
+
         Cherry-pick r290745. rdar://problem/80335706
 
     [Cocoa] The behavior of navigator-language-ru changed in Monterey / iOS 15

Modified: branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-track-interrupted.html (291922 => 291923)


--- branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-track-interrupted.html	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-track-interrupted.html	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt (0 => 291923)


--- branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio-expected.txt	2022-03-26 01:51:54 UTC (rev 291923)
@@ -0,0 +1,3 @@
+
+PASS Mute/unmute video track if audio gets interrupted
+

Added: branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio.html (0 => 291923)


--- branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio.html	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted-from-audio.html	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted.html (291922 => 291923)


--- branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted.html	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/LayoutTests/fast/mediastream/media-stream-video-track-interrupted.html	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/LayoutTests/fast/mediastream/track-ended-while-muted.html (291922 => 291923)


--- branches/safari-613-branch/LayoutTests/fast/mediastream/track-ended-while-muted.html	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/LayoutTests/fast/mediastream/track-ended-while-muted.html	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/LayoutTests/platform/glib/TestExpectations (291922 => 291923)


--- branches/safari-613-branch/LayoutTests/platform/glib/TestExpectations	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/LayoutTests/platform/glib/TestExpectations	2022-03-26 01:51:54 UTC (rev 291923)
@@ -712,6 +712,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: branches/safari-613-branch/Source/WTF/ChangeLog (291922 => 291923)


--- branches/safari-613-branch/Source/WTF/ChangeLog	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WTF/ChangeLog	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1,5 +1,99 @@
 2022-03-23  Alan Coon  <[email protected]>
 
+        Cherry-pick r290985. rdar://problem/78421282
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290985 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-23  Alan Coon  <[email protected]>
+
         Cherry-pick r290978. rdar://problem/89901536
 
     Add early return for empty path in makeAllDirectories

Modified: branches/safari-613-branch/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml (291922 => 291923)


--- branches/safari-613-branch/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2022-03-26 01:51:54 UTC (rev 291923)
@@ -586,6 +586,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: branches/safari-613-branch/Source/WebCore/ChangeLog (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/ChangeLog	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/ChangeLog	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1,5 +1,116 @@
 2022-03-23  Alan Coon  <[email protected]>
 
+        Cherry-pick r290985. rdar://problem/78421282
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290985 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-23  Alan Coon  <[email protected]>
+
         Cherry-pick r290837. rdar://problem/80407863
 
     [Cocoa] Crash in MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL

Modified: branches/safari-613-branch/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -91,6 +91,7 @@
     if (!isCaptureTrack())
         return;
 
+    m_isInterrupted = m_private->source().interrupted();
     allCaptureTracks().add(this);
 
     if (m_private->type() == RealtimeMediaSource::Type::Audio)
@@ -500,6 +501,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());
@@ -593,7 +606,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()] {
@@ -603,6 +617,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: branches/safari-613-branch/Source/WebCore/Modules/mediastream/MediaStreamTrack.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/Modules/mediastream/MediaStreamTrack.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/Modules/mediastream/MediaStreamTrack.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -205,6 +205,7 @@
     bool m_muted { false };
     bool m_ended { false };
     const bool m_isCaptureTrack { false };
+    bool m_isInterrupted { false };
 };
 
 typedef Vector<RefPtr<MediaStreamTrack>> MediaStreamTrackVector;

Modified: branches/safari-613-branch/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -701,15 +701,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: branches/safari-613-branch/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeAudioSource.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -315,9 +315,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: branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebKit/ChangeLog (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/ChangeLog	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/ChangeLog	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1,5 +1,123 @@
 2022-03-23  Alan Coon  <[email protected]>
 
+        Cherry-pick r290985. rdar://problem/78421282
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290985 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-23  Alan Coon  <[email protected]>
+
         Cherry-pick r290443. rdar://problem/89322580
 
     Update CSP console logging

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -343,9 +343,9 @@
     MockRealtimeMediaSourceCenter::resetDevices();
 }
 
-void GPUProcess::setMockCameraIsInterrupted(bool isInterrupted)
+void GPUProcess::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    MockRealtimeMediaSourceCenter::setMockCameraIsInterrupted(isInterrupted);
+    MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
 }
 
 #endif

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -147,7 +147,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 PLATFORM(MAC)

Modified: branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.messages.in (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.messages.in	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/GPUProcess/GPUProcess.messages.in	2022-03-26 01:51:54 UTC (rev 291923)
@@ -39,11 +39,11 @@
     UpdateSandboxAccess(Vector<WebKit::SandboxExtension::Handle> extensions);
     UpdateCaptureAccess(bool allowAudioCapture, bool allowVideoCapture, bool allowDisplayCapture, WebCore::ProcessIdentifier processID) -> () Async
     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: branches/safari-613-branch/Source/WebKit/UIProcess/API/C/WKPage.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/UIProcess/API/C/WKPage.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/UIProcess/API/C/WKPage.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebKit/UIProcess/API/C/WKPagePrivate.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/UIProcess/API/C/WKPagePrivate.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/UIProcess/API/C/WKPagePrivate.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -197,7 +197,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: branches/safari-613-branch/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -137,7 +137,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: branches/safari-613-branch/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -313,9 +313,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
 

Modified: branches/safari-613-branch/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/UIProcess/GPU/GPUProcessProxy.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -83,7 +83,7 @@
     void clearMockMediaDevices();
     void removeMockMediaDevice(const String&);
     void resetMockMediaDevices();
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
 #endif
 
     void removeSession(PAL::SessionID);

Modified: branches/safari-613-branch/Source/WebKit/UIProcess/WebPageProxy.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -10795,9 +10795,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: branches/safari-613-branch/Source/WebKit/UIProcess/WebPageProxy.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/UIProcess/WebPageProxy.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/UIProcess/WebPageProxy.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1868,7 +1868,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: branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -4854,9 +4854,9 @@
     });
 }
 
-void WebPage::setMockCameraIsInterrupted(bool isInterrupted)
+void WebPage::setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 {
-    MockRealtimeMediaSourceCenter::setMockCameraIsInterrupted(isInterrupted);
+    MockRealtimeMediaSourceCenter::setMockCaptureDevicesInterrupted(isCameraInterrupted, isMicrophoneInterrupted);
 }
 #endif // USE(GSTREAMER)
 

Modified: branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1221,7 +1221,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: branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-03-26 01:51:54 UTC (rev 291923)
@@ -385,7 +385,7 @@
     CaptureDevicesChanged()
 #if USE(GSTREAMER)
     SetOrientationForMediaCapture(int rotation)
-    SetMockCameraIsInterrupted(bool isInterrupted)
+    SetMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted)
 #endif
 #endif
 

Modified: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -69,7 +69,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);
@@ -86,6 +86,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
@@ -102,6 +103,12 @@
     WebCore::RealtimeMediaSourceSettings m_settings;
 };
 
+inline void RemoteRealtimeAudioSource::sourceMutedChanged(bool muted, bool interrupted)
+{
+    m_proxy.setInterrupted(interrupted);
+    notifyMutedChange(muted);
+}
+
 } // namespace WebKit
 
 #endif

Modified: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -72,6 +72,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;
@@ -82,6 +85,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: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -151,18 +151,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: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -124,7 +124,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: branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.messages.in (291922 => 291923)


--- branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.messages.in	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.messages.in	2022-03-26 01:51:54 UTC (rev 291923)
@@ -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: branches/safari-613-branch/Tools/ChangeLog (291922 => 291923)


--- branches/safari-613-branch/Tools/ChangeLog	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Tools/ChangeLog	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1,5 +1,106 @@
 2022-03-23  Alan Coon  <[email protected]>
 
+        Cherry-pick r290985. rdar://problem/78421282
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290985 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-23  Alan Coon  <[email protected]>
+
         Cherry-pick r290978. rdar://problem/89901536
 
     Add early return for empty path in makeAllDirectories

Modified: branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl (291922 => 291923)


--- branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl	2022-03-26 01:51:54 UTC (rev 291923)
@@ -386,7 +386,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: branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp (291922 => 291923)


--- branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -1824,9 +1824,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: branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h (291922 => 291923)


--- branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -498,7 +498,7 @@
     void resetMockMediaDevices();
     void setMockCameraOrientation(unsigned);
     bool isMockRealtimeMediaSourceCenterEnabled();
-    void setMockCameraIsInterrupted(bool);
+    void setMockCaptureDevicesInterrupted(bool isCameraInterrupted, bool isMicrophoneInterrupted);
 
     bool hasAppBoundSession();
     void clearAppBoundSession();

Modified: branches/safari-613-branch/Tools/WebKitTestRunner/TestController.cpp (291922 => 291923)


--- branches/safari-613-branch/Tools/WebKitTestRunner/TestController.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Tools/WebKitTestRunner/TestController.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -3587,9 +3587,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: branches/safari-613-branch/Tools/WebKitTestRunner/TestController.h (291922 => 291923)


--- branches/safari-613-branch/Tools/WebKitTestRunner/TestController.h	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Tools/WebKitTestRunner/TestController.h	2022-03-26 01:51:54 UTC (rev 291923)
@@ -310,7 +310,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: branches/safari-613-branch/Tools/WebKitTestRunner/TestInvocation.cpp (291922 => 291923)


--- branches/safari-613-branch/Tools/WebKitTestRunner/TestInvocation.cpp	2022-03-26 01:51:42 UTC (rev 291922)
+++ branches/safari-613-branch/Tools/WebKitTestRunner/TestInvocation.cpp	2022-03-26 01:51:54 UTC (rev 291923)
@@ -968,8 +968,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