Title: [276892] trunk
Revision
276892
Author
[email protected]
Date
2021-05-03 01:12:49 -0700 (Mon, 03 May 2021)

Log Message

Use OptionSet for MediaProducer::MutedStateFlags
https://bugs.webkit.org/show_bug.cgi?id=224550
<rdar://problem/76960294>

Reviewed by Eric Carlson.

Source/WebCore:

Refactoring to improve type safety.
No change of behavior.

* Modules/mediastream/MediaStreamTrack.cpp:
(WebCore::MediaStreamTrack::updateCaptureAccordingToMutedState):
(WebCore::MediaStreamTrack::updateToPageMutedState):
* page/MediaProducer.h:
* page/Page.h:
(WebCore::Page::isAudioMuted const):
(WebCore::Page::isMediaCaptureMuted const):
* testing/Internals.cpp:
(WebCore::Internals::setPageMuted):

Source/WebKit:

Update to use new OptionSet MediaProducer::MutedStateFlags.
Fix a potential bug in case the page is video capture muted, covered by updated API test.

* Shared/WebPageCreationParameters.cpp:
(WebKit::WebPageCreationParameters::decode):
* UIProcess/API/C/WKPage.cpp:
(WKPageSetMuted):
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView setMicrophoneCaptureState:completionHandler:]):
(-[WKWebView setCameraCaptureState:completionHandler:]):
(-[WKWebView _setPageMuted:]):
* UIProcess/API/glib/WebKitWebView.cpp:
(webkit_web_view_set_is_muted):
* UIProcess/Cocoa/MediaUtilities.mm:
(WebKit::toWKMediaMutedState):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::updateActivityState):
* UIProcess/WebPageProxy.h:

Tools:

* TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (276891 => 276892)


--- trunk/Source/WebCore/ChangeLog	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/ChangeLog	2021-05-03 08:12:49 UTC (rev 276892)
@@ -1,3 +1,24 @@
+2021-05-03  Youenn Fablet  <[email protected]>
+
+        Use OptionSet for MediaProducer::MutedStateFlags
+        https://bugs.webkit.org/show_bug.cgi?id=224550
+        <rdar://problem/76960294>
+
+        Reviewed by Eric Carlson.
+
+        Refactoring to improve type safety.
+        No change of behavior.
+
+        * Modules/mediastream/MediaStreamTrack.cpp:
+        (WebCore::MediaStreamTrack::updateCaptureAccordingToMutedState):
+        (WebCore::MediaStreamTrack::updateToPageMutedState):
+        * page/MediaProducer.h:
+        * page/Page.h:
+        (WebCore::Page::isAudioMuted const):
+        (WebCore::Page::isMediaCaptureMuted const):
+        * testing/Internals.cpp:
+        (WebCore::Internals::setPageMuted):
+
 2021-05-02  Rob Buis  <[email protected]>
 
         getPropertyValue for url path doesn't return the "#" character

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (276891 => 276892)


--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2021-05-03 08:12:49 UTC (rev 276892)
@@ -483,13 +483,13 @@
 
     auto* activeAudioSource = RealtimeMediaSourceCenter::singleton().audioCaptureFactory().activeSource();
     if (activeAudioSource && isSourceCapturingForTrackInDocument(*activeAudioSource, document)) {
-        bool pageMuted = page->mutedState() & MediaProducer::AudioCaptureIsMuted;
+        bool pageMuted = page->mutedState().contains(MediaProducer::MutedState::AudioCaptureIsMuted);
         activeAudioSource->setMuted(pageMuted || (document.hidden() && document.settings().interruptAudioOnPageVisibilityChangeEnabled()));
     }
 
     auto* activeVideoSource = RealtimeMediaSourceCenter::singleton().videoCaptureFactory().activeSource();
     if (activeVideoSource && isSourceCapturingForTrackInDocument(*activeVideoSource, document)) {
-        bool pageMuted = page->mutedState() & MediaProducer::VideoCaptureIsMuted;
+        bool pageMuted = page->mutedState().contains(MediaProducer::MutedState::VideoCaptureIsMuted);
         activeVideoSource->setMuted(pageMuted || document.hidden());
     }
 #else
@@ -509,14 +509,14 @@
 
     switch (source().deviceType()) {
     case CaptureDevice::DeviceType::Microphone:
-        m_private->setMuted(page->mutedState() & MediaProducer::AudioCaptureIsMuted);
+        m_private->setMuted(page->mutedState().contains(MediaProducer::MutedState::AudioCaptureIsMuted));
         break;
     case CaptureDevice::DeviceType::Camera:
-        m_private->setMuted(page->mutedState() & MediaProducer::VideoCaptureIsMuted);
+        m_private->setMuted(page->mutedState().contains(MediaProducer::MutedState::VideoCaptureIsMuted));
         break;
     case CaptureDevice::DeviceType::Screen:
     case CaptureDevice::DeviceType::Window:
-        m_private->setMuted(page->mutedState() & MediaProducer::ScreenCaptureIsMuted);
+        m_private->setMuted(page->mutedState().contains(MediaProducer::MutedState::ScreenCaptureIsMuted));
         break;
     case CaptureDevice::DeviceType::Speaker:
     case CaptureDevice::DeviceType::Unknown:

Modified: trunk/Source/WebCore/page/MediaProducer.h (276891 => 276892)


--- trunk/Source/WebCore/page/MediaProducer.h	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/page/MediaProducer.h	2021-05-03 08:12:49 UTC (rev 276892)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include <wtf/EnumTraits.h>
+#include <wtf/OptionSet.h>
 #include <wtf/WeakPtr.h>
 
 namespace WebCore {
@@ -75,18 +76,17 @@
         AudioVideo
     };
 
-    enum MutedState {
-        NoneMuted = 0,
+    enum class MutedState {
         AudioIsMuted = 1 << 0,
         AudioCaptureIsMuted = 1 << 1,
         VideoCaptureIsMuted = 1 << 2,
         ScreenCaptureIsMuted = 1 << 3,
-
-        AudioAndVideoCaptureIsMuted = AudioCaptureIsMuted | VideoCaptureIsMuted,
-        MediaStreamCaptureIsMuted = AudioCaptureIsMuted | VideoCaptureIsMuted | ScreenCaptureIsMuted,
     };
-    typedef unsigned MutedStateFlags;
 
+    using MutedStateFlags = OptionSet<MutedState>;
+    static constexpr MutedStateFlags AudioAndVideoCaptureIsMuted = { MutedState::AudioCaptureIsMuted, MutedState::VideoCaptureIsMuted };
+    static constexpr MutedStateFlags MediaStreamCaptureIsMuted = { MutedState::AudioCaptureIsMuted, MutedState::VideoCaptureIsMuted, MutedState::ScreenCaptureIsMuted };
+
     virtual void pageMutedStateDidChange() = 0;
 
 protected:
@@ -106,4 +106,14 @@
     >;
 };
 
+template<> struct EnumTraits<WebCore::MediaProducer::MutedState> {
+    using values = EnumValues<
+        WebCore::MediaProducer::MutedState,
+        WebCore::MediaProducer::MutedState::AudioIsMuted,
+        WebCore::MediaProducer::MutedState::AudioCaptureIsMuted,
+        WebCore::MediaProducer::MutedState::VideoCaptureIsMuted,
+        WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted
+    >;
+};
+
 }

Modified: trunk/Source/WebCore/page/Page.h (276891 => 276892)


--- trunk/Source/WebCore/page/Page.h	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/page/Page.h	2021-05-03 08:12:49 UTC (rev 276892)
@@ -699,8 +699,8 @@
     MediaProducer::MediaStateFlags mediaState() const { return m_mediaState; }
     void updateIsPlayingMedia(uint64_t);
     MediaProducer::MutedStateFlags mutedState() const { return m_mutedState; }
-    bool isAudioMuted() const { return m_mutedState & MediaProducer::AudioIsMuted; }
-    bool isMediaCaptureMuted() const { return m_mutedState & MediaProducer::MediaStreamCaptureIsMuted; };
+    bool isAudioMuted() const { return m_mutedState.contains(MediaProducer::MutedState::AudioIsMuted); }
+    bool isMediaCaptureMuted() const { return m_mutedState.containsAny(MediaProducer::MediaStreamCaptureIsMuted); };
     void schedulePlaybackControlsManagerUpdate();
 #if ENABLE(VIDEO)
     void playbackControlsMediaEngineChanged();
@@ -953,7 +953,7 @@
     bool m_inLowQualityInterpolationMode { false };
     bool m_areMemoryCacheClientCallsEnabled { true };
     float m_mediaVolume { 1 };
-    MediaProducer::MutedStateFlags m_mutedState { MediaProducer::NoneMuted };
+    MediaProducer::MutedStateFlags m_mutedState;
 
     float m_pageScaleFactor { 1 };
     float m_zoomedOutPageScaleFactor { 0 };

Modified: trunk/Source/WebCore/testing/Internals.cpp (276891 => 276892)


--- trunk/Source/WebCore/testing/Internals.cpp	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebCore/testing/Internals.cpp	2021-05-03 08:12:49 UTC (rev 276892)
@@ -4590,14 +4590,14 @@
     if (!document)
         return;
 
-    WebCore::MediaProducer::MutedStateFlags state = MediaProducer::NoneMuted;
+    WebCore::MediaProducer::MutedStateFlags state;
     for (StringView stateString : statesString.split(',')) {
         if (equalLettersIgnoringASCIICase(stateString, "audio"))
-            state |= MediaProducer::AudioIsMuted;
+            state.add(MediaProducer::MutedState::AudioIsMuted);
         if (equalLettersIgnoringASCIICase(stateString, "capturedevices"))
-            state |= MediaProducer::AudioAndVideoCaptureIsMuted;
+            state.add(MediaProducer::AudioAndVideoCaptureIsMuted);
         if (equalLettersIgnoringASCIICase(stateString, "screencapture"))
-            state |= MediaProducer::ScreenCaptureIsMuted;
+            state.add(MediaProducer::MutedState::ScreenCaptureIsMuted);
     }
 
     if (Page* page = document->page())

Modified: trunk/Source/WebKit/ChangeLog (276891 => 276892)


--- trunk/Source/WebKit/ChangeLog	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/ChangeLog	2021-05-03 08:12:49 UTC (rev 276892)
@@ -1,3 +1,30 @@
+2021-05-03  Youenn Fablet  <[email protected]>
+
+        Use OptionSet for MediaProducer::MutedStateFlags
+        https://bugs.webkit.org/show_bug.cgi?id=224550
+        <rdar://problem/76960294>
+
+        Reviewed by Eric Carlson.
+
+        Update to use new OptionSet MediaProducer::MutedStateFlags.
+        Fix a potential bug in case the page is video capture muted, covered by updated API test.
+
+        * Shared/WebPageCreationParameters.cpp:
+        (WebKit::WebPageCreationParameters::decode):
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageSetMuted):
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView setMicrophoneCaptureState:completionHandler:]):
+        (-[WKWebView setCameraCaptureState:completionHandler:]):
+        (-[WKWebView _setPageMuted:]):
+        * UIProcess/API/glib/WebKitWebView.cpp:
+        (webkit_web_view_set_is_muted):
+        * UIProcess/Cocoa/MediaUtilities.mm:
+        (WebKit::toWKMediaMutedState):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::updateActivityState):
+        * UIProcess/WebPageProxy.h:
+
 2021-05-03  Kimmo Kinnunen  <[email protected]>
 
         IPC::Semaphore operations ASSERT when the semaphore has been destroyed

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (276891 => 276892)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2021-05-03 08:12:49 UTC (rev 276892)
@@ -275,8 +275,13 @@
         return WTF::nullopt;
     if (!decoder.decode(parameters.mediaVolume))
         return WTF::nullopt;
-    if (!decoder.decode(parameters.muted))
+
+    Optional<MediaProducer::MutedStateFlags> mutedStateFlags;
+    decoder >> mutedStateFlags;
+    if (!mutedStateFlags)
         return WTF::nullopt;
+    parameters.muted = *mutedStateFlags;
+
     if (!decoder.decode(parameters.mayStartMediaWhenInWindow))
         return WTF::nullopt;
     if (!decoder.decode(parameters.mediaPlaybackIsSuspended))

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


--- trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp	2021-05-03 08:12:49 UTC (rev 276892)
@@ -2712,14 +2712,14 @@
 
 void WKPageSetMuted(WKPageRef page, WKMediaMutedState mutedState)
 {
-    WebCore::MediaProducer::MutedStateFlags coreState = WebCore::MediaProducer::NoneMuted;
+    WebCore::MediaProducer::MutedStateFlags coreState;
 
     if (mutedState & kWKMediaAudioMuted)
-        coreState |= WebCore::MediaProducer::AudioIsMuted;
+        coreState.add(WebCore::MediaProducer::MutedState::AudioIsMuted);
     if (mutedState & kWKMediaCaptureDevicesMuted)
-        coreState |= WebCore::MediaProducer::AudioAndVideoCaptureIsMuted;
+        coreState.add(WebCore::MediaProducer::AudioAndVideoCaptureIsMuted);
     if (mutedState & kWKMediaScreenCaptureMuted)
-        coreState |= WebCore::MediaProducer::ScreenCaptureIsMuted;
+        coreState.add(WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted);
 
     toImpl(page)->setMuted(coreState);
 }

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (276891 => 276892)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-05-03 08:12:49 UTC (rev 276892)
@@ -1015,10 +1015,10 @@
         return;
     }
     auto mutedState = _page->mutedStateFlags();
-    if (state == WKMediaCaptureStateActive && mutedState & WebCore::MediaProducer::AudioCaptureIsMuted)
-        mutedState ^= WebCore::MediaProducer::AudioCaptureIsMuted;
+    if (state == WKMediaCaptureStateActive)
+        mutedState.remove(WebCore::MediaProducer::MutedState::AudioCaptureIsMuted);
     else if (state == WKMediaCaptureStateMuted)
-        mutedState = WebCore::MediaProducer::AudioCaptureIsMuted;
+        mutedState.add(WebCore::MediaProducer::MutedState::AudioCaptureIsMuted);
     _page->setMuted(mutedState, [completionHandler = makeBlockPtr(completionHandler)] {
         completionHandler();
     });
@@ -1036,10 +1036,10 @@
         return;
     }
     auto mutedState = _page->mutedStateFlags();
-    if (state == WKMediaCaptureStateActive && mutedState & WebCore::MediaProducer::VideoCaptureIsMuted)
-        mutedState ^= WebCore::MediaProducer::VideoCaptureIsMuted;
+    if (state == WKMediaCaptureStateActive)
+        mutedState.remove(WebCore::MediaProducer::MutedState::VideoCaptureIsMuted);
     else if (state == WKMediaCaptureStateMuted)
-        mutedState = WebCore::MediaProducer::VideoCaptureIsMuted;
+        mutedState.add(WebCore::MediaProducer::MutedState::VideoCaptureIsMuted);
     _page->setMuted(mutedState, [completionHandler = makeBlockPtr(completionHandler)] {
         completionHandler();
     });
@@ -3356,14 +3356,14 @@
 
 - (void)_setPageMuted:(_WKMediaMutedState)mutedState
 {
-    WebCore::MediaProducer::MutedStateFlags coreState = WebCore::MediaProducer::NoneMuted;
+    WebCore::MediaProducer::MutedStateFlags coreState;
 
     if (mutedState & _WKMediaAudioMuted)
-        coreState |= WebCore::MediaProducer::AudioIsMuted;
+        coreState.add(WebCore::MediaProducer::MutedState::AudioIsMuted);
     if (mutedState & _WKMediaCaptureDevicesMuted)
-        coreState |= WebCore::MediaProducer::AudioAndVideoCaptureIsMuted;
+        coreState.add(WebCore::MediaProducer::AudioAndVideoCaptureIsMuted);
     if (mutedState & _WKMediaScreenCaptureMuted)
-        coreState |= WebCore::MediaProducer::ScreenCaptureIsMuted;
+        coreState.add(WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted);
 
     _page->setMuted(coreState);
 }

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp (276891 => 276892)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2021-05-03 08:12:49 UTC (rev 276892)
@@ -3271,7 +3271,10 @@
     if (webkit_web_view_get_is_muted (webView) == muted)
         return;
 
-    getPage(webView).setMuted(muted ? WebCore::MediaProducer::AudioIsMuted : WebCore::MediaProducer::NoneMuted);
+    WebCore::MediaProducer::MutedStateFlags audioMutedFlag;
+    if (muted)
+        audioMutedFlag.add(WebCore::MediaProducer::MutedState::AudioIsMuted);
+    getPage(webView).setMuted(audioMutedFlag);
     g_object_notify_by_pspec(G_OBJECT(webView), sObjProperties[PROP_IS_MUTED]);
 }
 

Modified: trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm (276891 => 276892)


--- trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/Cocoa/MediaUtilities.mm	2021-05-03 08:12:49 UTC (rev 276892)
@@ -46,13 +46,11 @@
 _WKMediaMutedState toWKMediaMutedState(WebCore::MediaProducer::MutedStateFlags state)
 {
     _WKMediaMutedState mediaMutedState = _WKMediaNoneMuted;
-    if (state & WebCore::MediaProducer::NoneMuted)
-        mediaMutedState |= _WKMediaNoneMuted;
-    if (state & WebCore::MediaProducer::AudioIsMuted)
+    if (state & WebCore::MediaProducer::MutedState::AudioIsMuted)
         mediaMutedState |= _WKMediaAudioMuted;
     if (state & WebCore::MediaProducer::AudioAndVideoCaptureIsMuted)
         mediaMutedState |= _WKMediaCaptureDevicesMuted;
-    if (state & WebCore::MediaProducer::ScreenCaptureIsMuted)
+    if (state & WebCore::MediaProducer::MutedState::ScreenCaptureIsMuted)
         mediaMutedState |= _WKMediaScreenCaptureMuted;
     return mediaMutedState;
 }

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (276891 => 276892)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-05-03 08:12:49 UTC (rev 276892)
@@ -1990,7 +1990,7 @@
         m_activityState.add(ActivityState::IsInWindow);
     if (flagsToUpdate & ActivityState::IsVisuallyIdle && pageClient().isVisuallyIdle())
         m_activityState.add(ActivityState::IsVisuallyIdle);
-    if (flagsToUpdate & ActivityState::IsAudible && m_mediaState & MediaProducer::IsPlayingAudio && !(m_mutedState & MediaProducer::AudioIsMuted))
+    if (flagsToUpdate & ActivityState::IsAudible && m_mediaState & MediaProducer::IsPlayingAudio && !(m_mutedState.contains(MediaProducer::MutedState::AudioIsMuted)))
         m_activityState.add(ActivityState::IsAudible);
     if (flagsToUpdate & ActivityState::IsLoading && m_pageLoadState.isLoading())
         m_activityState.add(ActivityState::IsLoading);
@@ -2447,10 +2447,12 @@
     
 void WebPageProxy::setMediaStreamCaptureMuted(bool muted)
 {
+    auto state = m_mutedState;
     if (muted)
-        setMuted(m_mutedState | WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+        state.add(WebCore::MediaProducer::MediaStreamCaptureIsMuted);
     else
-        setMuted(m_mutedState & ~WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+        state.remove(WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+    setMuted(state);
 }
 
 void WebPageProxy::activateMediaStreamCaptureInPage()
@@ -2458,7 +2460,7 @@
 #if ENABLE(MEDIA_STREAM)
     WebProcessProxy::muteCaptureInPagesExcept(m_webPageID);
 #endif
-    setMuted(m_mutedState & ~WebCore::MediaProducer::MediaStreamCaptureIsMuted);
+    setMediaStreamCaptureMuted(false);
 }
 
 #if !PLATFORM(IOS_FAMILY)

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (276891 => 276892)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-05-03 08:12:49 UTC (rev 276892)
@@ -734,7 +734,7 @@
     bool isEditable() const { return m_isEditable; }
 
     void activateMediaStreamCaptureInPage();
-    bool isMediaStreamCaptureMuted() const { return m_mutedState & WebCore::MediaProducer::MediaStreamCaptureIsMuted; }
+    bool isMediaStreamCaptureMuted() const { return m_mutedState.containsAny(WebCore::MediaProducer::MediaStreamCaptureIsMuted); }
     void setMediaStreamCaptureMuted(bool);
 
     void requestFontAttributesAtSelectionStart(CompletionHandler<void(const WebCore::FontAttributes&)>&&);
@@ -1365,7 +1365,7 @@
 
     void setMediaVolume(float);
     void setMuted(WebCore::MediaProducer::MutedStateFlags, CompletionHandler<void()>&& = [] { });
-    bool isAudioMuted() const { return m_mutedState & WebCore::MediaProducer::AudioIsMuted; };
+    bool isAudioMuted() const { return m_mutedState.contains(WebCore::MediaProducer::MutedState::AudioIsMuted); };
     void setMayStartMediaWhenInWindow(bool);
     bool mayStartMediaWhenInWindow() const { return m_mayStartMediaWhenInWindow; }
     void setMediaCaptureEnabled(bool);
@@ -2826,7 +2826,7 @@
     WebCore::LayoutPoint m_maxStableLayoutViewportOrigin;
 
     float m_mediaVolume { 1 };
-    WebCore::MediaProducer::MutedStateFlags m_mutedState { WebCore::MediaProducer::NoneMuted };
+    WebCore::MediaProducer::MutedStateFlags m_mutedState;
     bool m_mayStartMediaWhenInWindow { true };
     bool m_mediaPlaybackIsSuspended { false };
     bool m_mediaCaptureEnabled { true };

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (276891 => 276892)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-05-03 08:12:49 UTC (rev 276892)
@@ -1785,7 +1785,7 @@
 
 void WebProcessProxy::pageMutedStateChanged(WebCore::PageIdentifier identifier, WebCore::MediaProducer::MutedStateFlags flags)
 {
-    bool mutedForCapture = flags & MediaProducer::AudioAndVideoCaptureIsMuted;
+    bool mutedForCapture = flags.containsAny(MediaProducer::AudioAndVideoCaptureIsMuted);
     if (!mutedForCapture)
         return;
 

Modified: trunk/Tools/ChangeLog (276891 => 276892)


--- trunk/Tools/ChangeLog	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Tools/ChangeLog	2021-05-03 08:12:49 UTC (rev 276892)
@@ -1,3 +1,14 @@
+2021-05-03  Youenn Fablet  <[email protected]>
+
+        Use OptionSet for MediaProducer::MutedStateFlags
+        https://bugs.webkit.org/show_bug.cgi?id=224550
+        <rdar://problem/76960294>
+
+        Reviewed by Eric Carlson.
+
+        * TestWebKitAPI/Tests/WebKit/GetUserMedia.mm:
+        (TestWebKitAPI::TEST):
+
 2021-05-01  Chris Dumez  <[email protected]>
 
         Start leveraging std::filesystem in WTF::FileSystem

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm (276891 => 276892)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm	2021-05-03 07:49:05 UTC (rev 276891)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/GetUserMedia.mm	2021-05-03 08:12:49 UTC (rev 276892)
@@ -280,6 +280,7 @@
     [webView stringByEvaluatingJavaScript:@"stop()"];
     EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
 
+    // Mute camera, then microphone
     microphoneCaptureStateChange = false;
     cameraCaptureStateChange = false;
     [webView stringByEvaluatingJavaScript:@"captureAudioAndVideo()"];
@@ -293,8 +294,8 @@
 
     microphoneCaptureStateChange = false;
     [webView setMicrophoneCaptureState:WKMediaCaptureStateMuted completionHandler:nil];
+    EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateMuted));
     EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted));
-    EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive));
 
     microphoneCaptureStateChange = false;
     cameraCaptureStateChange = false;
@@ -302,6 +303,34 @@
     EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
     EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateNone));
 
+    // Mute microphone, then camera
+    microphoneCaptureStateChange = false;
+    cameraCaptureStateChange = false;
+    [webView stringByEvaluatingJavaScript:@"captureAudioAndVideo()"];
+    EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateActive));
+    EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateActive));
+
+    microphoneCaptureStateChange = false;
+    [webView setMicrophoneCaptureState:WKMediaCaptureStateMuted completionHandler:nil];
+    EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateMuted));
+    EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateActive));
+
+    cameraCaptureStateChange = false;
+    [webView setCameraCaptureState:WKMediaCaptureStateMuted completionHandler:nil];
+    EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted));
+    EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateMuted));
+
+    // Stop microphone, then stop camera
+    microphoneCaptureStateChange = false;
+    [webView setMicrophoneCaptureState:WKMediaCaptureStateNone completionHandler:nil];
+    EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
+    EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateMuted));
+
+    cameraCaptureStateChange = false;
+    [webView setCameraCaptureState:WKMediaCaptureStateNone completionHandler:nil];
+    EXPECT_TRUE(waitUntilCameraState(webView.get(), WKMediaCaptureStateNone));
+    EXPECT_TRUE(waitUntilMicrophoneState(webView.get(), WKMediaCaptureStateNone));
+
     [webView removeObserver:observer.get() forKeyPath:@"microphoneCaptureState"];
     [webView removeObserver:observer.get() forKeyPath:@"cameraCaptureState"];
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to